Trac и его друзья Gitolite, Nginx и UWSGI
Всем наверно известен замечательный 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
Заключение
Надеюсь моя статья, поможет кому-то разобраться с этим вопросом или как минимум сэкономить время.
Автор: Alesh