Trac и его друзья Gitolite, Nginx и UWSGI

из песочницы
Alesh 18 ноября 2012 в 17:59 9,9k
Всем наверно известен замечательный OpenSource проект Trac, позволяющий организовать рабочий процесс при разработке программного обеспечения. Однако его развертывание и настройка является не простой задачей. Информация в интернете разрозненная и часто уже устаревшая. В этом я смог сам убедиться настраивая Trac интегрированный с Gitolite на связке Nginx+UWSGI.

После небольшой увертюры с бубном у меня родился этот документ являющийся практически пошаговой инструкцией по развертыванию проекта Trac. Надеюсь это пригодится кому-нибудь еще.

Инструкция ориентирована на пользователя с базовыми знаниями администрирования Linuх и системы установки пакетов Python. Скажу сразу, что описан процесс развертывания на системе со свежеустановленным дистрибутивом Ubuntu 12.04, однако думаю информацию будет полезна и для поклонников других сборок Linux.

Инициализация проекта Trac


Выполните следующие действия если в системе не установлен дистрибутив Trac:
  • установите ​Python Pip;
  • установите ​Babel, если нужна локализация интерфейса;
  • установите сам Trac с указанием версии, в статье описано установка версии 1.0.

sudo apt-get install python-pip
sudo pip install babel
sudo pip install "Trac==1.0"

Теперь нужно проинициализировать каталог размещения проекта. Выполните следующие действия:
  • создать пользователя trac;
  • создать группы tracsys и включить в неё trac и себя;
  • подготовить место под размещение проекта;
  • проинициализировать каталог проекта;
  • назначить владельца и необходимые права;
  • запустить, посмотреть что получилось.

sudo adduser --disabled-password --gecos 'Trac'  trac
sudo addgroup tracsys
sudo adduser trac tracsys
sudo adduser `whoami` tracsys
sudo mkdir -p /var/www/trac
sudo trac-admin /var/www/trac initenv
sudo chown -R nobody:tracsys /var/www/trac
sudo chmod -R g+rwXs /var/www/trac
tracd -p 8000 /var/www/trac/

Всё достаточно тривиально, кроме манипуляций с группой tracsys и назначением прав на каталог проекта. Но это задел на интеграцию с gitolite и организацию хостинга проекта на основе связки Nginx+UWSGI.

Организация хостинга с помощь Nginx и UWSGI


UWSGI — это сервер WSGI приложений. Что бы запустить под ним наш проект Trac его нужно представить в виде приложение WSGI. Сделать это не сложно с помощью скрипта ниже приведенного. Скопируйте его в файл /home/trac/wsgi_trac.py, назначьте пользователя trac владельцем. Далее необходимо создать конфигурационные файлы Nginx и UWSGI. Для Nginx файл стандартный в таких случаях, а для UWSGI есть тонкости. Наше WSGI будет запускаться с правами пользователя trac и группы tracsys. Конфигурационные файлы wsgi_trac.nginx и wsgi_trac.uwsgi приведены ниже.

wsgi_trac.py

import os
import sys
import trac.web.main
sys.stdout=sys.stderr
os.environ['TRAC_ENV'] = '/var/www/trac'
application = trac.web.main.dispatch_request

wsgi_trac.nginx

server {
  listen  80;
  server_name  trac.local;

  location / {
    include  uwsgi_params;
    uwsgi_pass  127.0.0.1:5544;
  }
}

wsgi_trac.uwsgi

[uwsgi]
uid=trac
gid=tracsys
chmod-socket=777
chown-socket=trac
chdir = /home/trac
socket = 127.0.0.1:5544
module = wsgi_trac:application
processes = 2
master = 1

Если Nginx и/или UWSGI не установлены установите их. Симлинками активируйте конфигурационные файлы и перезапустите сервисы.
sudo apt-get install nginx uwsgi uwsgi-plugin-python
sudo ln -s /home/trac/wsgi_trac.nginx /etc/nginx/sites-enabled/trac.conf
sudo ln -s /home/trac/wsgi_trac.uwsgi /etc/uwsgi/apps-enabled/trac.ini
sudo service nginx restart
sudo service uwsgi restart


Установка плагина AccountManagerPlugin


Дистрибутив Trac 1.0 не включает в себя компонент, которые бы позволил управлять пользовательскими аккаунтами. Для этого используются всевозможные плагины. В нашем примере будет использован плагин ​AccountManagerPlugin. Скачайте его и соберите как egg дистрибутив. Полученный файл с расширением .egg перепишите в каталог плагинов, в нашем случае это /var/www/trac/plugins. Добавьте в файл ​trac.ini строки.
[components]
trac.web.auth.LoginModule = disabled
acct_mgr.web_ui.LoginModule = enabled
acct_mgr.web_ui.RegistrationModule = enabled

Для хранения паролей будет использоваться файл в формате HtDigest, для этого добавим в файл trac.ini так же и следующие строки.
[account-manager]
authentication_url = 
force_passwd_change = False
hash_method = HtDigestHashMethod
htdigest_realm = trac
htpasswd_hash_type = crypt
password_file = /var/www/trac/db/users.htdigest
password_store = HtDigestStore
persistent_sessions = False
refresh_passwd = False
user_lock_max_time = 0
verify_email = False

После этого в веб интерфейсе появиться пункт позволяющий зарегистрировать пользователя. Регистрируйте пользователя. И выполните команду что бы назначить его админом.
trac-admin /var/www/trac permission add <имя зарегистрированного пользователя> TRAC_ADMIN

