Redmine, действительно, обладает большими возможностями: управление несколькими проектами, отслеживание ошибок, интеграция с репозиториями, перекрёстные ссылки на исправленные баги в коммитах и на коммиты в баг-репортах, назначение разных ролей пользователей в каждом проекте и т.д. Однако процедура установки довольна сложна, а для некоторых очень полезных функций требуется небольшая доработка или использование плагинов. Надеюсь, что предлагаемое ниже руководство поможет желающим использовать Redmine в своих проектах.
Компоненты
Система управления проектами Redmine
> Официальный сайт
Основные возможности:
- ведение нескольких проектов
- система отслеживания событий (bug, feature)
- разные роли пользователей (менеджер, разработчик, репортер) по каждому проекту
- поддержка новостей, документов, файлов, wiki, форумов для каждого проекта
- интеграция с системами управления версиями (SVN, Git, Mercurial)
- уведомления о событиях по электронной почте
- возможность учёта времени работы
Система контроля версий Mercurial
> Официальный сайт
Кросс-платформенная распределённая система управления версиями.
Также понадобится
Web-сервер и система управления базами данных. Использованы Mysql и Apache.
Установка
Инструкция составлена на основе полезной, но сильно устаревшей инструкции
HowTo Install Redmine 1.2.x with Mercurial and Subversion on Ubuntu Server 10.04.
Также использовалась официальная инструкция по установке
Redmine Installation Guide.
Предполагаем что у нас уже есть сервер с предустановленным на нём Ubuntu Server 16.04. Дальнейшие инструкции описывают установку системы управления и вспомогательного ПО.
Итак, начнём. Сначала устанавливаем LAMP server:
$ sudo tasksel install lamp-server
Во время установки понадобится ввести пароль root-пользователя базы данных MySQL (не путать с паролем root операционной системы).
Создаём базу данных MySQL и пользователя redmine для работы с ней. Вместо [password] вставляем желаемый пароль пользователя.
$ mysql -u root -p
(вводим пароль root базы данных MySQL)
> create database redmine character set utf8;
> create user 'redmine'@'localhost' identified by '[password]';
> grant all privileges on redmine.* to 'redmine'@'localhost';
> exit
Скачиваем Redmine со страницы www.redmine.org/projects/redmine/wiki/Download или командой
$ wget http://www.redmine.org/releases/redmine-3.3.3.tar.gz
Распаковываем Redmine в каталог /usr/share/redmine. Находим подкаталог config и копируем config/database.yml.example в config/database.yml. После этого редактируем файл, для того чтобы установить «production» режим базы данных:
$ sudo cp /usr/share/redmine/config/database.yml.example /usr/share/redmine/config/database.yml
$ sudo nano /usr/share/redmine/config/database.yml
Вводим текст и сохраняем файл (ctrl+x):
production:
adapter: mysql2
database: redmine
host: localhost
username: redmine
password: "[password]"
encoding: utf8
Устанавливаем необходимые пакеты:
$ sudo apt install ruby ruby-dev build-essential libmysqlclient-dev
Устанавливаем Bundler:
$ gem install bundler
Теперь можно установить gems, необходимые для Redmine:
$ cd /usr/share/redmine
$ bundle install --without development test rmagick
Создаём случайный ключ, который Rails будет использовать для шифрования данных в cookie:
$ cd /usr/share/redmine
$ bundle exec rake generate_secret_token
Дальше создаём структуру базы данных (выполняем в /usr/share/redmine):
$ RAILS_ENV=production bundle exec rake db:migrate
$ RAILS_ENV=production bundle exec rake redmine:load_default_data
Устанавливаем необходимые права доступа:
$ cd /usr/share/redmine
$ sudo chown -R www-data:www-data files log tmp public/plugin_assets
$ sudo chmod -R 755 files log tmp public/plugin_assets
При желании можно протестировать установку Redmine с помощью веб-сервера WEBrick:
$ sudo -u www-data bundle exec rails server webrick -e production
После запуска WEBrick стартовая страница Redmine должна быть доступна в браузере по адресу
http://localhost:3000/
Интеграция с Apache
Установить Passenger:
$ sudo apt-get install libapache2-mod-passenger
Добавить символьную ссылку на public каталог Redmine:
$ sudo ln -s /usr/share/redmine/public /var/www/redmine
Необходимо настроить пользователя Passenger по умолчанию, для этого редактируем файл:
$ sudo nano /etc/apache2/mods-available/passenger.conf
Нужно добавить следующую строчку и сохранить (ctrl+x):
PassengerDefaultUser www-data
В итоге файл должен выглядеть так:
<IfModule mod_passenger.c>
PassengerRoot /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini
PassengerDefaultRuby /usr/bin/ruby
PassengerDefaultUser www-data
</IfModule>
Далее создать конфигурационный файл redmine.conf для apache:
$ sudo nano /etc/apache2/sites-available/redmine.conf
Добавить следующий текст и сохранить (ctrl+x):
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www
ServerName myservername
RewriteEngine on
RewriteRule ^/$ /redmine [R]
<Directory /var/www/redmine>
RailsBaseURI /redmine
PassengerResolveSymlinksInDocumentRoot on
</Directory>
ErrorLog /var/log/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/access.log combined
</VirtualHost>
Подключить модули Passenger и Rewite:
$ sudo a2enmod passenger
$ sudo a2enmod rewrite
Отключить default вебсайт и подключить redmine:
$ sudo a2dissite 000-default
$ sudo a2ensite redmine
Установить права доступа на /tmp/cache Redmine:
sudo chmod 777 /usr/share/redmine/tmp/cache
Перезапустить Apache:
$ sudo service apache2 reload
Теперь можно открыть любимый браузер и зайти на
http://[my site or ip]/redmine
или просто http://[my site or ip]
. Должна появиться стартовая страничка системы Redmine.Установка Mercurial
Необходимо установить пакеты:
$ sudo apt-get install mercurial libapache2-mod-perl2 libapache-dbi-perl libdbd-mysql-perl
Создать директорию, в которой будут храниться репозитории проектов:
$ sudo mkdir -p /var/hg/
Теперь мы хотим сделать репозитории доступными по http протоколу. Для этого необходимо создать cgi-скрипт:
$ sudo nano /var/hg/hgwebdir.cgi
Добавить следующий текст и сохранить:
#!/usr/bin/python
from mercurial import demandimport; demandimport.enable()
from mercurial.hgweb.hgwebdir_mod import hgwebdir
import mercurial.hgweb.wsgicgi as wsgicgi
application = hgwebdir('hgweb.config')
wsgicgi.launch(application)
Теперь нужно создать файл hgweb.config:
$ sudo nano /var/hg/hgweb.config
Добавить следующее содержимое и сохранить:
[paths]
/=/var/hg/**
[web]
allow_push = *
push_ssl = false
allowbz2 = yes
allowgz = yes
allowzip = yes
Установить разрешения для файлов:
$ sudo chown -R www-data:www-data /var/hg/*
$ sudo chmod gu+x /var/hg/hgwebdir.cgi
Теперь надо создать conf файл для Apache:
$ sudo nano /etc/apache2/conf-available/hg.conf
Добавить следующее содержимое и сохранить:
PerlLoadModule Apache2::Redmine
ScriptAliasMatch ^/hg/(.*) /var/hg/hgwebdir.cgi/$1
<Directory /var/hg>
Options +ExecCGI
</Directory>
<Location /hg>
AuthType Basic
AuthName "Mercurial"
Require valid-user
AuthUserFile /dev/null
#Redmine auth
PerlAccessHandler Apache::Authn::Redmine::access_handler
PerlAuthenHandler Apache::Authn::Redmine::authen_handler
RedmineDSN "DBI:mysql:database=redmine;host=127.0.0.1"
RedmineDbUser "redmine"
RedmineDbPass "[password]"
</Location>
Ещё необходимо создать ссылки:
$ sudo ln -s /etc/apache2/conf-available/hg.conf /etc/apache2/conf-enabled/
$ sudo ln -s /usr/share/redmine/extra/svn/Redmine.pm /usr/lib/x86_64-linux-gnu/perl5/5.22/Apache2/
Включить CGI модуль и перезапустить Apache:
$ sudo a2enmod cgi
$ sudo service apache2 reload
Репозитории будут доступны по адресам
http://[my site or ip]/hg/*
. Например, для проекта project адрес будет таким http://[my site or ip]/hg/project
. Если у проекта project будет подпроект subproject1, то его репозиторий будет доступен по адресу http://[my site or ip]/hg/project/subproject1
.Чтобы клонировать репозиторий надо будет выполнить:
$ hg clone http://[my site or ip]/hg/project
Если клонируемый проект не публичный (устанавливается в настройках проекта через веб-интерфейс системы Redmine), то потребуется ввести имя пользователя и пароль.
Авторизация осуществляется по проектам, т.е. доступ будет возможен только для участников проекта (менеджеры и разработчики).
При создании репозитория в веб-интерфейсе Redmine необходимо указать путь к нему, например /var/hg/projectname. Репозитории в /var/hg необходимо создать вручную для каждого проекта и инициализировать командой (
hg init
). После создания нового репозитория надо убедиться, что у него установлены нужные права доступа:
$ sudo chown -R www-data:www-data /var/hg/[repository name]
В принципе, есть возможность автоматизировать создание репозиториев. Информация об этом есть в руководстве по ссылке HowTo Install Redmine 1.2.x with Mercurial and Subversion on Ubuntu Server 10.04
Уведомления о фиксации изменений по email
Redmine поддерживает уведомления о разных событиях (изменениях в жизни баг/фич и т.п.). Для того чтобы пользоваться этим функционалом достаточно настроить способ отправки email-сообщений. Делается это в файле /usr/share/redmine/config/configuration.yml В файле имеются шаблоны для разных конфигураций. Нужно разкомментировать и отредактировать нужный.
Например, так:
email_delivery:
delivery_method: :smtp
smtp_settings:
address: "10.11.12.13"
port: 25
authentification: :none
enable_starttls_auto: false
openssl_verify_mode: 'none'
Обратите внимание, что каждая секция в файле configuration.yml сдвинута на два пробела. Это важно.
Базовые уведомления должны быть доступны после указания способа рассылки электронных писем. Однако для уведомлений об изменениях в репозитории необходимо использовать внешний плагин. Скачать его можно с сайта github.com/lpirl/redmine_diff_email.
Установим этот плагин. Для этого скопируем содержимое плагина в каталог /usr/share/redmine/plugins/redmine_diff_email. В соответствии с инструкцией по установке плагина изменяем файл /usr/share/redmine/app/views/repositories/_form.html.erb:
--- OLD
+++ NEW
@@ -23,6 +23,7 @@
<% button_disabled = ! @repository.class.scm_available %>
<%= repository_field_tags(f, @repository) %>
<% end %>
+<%= call_hook(:view_repository_form) %>
</div>
<p>
Оригинальный плагин работает с устаревшей версией redmine. Для redmine-3.3 нужно внести изменения в файл
/usr/share/redmine/plugins/redmine_diff_email/db/migrate/002_add_repositories_is_diff_email_attached.rb. Содержимое файла должно быть таким:
class AddRepositoriesIsDiffEmailAttached < ActiveRecord::Migration
def self.up
add_column :repositories, :is_diff_email_attached, :boolean, :default => false, :null => false
Repository.update_all(["is_diff_email_attached = ?", true])
Repository.update_all(["is_diff_email = ?", true])
end
def self.down
remove_column :repositories, :is_diff_email_attached
end
end
После этого в каталоге /usr/share/redmine выполнить команду для обновления базы данных:
bundle exec rake redmine:plugins:migrate RAILS_ENV=production
Перезапускаем Redmine:
$ sudo service apache2 reload
Если плагин установлен правильно, то в списке плагинов Administration > Plugins появится Redmine Diff Email Plugin, а также в веб-интерфейсе Redmine SomeProject > «Settings» Tab > «Repositories» Tab > «Edit» появятся настройки уведомлений.
Кроме того, чтобы информация об изменениях в репозиториях автоматически отслеживалась Redmine, необходимо выполнить дополнительные действия. Сначала нужно включить WS для управления репозиториями и сгенерировать API key. Как это делается:
* В web-интерфейсе Redmine в меню Administration выбрать Settings
* Перейти на вкладку Repositories
* Включить 'Enable WS for repository management'
* Кликнуть на ссылку 'Generate a key'
* Сохранить изменения кнопкой 'Save'
Далее создаём скрипт:
$ sudo nano /var/hg/fetch_changes
Добавляем следующий текст и сохраняем: (необходимо заменить [your API key] сгенерированным в API-ключом)
#!/bin/sh
curl "http://localhost/redmine/sys/fetch_changesets?key=[your API key]" > /dev/null 2>&1
Устанавливаем права доступа для созданного файла:
$ sudo chown www-data:www-data /var/hg/fetch_changes
$ sudo chmod ug+x /var/hg/fetch_changes
Остаётся добавить в /var/hg/hgweb.config секцию [hooks], чтобы скрипт fetch_changes выполнялся после каждого коммита:
[hooks]
changegroup = /var/hg/fetch_changes
Теперь при изменениях в репозитории Redmine будет автоматически отсылать уведомления участникам проекта.
Комментарии (12)
khanid
15.06.2017 20:47Кстати, а что там на ubuntu с selinux? Он есть? Просто на центос она прописался давно, вроде в дебиане 8 есть… А не учитывать его нельзя, т.к. он, например, вполне себе запрещает httpd почту отправлять. А без почты это неудобный инструмент.
И нужно что-то типа
sudo setsebool -P httpd_can_sendmail 1
чтобы не получать ошибки о невозможности отправки почты (да и вообще иметь возможность её отправлять).
rub_ak
15.06.2017 21:32+1Гугл подсказывает, что с версии 12.04 его по умолчанию нет. Ставиться отдельно.
casey
15.06.2017 23:21Ощущение что попал в прошлый век. Как насчет Docker, aws для отправки писем и s3 для хранения файлов? Будет стоит копейки зато куда дешевле быстрее в установке и эксплуатации.
moonug
16.06.2017 06:11+2Не знаю как у автора, но у нас, например, нет возможности выносить код за пределы внутренней сети. Потому никаких aws, s3 и похожего. Да, все на виртуалках, но еще один слой абстракции в виде докера не имеет особого смысла.
lleo_aha
16.06.2017 09:50nginx видимо тоже :)
moonug
16.06.2017 10:03Не совсем понял что имелось ввиду. В смысле, что nginx — тоже лишний слой? Ну для своего случая я так не считаю.
У меня другой набор: redmine/postgresql/unicorn/nginx + kallithea/mysql/rabbitmq/celery/nginx. В целом все работает прилично, даже обновлять почти не больно :).
lexaivanov
16.06.2017 09:05Поддержу, я даже опубликовал на Docker hub готовый образ redmine на базе alpine linux + unicorn в качестве сервера.
mmblsc
bitnami, готовые образы. поднял виртуалку и вперед
khanid
Это не вариант для тех, кто не доверяет сторонним готовым образам.