Eugene Burtsev's blog

Установка связки Mercurial + UWSGI + Nginx + HTTPS на Ubuntu Server 10.04

Недавно появилась необходимость установить Mercurial сервер, используя в качестве фронтэнда nginx. В интернете довольно много информации на данную тему, но пришлось довольно много импровизировать что бы добиться результата. Итак, ниже представлен результат труда по настройке этой связки.

Все нижеописанные действия производятся из под рута. Итак, приступим :)

Установка необходимого софта

Python

В первую очередь поставим Python.

apt-get install python

Так же для удобства добавления сторонних PPA можно поставить python-software-properties:

apt-get install python-software-properties

После этого PPA можно добавлять командой

add-apt-repository ppa:xxx/yyy

Mercurial

Поскольку в репозитории Lucid Lynx находится версия mercurial’а, древняя как говно мамона, то подключаем PPA с новыми версиями:

add-apt-repository ppa:mercurial-ppa/stable-snapshots
apt-get update
apt-get install mercurial

Nginx

В основном репозитории nginx отсутствует поэтому подключаем PPA и устанавливаем.

add-apt-repository ppa:nginx/stable
apt-get update
apt-get install nginx

uwsgi-python

В качестве сервера python-приложений установим uwsgi-python.

add-apt-repository ppa:uwsgi/release
apt-get update
apt-get install uwsgi-python

Настройка

Теперь после установки софта начинается самое сложное - настройка. Во первых, рассмотрим структуру директорий, которая будет использоваться.

/var/www/hosts/hg.server.net/conf    здесь будут расположены конфиги
/var/www/hosts/hg.server.net/logs    директория для логов
/var/www/hosts/hg.server.net/repos   директория, содержащая репозитории

Mercurial + uwsgi

Создадим файл описания UWSGI-приложения /etc/uwsgi-python/apps-available/hgweb.xml примерно такого содержания:

hgweb.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<uwsgi>
  <socket>/var/run/uwsgi.hgweb.sock</socket>
  <master/>
  <workers>2</workers>
  <![CDATA[
     import uwsgi
     import os

     os.environ["HGENCODING"] = "UTF-8"

     from mercurial import demandimport; demandimport.enable()
     from mercurial.hgweb.hgwebdir_mod import hgwebdir

     application = hgwebdir('/var/www/hosts/hg.server.net/conf/hgweb.config')
 ]]>
</uwsgi>

Параметр socket задает адрес который будет прослушивать сервер. workers количество запущенных воркеров. Обратите внимание что в 14-ой строке необходимо указать правильный путь к конфигу hgweb, созданием которого мы сейчас и займемся.

Для этого создаем файл /var/www/hosts/hg.server.net/conf/hgweb.config:

hgweb.config
1
2
3
4
5
6
7
8
[web]
push_ssl = true
allow_push = *
style = gitweb
allow_archive = gz, zip, bz2

[collections]
/var/www/hosts/hg.server.net/repos/ = /var/www/hosts/hg.server.net/repos/

Во второй строке мы разрешаем проталкивать изменения только по SSL. В третьей можно перечислить через запятую пользователей которым разрешено проталкивать изменения на сервер. В четвертой выбирается стиль интерфейса. Мне больше всего нравится gitweb. в последней строке необходимо установить корректные пути до репозиториев. Теперь, для проверки корректности настроек временно поменяем строку <socket>/var/run/uwsgi.hgweb.sock</socket> в файле hgweb.xml на <socket>127.0.0.1:3031</socket> и запустим следующую команду:

uwsgi-python -x /etc/uwsgi-python/apps-available/hgweb.xml

Если все настроено верно то никаких ошибок выведено не будет. И если зайти браузером по адресу http://127.0.0.1:3031/ то отобразится список репозиториев. Если все нормально то меняем файл hgweb.xml обратно и создаем симлинк в /etc/uwsgi-python/apps-enabled:

ln -s /etc/uwsgi-python/apps-{available,enabled}/hgweb.xml

Теперь можно переходить к следующему этапу.

Nginx

Создадим файл паролей при помощи утилиты htpasswd

htpasswd -c /var/www/auth/.htpasswd <username>

Создаем конфиг /etc/nginx/sites-available/hg.server.net

hg.server.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
server {
  listen               443;
  listen               80;
  server_name          hg.server.net;

  ssl                  on;
  ssl_protocols        SSLv3 TLSv1;
  ssl_certificate      /var/www/hosts/hg.server.net/ssl/ssl_certificate.crt;
  ssl_certificate_key  /var/www/hosts/hg.server.net/ssl/ssl_certificate.key;

  root                 /var/www/hosts/hg.server.net/www;
  access_log           /var/www/hosts/hg.server.net/logs/access.log;
  error_log            /var/www/hosts/hg.server.net/logs/error.log;

  # Need for very big files
  client_max_body_size 100m;

  if ( $scheme = "http" ) {
      rewrite ^/(.*)$  https://$host/$1 permanent;
  }

  location / {
      auth_basic                  "Mercurial Repository";
      auth_basic_user_file        /var/www/auth/.htpasswd;
      include     uwsgi_params;
      uwsgi_param REMOTE_PORT     $remote_port;
      uwsgi_param SERVER_PORT     $server_port;
      uwsgi_param SERVER_PROTOCOL $server_protocol;
      uwsgi_param UWSGI_SCHEME    $scheme;
      uwsgi_param SCRIPT_NAME     /;
      uwsgi_param AUTH_USER       $remote_user;
      uwsgi_param REMOTE_USER     $remote_user;
      uwsgi_pass  hgweb;
  }

  location /static/ {
      rewrite       /static/(.*)  /$1 break;
      root          /usr/share/mercurial/templates/static;
      expires 30d;
  }

  location ~ /\. {
      deny all;
  }
}

upstream hgweb {
  server unix:/var/run/uwsgi.hgweb.sock;
}

Делаем симлинк для нашего конфига в /etc/nginx/sites-enabled:

ln -s /etc/nginx/sites-{available,enabled}/hg.server.net

Запускаем сервисы

service uwsgi-python start
service nginx start

Если все хорошо то зайдя по адресу http://hg.server.net/ увидим список репозиториев. Если это так то сделаем что бы все запускалось автоматически при старте системы и забудем о настройке.

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

Во первых убедитесь что сделали симлинки на конфиги. Во вторых следует настроить сервисы для автоматического запуска:

update-rc.d uwsgi-python defaults
update-rc.d nginx defaults

Все - настройка завершена, можно перезагрузиться и еще раз проверить работу.

Comments