· redmine git git_hosting uwsgi systemd

Redmine + Git hosting - делаем замену GitLab

Довольно продолжительное время я использовал GitLab для своих проектов. Все было хорошо ровно до тех пор, пока мониторинг не начал ругаться на использование RAM и CPU в простое. Шутка ли - когда никто и ничего не делает (даже боты не пытаются скрейпить) - стабильно занято 15% CPU и почти 3 ГБайт RAM.

Был период скитаний, в течение которого я испробовал и Gitea/Gogs, и полный стек Atlassian (Bitbucket Server + JIRA + Confluence + Bamboo) и даже Phabricator. Первый впечатлил очень маленьким потреблением ресурсов, но он не давал создавать подзадачи, второе же… В общем, оно хотело слишком много ресурсов (минимум 10 ГБайт) на старте. Потому что Java :). Третье вообще “ни то, ни се” - фич вроде много, но они либо недопилены, либо нету по ним нормальных доков.

В итоге одним прекрасным вечером я вспомнил про Redmine и его плагин redmine_git_hosting, который вполне может обеспечить нужную мне функциональность простого и легкого управления git-репозиториями, сохраняя при этом фичи Redmine (проекты с подпроектами, диаграмма Ганнта, задачи с подзадачами и WYSIWYG с плагином CKEditor). В итоге решил установить эту связку.

Стоит упомянуть, что это не первое мое использование Redmine с плагином redmine_git_hosting, так что опыт по установке уже был. Да и расписывать установку Redmine я тут не буду, так как гайдов в интернете и на официальном сайте полно. Единственное - дам пару советов.

Системный ruby

Конечно, много кто скажет, что системный ruby лучше не использовать, прилетит апдейт и все сломается и т.д. и т.п. Нет, не сломается, потому что я использую Debian :). А вообще, если все-таки есть желание использовать системную версию Ruby, то обязательно в конфиге своего шелла (это может быть ~/.bashrc или ~/.zshrc или вообще в ~/.profile) экспортируйте переменную GEM_HOME, которая указывает путь до гемов, которые будет устанавливать bundler. Это необходимо сделать до установки Redmine.

Первичная настройка redmine_git_hosting

После того, как вы выполните первичную настройку, не пугайтесь того, что у вас может ничего не заработать. Мне помогло создание файла settings.yml с первоначальными настройками и его импорт в Redmine. Первое - сам конфиг:

gitolite_user: git
gitolite_ssh_private_key: "/home/redmine/gitolite"
gitolite_ssh_public_key: "/home/redmine/gitolite.pub"
gitolite_hooks_url: "https://example.com"
ssh_server_domain: "example.com"
http_server_domain: "example.com"
https_server_domain: "example.com"

Исправьте example.com на свой домен.

В случае необходимости в ssh_server_domain можно использовать порт. Это полезно, когда Redmine и веб-сервер разделены по разным виртуалкам за NAT и мы можете спроксировать SSH порт.

Убедитесь, что ключи, указанные в *_key параметрах существуют и у Redmine есть к ним доступ.

После этого даем команду:

RAILS_ENV=production rake redmine_git_hosting:update_settings

uwsgi

Первично я использовал uwsgi в качестве запускатора Redmine. Он (uwsgi) слушал порт по HTTP, а веб-сервер проксировал в него запросы. Однако в бою я отказался от этого и использую чистый systemd (см. ниже).

Конфиг uwsgi:

[uwsgi]
master = true
lazy = true
processes = 2 
uid = redmine
gid = redmine
env = RAILS_ENV=production
env = GEM_HOME=/home/redmine/.gem/
env = PATH=/bin:/usr/lib:/usr/lib/colorgcc/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/redmine/bin
chdir = /home/redmine/redmine
rack = /home/redmine/redmine/config.ru
http-modifier1 = 7
socket = 127.0.0.1:3000
#plugin = rack
plugin = /home/redmine/.gem/gems/uwsgi-2.0.17/ext/uwsgi/uwsgi.ruby

В чем самый сок этой конфигурации:

  1. Используется системный ruby. Для того, чтобы не засирать системные директории, экспортируется переменная GEM_HOME, которая используется для указания пути до гемов, которые устанавливает команды gem и bundler.

  2. Используется рубишный uwsgi плагин, который устанавливается через gem:

gem install uwsgi --no-doc --no-ri

В принципе, можно скопипастить, поправить под себя и использовать.

Контроль работы, эмпероры, супервизоры

supervisord

Для автоперезапуска в случае ахтунгов можно использовать supervisord со следующим конфигом, который надо положить в /etc/supervisor/conf.d/redmine.conf:

[program:redmine]
directory=/home/redmine
command=/home/redmine/.gem/bin/uwsgi --ini /home/redmine/uwsgi.ini
autostart=true
environment=GEM_HOME="/home/redmine/.gem"
user=redmine

systemd

Куда более простой способ контроля uwsgi - с помощью systemd. Точнее, даже не сколько простой, сколько более надежный, так как supervisord был замечен за зависаниями при перезапуске приложения. Конфиг для systemd:

[Unit]
Description=redmine
After=network.target

[Service]
ExecStart=/home/redmine/.gem/bin/uwsgi --ini /home/redmine/uwsgi.ini
User=redmine
Group=redmine
Environment=GEM_HOME=/home/redmine/.gem
Environment=PATH=${PATH}:${HOME}/bin

[Install]
WantedBy=multi-user.target

После проведения этих манипуляций и настроек в Redmine были перенесены все мои приватные проекты с задачами, переразбиты на подзадачи (как же мне этого не хватало!), в вики все данные редактируются в WYSIWYG редакторе, и Redmine начала пользоваться жена для своих проектов. А GitLab, между прочим, ей сильно не нравился :)

Кстати, после всего этого я прикрутил к Redmine еще и Jenkins в качестве CI, но это уже совсем другая история. Надеюсь, что не забуду написать про нее :).

  • LinkedIn
  • Tumblr
  • Reddit
  • Google+
  • Pinterest
  • Pocket