28 июня 2012

Установка Redmine на CentOS 6.2 (Часть 3)


Продолжение статьи об установке Redmine на сервер под управлением CentOS 6.2. Первую часть вы можете прочитать здесь, вторую часть - здесь.
В этой части мы всё таки доберемся до установки самого Redmine, http-сервера Apache и модуля Passenger, а так же сделаем нужные настройки для полноценной работы всей связки установленных пакетов.
Поехали...

    Содержание:
  1. Проверка текущей версии CentOS.
  2. Подготовка к установке. Установка дополнительных пакетов.
  3. Установка Ruby.
  4. Установка RubyGems.
  5. Установка Rails.
  6. Установка Extra Packages for Enterprise Linux 6 (EPEL).
  7. Установка MySQL.
  8. Конфигурация MySQL.
  9. Первый запуск MySQL.
  10. Создание пароля для root и удаление анонимного подключения к MySQL.
  11. Создание базы данных и пользователя для Redmine.
  12. Установка автоматического запуска MySQL.
  13. Установка ImageMagick.
  14. Установка поддержки шрифтов TrueType.
  15. Установка RMagick.
  16. Установка Redmine.
  17. Установка Apache.
  18. Начальная настройка Redmine.
  19. Установка модуля MySQL для подключения через Ruby.
  20. Настройка файла configuration.yml.
  21. Установка Passenger.
  22. Подключение и настройка модуля Passenger к Apache.
  23. Изменение конфигурации, если используется SELinux.
  24. Запуск Apache и установка его автозагрузки.

16. Установка Redmine.


Скачиваем дистрибутив Redmine версии 2.0.3 с сайта http://rubyforge.org/frs/?group_id=1850.
[root@loginsrv src]# cd ~ebabenko/data/distrib/redmine
[root@loginsrv redmine]# wget http://rubyforge.org/frs/download.php/76259/redmine-2.0.3.tar.gz

[...skipped...]

[root@loginsrv redmine]# cd /var/lib
[root@loginsrv lib]# cp ~ebabenko/data/distrib/redmine/redmine-2.0.3.tar.gz .
[root@loginsrv lib]# tar zxvf redmine-2.0.3.tar.gz

[...skipped...]

[root@loginsrv lib]# rm redmine-2.0.3.tar.gz
rm: remove regular file `redmine-2.0.3.tar.gz'? y
[root@loginsrv lib]# mv redmine-2.0.3 redmine

17. Установка Apache.

[root@loginsrv lib]# yum install httpd httpd-devel

[...skipped...]

Total download size: 1.6 M
Is this ok [y/N]: y

[...skipped...]

Installed:
  httpd-devel.x86_64 0:2.2.15-15.el6.centos.1

Dependency Installed:
  apr-devel.x86_64 0:1.3.9-5.el6_2
  apr-util-devel.x86_64 0:1.3.9-3.el6_0.1
  expat-devel.x86_64 0:2.0.1-11.el6_2

Updated:
  httpd.x86_64 0:2.2.15-15.el6.centos.1

Dependency Updated:
  apr.x86_64 0:1.3.9-5.el6_2
  expat.x86_64 0:2.0.1-11.el6_2
  httpd-tools.x86_64 0:2.2.15-15.el6.centos.1

Complete!

18. Начальная настройка Redmine.

[root@loginsrv lib]# pwd
/var/lib
[root@loginsrv lib]# chown -R apache:apache redmine
Конфигурируем database.yml.
[root@loginsrv lib]# cd redmine/config
[root@loginsrv config]# cp database.yml.example database.yml
[root@loginsrv config]# vi database.yml
Использоваться будет только одна конфигурация - production. Поэтому приводим соответствующую секцию к следующему виду:
production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  password: RedMinePasswd
  encoding: utf8
Если требуется использовать и другие конфигурации, другие секции этого файла так же требуется привести к подобному виду (а так же не забыть под каждую из них создать соответствующих пользователей и БД в MySQL).
Создаём токен.
[root@loginsrv config]# cd ../
[root@loginsrv redmine]# gem install bundler
Successfully installed bundler-1.1.4
1 gem installed
Installing ri documentation for bundler-1.1.4...
Installing RDoc documentation for bundler-1.1.4...
[root@loginsrv redmine]# bundle install --without development test postgresql sqlite

[...skipped...]

[root@loginsrv redmine]# rake generate_session_store

Note: The rake task generate_session_store has been deprecated, please use the replacement version generate_secret_token
[root@loginsrv redmine]# rake generate_secret_token
[root@loginsrv redmine]# ls config/initializers/secret_token.rb
config/initializers/secret_token.rb

19. Установка модуля MySQL для подключения через Ruby.

[root@loginsrv redmine]# gem install mysql
Fetching: mysql-2.8.1.gem (100%)
Building native extensions.  This could take a while...
Successfully installed mysql-2.8.1
1 gem installed
Installing ri documentation for mysql-2.8.1...
Installing RDoc documentation for mysql-2.8.1...
[root@loginsrv redmine]# whereis ruby
ruby: /usr/local/bin/ruby /usr/local/lib/ruby
[root@loginsrv redmine]# cd /usr/local/lib/ruby/gems/1.9.1/gems/mysql-2.8.1
[root@loginsrv mysql-2.8.1]# whereis mysql_config
mysql_config: /usr/bin/mysql_config /usr/share/man/man1/mysql_config.1.gz
[root@loginsrv mysql-2.8.1]# ruby ext/mysql_api/extconf.rb --with-mysql-config=/usr/bin/mysql_config
checking for mysql_ssl_set()... yes
checking for rb_str_set_len()... yes
checking for rb_thread_start_timer()... no
checking for mysql.h... yes
ext/mysql_api/extconf.rb:67: Use RbConfig instead of obsolete and deprecated Config.
creating Makefile
[root@loginsrv mysql-2.8.1]# make
linking shared-object mysql_api.so
gcc: mysql.o: No such file or directory
make: *** [mysql_api.so] Error 1
К этому моменту, я уже переставал понимать что происходит и думал, когда же уже установится этот злосчастный Redmine. Поэтому долго париться на счет ошибки не стал: откуда взялась, почему криво сконфигурировалась. Просто "забил болт" и отредактировал Makefile следующим образом:
[root@loginsrv mysql-2.8.1]# vi Makefile
[...skipped...]

SRCS = mysql.c
OBJS = $(srcdir)/mysql.o

[...skipped...]
Собираем и устанавливаем.
[root@loginsrv mysql-2.8.1]# make
linking shared-object mysql_api.so
[root@loginsrv mysql-2.8.1]# make install
/usr/bin/install -c -m 0755 mysql_api.so /usr/local/lib/ruby/site_ruby/1.9.1/x86_64-linux
installing default mysql_api libraries
[root@loginsrv mysql-2.8.1]# cd /var/lib/redmine/lib
[root@loginsrv lib]# ln -s /usr/local/lib/ruby/gems/1.9.1/gems/mysql-2.8.1/lib/mysql.rb
[root@loginsrv lib]# cd ../
[root@loginsrv redmine]# rake db:migrate RAILS_ENV=production

[...skipped...]

[root@loginsrv redmine]# rake redmine:load_default_data RAILS_ENV=production

Select language: ar, bg, bs, ca, cs, da, de, el, en, en-GB, es, et, eu, fa, fi, fr, gl, he, hr, hu, id, it, ja, ko, lt, lv, mk, mn, nl, no, pl, pt, pt-BR, ro, ru, sk, sl, sq, sr, sr-YU, sv, th, tr, uk, vi, zh, zh-TW [en] ru
====================================
Default configuration data loaded.

20. Настройка файла configuration.yml.

[root@loginsrv redmine]# cd config
[root@loginsrv config]# cp configuration.yml.example configuration.yml
[root@loginsrv config]# vi configuration.yml
Найдите следующую запись и отредактируйте её в соответствии с вашими параметрами и предпочтениями.
# default configuration options for all environments
default:
  # Outgoing emails configuration (see examples above)
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      address: smtp.example.net
      port: 25
      domain: example.net
      authentication: :login
      user_name: "redmine@example.net"
      password: "redmine"
В начале файла приводится список различных примеров конфигураций. Я настроил на собственный ящик в GMail.
production:
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      tls: true
      enable_starttls_auto: true
      address: "smtp.gmail.com"
      port: 587
      domain: "smtp.gmail.com"
      authentication: :plain
      user_name: "patttern@gmail.com"
      password: "****"

21. Установка Passenger.

[root@loginsrv config]# cd /usr/local/src
[root@loginsrv src]# gem install passenger
Fetching: fastthread-1.0.7.gem (100%)
Building native extensions.  This could take a while...
Fetching: daemon_controller-1.0.0.gem (100%)
Fetching: passenger-3.0.13.gem (100%)
Successfully installed fastthread-1.0.7
Successfully installed daemon_controller-1.0.0
Successfully installed passenger-3.0.13
3 gems installed
Installing ri documentation for fastthread-1.0.7...
Installing ri documentation for daemon_controller-1.0.0...
Installing ri documentation for passenger-3.0.13...
Installing RDoc documentation for fastthread-1.0.7...
Installing RDoc documentation for daemon_controller-1.0.0...
Installing RDoc documentation for passenger-3.0.13...
[root@loginsrv src]# yum install curl-devel

[...skipped...]

Total download size: 598 k
Is this ok [y/N]: y

[...skipped...]

Updated:
  libcurl-devel.x86_64 0:7.19.7-26.el6_2.4

Dependency Updated:
  curl.x86_64 0:7.19.7-26.el6_2.4
  libcurl.x86_64 0:7.19.7-26.el6_2.4

Complete!
[root@loginsrv src]# passenger-install-apache2-module
Welcome to the Phusion Passenger Apache 2 module installer, v3.0.13.

This installer will guide you through the entire installation process. It
shouldn't take more than 3 minutes in total.

Here's what you can expect from the installation process:

 1. The Apache 2 module will be installed for you.
 2. You'll learn how to configure Apache.
 3. You'll learn how to deploy a Ruby on Rails application.

Don't worry if anything goes wrong. This installer will advise you on how to
solve any problems.

Press Enter to continue, or Ctrl-C to abort.
1

--------------------------------------------

Checking for required software...

[...skipped...]

--------------------------------------------
Compiling and installing Apache 2 module...

[...skipped...]

--------------------------------------------
The Apache 2 module was successfully installed.

Please edit your Apache configuration file, and add these lines:

   LoadModule passenger_module /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.13/ext/apache2/mod_passenger.so
   PassengerRoot /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.13
   PassengerRuby /usr/local/bin/ruby

After you restart Apache, you are ready to deploy any number of Ruby on Rails
applications on Apache, without any further Ruby on Rails-specific
configuration!

Press ENTER to continue.


--------------------------------------------
Deploying a Ruby on Rails application: an example

Suppose you have a Rails application in /somewhere. Add a virtual host to your
Apache configuration file and set its DocumentRoot to /somewhere/public:

   <VirtualHost *:80>
      ServerName www.yourhost.com
      # !!! Be sure to point DocumentRoot to 'public'!
      DocumentRoot /somewhere/public
      <Directory /somewhere/public>
         # This relaxes Apache security settings.
         AllowOverride all
         # MultiViews must be turned off.
         Options -MultiViews
      </Directory>
   </VirtualHost>

And that's it! You may also want to check the Users Guide for security and
optimization tips, troubleshooting and other useful information:

  /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.13/doc/Users guide Apache.html

Enjoy Phusion Passenger, a product of Phusion (www.phusion.nl) :-)
http://www.modrails.com/

Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.

22. Подключение и настройка модуля Passenger к Apache.


Для начала требуется создать файл конфигурации Passenger для Apache с содержимым, которое было объявлено при установке модуля + дополнительные настройки, которые я тупо скопировал с источника [1] (если вам требуется).
[root@loginsrv src]# vi /etc/httpd/conf.d/passenger.conf
# Pathes from passenger-install-apache2-module
LoadModule passenger_module /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.13/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.13
PassengerRuby /usr/local/bin/ruby

# Remove HTTP Headers
Header always unset "X-Powered-By"
Header always unset "X-Rack-Cache"
Header always unset "X-Content-Digest"
Header always unset "X-Runtime"

# Tuning of Passenger
PassengerMaxPoolSize 20
PassengerMaxInstancesPerApp 4
PassengerPoolIdleTime 3600
PassengerUseGlobalQueue on
PassengerHighPerformance on
PassengerStatThrottleRate 10
RailsSpawnMethod smart
RailsAppSpawnerIdleTime 86400
RailsFrameworkSpawnerIdleTime 0

# ServerName Host:Port
ServerName bt.esphere.ru:80
Правим конфигурационный файл Apache.
[root@loginsrv src]# vi /etc/httpd/conf/httpd.conf
Добавляем в конец файла следующие строки.
<VirtualHost *:80>
    ServerName bt.esphere.ru
    DocumentRoot /var/www/html
    RailsEnv production
    RailsBaseURI /redmine
</VirtualHost>
Опция "RailsEnv production" используется опционально. Если вы планируете использовать несколько концигураций, этот параметр можно опустить (или закомментировать). Создаем симлинк на Redmine.
[root@loginsrv src]# ln -s /var/lib/redmine/public /var/www/html/redmine

23. Изменение конфигурации, если используется SELinux.

[root@loginsrv src]# passenger-config --root
/usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.13
[root@loginsrv src]# chcon -R -h -t httpd_sys_content_t /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.13
[root@loginsrv src]# vi /etc/selinux/config
Параметр
SELINUX=enforcing
меняем на
SELINUX=disabled
Останавливаем и отключаем firewall.
[root@loginsrv src]# /etc/rc.d/init.d/iptables stop
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Setting chains to policy ACCEPT: nat filter      [  OK  ]
iptables: Unloading modules:                               [  OK  ]
[root@loginsrv src]# /sbin/chkconfig iptables off

24. Запуск Apache и установка его автозагрузки.

[root@loginsrv src]# /etc/init.d/httpd start
Starting httpd:                                            [  OK  ]
[root@loginsrv src]# /sbin/chkconfig httpd on
[root@loginsrv src]# /sbin/chkconfig --list httpd
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
Если ваши нервы выдержали и вы провели все операции от начала и до текущего момента, то в результате по переходу по адресу вашего сервера (в моём случае это адрес http://bt.esphere.ru/redmine) вы должны увидеть главную страницу Redmine. У меня, к сожалению, такого чуда не произошло. Вместо желаемой страницы, я получал список файлов директории redmine.
Я решил перезапустить сервер полностью, чтобы облегчить мозг сервера после таких истязательств, а после уже приступить к поиску проблемы. Однако, после перезапуска как по мановению волшебной палочки, Redmine поднялся.

Спасибо всем, кто осилил данный мануал до конца.
При использовании всего или части содержимого, не забывайте указывать ссылку на источник, то есть на мой блог.

Источники, использованные при написании статьи:
[1] http://kk-openam.blogspot.com/2012/05/redmine.html
[2] http://blog.whatgeek.com.pt/2011/11/install-core-fonts-centos-6/
[3] http://www.redmine.org/projects/redmine/wiki/RedmineInstall

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

  1. Анонимный18 июля, 2012 15:47

    Спасибо за труд, внесу некоторые поправки. После всего сделанного по вашей инструкции, возникла ошибка в Ruby, вернее он начал ругаться на БД. В пункте создания БД на мускуле немного не те команды нужно использовать. Вот те, что использовал я:
    create database redmine character set utf8;
    create user 'redmine'@'localhost' identified by 'my_password';
    grant all privileges on redmine.* to 'redmine'@'localhost';
    После него редмайн стал сразу. И еще. Не отключайте фаервол. Лучше просто открыть 80 порт

    ОтветитьУдалить
    Ответы
    1. Спасибо за замечание. Однако, вводимые запросы SQL, которые я описал выше, у меня прошли безошибочно. Осмелюсь предположить, что это какая то тонкость самого MySQL сервера. Ваш запрос то же является абсолютно правильным. У меня он чуть развернутый.
      Что касательно firewall - полностью с Вами согласен, отключать его не нужно. Но описывать правильность его настройки у меня в данной статье как таковой задачей не ставилось. К тому же сервер, на котором я производил эксперименты уже стоит за корпоративным firewall'ом, собственно именно поэтому я посчитал что дополнительный фаервол мне просто будет мешаться.

      Удалить
  2. Егор, отличная статья, спасибо. Единственная проблема, котрая не дает насладиться )) Редмайн, это несостыковка его с гит плагинами для управления gitolite. Так и не смог на свежих версиях Редмайн добиться их работы. Есть ли у Вас успешные решения в этой области?

    ОтветитьУдалить
    Ответы
    1. Спасибо за Ваш отзыв!
      С плагинами для Redmine 1.* для версии Redmine 2.* - известная проблема. Мне требовалось подрубить плагин, чтобы Redmine авторизовывался к SSO (OpenAM) серверу. За основу взял плагин JOSSO для Redmine, но как понятно, он просто напросто не заработал. После перелопачивания ответов от гугла на момент как лечить плагины, нашел решение. И проблема эта связана с новой версией Rails, проще говоря, изменились методы. Почитав доку по Rails, нашёл отличия, каким образом можно исправить методы, чтобы плагин заработал. Сделал в 2-х файликах изменения, плагин запустился... но не заработал, потому что был предназначен для JOSSO, для OpenAM он не подходил в принципе. Попытался переписать этот плагин нужным образом, но дальше дело не пошло, так как я во первых не "рубист", во вторых этот таск был снят с моих задач (это была корпоративная задача). Собственно, успешным решением это назвать сложно. А другими плагинами я не занимался.

      Удалить
    2. Спасибо. Именно, проблема в том и у меня, что я не "рубист") Плагин работы Редмайн с Гитом нормально удалось запустить лишь для ветки 1.1.х Даже для 1.4 он практически не работоспособен, не говоря о версии 2, где новые "Рельсы". Точнее для 1.4 он установился и давал конфигурить, но часть страниц перестала работать, ака Профиля юзера. Всё это "к сожаленю", потому что иначе смысл в Редмайн для нашей компании полностью теряется. Либо оставаться на 1.1.х
      Но всё равно спасибо за труд и ответ.

      Удалить
  3. Анонимный20 июля, 2012 18:24

    Егор, в процессе работы с Редмайном возникла потребность интегрировать в его работу Subversion. Не занимались этим? Суть проблемы излагать сейчас не буду, дождусь вашего ответа.

    ОтветитьУдалить
    Ответы
    1. К сожалению нет. Мой опыт закончился на установке самого Redmine, после чего я передал права на управление. Никакие дополнительные плагины и настройки в нем я больше не производил.

      Удалить
    2. Спасибо!!! Как с этим разберусь, то по вашему желанию, поделюсь подробным мануалом, может кому-то пригодиться.

      Удалить
    3. Руслан.
      На сколько я вижу по спросам в интернете, данная тема достаточно востребованная. Поэтому, я бы с удовольствием почитал (и проэкспериментировал) ваш мануал.

      Удалить
  4. Сейчас занимался связкой, сделать все по автомату (проект - отдельный репозитарий)не вышло, перековырял и офф мануалы и документацию. Решено было создать одно узкоспециализированное хранилище под потребности компании. Сейчас данную весчь вынесу наверх, то бишь на боевые сервера, тогда и поделюсь документиком. himik_od_ua@mail.ru пришлите сюда пустое письмо, чтоб у меня была возможность вам ответить с файлом мануала. По данному вопросу разобрался насколько это возможно, так что обращайтесь, если будут вопросы

    ОтветитьУдалить
  5. Спасибо большое - повторил все досканально на vmware 9.0 + CentOS 6.3 естественно что некоторые пакеты уже изменились в версии и это надо просто подправлять в процессе и быть внимательным =) а так я получил ровно все что описано и сделал это за пару часов вникая. Спасибо за яростную экономию времени =)

    ОтветитьУдалить
    Ответы
    1. Alexandr Trohman, спасибо за ваш отзыв. Значит мои труды не прошли зря.

      Удалить
  6. а мочему mysql а не mysql2 - это имеет какое-то значение?

    ОтветитьУдалить
    Ответы
    1. В подробности данного вопроса не вникал, судя по всему mysql и mysql2 - это разные версии. В принципе, можете попробовать подключить через mysql, вдруг действительно получится.

      Удалить
    2. Сорри как всегда manual не читал ((, для ruby 1.9 - adapter must be set to mysql2

      Удалить
    3. Ну в принципе я действовал так же по методу "Если ничего не получилось - читаем маны" =) Потому и не смог ответить на вопрос. Правда изначально посмотрел таблицу required. Однако, про mysql не помню. Скорее всего это уже было тогда, когда я уже переставал понимать, что происходит и когда же в конце концов это всё установится.
      Спасибо за информацию.

      Удалить
  7. Анонимный17 ноября, 2012 07:58

    ОТЛИЧНЫЙ САМЫЙ ПОДРОБНЫЙ МАНУАЛ КОТОРЫЙ МОЖНО НАЙТИ! БЛАГОДАРЮ!

    ОтветитьУдалить
  8. Ура!!! Я сделал это! Хотя не сразу все срослось, но получилось! Автору уважение и почет. Спасибо за прекрасный пост! Только с селинуксом кажется немного схалтурил. Вроде начал создавать правила, но потом просто его отключил и iptables тоже. Так нельзя :)

    ОтветитьУдалить
    Ответы
    1. :))) Есть немного халтуры, согласен. Просто на тот момент, когда я дошёл до конфигурации правил, мне уже было не до настройки.

      Удалить
  9. По Вашей статье пытаюсь поставить на RHEL 6.3
    Версия ImageMagic - 6.8.1-10
    Возникли проблемы при установке rmagic 2.13.1
    checking for InitializeMagick() in -lMagickCore... no
    checking for InitializeMagick() in -lMagick... no
    checking for InitializeMagick() in -lMagick++... no
    Can't install RMagick 2.13.1. Can't find the ImageMagick library or one of the dependent libraries. Check the mkmf.log file for more detailed information.

    Способ решения:
    [root@redmine lib]# cd /usr/local/lib
    [root@redmine lib]# ln -s libMagick++-Q16.la libMagick++.la
    [root@redmine lib]# ln -s libMagick++-Q16.so.7.0.0 libMagick++.so
    [root@redmine lib]# ln -s libMagickCore-Q16.la libMagickCore.la
    [root@redmine lib]# ln -s libMagickCore-Q16.so.7.0.0 libMagickCore.so
    [root@redmine lib]# ln -s libMagickWand-Q16.la libMagickWand.la
    [root@redmine lib]# ln -s libMagickWand-Q16.so.7.0.0 libMagickWand.so

    Разместите пожалуйста в блоге. Я сам потратил час на поиски решения.

    ОтветитьУдалить
    Ответы
    1. Спасибо, Денис, за комментарий.
      Времена меняются и меняются критерии установки. То что написано в статье было справделиво для тех версий, которые указаны во время установки. На текущий момент, ситуация изменилась. Я, устанавливая буквально неделю назад Redmine (а он уже подрос до версии 2.2.1), так же столкнулся с такой проблемой. Однако, данный вопрос решается немного проще. Вместо создания симлинков, нужно выполнить
      $ sudo yum install ImageMagick-devel
      Данная статья (все 3 части) останутся не изменными. Сейчас подготавливается статья с дополнениями к этой статье, куда и будет внесена данная поправка.

      Удалить
    2. Размещать или нет - дело хозяйское.
      Уже 2.2.2 (её и ставим)
      А Вы не пробовали использовать БД Postgreesql или Oracle? Для корпоративных целей. Я думаю, что читателям тоже было бы интересно почитать про такие связки.

      Удалить