ХостингLocum — новая сила с RVM

Что случилось?

Мы долго шли к этому, и все-таки это состоялось. Теперь по умолчанию используется rvm и bundler на всех новых проектах. Старые проекты не будут затронуты до тех пор, пока вы сами не начнете переключать версию ruby в настройках. Подумайте — стоит ли делать это, если все работает.

Зачем?

Хотя бы потому что мы всегда стараемся предоставлять новые технологии, как только они становятся достаточно стабильны и удобны. К тому же поступило много просьб от наших пользователей о переходе на новую версию. Конечно, полный переход мы навязывать не стали, ведь есть много проектов, которые давно уже работают на 1.8.7, разработка не ведется и всех все устраивает, так зачем же ломать? Поэтому пришлось делать поддержку нескольких версий, ну а за одно и переключение между ними.

Ruby 1.8.7 уже устарел, тем более в новых версиях Ruby On Rails его поддержка со временем прекратится. Сейчас все наши пользователи могут использовать самые последние версии ruby, да и к тому же переключаться между ними. Переведите свой проект на 1.9.3 и наслаждайтесь производительностью. Конечно, перед этим необходимо установить нужные gem для этой версии ruby. Об этом читайте далее.

Как теперь все работает?

В качестве сервера приложений все так же используется unicorn — он довольно хорошо себя проявил за последнее время по сравнению со своими конкурентами. По крайней мере в разделяемой среде, где много проектов, мы пока не видим ему альтернативы.

Теперь для запуска процессов нужно будет указывать какая версия ruby вам нужна. Для этого используется Ruby Version Manager или сокращенно — RVM. Наверняка многие из вас уже знакомы с этим средством переключения между различными версиями ruby. Если нет — обратитесь к официальной документации, она довольно проста и понятна.

Как же теперь запускается unicorn?

Для этого нужно выполнить следующую команду:

rvm use <версия> do bundle exec unicorn_rails -Dc /etc/unicorn/<имя_проекта>.<логин_в_панель_управления>.rb

Вместо <версия> нужно подставить одно из следующих значений, что и будет определять версию ruby, которая используется на данный момент:

Перезагрузка кода

Тут ничего не поменялось, так как нам нужно всего лишь отправить сигнал USR2 мастер-процессу, это делается и без rvm:

kill -USR2 `cat /var/run/unicorn/<имя пользователя на сервере>/<имя_проекта>.<логин_в_панель_управления>.pid`

Как всегда логи находятся в logs/unicorn.*.log, и если вдруг после отправки сигнала ничего не поменялось — это хороший повод заглянуть в них. Полная остановка unicorn делается аналогично, но сигнал будет QUIT, вместо USR2.

Почему bundler а не rvm gemsets?

Этот вопрос может возникнуть у знакомых с работой rvm пользователей. Ответ довольно просто — gemsets не предназначены для работы в разделяемой среде между несколькими пользователям — будут проблемы прав доступа. Тем более bundler стал стандартным средством ограничение области видимости gem а так же их установки и обновления, независимо от того используется вообще rvm или нет. Большинство проектов у нас используют bundler уже сейчас, а уж все новые так и тем более должны это делать.

Куда ставить bundle?

Мы рекомендуем ставить в ../../shared/gems, сделать это можно указав нужный параметр при выполнении команды (предполагается, что команда выполняется в RAILS_ROOT):

bundle install --path ../../shared/gems

Shared — чтобы не переустанавливать все gem после каждого деплоя, а просто вызывать bundle update.

Как переключать версии?

Войдите в раздел «Услуги»->»Проекты», далее нажмите на ссылку «подробнее» напротив нужного проекта в таблице, откроются параметры проекта. Там вы увидите поле с версией ruby, выберите интересующую вас версию и нажмите кнопку сохранения параметров.

Что при этом произойдет?

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

Итак, по умолчанию у нас запущен проект с ruby 1.9.3, если мы сменили версию, то вначале будет удалена директория ../../shared/gems, так как система предполагает, что ваши gem стоят там. Удалять директорию приходится потому, что bundler не может понять иногда, что native extension того или иного gem собран был для другой версии ruby и попытается использовать его не пересобирая, что приведет к ошибке и падению unicorn. Конкретно такая проблема наблюдается при смене версии с 1.9.3 до 1.9.2, если не удалить все gem и не поставить снова.

После этого в RAILS_ROOT (projectname/current) будет выполнена команда bundle install —path ../../shared/gems, а затем — полная остановка unicorn и запуск его с указанием новой версии ruby для rvm.

Чтобы в процессе этого не возникало никаких ошибок убедитесь что ваш Gemfile валиден и код проекта сможет работать с выбранной вами версией, потому что иногда синтаксис все-таки не полностью совместим. Об отличиях между разными версиями ruby вы всегда сможете прочесть в официальных документах и описаниях каждого из релизов.

Почему не rvmrc?

rvmrc — это всего лишь шелл-скрипт, использование которого рассчитано на определенные настройки пользовательской оболочки. Мы не можем гарантировать что у всех эти настройки соблюдаются, а уж тем более не хотим это навязывать. К тому же в нескольких уровнях rvmrc легко запутаться. Мы никак не ограничиваем вас в использовании rvmrc, но изначально не навязываем его. Вы всегда можете самостоятельно настроить и пользоваться им как вам будет удобно. Подробно о работе rvmrc читайте в документации по rvm.

Что по умолчанию?

По умолчанию создается «пустой» rails-проект (по сути то, что получаем после rails new) с ruby 1.9.3 и rails 3.1.1

Кстати, не удивляйтесь, что ссылка «About your application’s environment» не работает — по идеологии Ruby On Rails она должна работать только в development-окружении, а на хостинге все запускается в production.

Что станет с Capistrano?

Как всегда мы предполагаем, что для размещения кода на сервере будет использоваться Capistrano. RVM этому никак не помешает, просто мы теперь генерируем deploy.rb c учетом использования rvm.

Получить deploy.rb для каждого конкретного проекта можно в вашей панели управления услугами Locum.ru. Войдите в раздел «Услуги»->»Проекты», далее нажмите на ссылку «подробнее» напротив нужного проекта в таблице, откроются параметры проекта. Там вы увидите кнопку для генерации deploy.rb, нажмите ее и получите содержание файла с учетом rvm.

Обычно для того, чтобы начать пользоваться Capistrano достаточно просто добавить в deploy.rb ссылку на вашу систему контроля версий, настроить авторизацию по ключам на наш сервер. а так же с нашего сервера к вашей системе контроля версий (git, svn, mercurial). Если вы нигде еще не разместили свой проект в контроле версий, то можете создать гит репозиторий на нашем сервере, об этом у нас есть соответствующая заметка в блоге.

Имейте ввиду, что если вы измените версию ruby для проекта, вам необходимо будет поменять ее и в вашем deploy.rb.

Что делать с моими старыми проектами?

Решение остается полностью за вами. Если вы знаете что такое rvm и понимаете зачем вам нужно перейти на новую версию, или даже если понимаете, что это не имеет смысла но хочется (бывает такое, не правда ли?), вы всегда можете это сделать. А так — просто не трогайте их, с ними ничего не произошло.

На что еще важно обратить внимание?

Всегда помните, что все команды ваши теперь следует запускать в rvm и bundle, т.е. вместо

rails c

мы используем

rvm use <версия> do bundle exec rails c

И только так входим в консоль. Мы всегда рекомендуем вызывать команду явно, а не полагаться на rvmrc, фазу луны или еще что-нибудь. Так меньше вероятность совершить ошибку, потому что довольно легко забыть изменить версию в rvmrc и потом долго думать от чего не работает.

Заключение

На этом у нас все. Ждем ваших комментариев и отзывов, спасибо, что выбираете Locum.ru. Мы же и впредь будем стараться радовать вас внедрением новых технологий.

  1. Alex:

    Почему Вам бы не записать скринкаст, как с нуля деплоить…а то везде все размазано, не понятно

  2. Reallyrails:

    Огромное спасибо за RVM!

    В первой команде ошибка: после «rvm use » забыли «do».

  3. Очепятки:
    1) «Что станет Capistrano?» — может, пропущен предлог?
    2) «команда bundle install –path vendor/games» — games??? lolчто?

    СПАСИБО, ДОЛГО ЖДАЛ!!!

  4. Alex, мы, вероятно, запишем. Но сложно представить как rails-разработчику непонятно.

  5. Спасибо за замечания. Опечатки поправили. За одно и перекинули вообще в shared/gems, а то в vendor придется все время переставлять.

  6. Alex:

    freeman, ну теоретически оно все понятно, но я допустим один раз пробывал деплоить так и не получилось, думаю я не один такой rails-разработчик))

  7. Начинающим сложно у Вас. Так и не понятно как установить гемы на сервер и как использовать все в месте.

  8. Алексей:

    Да, скринкаст очень нужен

  9. Александр:

    Ребята, Вы меня продолжаете радовать! Отилчный подарок под новый год :-) Желаю Вам в Новом Году побольше клиентов и успешных проектов!!!

  10. Андрей:

    Хорошо что предоставили выбор, но этими изменениями мне усложнили размещение проекта, непонятно почему при создании проекта rails через панель управления, адаптер для базы остаётся по дефолту, хотя СУБД была выбрана, так же остаётся непонятным как установить(обновить версию rails до последней), есть ещё масса других вопросов. Присоединяюсь к мнению, что хорошо бы прочитать статью как теперь нужно размещать свой проект на вашем сервере.

  11. Очень ныжны или скрикаст или инструкция со скриптами для деплоя. Очень всё непрозрачно. Спасибо.

  12. anabios:

    Здравствуйте!
    Планирует ли Locum создание облачного хостинга?

  13. Дмитрий:

    Теория это очень хорошо, но привели бы практический пошаговый пример, как развернуть какой-нибудь популярный проект на вашем хостинге, например, redmine. А то у меня с новыми изменениями по этой статье сделать уже не получилось.