Redmine 2.2.2 на Ubuntu 12.04 с nginx 1.2.4 и Unicorn 4.6.0

Тут будет инструкция по установке Redmine 2.2.2 на Ubuntu 12.04 с работой через nginx 1.2.4 и Unicorn 4.6.0.
Краткое описание:

  • Redmine — открытое серверное веб-приложение для управления проектами и задачами (в том числе для отслеживания ошибок). (wiki (c))
  • nginx — легкий и гибкий HTTP-сервер
  • Unicorn — HTTP-сервер для приложений Ruby on Rails
  • Ubuntu — Так вышло что именно Ubuntu на данный момент является основной Linux системой с которой я работаю

Под катом будет инструкция по установке

Предистория

Когда появилась необходимость поднять Redmine у меня на сервере уже был настроен некоторый софт (PostgreSQL, Jenkins, nginx), а значит и Redmine должен работать вместе с ними.

Собственно установка

Установка софта, которое на данном этапе уже должна быть установлена и настроена в данном руководстве не рассматривается: PostgreSQL 9.1, nginx

Устанавливаем ruby 1.9.x и мета пакет для сборки (может понадобиться при установке gem-ов)
sudo apt-get install ruby1.9.1-full build-essential

Добавляем PPA содержащий deb-пакет с Redmine
sudo add-apt-repository ppa:ondrej/redmine
sudo apt-get update

Устанавливаем Redmine из PPA
При установке сразу будет сконфигурировано подключение к СУБД, которая уже должна быть установлена.
Для интеграции с разными СУБД используются разные пакеты: redmine-pgsql, redmine-mysql, redmine-sqlite
После настройки подключения к СУБД будет автоматически создана база (migrate) и загружено первоначальное наполнение
Подключение к СУБД можно перенастроить командой: sudo dpkg-reconfigure -plow redmine
sudo apt-get install redmine redmine-pgsql imagemagick ruby-rmagick

Redmine будет установлено следующие директории:
* /usr/share/redmine/ — само приложение
* /etc/redmine/default/ — конфигурационные файлы
* /var/lib/redmine/default/ — загружаемые файлы

У меня зачем-то установился ruby1.8 (ruby 1.8.7 (2011-06-30 patchlevel 352)) — удаляем
sudo apt-get remove ruby1.8 ruby1.8-dev libruby1.8
sudo apt-get autoremove

Создаем директории которые не были созданы при установке пакета
sudo mkdir /usr/share/redmine/tmp && sudo chown www-data:www-data /usr/share/redmine/tmp && sudo chmod a-x,u+rw,g+rw /usr/share/redmine/tmp

