3 июня 2009 г.

Установка Redmine на FreeBSD 7.2, используя apache, mod_rails и postgres sql

Разобравшись с git сервером и GUI клиентами в прошлой статье, я обещал рассмотреть установку GitPlugin для Trac (пользуюсь давно, все устраивало, когда был SVN). Но сейчас меня смутили несколько вещей:
1. Trac не поддерживает git из коробки (реализован в виде плагина, что не есть уже хорошо).
2. Trac хорош для одного крупного проекта (для запуска дополнительного надо много телодвижений), а мы хотим построить СКВ для многих проектов.
3. В trac нет русификации, а она желательна (возможен доступ пользователей программ для создания задач или сообщений о багах).
4. В trac нет удобной системы распределения прав (есть конечно дополнительные пакеты, но если все это сложить, получается уж очень громоздко).

Поэтому я решил поискать систему, которая бы меня устраивала.
И я ее нашел, redmine. Он написан на Ruby, поддерживает кучу баз данных, есть русский язык, лишен всех недостатков перечисленных выше, самое главное, поддерживает git "из коробки"!

Краткий обзор возможностей отсюда:

* Поддержка нескольких проектов в одной базе данных;
* Гибкая система настройки пользовательских прав доступа;
* Гибкая система тикетов и заданий;
* Поддержка календаря и графиков Гантта
* Поддержка файлового архива, документация и новостных лент по проекту
* Сквозное логирование событий в системе и поддержка отсылки на еmail
* Встроенная система Wiki по проекту
* Встроенная система форумов по проекту
* Простая система учета времени
* Возможность добавлять произвольные пользовательские поля к проектам, заданиям и пользователям
* Интеграция с системами контроля версий (SVN, CVS, Mercurial, Bazaar and Darcs)
* Поддержка LDAP авторизации
* Поддержка регистрации пользователей
* Мультиязычность (Русский и Украинский присутствуют)
* Поддержка различных баз данных


Дополню, что git тоже поддерживается.

Начнем.

Системе 3 года, но уже информации по ней много, все хвалят, соответственно в поиске можно найти много мануалов по установке прямо под вашу систему.
Но мы пройдем этот путь заново :)
Считаем, что apache2 и postgres 8.3 уже установлен.

Следуем официальному руководству по установке:

1. Проверяем и устанавливаем необходимые пакеты:
  1. #ruby --version  
  2. ruby 1.8.7 (2007-03-13 patchlevel 0) [i386-freebsd7]  
  3. #cd /usr/ports/www/rubygem-rails  
  4. #make clean install  

Этот пакет содержит все компоненты, которые необходимы для запуска Ruby On Rails (собственно, на котором и написан redmine).
Таблицу с необходимыми версиями смотрим здесь.

У меня с портами REALEASE-7.2 встала версия 2.3.2
  1. #cd /usr/ports/converters/ruby-iconv  
  2. #make clean install  

2. Скачиваем стабильную ветку:
  1. #wget http://rubyforge.org/frs/download.php/56909/redmine-0.8.4.tar.gz  
  2. #tar -zxvf redmine-0.8.4.tar.gz  

3. Конфигурируем базу данных.
Добавляем пользователя redmine в базу данных postgres:
  1. #su pgsql  
  2. $createuser redmine -–no-superuser -–no-createdb -–no-createrole -–login –-pwprompt -–encrypted  
  3. $createdb --owner=redmine --encoding=utf-8 redmine  
  4. $exit  

Редактируем pg_hba.conf при необходимости.

Копируем ~/redmine-0.8.4/config/database.yml.example в ~/redmine-0.8.4/config/database.yml и редактируем:
  1. production:  
  2.   adapter: postgresql  
  3.   database: redmine  
  4.   host: localhost  
  5.   username: redmine  
  6.   password: password  
  7.   encoding: utf8  

Заполняем базу данных схемой Redmine, выполнив команду в директории redmine-0.8.4:
  1. #rake db:migrate RAILS_ENV="production"  

Загружаем первоначальную конфигурацию Redmine:
  1. #rake redmine:load_default_data RAILS_ENV="production"  

4. Устанавливаем права.
Пользователь www должен иметь право писать в директории files, log, tmp.
  1. #cd redmine-0.8.4  
  2. #chown -R www:www files log tmp public/plugin_assets  
  3. #chmod -R 755 files log tmp public/plugin_assets  

5. Пробный запуск.
  1. #sudo -u www ruby script/server webrick -e production  

Переходим по адресу http://SERVER:3000/, все должно работать.
Можно залогиниться от admin, пароль admin.

Примеры настройки smtp сервера здесь.

6. Связываем apache и Redmine.
Есть официальное how to.

Мне оно не понравилось, использует CGI, в общем все кисло :)
Гораздо более интересно решение "Настройка Redmine на работу через apache and mongrel_cluster по HTTPS", изначально подсмотренное здесь.
Предлагается использовать mongrel в качестве бэкенда к серверу apache.
Mongrel является HTTP-сервером и библиотекой на Ruby, которая предназначена для хостинга разнообразных веб-приложений написанных на языке программирования Ruby, используя HTTP протокол, а не FastCGI или SCGI.
Вот это уже гораздо интересней. Тем более https.

