Пользователь
–0,1
рейтинг
18 ноября 2012 в 17:59

Разработка → 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
карма
21,0
рейтинг –0,1
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (11)

  • 0
    Я много чего перепробовал и все-же решил остановиться на GitLab и деплою его тоже через Nginx + uWSGI(я через него все теперь деплою… и python и php и ruby и erlang)
    • 0
      Gitolab да, полезный тул. Но и он юзает Gitolite. А вот инструментов которые позволяют разделять права и управляют Git репозиториями я и не знаю, во всяком случае OpenSource. Кстати если пробовали что-то такого плана, пусть и платными — поделитесь урлами на проекты.
      • 0
        SCM-Manager — там минимум функционала, но как раз права и управление репозиториями имеется.
  • 0
    Друзья, это мой первый пост как мне вдруг захотелось разморозиться (выйти из ридонли). Полагаю что шестнадцати парням моя статья показалось интересна и они добавили ее в избранное на данный момент. Странны два минуса на данный момент, ну друзья если есть какие-то вопросы к статье — да минусуйте, но дайте какой--то фидбэк в комментах.

    Что не так, техническая ошибка в самом тексте и логе команд, грамматические ошибки в тексте, что друзья? Может эта тема про Trac вообще не нужна? Ну напишите плиз!
  • 0
    А вот вариант задеплоить Trac на Windows за пару кликов.
  • 0
    Когда эта штука ( projects.unbit.it/uwsgi/wiki ) уже будет на 100% покрывать руби и пхп? Сразу отпадут головные боли настройки разных платформ — всё будет просто и легко.

    А то щас только 60 и 5 % :(
    • +1
      Там речь идет об поддержке фишек своего фирменного API и я сомневаюсь, что будет когда-то 100%. Например что бы реализовать поддержку Green threads, мне думается надо сам PHP основательно перелопатить.

      А так PHP через него запускается вполне сносно.
  • 0
    Какие пользователи Трака к каким репозиториям получают доступ? Все пользователи ко всем репозиториям?
    • 0
      После инсталляции доступ к репозиториям имеет только системный пользователь trac. Реальные пользователи добавляются из админки веб-интерфейса. Там же создаются рабочие репозитории и назначаются права пользователей на них.
      • 0
        >Реальные пользователи добавляются из админки веб-интерфейса

        Пользователи чего? Репозитория или трака?
  • 0
    Пользователь добавляется в Trac в разделе управления аккаунтами. Если ему нужен доступ к gitolite, то с таким же логином в разделе управления репозиториями загружается его публичный ключ. После этого уже можно ему назначать права на репозитории.

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