Сейчас уже можно проверить как работает Redmine (будет доступен тут: http://localhost:3000/)
Предупреждение: я меня под пользователем www-data оно так и не запустилось, только под root-ом. Падает с ошибкой доступа при создании папки /usr/share/redmine/tmp/cache
sudo -u www-data ruby /usr/share/redmine/script/rails server -e production -b 0.0.0.0

Устанавливаем rails и unicorn
sudo gem install rails unicorn

Создаём файл настроек для unicorn
sudo curl -o /usr/share/redmine/config/unicorn.conf.rb https://raw.github.com/defunkt/unicorn/master/examples/unicorn.conf.rb

Выставляем нужные нам параметры:
sudo nano /usr/share/redmine/config/unicorn.conf.rb

Запускаем unicorn для проверки (будет доступен тут: http://localhost:8080/)
sudo unicorn_rails -c /usr/share/redmine/config/unicorn.conf.rb -E production

Вот Redmine и запущен. Счастье и радость 🙂
Следующая задача: запустить Redmine в «поддиректории».
В текущей конфигурации Redmine будет работать только в корне сайта, что нам не подходит, так как кроме Redmine у нас на сайте еще много чего крутится.
И вот тут начинается «магия» 🙂
Работающее на данный момент решение этой проблемы скомпилировано из разных частей решений описанных:
* Официальной wiki Redmine
* Тикета с ошибкой Redmine
* Еще одного тикета и пары страниц в инете, я их уже забыл 🙂

Редактируем окружение Redmine:
* До запуска приложения вставляем: RedmineApp::Application.routes.default_scope = { :path => '/redmine', :shallow_path => '/redmine' }
* После запуска приложения вставляем: Redmine::Utils::relative_url_root = "/redmine"
sudo nano /usr/share/redmine/config/environment.rb

Создаём еще один файл
* И вставляем туда: config.asset_path = '/redmine%s'
sudo nano /usr/share/redmine/config/additional_environment.rb
sudo chmod a+r /usr/share/redmine/config/additional_environment.rb

Запускаем unicorn и проверяем что Redmine теперь корректно работает по адресу http://localhost:8080/redmine/
Стили, скрипты могут не загружаться, но главное что бы ссылки (как пользовательские, так и для скриптов и стилей) вели внутрь /redmine
Загрузку статики мы перенесём на плечи nginx
sudo unicorn_rails -c /usr/share/redmine/config/unicorn.conf.rb -E production

Настраиваем nginx на проксирование запросов к Redmine
Создаем конфигурацию для upstream:

# Создаем перенаправления:

Создаем ссылку на самого себя внутри public (необходимо, так как nginx будет искать файлы внутри папки redmine)
sudo ln -s /usr/share/redmine/public /usr/share/redmine/public/redmine

Перезапускаем nginx и проверяем (не забудьте запустить unicorn): http://localhost/redmine/
sudo service nginx restart

Не забываем настроить Redmine:
* Сменить пароль дефолтному админу: admin/admin
* Разрешить/запретить создание пользователей
* И т.д.

Теперь можно настроить автозапуск unicorn при старте системы
sudo nano /etc/init/redmine.conf

Проверка работы службы
sudo status redmine
sudo start redmine
ps -ef|grep unicorn
cat /var/run/redmine_unicorn.pid
sudo status redmine
sudo start redmine
sudo stop redmine
ps -ef|grep unicorn

Перезагружаем сервер целиком и проверяем что все работает

Процесс поиска рабочего варианта

Что бы не поломать уже работающий сервер был выбран такой процесс поиска рабочего варианта установки:

  • Поднимаем на локальном компе виртуалку с Ubuntu 12.04 (я использовал VirtualBox)
  • Обновляем её до актуального на данный момент состояния
  • Устанавливаем полезные пакеты общего назначения: htop
  • Настраиваем на комфортное использование:
    • включаем автологин
    • не выключение монитора
    • sudo без запроса пароля
    • в избранное добавляем папку с другого компа для хранения полезных данных между откатами машины
  • Выключаем, создаем снимок состояния
  • Включаем и делаем с машиной все, что душе будет угодно
  • Если что-то не понравилось, то выключаем машину, откатываемся на созданный снимок, включаем и опять настраиваем
  • И так до победного конца

12 комментариев

  1. Если интересно, то могу в комменте отписать краткую историю как я шел к этой инструкции 🙂

      1. 2 захода по 3 часа при тренировке на виртуалке. Пару раз пришлось откатывать виртуалку, так как она превращалась в тыкву. И один заход в 3 часа уже при установке на боевой сервер с написанием инструкции по установке, которая потом переродилась в этот пост.
        Итого 9 часов.

  2. Обновление до версии Redmine 2.2.3, вышедшей 2013-02-13.
    При обновлении будут убраны изменения в файлах «/usr/share/redmine/config/environment.rb» и «/usr/share/redmine/config/additional_environment.rb», соответственно их нужно будет восстановить.
    После обновления пакета будет вызвана команда миграции базы (RAILS_ENV=production rake db:migrate), но она завершается с ошибкой, хотя ни какие изменения накатывать не нужно (последний файл миграции в обоих версиях: /usr/share/redmine/db/migrate/20121026003537_populate_enumerations_position_name.rb).
    Фактически мы уже можем использовать обновленную версию Redmine, но apt-get считает что пакет еще не до конца настроен и будет все время пытаться его настроить.

    1. Собственно команда RAILS_ENV=production rake db:migrate падает и на Redmine 2.2.2, так что дело не в обновлении до версии 2.2.3, а в чем-то еще.

    2. Нашел как исправить ошибку возникающую при запуске rake (/usr/lib/ruby/vendor_ruby/rake/version.rb:2: warning: already initialized constant VERSION).
      Так как я не очень сильно знаком с Ruby, то объяснить в чем конкретно заключается ошибка (кроме того что она связана с rake) и как описанное эту ошибку исправляет я не могу 🙂
      Решение: в файл /usr/share/redmine/Gemfile нужно добавить строчку gem 'rake'
      После такой модификации rake начинает выполняться без проблем, что позволит:
      * apt-get закончить кофигурирование пакета и в будущем не пытаться при каждом чихе его конфигурить
      * устанавливать в Redmine плагины, так как они требуют запуска команды sudo rake redmine:plugins:migrate RAILS_ENV=production

  3. Запустить под www-data:
    sudo nano /usr/share/redmine/config/environment.rb
    ++ user «www-data», «www-data»
    Для порядка можно:
    chown -R www-data /usr/share/redmine

    1. Кстати, рекомендую делать для redmine рабочую копию. Мне, лично, было необходимо прикрутиться к gitolite, поэтому заводил нормального юзера и в хомятник и всё перекладывал.


      adduser --home /var/www/redmine redmine
      nano /etc/init/redmine.conf


      description "Redmine in unicorn"

      start on (filesystem and networking) or runlevel [2345]
      stop on runlevel [016]

      console owner

      setuid redmine
      setgid redmine

      exec unicorn_rails -c /var/www/redmine/config/unicorn.conf.rb -E production


      cp -R ./redmine/* /var/www/redmine
      chown -R redmine:redmine /etc/redmine/default
      mkdir /var/log/unicorn/
      chown -R redmine:redmine /var/log/redmine
      chown -R redmine:redmine /var/www/redmine
      chown -R redmine:redmine /var/log/unicorn*
      chmod a+w /etc/redmine/default/session.yml
      rm /tmp/redmine_unicorn.sock
      nano /var/www/redmine/config/unicorn.conf.rb


      worker_processes 2
      user "redmine", "redmine"
      working_directory "/home/redmine/redmine"
      listen "/tmp/redmine_unicorn.sock", :backlog => 64
      timeout 60
      pid "/tmp/redmine_unicorn.pid"
      stderr_path "/var/log/unicorn/stderr.log"
      stdout_path "/var/log/unicorn/stdout.log"
      ...

  4. Сделал вроде все как у вас в статье, но в браузере получаю ошибку:

    Internal error

    An error occurred on the page you were trying to access.
    If you continue to experience problems please contact your Redmine administrator for assistance.

    If you are the Redmine administrator, check your log files for details about the error.

    Подскажите что я делаю не так?

    1. Пытаюсь снова сформировать базу данных и получаю кучу ошибок, база данных то создается, а вот таблицы в ней нет.

      root@gars:/etc/redmine/redmine# dpkg-reconfigure -plow redmine
      dbconfig-common: writing config to /etc/dbconfig-common/redmine/instances/redmine.conf

      Creating config file /etc/redmine/redmine/database.yml.new with new version
      granting access to database redmine for redmine@localhost: already exists.
      creating database redmine: already exists.
      dbconfig-common: flushing administrative password
      /usr/lib/ruby/vendor_ruby/rake/version.rb:2: warning: already initialized constant VERSION
      /usr/lib/ruby/vendor_ruby/rake/version.rb:5: warning: already initialized constant MAJOR
      /usr/lib/ruby/vendor_ruby/rake/version.rb:5: warning: already initialized constant MINOR
      /usr/lib/ruby/vendor_ruby/rake/version.rb:5: warning: already initialized constant BUILD
      /usr/lib/ruby/vendor_ruby/rake/version.rb:6: warning: already initialized constant NUMBERS
      /usr/lib/ruby/vendor_ruby/rake.rb:27: warning: already initialized constant RAKEVERSION
      /usr/lib/ruby/vendor_ruby/rake/early_time.rb:17: warning: already initialized constant EARLY
      /usr/lib/ruby/vendor_ruby/rake/alt_system.rb:32: warning: already initialized constant WINDOWS
      /usr/lib/ruby/vendor_ruby/rake/application.rb:31: warning: already initialized constant DEFAULT_RAKEFILES
      WARNING: Possible conflict with Rake extension: String#ext already exists
      WARNING: Possible conflict with Rake extension: String#pathmap already exists
      /usr/lib/ruby/vendor_ruby/rake/task_arguments.rb:77: warning: already initialized constant EMPTY_TASK_ARGS
      /usr/lib/ruby/vendor_ruby/rake/invocation_chain.rb:49: warning: already initialized constant EMPTY
      /usr/lib/ruby/vendor_ruby/rake/file_utils.rb:9: warning: already initialized constant RUBY
      /usr/lib/ruby/vendor_ruby/rake/file_utils.rb:86: warning: already initialized constant LN_SUPPORTED
      /usr/lib/ruby/vendor_ruby/rake/file_utils_ext.rb:16: warning: already initialized constant DEFAULT
      /usr/lib/ruby/vendor_ruby/rake/file_list.rb:44: warning: already initialized constant ARRAY_METHODS
      /usr/lib/ruby/vendor_ruby/rake/file_list.rb:47: warning: already initialized constant MUST_DEFINE
      /usr/lib/ruby/vendor_ruby/rake/file_list.rb:51: warning: already initialized constant MUST_NOT_DEFINE
      /usr/lib/ruby/vendor_ruby/rake/file_list.rb:55: warning: already initialized constant SPECIAL_RETURN
      /usr/lib/ruby/vendor_ruby/rake/file_list.rb:61: warning: already initialized constant DELEGATING_METHODS
      /usr/lib/ruby/vendor_ruby/rake/file_list.rb:364: warning: already initialized constant DEFAULT_IGNORE_PATTERNS
      /usr/lib/ruby/vendor_ruby/rake/file_list.rb:370: warning: already initialized constant DEFAULT_IGNORE_PROCS
      /usr/lib/ruby/vendor_ruby/rake.rb:68: warning: already initialized constant FileList
      /usr/lib/ruby/vendor_ruby/rake.rb:69: warning: already initialized constant RakeFileUtils
      rake aborted!
      undefined method `+’ for LL():Rake::Scope::EmptyScope

      (See full trace by running task with —trace)

      Наверно все проблемы из-за не заполненной базы. Но вот как ее заполнить не могу понять.

      1. Но вот что забавно. База данных успешно установилась. Redmine заработал, но вот при заходе на некоторые странички например «создать проект», «настройки» все равно вылазит ошибка:

        Internal error

        An error occurred on the page you were trying to access.
        If you continue to experience problems please contact your Redmine administrator for assistance.

        If you are the Redmine administrator, check your log files for details about the error.

        Как ее победить? Вообще ничего не понимаю.

        1. У меня была такая проблема. В логах писалось про не соответствие кодировок UTF-8 и какой-то локальной.
          Решилось очисткой кешей: bundle exec rake tmp:cache:clear

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *