четверг, 12 марта 2009 г.

Redmine + Apache + Passenger + Subversion на примере Gentoo


Как ранее писал, решил я настроить себе subversion сервер с багтрекером Redmine. Для этого обзавёлся виртуальным выделенным сервером на 1GB.ru . В качестве операционной системы там установлен Gentoo 2008. Для запуска сайта на Ruby on Rails существует много возможных комбинаций серверов. Например, я пробовал Apache + proxy_balancer + Mongrel , просто Mongrel. Так же всевозможные замены Apache на альтернативные веб-сервера. Но посоветовавшись с админом форума http://rubyclub.com.ua/, пришел к тому, что буду использовать Apache + Passenger. Кстати, в сети не нашел какого-либо мануала про Redmine и эту связку, с чем связаны многие часы раздумий. Ну и для полного счастья, точнее для более быстрой работы Passenger устанавливал Ruby Enterprise Edition. Я не рассматриваю установку и настройку базы данных, т.к. у меня она стоит на мощностях хостинга, а не на моем vds. Цель поста - систематизировать свои знания, оставить себе шпаргалку, ну и показать некоторые нетривиальные места. Практически все собиралось из исходников, так что привязки  конкретно к Gentoo практически нет. Ну и как некоторый показатель - после изучения всех граблей, настройка сервера заняла часа 3-4, и то в связи с ограничением на ресурсы сервера.
Ну и собственно поехали. 1. Так как я все собирал из исходников, то для начала нужно зачистить систему от установленного apache, php, subversion (svn старая версия, лучше поновее). Но в начале сохраните файл /etc/init.d/svnserve . Он пригодится для запуска svn после установки из исходников. В Gentoo последовательно выполняем следующие команды ( php я не планирую использовать, поэтому и удаляю )
emerge -C php
emerge -C subversion
emerge -C apache
Подчищаем директории от не удалившихся файлов. Например у меня осталась папка /etc/apache с конфигами, ну и в /usr/lib/php5 остались модули. 2. Теперь проверим установленную версию rubygems, выполнив команду
gem env
У меня было  RUBYGEMS VERSION: 1.1.1 . Как оказалось, это было очень плохо. Когда я пытался установить гемы для ruby, на сервере происходило громадное выделение памяти, после чего программа аварийно завершалась из-за нехватки памяти. Так что обновится нужно, да и в требованиях к Redmine написано "RubyGems 1.3.1 is required". Выполняем следующее
emerge rubygems
3. Для сборки Ruby Enterprise Edition нам потребуется OpenSSL, так же он может пригодиться для настройки subversion ( это как душе угодно) и apache. Скачиваем с сайта нужную нам версию исходников (вам может не нужна прям последняя, всяко может быть), и распаковываем
wget http://www.openssl.org/source/openssl-0.9.8j.tar.gz
tar xzvf openssl-0.9.8j.tar.gz
Затем конфигурируем OpenSSL, компилируем, и устанавливаем
cd openssl-0.9.8j
./config shared
make
make install
Ну и нужно сказать системе где искать библиотеки от OpenSSL
echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
/sbin/ldconfig
4. На этом шаге установим apache. Берем исходники на этой странице. Скачиваем, распаковываем.
wget http://apache.rinet.ru/dist/httpd/httpd-2.2.11.tar.gz
tar xzvf httpd-2.2.11.tar.gz
Далее конфигурируем, указав путь до OpenSSL ( раз уж мы поставили OpenSSL, то почему бы не собрать все с поддержкой оного?), компилируем, и устанавливаем
cd httpd-2.2.11
./configure --prefix=/usr/local/apache2 --enable-mods-shared=all --enable-deflate  --enable-so --enable-ssl=shared --with-ssl=/usr/local/ssl
make
make install
Теперь нужно позаботиться о том, чтобы при старте системы запускался апач. Для этого копируем скрипт запуска апача, и добавляем его в список автозагрузки
cp /usr/local/apache2/bin/apachectl /etc/init.d/apachectl
chmod +x /etc/init.d/apachectl
rc-update add apachectl default
5. Настало время Ruby Enterprise Edition (ruby-ee). Важный момент - после установки ruby-ee у нас в системе будет два Ruby. Один общесистемный, зарытый в каталогах /usr или /var (не уточнял), и второй ruby-ee, который будет использоваться только в apache. Нужно учесть то, что при запуске скриптов/программ ruby из консоли (например gem install, rake....) , будет запускаться общесистемный Ruby. В дальнейшем при использовании Redmine для задач обслуживания ( вне apache) нужно указывать полный путь до ruby/gem/rake ( /opt/ruby-ee-186/bin/rake). Иначе система будет ругаться на не установленные компоненты. Другой вариант, это установить в общесистемный ruby эти компоненты командой
gem install rails -v=2.2.2
до установки ruby-ee. Берем последнюю версию от сюда . Скачиваем, распаковываем.
wget http://rubyforge.org/frs/download.php/51100/ruby-enterprise-1.8.6-20090201.tar.gz
tar xzvf ruby-enterprise-1.8.6-20090201.tar.gz
Важный момент: следующие действия лучше делать из консоли, а не из под запущенного Midnight Commander (если вдруг он у вас запущен). Я не разбирался почему, но при запущенном MC глобальные переменные не определялись. Ruby-ee попутно ставит "пакет" для Passenger и другие. Для нормальной установки нужно определить две глобальные переменные (набрав эти строки в консоли)
RUBYOPT=""
export APXS2=/usr/local/apache2/bin/apxs
Плюс еще одна возможная проблема. На Gentoo с ruby-enterprise-1.8.6-20090201 это проявляется точно. При компиляции возникают ошибки связанные с OpenSSL. Чтобы исправить это, нужно пропатчить три файла в папке ruby-enterprise-1.8.6-20090201\ruby-enterprise-1.8.6-20090201\source\ext\openssl\ как показано по ссылке . Вот теперь мы можем приступить к установке
./ruby-enterprise-1.8.6-20090201/installer
Во время установки появится вопрос "куда ставить?" Я ввел путь /opt/ruby-ee-186/ (далее некоторые настройки будут идти от этого пути). (update 9.07.2009) На данную дату вышла новая версия ruby on rails 2.2.3 . Ruby-ee ставит по умолчанию последнию версию. У меня при установке произошли ошибки. В итоге он не поставил ruby on rails. Так что даже если он и поставит, то после этого нужно выполнить следующую команду
/opt/ruby-ee-186/bin/gem install /opt/ruby-ee-186/bin/rails -v=2.2.2
После установки ruby-ee поставим Passenger.
/opt/ruby-ee-186/bin/passenger-install-apache2-module
К настройке работы apache и Passenger приступим после установки Redmine. 6. Сейчас установим Subversion. Можно конечно было поставить Redmine, но я хочу поставить его из репозитария, а для этого нужен subversion ( а мы его удалили на 1 шаге ). Скачиваем последнюю версию, разархивируем, ставим. Проблем возникнуть не должно.
wget http://subversion.tigris.org/downloads/subversion-1.5.6.tar.gz
tar xzvf subversion-1.5.6.tar.gz
cd subversion-1.5.6
./configure
make
make install
7. Теперь приступим к установке Redmine. Важный момент: при установке Файлы будем хранить в /home/www/redmine . Я не буду полностью описывать шаги установки, приведу только последовательность действий, а расшифровку смотрите на сайте . Скачиваем последнюю версию с репозитория
cd /home/www
svn co http://redmine.rubyforge.org/svn/trunk redmine
Создаем базу данных, с кодировкой по умолчанию UTF8. Далее переименовываем файл config/database.yml.example в config/database.yml и редактируем в нем раздел production, внеся настройки нашей базы данных. После этого, находясь в корне папки redmine выполняем следующие действия
rake db:migrate RAILS_ENV="production"
rake redmine:load_default_data RAILS_ENV="production"
rake config/initializers/session_store.rb
chmod -R 755 files log tmp public/plugin_assets
Для работы почты переименовываем файл config/email.yml.example в config/email.yml и редактируем его, внеся учетные данные почтового сервера. В файле config/enviroment.rb раскомментируйте строку ENV['RAILS_ENV'] ||= 'production' . Ну и почти что самое главное - для работы через Passenger, нужно удалить файл public/.htaccess. Иначе не будут отображаться стили оформления. 8. А теперь настроим связку Apache + Passenger и запустим первый раз Redmine. Апач будет работать под пользователем apache (или любой другой). Если у вас его нет, то нужно создать. Одно из важных условий - у пользователя apache должен быть домашний каталог /home/www (либо любой другой , но он должен быть доступен для записи пользователем apache). Теперь нужно дать пользователю apache права на папку /www/home/redmine.
chown -R apache:apache /home/www/redmine
Не забывайте после создания каких либо файлов в этой папке под root`ом менять права. Это решает большую часть ошибок. Теперь собственно Apache. Правим конфигурационный файл /usr/local/apache2/conf/httpd.conf ( я опускаю моменты настройки apache такие как адрес сервера, почта админа и подобное. об этом много разных мануалов). Ищем строку "User daemon" , и заменяем daemon на apache. Также и в следующей строке. В конце файла нужно добавить следующие строки
LoadModule passenger_module /opt/ruby-ee-186/lib/ruby/gems/1.8/gems/passenger-2.0.6/ext/apache2/mod_passenger.so
PassengerRoot /opt/ruby-ee-186/lib/ruby/gems/1.8/gems/passenger-2.0.6
PassengerRuby /opt/ruby-ee-186/bin/rubyPassengerUserSwitching off 
PassengerDefaultUser apache
PassengerMaxPoolSize 1
PassengerUseGlobalQueue on
PassengerMaxInstancesPerApp 1
<VirtualHost your_server_name>
 ServerName your_server_name
 DocumentRoot /home/www/redmine/public
 <Directory /home/www/redmine/public>
   Order allow,deny Allow from all
 </Directory>
</VirtualHost>
В строках 1-3 мы указываем откуда запускать passwnger и ruby. Путь должен указывать на папку, которую вы указали в пункте 5 (/opt/ruby-ee-186/) . Строки 4-5 мы указываем от имени какого пользователя запускать Passenger и отключаем смену пользователя. Строки 6-8 ограничивают количество процессов/ресурсов потребляемых passenger`ом. Ну а в остальных строках мы создаем виртуальный хост - наш сайт. Сохраняем файл. Теперь можно запускать Apache
/etc/init.d/apachectl start
Заходим на сайт и видим главную страницу Redmine ( а может и не видим -) ) 9. Далее настраиваем subversion. Я использую связку subversion и sasl. Небольшую инструкцию можно взять тут и официальный мануал тут . Пара замечаний по этой инструкции. После добавления пользователей в базу не забудьте поправить права доступа к ней, иначе процесс subversion не сможет получить к нему доступ. Для запуска subversion скопируйте в /etc/init.d/ файл svnserve, сохраненный в пункте 1. Правим в нем путь до папки с репозиторием, и имя пользователя. Ну и опять самое важное - для папки с репозиторием смените владельца, иначе опять получим отказ доступа. Права на файлы самое важное!! 10. А теперь последний штрих, на который у меня ушло двое суток. Пробуем создать тестовый проект, добавляем в него ссылку на svn репозиторий.redmine Заходим на вкладку Хранилище, и если мы видим такую же часть, как выделенная на картинке - все работает отлично. Иначе - плохо. Если мы откроем логи апача, то увидим ошибку " не могу найти svn". Т.е. процесс пытается получить данные из хранилища с помощью программы svn, но не может её найти. Для решения этой проблемы нужно отредактировать файл lib/redmine/scm/adapters/subversion_adapter.rb исправив переменную SVN_BIN
# SVN executable name
SVN_BIN = "/usr/local/bin/svn  --config-dir /home/www/.svnconfig"
Этим мы говорим от куда запускать svn и где хранить конфиги. Кстати папку для конфигов надо создать и поменять владельца, на того под которым работает svn. Ну и для полного счастья и работы, нужно выполнить в консоли какую-нибудь команду svn указав папку для конфигов. Это нужно для того чтобы установить некоторые параметры настройки svn. Иначе в логах apache будет висеть ошибка, и вывод консоли , с предложение установить один из параметров. Его кстати можно установить вручную в файле - читайем лог ошибки. После этого все должно работать.
--------------------
Вот эти вроде простые действия заняли почти неделю копания. Главная ошибка, это права доступа к файлам. В итоге получился багтрекер projects.dobrih.net (закрыт в 2010 г). Ну и на последок несколько ссылок на инструкции по установке Redmine на других связках Redmine 0.8.x Installation Tutorial
Setting up a Redmine site on Ubuntu
русская инструкция по установке на Windows

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

  1. Пасиб за инструкцию.

    Очень помогла. Правда для установки на Suse :)

    ОтветитьУдалить
  2. Огромное спасибо.
    Благодоря тому что Вы потратили на настройку РедМайна неделю, я эту неделю сэкономил.
    Точнее вообще поставил, а то-бы просто плюнул и дальше мучался-бы с мантисом.

    ОтветитьУдалить
  3. > Вот эти вроде простые действия заняли почти неделю копания.

    5ый день - подхожу к связке apache+redmine :)

    ОтветитьУдалить
  4. [...] установить связку Redmine по анологии моей инстукции . И что вы думаете , даже глядя краем глаза в неё, я [...]

    ОтветитьУдалить
  5. Большое спасибо за помощь в решении проблемы с доступом к subversion

    ОтветитьУдалить
  6. wget http://www.openssl.org/source/openssl-0.9.8j.tar.gz
    tar xzvf openssl-0.9.8j.tar.gz
    .....

    кагбэ это дженту....

    echo "www-servers/apache ssl" >> /etc/portage/package.use
    emerge apache

    ОтветитьУдалить
  7. ну да. генту.
    я с никсами ни так много общаюсь. но сделал для себя такой вывод - зачем заучивать специфичные команды и различия в установке из пакетов на разных os, когда можно собрать из исходников и все будет по стандарту, оперделенному разработчиком программы.
    перед тем как ставить, я прочитал много разных статей. в большистве из них было - посмотрите файлик в такой то папке, если нет его там, то возможно он тут....
    Да и порой в пакетах нет последних версий нужных программ

    ОтветитьУдалить
  8. Это всё здорово, но пакеты позволяют более грамотно управлять версиями и зависимостями (особенно в Gentoo) программ. Если компилять всё самому, то зачем Вам Gentoo? Используйте LFS :)

    P.S. По поводу версий - как раз в Gentoo последние версии достаточно быстро появляются в портеже. Опять же, зачем если Вам нужны _самые последние_ версии? Если Вы беспокоитесь о секурити - то свежачок не всегда является лучшим вариантом... Лучше довериться менеджеру пакетов и в кроне проверять пакеты на известные уязвимости через GLSA, тем более что делается это очень просто:
    $ glsa-check -l affected

    P.P.S. Это я всё к тому, что если уж сели на дженту, так поизучайте её хотя бы немного, у неё очень много приятных и удобных возможностей.

    ОтветитьУдалить
  9. Да, друх, ты сломал себе систему. Настанет час, когда ты на собственной шкуре познаешь правило 14443.

    ОтветитьУдалить
  10. я тебя породил, я тебя и убью (с)
    я только рад буду, если придется познать. Только так можно получить нужный опыт и знания. Я не рядовой пользователь, мне интересны программные проблемы и поиск их устранения. Это превращается в спорт - смогу ли я ? ( тварь ли я дрожащая ? (с) )
    ну и я понимаю, что поставив что то с сайта производителя, то все вопросы к нему.
    для меня gentoo на этом сервере всего лишь оболочка, я не хочу заострять внимание на ней. из-за частностей не увидишь общую картину.

    ОтветитьУдалить
  11. что в этом омерзительно? правило 14443? тогда смотри ответ выше.

    ОтветитьУдалить
  12. Однако ж хуже того, что ты сам на это наткнешься, так ты еще других этому учишь. Зачем, спрашивается, создавать это руководство, если оно в корне неправильное?

    ОтветитьУдалить
  13. Почему оно в корне не правильное ?
    у каждой задачи есть несколько путей решения. Я показал один из них. Что меншает заменить компиляцию из исходников, на сборку пакетов ? самое главное, тут озвучены некоторые сложные моменты, которые я с трудом нашел.
    Тем более вверху написано же - это больше для меня подсказка на будущее.

    ОтветитьУдалить
  14. Да потому что ты в начале наделал кучу косяков, замусорил систему левыми файлами, а потом в конце "успешно" боролся с собственными же косяками. Сделай все по-правильному - статья была бы в 2 раза меньше и не было бы таких очевидных ляпов.
    И что помешало тебе "компиляцию исходников заменить на сборку пакетов"?
    Напиши сверху - больше так не делать.

    ОтветитьУдалить
  15. Омерзительно говно в столовке на прилавке.
    Это гораздо хуже - это провокация , причем как выясняется сознательная.

    1) Аффтор идиот- причина помимо слома себе системы он ,в добавок ко всему
    умидрился собрать все без --as-needed , теперь про расход памяти пусть не плачет.

    ОтветитьУдалить
  16. Спасибо автору за статью.

    ОтветитьУдалить
  17. Подскажите, установил: Debian + Lighttpd + MySQL + Redmine, Подключил хранилище к проекту. Все отображается и работает красиво, однако... Из редмайна доступ к хранилищу должен быть только на просмотр? Потому как явных кнопок на редактирование, загрузку или удаление файлов в хранилище я не могу найти, подскажите пож.

    ОтветитьУдалить
  18. извини, что долго не отвечал. уже наверное вопрос не актуален. но все же.
    Redmine - это система для управления проектом, списком ошибок и т.п. . А доступ к хранилищу тут само собой только на чтение. на запись ты можешь получить только с помощью спец. программ.

    ОтветитьУдалить
  19. лишний раз убедили, что главное не понять, а установить. И, возможно, в дальнейшем не пользоваться. Gentoo подразумевает системный подход. Я тоже в свое время записывал команды в виде шпаргалок на будущее. Как оказалось, ни разу не пригодилось ничего кроме вот этого:
    cd /
    tar cvpzf /your_another_hdd_or_usb_stick/backup.tgz --exclude=/proc exclude=/sys /

    ОтветитьУдалить
  20. понять важно, если планируешь пользоваться долго и уверено. А я к генту , да и вообще к линуксу практически не прикоснулся за последний год. сейчас и не вспомню ничего без такой подсказки

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