Переносим Redmine c VPS на Heroku или как получить бесплатный project-management tool

Эта статья дает пошаговую инструкцию как опубликовать Redmine приложение на веб хостинге Heroku.



Сперва давайте определимся почему и зачем нам/вам это нужно. Кто еще не знает что такое Redmine то это веб-приложение для управления проектами и отслеживания ошибок (баг трекер). Это довольно популярное приложение с открытым кодом и множеством плагинов.

Heroku это платформа для хостинга веб приложений. Отличительными чертами которой являются простота использования, минимальная конфигурация и возможность быстро менять требуемые ресурсы сервера (например если ожидается хабраэффект можно быстро увеличить требуемые мощности). То что нас интересует для этой статьи это возможность хостить приложение бесплатно.

Зачем нужна эта статья? Heroku платформа хоть и предоставляет ряд преимуществ перед VPS хостингом, у нее так же в добавок есть ограничения. Эта статья раскрывает сложности при установки и рассчитана на среднего-опытного пользователя.


Мы будем устанавливать текущую trunk версию Redmine. Она требует rails 2.3.14 и одну из версий ruby 1.8.7, 1.9.2, 1.9.3.

На данный момент мы имеем.
  • Установленный git
  • RVM c нужной версией Ruby
  • VPS с уже рабочим Redmine и доступом по SSH
  • Аккаунт на Heroku
  • Аккаунт на Amazon S3


В примере мы будем использовать 1.9.2-p180 версию ruby. Сначала создадим новый gemset.
rvm use ruby-1.9.2-p180
rvm gemset create 'redmineheroku'
rvm use ruby-1.9.2-p180@redmineheroku


Теперь нам нужно получить последнюю версию Redmine, брать мы ее будем из git репозитория.
mkdir redmine_heroku
cd redmine_heroku
git init
git remote add redmine git://github.com/edavis10/redmine.git
git fetch redmine
git merge redmine/master


Теперь нам нужно изменить настройки подключения к дата-базе. Хоть мы и не будем запускать приложение локально, нам нужно будет загрузить информацию с существующего Redmine, который уже использует MySql, поэтому мы ее и будем использовать. Пример "/config/database.yml":
production:
  adapter: mysql
  database: redmineheroku
  host: localhost
  username: db_user
  password: db_password
  encoding: utf8

development:
  adapter: mysql
  database: redmineheroku
  host: localhost
  username: db_user
  password: db_password
  encoding: utf8


На данный момент trunk версия Redmine использует rails gem версии 2.3.14, поэтому устанавливаем его. Так же установим gem для подключения к дата-базе и создадим пустую базу.
gem install rails --version 2.3.14
gem install mysql
rake db:create RAILS_ENV=production


Т.к. у нас уже есть существующая база, нам ее нужно импортировать. Для этого установим mysql клиент и произведем импорт дампа базы который взят из последнего бэкапа.
sudo apt-get install mysql-client-core-5.1
mysql -udb_user -pdb_password -h127.0.0.1 redmineheroku < ~/mysqldump-file-path.sql

Хочу обратить ваше внимание что если используется короткий флаг (-u, -p и -h) для mysql то следующий параметр нужно писать без пробела.

Дальше создаем session_key командой, которая создаст новый файл "/config/initializers/session_store.rb"
rake generate_session_store

Т.к. у нас уже есть session_key с предыдущей установки, заменим им новосозданный ключ в файле "/config/initializers/session_store.rb". Если это новая установка то ничего не трогаем.

Если вы использовали плагины к Redmine, то сейчас самое время также установить и произвести для них обновление датабазы. У нас их нет, поэтому этот шаг пропускаем.
RAILS_ENV=production rake db:migrate:upgrade_plugin_migrations

Теперь произведем обновление датабазы.
RAILS_ENV=production rake db:migrate

Если это новая установка то загрузим стандартную информацию командой
RAILS_ENV=production rake redmine:load_default_data

Создадим папки если они еще не существуют и удалим "/config/initializers/session_store.rb" из .gitignore
mkdir tmp public/plugin_assets
sed -i '/\/config\/initializers\/session_store.rb/d' .gitignore


Основной шаг подошел к концу. Добавим все изменения в git.
git add .
git commit -m "Initial configuration"


Устанавливаем плагины


Просто так Redmine не будет полностью работать на Heroku, для этого нам нужно установить плагины. Будем использовать giternal для их установки.
gem install giternal

Создадим новый файл «config/giternal.yml»
redmine_heroku:
  path: vendor/plugins
  repo: http://github.com/edavis10/redmine_heroku.git
  
redmine_s3:
  path: vendor/plugins
  repo: http://github.com/tigrish/redmine_s3.git


Произведем установку плагинов.
giternal update
giternal freeze


Теперь нам нужно настроить redmine_s3 плагин. Этот плагин позволяет сохранять файлы закачки Redmine в Amazon S3. Так что если у вас еще нету аккаунта S3 на амазоне, то самое время его завести.

Создадим файл «config/s3.yml»
production:
  access_key_id: YOUR_S3_ACCESS_KEY_ID
  secret_access_key: YOUR_S3_SECRET_ACCESS_KEY
  bucket: YOUR_S3_REDMINE_PRODUCTION_BUCKET
  cname_bucket: false

development:
  access_key_id: YOUR_S3_ACCESS_KEY_ID
  secret_access_key: YOUR_S3_SECRET_ACCESS_KEY
  bucket: YOUR_S3_REDMINE_DEVELOPMENT_BUCKET
  cname_bucket: false


Удалим "/public/plugin_assets" из .gitignore и произведем кофигурацию изменений.
sed -i '/\/public\/plugin_assets/d' .gitignore
rake heroku:setup


Теперь нужно поменять session_key в файле "/config/initializers/session_store.rb" еще раз т.к. он был заменен при генерации на переменую. В идеальном мире мы не должны сохранять никакие пароли в репозиторий, но для простоты этой статьи сделаем именно так.

Теперь можно сделать еще одну остановку и сохранить изменения.
git add .
git commit -m "Configure plugins"


Переносим файлы


Т.к. мы переносим существующую установку нам так же нужно перенести все файлы закачки. Для этого скопируем все текущие файлы из VPS через SSH и произведем их загрузку в Amazon S3. Мы не можем просто скопировать в S3, т.к. файловая структура изменится.
scp user@123.456.789.000:~/vps_redmine/files/* ~/redmine_heroku/files/
RAILS_ENV=production rake redmine_s3:files_to_s3


Запускаем сервер


Установим gem heroku, он нужен для создания и настройки нашего приложения на серверах heroku.
gem install heroku

Создадим новое приложение на heroku с названием «redmine». Название должно быть уникально, поэтому его нужно заменить на еще не существующее.
heroku create redmine
git push heroku master


И последний шаг это загрузить локальную базу на серверы heroku. Gem taps нужен для этой команды, поэтому предварительно установим его.
gem install taps
heroku db:push

Приложение должно быть доступно по адресу redmine.heroku.com.

Дополнительная информация


Настраиваем email уведомления

Для примера будем использовать Google Mail почтовый ящик. Создадим "/config/configuration.yml" с email конфигурацией.
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: "email_address@gmail.com"
      password: "email_password"


Удалим этот фаил из gitignore и сохраним изменения
sed -i '/\/config\/configuration.yml/d' .gitignore
git add .
git commit -m "email config"

Ну и напоследок обновим версию на сервере
git push heroku master

Настройка безопасности

Как уже было упомянуто выше, это не лучшая идея сохранять пароли в репозиторий. Как выход все секретные данные можно вынести в глобальные переменные которые можно добавить на heroku командой
config:add key=val [...] # add one or more config vars
Единственный минус в том что нужно в некоторых случаях менять код. Больше можно прочитать тут

Производительность

На бесплатном тарифном плане наше приложение имеет меньший приоритет, плюс если оно не получает запросы то полностью останавливается и запустится при первом следующем запросе (что будет довольно заметно, т.к. это займет около 10 сек). Чтобы проверить производительность при нескольких пользователях мы использовали бесплатную версию одного сервиса. Если честно то результаты довольно оптимистичны и я не совсем верю в их точность. Если верить графику то при 50 пользователях одновременно, задержка будет не более 3 секунд если пользователи близко находятся к серверу. Сервер с нашим приложением расположен в городе Сиэттл (Seattle). Но должен заметить что приложение работает довольно быстро и значительно быстрее чем на дешевом VPS.


В заключение


В итоге переезда приложения Redmine с VPS на Heroku значительно уменьшились расходы и увеличилась производительность. Бесплатным решением это теоретически нельзя назвать ведь нам прийдется платить за Amazon S3, но эти расходы можно назвать копейками.

При написании этой статьи использовалась статья blog.firsthand.ca/2010/10/installing-redmine-on-heroku-with-s3.html
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 8

    +1
      +1
      Еще бы инструкции как с нуля это настраивать (в смысле, когда редмайн нами нигде не использовался, и мы хотим его начать использовать — то есть когда не надо мигрировать какие-либо данные). Есть такие руководства?
        0
        Предположу что статью вы не читали. По большому счету все тоже самое, только нужно пропустить шаги по импорту базы и переносу файлов. Вместо импорта базы нужно выполнить команду RAILS_ENV=production rake redmine:load_default_data. В статье это все описано, попробуйте, если не получится спрашивайте.
        0
        Эх, а я месяц потратил на написание плагина Heroku для хранения файлов с перехватом вызовов всего File/IO API, и впустую.
          0
          Сейчас крутятся Redmine на минимальном Linode и на бесплатном плане Heroku, на последнем заметно медленнее. Не поделитесь вкратце, что был за VPS и что на нём было использовано для запуска Redmine?
            0
            Использовал VPS с 512 ram. На нем стоял nginx с passenger и два ruby on rails приложения на ruby 1.8 (redmine) и 1.9. Второе приложение еще меньше чем redmine и почти не использовалось.
              0
              Странно, сейчас сравнил HTTPerf'ом такие же примерно два варианта. Единственное, что под пассажиром всё без извращений и все приложения на одной версии Ruby.

              Heroku free plan:
              Request rate: 25.9 req/s (38.7 ms/req)

              real 0m19.393s


              Linode 512:
              Request rate: 193.3 req/s (5.2 ms/req)

              real 0m2.596s


              Я переносил в прямо противоположенном направлении, и получил ускорение (в плюс к возможности отдавать большие файлы, не лежащие в /public больше, чем в один поток, чего Heroku как я помню, не может с одним воркером).

              Не могу не согласиться, что на небольших нагрузок разница очень несущественна, но вот когда даже человека три сидит, и нужно в плане проекта поменять у 20ти тасков версию выполнения, это реально напрягает.
                0
                Думаю тут вы правы, однопоточность бесплатного хероку может плохо сказаться в разных ситуациях. В моем случае приложение используется локально с 5 пользователями и видать еще не столкнулись с такими проблемами. Жаль что прошого VPS уже не осталось хотелось бы сравнить его производительность.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое