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 

Заключение

Надеюсь моя статья, поможет кому-то разобраться с этим вопросом или как минимум сэкономить время.

ссылка на оригинал статьи http://habrahabr.ru/post/159153/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *