Как подружить Mercurial и Nginx на Deebian 7 (Wheezy)

Допустим у нас есть хост с именем repo.example.com, на нём должен находиться наш репозиторий с исходными кодами, к которому мы будем обращаться по протоколу http.
Ранее я уже рассказывал, как реализовать подобное решение на apache2:

А вот краткая инструкция пользователя:

Установка пакетов

Для настройки данного решения нам понадобится веб-сервер и система управления репозиторием mercurial:

apt-get instal nginx mercurial mercurial-server apache2-utils

Настройка Mercurial

Подправим файл конфигурации Mercurial:

sudo mcedit /var/lib/mercurial-server/repos/hgwebdir.conf

Добавим в него:

[web]
style = coal
allow_push = *
push_ssl = no 

[paths]
/ = /var/lib/mercurial-server/repos/* 

Теперь сгенерируем файл паролей, в котором будут храниться наши пользователи:

sudo htpasswd -c /var/lib/mercurial-server/repos/.htpasswd username

Теперь пофиксим права доступа:

sudo chown -R hg:hg /var/lib/mercurial-server

Автоматический запуск Mercurial при старте сервера

Чтобы не захламлять систему самописными init скриптами можно воспользоваться уже готовым решение на базе rc.local

sudo mcedit /etc/rc.local

Добавим следующую строку (перед словом exit внизу):

/usr/bin/hg serve -d -A /var/log/hg_access.log -p 8080 -a 127.0.0.1 --pid-file /var/run/hgserver.pid --encoding utf8 --webdir-conf /var/lib/mercurial-server/repos/hgwebdir.conf

Чуть поподробнее о ключах:

  • Режим serve - (это не ошибка, он так называется) работать в режиме web-сервера
  • -d - Демонизация, то есть программа отпустит консоль и уйдёт в фоновый режим 
  • -p - Порт
  • -a - На каком сетевом интерфейсе демон будет работать
  • --pid-file - Тут будет храниться его pid
  • --encoding - Кодировка по умолчанию
  • --webdir-conf - Конфигурация репозиториев

Ну и запустим сам сервер, чтобы не перезапускать компьютер:

sudo /usr/bin/hg serve -d -A /var/log/hg_access.log -p 8080 -a 127.0.0.1 --pid-file /var/run/hgserver.pid --encoding utf8 --webdir-conf /var/lib/mercurial-server/repos/hgwebdir.conf

    Конфигурация Nginx

    Далее выполни настройку vhost'a nginx:

    sudo mcedit /etc/nginx/sites-available/repo

    Добавим в него следующую конфигурацию:

    server
        {
            listen 80;
            server_name repo.example.com;
            client_max_body_size 128M;

            location /
            {
                    proxy_pass http://127.0.0.1:8080;
                    auth_basic "Restricted";
                    auth_basic_user_file /var/lib/mercurial-server/repos/.htpasswd;
            }
        } 

    Теперь активируем её:

    sudo ln -s /etc/nginx/sites-available/repo /etc/nginx/sites-enabled/

    Теперь рестартуем сервер:

    sudo /etc/init.d/nginx restart

    или (на любителя)

    sudo service nginx restart

    Правки DNS

    И так, у нас в конфигурации nginx указан vhost repo.example.com его можно для теста прописать в /etc/hosts, а потом, если это необходимо, на DNS-сервере.

    sudo mcedit /etc/hosts

    Допишем в конец строку вида:

    192.168.1.15 repo.example.com

    Теперь когда мы выполняем ping, видно, что адрес резолвится.

    Настройка клиента Mercurial

    Подправим нашу локальную конфигурацию:

    mcedit ~/.hgrc

    Добавил что-то типа:

    [ui]
    username = tux@laptop

    Чтобы явно идентифицировать нас.

    Тестируем 

    На удалённом хосте где расположен наш web-репозиторий:

    sudo su -l hg
    cd repos
    hg init testrepo
    exit

    На локальной машине:

    hg clone http://repo.example.com/testrepoecho 'asd' > test.txthg statushg addremovehg commit -m 'тестовая запись'hg push