В данной статье я был хотел поделиться своим опытом развёртывания сервера Mercurial на одном из самых популярных дистрибутивов Linux. Я старался максимально просто и лаконично описать процесс настройки столь мощной и сложной системы как Mercurial в связке с web-сервером Apache2.
Мне от системы требовались следующие возможности:
- аутентификация по паролю
- просмотр через web изменений и коментариев сделанных пользователями
- коммит через протокол http или ssh
- множество репозиториев в одном хранилище
- и максимальная похожесть на систему git
Установка и настройка Mercurial
Установка сервера
Для того чтобы установить необходимый набор пакетов достаточно выполнить следующую команду:$ sudo apt-get install mercurial mercurial-server
Настройка сервера
Во время установки пакет mercurial-server создаст пользователя hg с домашней директорией /var/lib/mercurial-server.
Создадим тестовый репозиторий, для этого авторизуемся из под пользователя hg:
$ sudo su -l hgПо умолчанию у данного пользователя домашняя директория не в /home:
$ pwdПерейдём в репозитории и создадим новый:
/var/lib/mercurial-server/
$ cd reposПротестируем репозиторий:
$ hg init testrepo
$ cd testrepoСоздадим тестовый файлик:
$ echo "test msg" > test.txt
$ hg status
? test.txt
Добавим его в индекс:
$ hg add test.txtПопробуем закоммитить файл:
$ hg status
A test.txt
$ hg ci -m 'asd'Система требует задать имя пользователя от которого будет выполняться коммиты:
прервано: не задано имя пользователя (см. "hg help config")
$ mcedit ~/.hgrcДобавим в этот файл информацию о пользователе
[ui]
username = hg@server
После этого повторим коммит:
$ hg ci -m 'asd'Ошибок больше нет.
Добавим описание репозитория
После того как мы настроим web-доступ к нашему репозиторию мы сможем увидеть его description. Для этого отредактируем файл:
$ mcedit /var/lib/mercurial-server/repos/testrepo/.hg/hgrcЗапишем в него следующее:
[web]
description = Тут описание репозитория
Настройка доступа к Mercurial через HTTP
Установка apache2
Как и всегда лаконичная команда в консоли:
$ sudo apt-get install apache2 apache2-utils libapache2-mod-wsgi
Настройка VHost для Mercurial
Отредактируем файл конфигурации:
Включим указанный сайт штатными средствами apache2:
sudo mcedit /etc/apache2/sites-available/mercurial.confТам будет следующее содержимое:
<VirtualHost *:80>
ServerAdmin admin@company.ru
ServerName repo.company.ru
DocumentRoot /var/lib/mercurial-server/repos/
# Настройка WCGI
WSGIProcessGroup hg
WSGIDaemonProcess hg user=hg group=hg threads=2 maximum-requests=1000
# Обработчик WSGI
WSGIScriptAlias / /var/lib/mercurial-server/repos/hgwebdir.wsgi
# Аутентификация
<Location />
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /var/lib/mercurial-server/repos/.htpasswd
Require valid-userГлавное не забыть настроить хост в прямой зоне DNS-сервера, где "repo.company.ru >>> x.x.x.x".
</Location>
# Логи сервера
ErrorLog ${APACHE_LOG_DIR}/error.repo.log
CustomLog ${APACHE_LOG_DIR}/access.repo.log combined
</VirtualHost>
Включим указанный сайт штатными средствами apache2:
$ sudo a2ensite mercurial.confЗатем перезапустим сервер:
$ sudo /etc/init.d/apache2 restart
Настройка скрипта, отображающего содержимое репозитория
Далее настроим скрипт, для работы с репозиторием:$ sudo mcedit /var/lib/mercurial-server/repos/hgwebdir.wsgiЗапишем в него следующее содержимое:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
os.environ['HGENCODING'] = 'utf-8'
from mercurial.hgweb.hgwebdir_mod import hgwebdir
from mercurial.hgweb.request import wsgiapplication
path = os.path.dirname(os.path.abspath(__file__))
application = hgwebdir(path+'/hgwebdir.conf')
Теперь пропишем конфигурацию для указанного выше скрипта:
$ sudo mcedit /var/lib/mercurial-server/repos/hgwebdir.confЗапишем в этот файл следующее:
[web]
style = coal
allow_push = *
push_ssl = no
[paths]Есть небольшой хак, допустим в директории /var/lib/mercurial-server будет несколько репозиториев и возможно в будущем придётся их добавлять то достаточно в графе [paths] указать корневую директорию:
testrepo = /var/lib/mercurial-server/repos/testrepo/
[paths]Последний штрих:
/ = /var/lib/mercurial-server/repos/*
$ sudo chown hg:hg /var/lib/mercurial-server/repos/hgwebdir.wcgi /var/lib/mercurial-server/repos/hgwebdir.conf
Настроим доступ только для авторизованных пользователей
Для этого используем штатную утилиту из пакета apache2.utils:htpasswd -c /var/lib/mercurial-server/repos/.htpasswd usernameТеперь попытаем залогиниться, откроем через любой браузер адрес нашего сервера mercurial, после чего авторизуемся и перед нами будет список репозиториев, который мы указали в файле hgwebdir.conf.
Дальнейшее обслуживание
Если в дальнейшем потребуется добавить новый репозиторий:
$ sudo su -l hg
$ cd /var/lib/mercurial-server/repos/
$ hg init newrepo
$ mcedit hgwebdir.conf
Добавить строку в [paths]:
newrepo = /var/lib/mercurial-server/repos/newrepo/И всё, ничего перезапускать не требуется.
Как пользоваться
Продолжение тут: http://devppp.blogspot.ru/2013/10/merurial.html
Сдалал всё по вашей инструкции, однако непонятно теперь, где искать этот репозиторий, как зайти на него в браузере и как клонировать его на клиентских машинах. Спасибо!
ОтветитьУдалитьВсё просто)
ОтветитьУдалитьС точки зрения фс на сервере:
/var/lib/mercurial-server/repos/мойреп
С точки зрения web:
http://хост/мойреп
---
То есть клонирование репозитория выглядит так:
hg clone http://хост/мойреп
Ошибка Internal Server Error из-за
ОтветитьУдалить# Настройка WCGI
WSGIProcessGroup hg
WSGIDaemonProcess hg user=hg group=hg threads=2 maximum-requests=1000
# Обработчик WSGI
WSGIScriptAlias / /var/lib/mercurial-server/repos/hgwebdir.wsgi
В чем может быть беда?