Теперь у нас есть админ, зайдя под которым можно создавать, удалять и назначать права другим пользователям. Обратите внимания, что в веб интерфейсе активирована ссылка на форму регистрации нового пользователя, отключите её если самостоятельная регистрация пользователя не предусмотрена проектом. Сделать это уже можно в админке в разделе управления плагинами сняв галку в c RegistrationModule в форме конфигурации плагина AccountManagerPlugin.

Интеграция с Gitolite


Для управления репозиториями Git есть замечательный инструмент Gitolite, который к тому же может быть интегрирован с проектами Trac. Для этого надо выполнить следующие действия:

  • развернуть дистрибутив Gitolite, создать пользователя git с рабочей директорией /home/gitolite и добавить его в группу tracsys;
  • Создать SSH ключи для пользователя trac и скопировать публичный ключ в /tmp/trac.pub;

sudo apt-get install gitolite
sudo adduser --home /home/gitolite --disabled-password --gecos 'Git' git
sudo adduser git tracsys
sudo su trac
cd ~
ssh-keygen -t rsa
cp ~/.ssh/id_rsa.pub /tmp/trac.pub
exit

Следующим шагом под пользователем git инициализируем рабочий каталог gitolite. При этом откроется файл конфигурации, где надо исправить строчку '$REPO_UMASK = 0077;' на '$REPO_UMASK = 0007;'. Если vim у вас вызывает затруднения, просто нажмите ZZ. Сменить маску можно и позже отредактировав файл /home/gitolite/.gitolite.rc. Каталогу с репозиториями назначим права аналогичные тем, что назначили на каталог с проектом Trac.
sudo su git
cd ~
gl-setup /tmp/trac.pub
exit
sudo chown -R git:tracsys /home/gitolite/repositories/
sudo chmod -R g+rwXs /home/gitolite/repositories/

Осталось включить интеграцию с Git нашего Trac проекта. Для этого добавим в trac.ini следующие строки.
[components]
tracopt.versioncontrol.git.* = enabled

[trac]
repository_type = git

Теперь в админке, в разделе Репозитории подключите с именем testing тестовый репозиторий gitolite /home/gitolite/repositories/testing.git, а с именем gitolite-admin управляющий репозиторий /home/​gitolite/​repositories/​gitolite-admin.git. Если все было сделано правильно, в меню веб интерфейса появится раздел Исходный код в котором они оба будут присутствовать.

Все отлично, но хотелось бы и управлять репозиториями Gitolite через интерфейс нашего проекта Trac. Не проблема, в этом деле поможет плагин trac-GitolitePlugin. Скачайте его с приведенной страницы и соберите как egg дистрибутив. Полученный файл скопируйте в каталог плагинов и активируйте добавив в файл trac.ini следующие строки.
[components]
trac_gitolite.* = enabled

[trac]
permission_policies = GitolitePermissionPolicy, AuthzPolicy, DefaultPermissionPolicy, LegacyAttachmentPolicy

[trac-gitolite]
admin_reponame = gitolite-admin
admin_real_reponame = gitolite-admin
admin_ssh_path = git@localhost:gitolite-admin.git
admin_system_user =  trac
default_private = True
all_includes_anonymous = False

После этого в админке появиться новый раздел, в котором можно будет добавлять пользователей в Gitolite и назначать им права на репозитории. Однако у меня во время первого добавления пользователя выскочила ошибка выполнении команды git clone git@localhost:gitolite-admin.git /tmp/bla-bla. Пришлось выполнить эту команду из под пользователя trac и подтвердить добавление ключа в ручную, дальше всё заработало без проблем.

Осталось реализовать одну из самых интересных фишек интеграции Trac и Git, это закрытие тикета путем указания в коммите кодового слова. Например коммит в котором будет строка «close #777», автоматически закроет соответствующий тикет. Для этого во первых нужно будет активировать компонент CommitTicketUpdater через админку или добавив в файл trac.ini следующие строки.
[components]
tracopt.ticket.commit_updater.* = enabled

Далее скачаем ​Python скрипт реализующий соответствующий hook например в директорию /var/www/trac/hooks. В нем есть секция конфигурации, которую надо настроить исходя из расположения и конфигурации конкретного проекта Trac. В нашем случае это будет выглядеть как-то так:
# config
TRAC_ENV = '/var/www/trac'
GIT_PATH = '/usr/bin/git'
TRAC_ADMIN = '/usr/local/bin/trac-admin'
#REPO_NAME = '(default)'
# if you are using gitolite or sth similar, you can get the repo name from envir
REPO_NAME = os.getenv('GL_REPO')

У Gitolite своя система организации хуков, правильным образом прописанные они срабатывают на все репозитории им контролируемые, а это как раз то что надо. Для этого под пользователем git создайте файл ~/.gitolite/hooks/post-receive со следующим содержимым:
#!/bin/bash
python /var/www/trac/hooks/trac-post-receive-hook-0.12-new-commits-from-all-branches.py

И в завершении активируйте этот хук выполнив следующие команды.
sudo su git
cd ~/.gitolite/hooks/
chmod 755 post-receive
gl-setup

Заключение


Надеюсь моя статья, поможет кому-то разобраться с этим вопросом или как минимум сэкономить время.
Проголосовать:
+11
Сохранить: