Update: Доступна новая более проработанная версия. Эта инструкция требует доработки. Рекомендую ознакомится
В каждом более-менее крупном предприятии настаёт момент, когда уже нельзя запоминать кто из сотрудников связан с конкретным клиентом или с отдельным проектом клиента. Именно в это время предпринимателю необходимо задуматься о выборе системы управления проектами. Очевидно, что в данном случае минимальными требованиями будут:
— разграничение проектов
— возможность создания пользователей
— управление ролями и разграничение доступа
— статистика и отчеты
— временные отметки деятельности
— возможность расширения базового функционала
Со всеми этими и рядом других задач прекрасно справляется Open-Source приложение Redmine. Написано оно на языке Ruby и работает на популярном web-фреймворке Ruby on Rails. Для его использования не нужны никакие клиенты, достаточно обычного браузера как Google Chrome или Mozilla Firefox. Большинство данных хранятся в базе данных. Можно использовать популярные MySQL, PostgreSQL, SQLite (не рекомендуется в production окружении) и ряд других. Подразумевается, что уже есть компьютер под управлением операционный системой Linux (в нашем случае выбор пал на CentOS 7) и сконфигурированный стек LEMP.
Для начала требуется установить минимальный список зависимостей
# yum install epel-release # yum install unzip patch ruby freetds-devel ImageMagick-c++-devel mariadb-devel gcc ruby-devel rubygem-json rubygem-psych libyaml
После этого скачиваем самый свежий на данный момент стабильный релиз Redmine версии 3.0.3 и распаковываю в удобную папку.
# wget http://www.redmine.org/releases/redmine-3.0.3.zip # unzip redmine-3.0.3.zip
Переместим файлы в одно из предназначенных каталогов для веб приложений и создадим конфигурацию для соединения с базой данных:
# mv redmine-3.0.3 /srv/redmine # cd /srv/redmine/config # cp database.yml.example database.yml # vim database.yml production: adapter: mysql2 database: redmine host: localhost username: redmine password: "redmine" encoding: utf8
Всё должно быть понятно без лишних объяснений: указываются по стандарту хост, база, логин и пароль. После указания параметров лучше сразу их и создать:
# mysql -uroot -p MariaDB [(none)]> CREATE DATABASE redmine CHARACTER SET utf8 COLLATE utf8_general_ci; MariaDB [(none)]> grant all privileges on redmine.* to redmine@localhost identified by 'redmine'; MariaDB [(none)]> flush privileges; MariaDB [(none)]> \q Bye
Возвращаемся в каталог с приложением и устанавливаем bundler и остальные гемы. Я не планирую заниматься разработкой и тестированием готового продукта, следовательно укажу установщику исключить эти окружения из сборки
# cd /srv/redmine/ # gem install bundler Successfully installed bundler-1.10.3 1 gem installed # export PATH='/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user/.local/bin:/home/user/bin' # bundle install --without development test ... Bundle complete! 27 Gemfile dependencies, 46 gems now installed. ...
Далее по инструкции необходимо сгенерировать секретный ключ, а так же выполнить миграцию и наполнить базу демо-данными. При установке рекомендую сразу выбрать русский язык
# rake generate_secret_token # RAILS_ENV=production rake db:migrate # RAILS_ENV=production rake redmine:load_default_data Select language: ar, az, bg, bs, ca, cs, da, de, el, en, en-GB, es, es-PA, 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.
Проверим все ли компоненты установились и сможет ли приложение работать. Для этого можно использовать веб-сервер webrick который идет в комплекте с гемом rails.
# rails server webrick -e production -b 178.20.158.12 => Booting WEBrick => Rails 4.2.1 application starting in production on http://178.20.158.12:3000 => Run `rails server -h` for more startup options => Ctrl-C to shutdown server [2015-06-13 15:24:41] INFO WEBrick 1.3.1 [2015-06-13 15:24:41] INFO ruby 2.2.1 (2015-02-26) [x86_64-linux] [2015-06-13 15:24:41] INFO WEBrick::HTTPServer#start: pid=27426 port=3000
Можно зайти по указанному адресу и увидеть главную страницу Redmine:
Пол дела сделано, редмайн работает. Но webrick не самый лучший сервер для production-окружения. И я покажу как подружить rails и redmine в частности с мощнейшим web-сервером NGinx. Для этого нам понадобится ещё один гем — unicorn
Добавляем в Gemfile строку, которая укажет bundler-у добавить unicorn в текущий набор
# vim Gemfile gem 'unicorn' # bundle install --without development test ... Installing unicorn 4.9.0 ...
Далее создание конфигурации для нового гема
# vim config/unicorn.rb worker_processes 1 # Количество процессов: master + 1 дочерний working_directory "/srv/redmine/" # Домашний каталог redmine preload_app true timeout 30 listen "/srv/redmine/tmp/sockets/unicorn.sock", :backlog => 64 #путь к unix сокету с которым будет работать nginx pid "/srv/redmine/tmp/pids/unicorn.pid" # Место хранения PID-файла stderr_path "/srv/redmine/log/unicorn.stderr.log" # файл логов для ошибок stdout_path "/srv/redmine/log/unicorn.stdout.log" # файл логов для вывода before_fork do |server, worker| defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect! end after_fork do |server, worker| defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection end
И пробуем запустить наше хозяйство
# bundle exec unicorn_rails -E production -c config/unicorn.rb -D # ps aux | grep unicorn root 29092 7.5 10.8 482516 110596 ? Sl 15:35 0:01 unicorn_rails master -E production -c config/unicorn.rb -D root 29098 0.0 10.4 482516 106272 ? Sl 15:35 0:00 unicorn_rails worker[0] -E production -c config/unicorn.rb -D root 29102 0.0 0.0 112612 736 pts/0 S+ 15:36 0:00 grep --color=auto unicorn
Отлично, работает. Теперь необходимо подружить unicorn с nginx
Делается это очень просто:
# vim /etc/nginx/conf.d/redmine.conf upstream redmine { server unix:/srv/redmine/tmp/sockets/unicorn.sock; } server { listen 80; server_name projects.tradenark.com.ua; client_max_body_size 200m; root /srv/redmine/; location / { try_files $uri @ruby; } location ~* \.(jpg|gif|png|js|css|ico)$ { root /srv/redmine/public; expires 7d; error_page 404 502 504 = @ruby; } location @ruby { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_read_timeout 300; proxy_pass http://redmine; #upstream redmine } }
Проверяем конфигурацию и применяем правила
# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful # nginx -s reload
После этого можно открывать указанный нами адрес и логиниться в Redmine с данными admin/admin. Конечно же первым делом пароль нужно сменить на более безопасный и сложный
Завершающим шагом должен был быть гем мониторинга god, но по каким то причинам он у меня делает абсолютно всё, кроме самого главного — запуска unicorn. Так что на этом шаге стоит завершить статью. Когда разберусь в чём конкретно ошибка — дополню статью а то и вынесу в отдельный пост.
Добрый день.
Подскажите что не так, уже проделал и перепроверил все несколько раз после команды
bundle exec unicorn_rails -E production -c config/unicorn.rb -D
получаю ошибку:
[root@localhost config]# bundle exec unicorn_rails -E production -c config/unicorn.rb -D
/usr/local/share/gems/gems/unicorn-5.0.1/lib/unicorn/configurator.rb:72:in `read’: No such file or directory — config/unicorn.rb (Errno::ENOENT)
from /usr/local/share/gems/gems/unicorn-5.0.1/lib/unicorn/configurator.rb:72:in `reload’
from /usr/local/share/gems/gems/unicorn-5.0.1/lib/unicorn/configurator.rb:65:in `initialize’
from /usr/local/share/gems/gems/unicorn-5.0.1/lib/unicorn/http_server.rb:76:in `new’
from /usr/local/share/gems/gems/unicorn-5.0.1/lib/unicorn/http_server.rb:76:in `initialize’
from /usr/local/share/gems/gems/unicorn-5.0.1/bin/unicorn_rails:209:in `new’
from /usr/local/share/gems/gems/unicorn-5.0.1/bin/unicorn_rails:209:in `’
from /usr/local/bin/unicorn_rails:23:in `load’
from /usr/local/bin/unicorn_rails:23:in `’
master failed to start, check stderr log for details
У вас в ошибке есть строка No such file or directory — config/unicorn.rb
# ls /srv/redmine/config/unicorn.rb
/srv/redmine/config/unicorn.rb
Соответственно в моём случае команду нужно запускать находясь в каталоге /srv/redmine/
Проверьте на вашей системе
спасибо за быстрый ответ
Мне удалось обнаружить если в конфиге config/unicorn.rb закоментировать
before_fork do |server, worker|
defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect
end
то при выполнении bundle exec unicorn_rails -E production -c config/unicorn.rb -D появляются процесы.
При выполнении вашых команд вот:
/srv/redmine/config/unicorn.rb
[root@localhost redmine]# /srv/redmine/config/unicorn.rb
/srv/redmine/config/unicorn.rb: line 1: worker_processes: command not found
/srv/redmine/config/unicorn.rb: line 2: working_directory: command not found
/srv/redmine/config/unicorn.rb: line 4: preload_app: command not found
Try ‘timeout —help’ for more information.
/srv/redmine/config/unicorn.rb: line 8: listen: command not found
/srv/redmine/config/unicorn.rb: line 10: pid: command not found
/srv/redmine/config/unicorn.rb: line 12: stderr_path: command not found
/srv/redmine/config/unicorn.rb: line 13: stdout_path: command not found
/srv/redmine/config/unicorn.rb: line 16: syntax error near unexpected token `ActiveRecord::Base’
/srv/redmine/config/unicorn.rb: line 16: `defined?(ActiveRecord::Base) and’
[root@localhost redmine]#
Что не так делаю???
ПОЛУЧИЛОСЬ!
Невнимательно скопировал
в строке ActiveRecord::Base.connection.disconnect! в конце «!» -который я упустил
Вот только не совсем пойму как работает nginx
Сделал все по статье но сам redmine у меня не открывается , по 80порту вижу nginx а по 3000 Веб-страница недоступна
Где я туплю???
upstream redmine {
server unix:/srv/redmine/tmp/sockets/unicorn.sock;
}
Мы запускаем unicorn на сокете, а не на сетевом порту.
Я извиняюсь за тупые вопросы просто первый раз с этим сталкиваюсь, до этого пользовался Apache.
На сколько я понял redmine должен открыватся как http://Мой ip/redmine
ТАК?
Коллега, Вы еще можете дополнить Ваш /etc/nginx/conf.d/redmine.conf таким:
location ~* \.(jpg|gif|png|js|css|ico)$ {
root /srv/redmine/public;
expires 7d;
error_page 404 502 504 = @ruby;
}
Мелочь, но приятно 🙂
Спасибо, Виктор. Вы правы
Добавил в статью
Добрый.
Получилось разобраться с gem`ом god?
Так вышло что сервер несколько месяцев работал без перезагрузки и я совсем позабыл об этом gem-е 🙂
Не было причин с ним разбираться.
Спасибо, что напомнили. Постараюсь решить в ближайшее время
Глеб, теперь я тут:)
А как правильно в автозагрузку поставить:
bundle exec unicorn_rails -E production -c config/unicorn.rb -D
просто в rc.local так и прописать?
или это плохой тон? 🙂
Что то пропустил ваш комментарий
Нужно делать через systemctl, создавая новый сервис. В настройках есть и указание рабочей директории и выполняемой команды при запуске
Детальнее можно посмотреть тут
не получается настроить автозагрузку.
после загрузки из сервися или из rc.local командой
BUNDLE_GEMFILE=/var/www/html/redmine/Gemfile bundle exec unicorn_rails -E production -c config/unicorn.rb -D
юникорн не стартует с ошибкой
INFO — : reaped # worker=0
INFO — : master complete
INFO — : Refreshing Gem list
Bundler::GemRequireError: There was an error while trying to load the gem ‘yard’.
Gem Load Error is: couldn’t find HOME environment — expanding `~’
если же это же запускать из командной строки из папки с редмайном — то все работает.
Анатолий, попробуйте вот этот init скрипт
https://gist.github.com/shrkw/4491097