Но я решил пойти немного другим путем, установкой Phusion Passenger (aka mod_rails).
  1. # cd /usr/ports/www/rubygem-passenger  
  2. # make clean install  

Настраиваем апач:

Доступные настройки mod_rails:
* RailsEnv - задает среду выполнения приложения. Значение по умолчанию: production.
* RailsBaseURI - задает директорию, в которую размещается приложение. По этому адресу должна находиться директория public приложения.
* RailsRuby - задает интерпретатор, который будет использован для выполнения приложения. Имеет смысл, если у Вас установлено несколько интерпретаторов Руби.
* RailsMaxPoolSize - максимальное количество запущенных экземпляров приложения. Оптимально значение зависит от конфигурации системы. Значение по умолчанию: 20.
* RailsPoolIdleTime - максимальное время бездействия экземпляра приложения в секундах. По истечении этого времени экземпляр приложения будет остановлен для экономии памяти. Разработчики рекомендуют в качестве оптимального значения 2*x, где x - время, которое пользователь тратит на просмотр страницы. Значение по умолчанию: 120.

Настроен апач примерно так.
Создаем сертификаты.

А потом настраиваем секьюрный хост:
  1. SSLCipherSuite HIGH:MEDIUM:!aNULL:+SHA1:+MD5:+HIGH:+MEDIUM  
  2. SSLMutex file:/usr/local/etc/apache22/logs/ssl_mutex  
  3. SSLSessionCache shm:/usr/local/etc/apache22/logs/ssl_cache_shm  
  4. SSLSessionCacheTimeout 600  
  5.   
  6. <ifmodule mime.c="">  
  7.     AddType application/x-x509-ca-cert      .crt  
  8.     AddType application/x-pkcs7-crl         .crl  
  9. </ifmodule>  
  10.   
  11. SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0  
  12.   
  13. NameVirtualHost *:80  
  14.   
  15. LoadModule passenger_module /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.2/ext/apache2/mod_passenger.so  
  16. PassengerRoot /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.2  
  17. PassengerRuby /usr/local/bin/ruby18  
  18.   
  19. PassengerDefaultUser www  
  20. PassengerMaxPoolSize 1  
  21. PassengerUseGlobalQueue on  
  22. PassengerMaxInstancesPerApp 1  
  23.   
  24. <virtualhost *:80="">  
  25.     ServerName SERVER  
  26.       
  27.     ErrorLog etc/apache22/logs/httpd-redmine.log  
  28.   
  29.     RewriteEngine On  
  30.     Options +FollowSymlinks  
  31.     RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=permanent]  
  32. </virtualhost>  
  33.         
  34. <virtualhost *:443="">  
  35. RailsEnv production  
  36. ServerName SERVER  
  37.   
  38. SSLEngine on  
  39. SSLVerifyClient none  
  40. SSLCertificateFile etc/apache22/keys/new.crt  
  41. SSLCertificateKeyFile etc/apache22/keys/new.key  
  42. SSLCACertificateFile etc/apache22/keys/cacert.pem  
  43. SSLProtocol all -SSLv2  
  44. DocumentRoot /tank/redmine/redmine-0.8.4/public  
  45. ErrorLog etc/apache22/logs/httpsd-redmine.log  
  46.   
  47. <directory tank="" redmine="" redmine-0.8.4="" public="">  
  48.     Options FollowSymLinks  
  49.     AllowOverride None  
  50.     SSLOptions +StdEnvVars  
  51.     Order allow,deny  
  52.     Allow from all  
  53. </directory>  
  54. </virtualhost>  

Проверяем конфигурацию apache:
  1. #/usr/local/etc/rc.d/apache22 configtest  

Стартуем и может быть получаем ошибку
  1. Error message:  
  2.     No such file or directory - /nonexistent  
  3. Exception class:  
  4.     Errno::ENOENT  

если у нашего пользователя www нет домашней директории. Решается это так:

Покопавшись немного обнаружил, что проблема вызвана конфликтом Passenger и gem и исправляется внесением изменений в файл rubygems.rb в метод self.set_paths.
Необходимо заменить код

# only create by matching user
next if Etc.getpwuid.uid != File::Stat.new(Gem.user_home).uid

на:

# only create by matching user
home_folder_uid = File::Stat.new(Gem.user_home).uid rescue nil
next if Etc.getpwuid.uid != home_folder_uid

Файл находится здесь /usr/local/lib/ruby/site_ruby/1.8/rubygems.rb .

Перезапускаем апач, http://SERVER (должен выполниться редирект на https://SERVER).

Настройка самого redmine через веб-интерфейс интуитивно понятна, удачи!



PS. Кстати, напоследок линк: Git User's Manual

6 комментариев:

  1. а почемун не попробовать nginx

    ОтветитьУдалить
  2. В таком случае придется выбирать между cgi на nginx, или бек WEBRick + фронт nginx, или бек mongrel_cluster + фронт nginx. И для чего этот зоопарк? Скажите, чем апач хуже?

    ОтветитьУдалить
  3. Да, ="" - в конифигах не нужно, эту блоггер зачем-то добавляет.

    ОтветитьУдалить
  4. спасибо статья оказалась полезной

    ОтветитьУдалить
  5. Респект! Отжигаешь по полной!
    Killich

    ОтветитьУдалить
  6. да уж, ребята, webrick-у самое место на production окружении....

    ОтветитьУдалить