Redmine 3 + Unicorn + Nginx на CentOS 7

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:
redmine_test
Пол дела сделано, редмайн работает. Но 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. Конечно же первым делом пароль нужно сменить на более безопасный и сложный
redmine_final
Завершающим шагом должен был быть гем мониторинга god, но по каким то причинам он у меня делает абсолютно всё, кроме самого главного — запуска unicorn. Так что на этом шаге стоит завершить статью. Когда разберусь в чём конкретно ошибка — дополню статью а то и вынесу в отдельный пост.

Redmine 3 + Unicorn + Nginx на CentOS 7: 15 комментариев

  1. testsia

    Добрый день.
    Подскажите что не так, уже проделал и перепроверил все несколько раз после команды
    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

  2. Воронов Глеб Автор записи

    У вас в ошибке есть строка No such file or directory — config/unicorn.rb

    # ls /srv/redmine/config/unicorn.rb
    /srv/redmine/config/unicorn.rb

    Соответственно в моём случае команду нужно запускать находясь в каталоге /srv/redmine/
    Проверьте на вашей системе

  3. testsia

    спасибо за быстрый ответ
    Мне удалось обнаружить если в конфиге 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]#

  4. testsia

    ПОЛУЧИЛОСЬ!
    Невнимательно скопировал
    в строке ActiveRecord::Base.connection.disconnect! в конце «!» -который я упустил
    Вот только не совсем пойму как работает nginx
    Сделал все по статье но сам redmine у меня не открывается , по 80порту вижу nginx а по 3000 Веб-страница недоступна
    Где я туплю???

  5. testsia

    Я извиняюсь за тупые вопросы просто первый раз с этим сталкиваюсь, до этого пользовался Apache.
    На сколько я понял redmine должен открыватся как http://Мой ip/redmine
    ТАК?

  6. Victor

    Коллега, Вы еще можете дополнить Ваш /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;
    }
    Мелочь, но приятно 🙂

    1. Воронов Глеб Автор записи

      Так вышло что сервер несколько месяцев работал без перезагрузки и я совсем позабыл об этом gem-е 🙂
      Не было причин с ним разбираться.
      Спасибо, что напомнили. Постараюсь решить в ближайшее время

  7. Alex

    Глеб, теперь я тут:)

    А как правильно в автозагрузку поставить:
    bundle exec unicorn_rails -E production -c config/unicorn.rb -D

    просто в rc.local так и прописать?
    или это плохой тон? 🙂

    1. Воронов Глеб Автор записи

      Что то пропустил ваш комментарий
      Нужно делать через systemctl, создавая новый сервис. В настройках есть и указание рабочей директории и выполняемой команды при запуске
      Детальнее можно посмотреть тут

  8. Анатолий

    не получается настроить автозагрузку.
    после загрузки из сервися или из 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 `~’​

    если же это же запускать из командной строки из папки с редмайном — то все работает.

Добавить комментарий