Уже давно пользуюсь хостингом locum.ru для своих проектов. И вот возникла необходимость разместить там проект на Ruby on Rails. Сделать это было нелегко, поэтому выкладываю инструкцию по деплою Rails приложений на этом хостинге.
Предупреждение: Чтобы легко разрабатывать на Ruby on Rails, используйте на своем ПК ОС Linux. Мы используем Ubuntu 14.04 x64.
Мы будем деплоить простое Ruby on Rails приложение, созданное по уроку. Вы можете деплоить свой проект. Главное, чтобы он был работоспособен у вас на ПК, когда вы запускаете сервер разработки командой rails s.
1. Создадим в админке хостинга locum.ru проект. В админке хостинга: Услуги > Проекты > кнопка "Создать проект".
Тип проекта: Ruby on Rails. Имя: blog. Создать базу данных: PostgreSQL.
После создания проекта в его настройках вы увидите сервер, к которому он привязан. В нашем случае это - fluorine. В настройках проекта также выберем версию интерпретатора Ruby: 2.1.5.
Нужно подождать некоторое время (у нас это заняло 5-10 мин.), чтобы адрес, к которому проект привязан, стал доступен: http://blog.kenny.lclients.ru/ , где kenny - имя пользователя на хостинге locum.
Перейдя по адресу проекта, вы увидите страницу стандартного приветствия: Welcome aboard
2. Для деплоя будем применять capistrano, поэтому нужно обязательно поместить проект в GIT-репозиторий. Поскольку хостинг locum позволяет создать приватный GIT-репозиторий, то мы этим воспользуемся. О том, как это сделать, можно узнать в уроке по созданию git-репозитория на хостинге locum.
3. Проверим окружение нашего локального ПК.
3.1. Проверим версию ruby и rails:
$ ruby -v
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]
$ rails -v
Rails 4.1.8
Примечание: На вашем ПК можно установить несколько версий ruby. Это можно сделать при помощи rvm manager. Установите ту версию, которая будет использоваться на сервере. В нашем случае, это ruby 2.1.5.
3.2. Проверим, установлен ли у нас capistrano:
$ cap -V
Capistrano Version: 3.2.1 (Rake Version: 10.3.2)
Если нет, установим:
$ sudo apt-get install capistrano
Примечание: После установки капистрано при попытке выполнить cap -V может возникнуть ошибка: cannot load such file -- capistrano/cli. Для ее устранения попробуйте удалить гем capistrano, сделать bundle update и снова установить гем capistrano:
$ gem uninstall capistrano
$ bundle update
$ gem install capistrano
4. Для корректной работы capistrano с нашим локальным проектом, добавим следующие строки в Gemfile:
Мы изменили Gemfile, поэтому нужно дать команду на установку новых гемов:
$ bundle install
5. На нашем ПК даем capistrano команду на генерацию нужных файлов:
$ cap install
Будут выполнены следующие действия:
mkdir -p config/deploy
create config/deploy.rb
create config/deploy/staging.rb
create config/deploy/production.rb
mkdir -p lib/capistrano/tasks
6. Теперь нужно корректно настроить файл config/deploy.rb. Но прежде чем это сделать, давайте получим значение переменной $PATH на сервере locum.
$ ssh hosting_kenny@fluorine.locum.ru
$ rvm use ruby-2.1.5
$ echo $PATH
Хостинг locum использует rvm. В настройках проекта в админке мы задали, что будем использовать версию 2.1.5. Поэтому здесь мы перешли на использование этой версии ruby и получили значение переменной $PATH для данной версии. Полученное значение нужно поместить в параметр path метода set :default_env в файле config/deploy.rb:
8. Пока capistrano не знает, как делать деплой на продакшен. Исправим это, отредактировав файл config/deploy/production.rb:
Все остальные строки в этом файле следует закомментировать.
9. Попробуем дать команду на деплой приложения в продакшен. Для этого у себя на локальном ПК выполните команду, находясь в папке проекта:
$ cap production deploy
Может возникнуть ошибка: Gemfile:28: syntax error, unexpected ':', expecting $end gem 'sdoc', '~> 0.4.0', group: :doc, а также такая ошибка: syntax error, unexpected ':', expecting $end gem 'spring', group: :development
Для устранения, нужно удалить в Gemfile проекта вторые части строк и оставить так:
gem 'sdoc', '~> 0.4.0'
gem 'spring'
Важно: Перед запуском команды cap production deploy ВСЕ ИЗМЕНЕНИЯ в файлах проекта должны быть отправлены на удаленный репозиторий (команда git push), т.к. именно оттуда capistrano берет файлы для деплоя.
Скорее всего не запущен процесс сервера unicorn, обслуживающий коннекты к данному адресу.
Зайдите на сервер locum и выполните команду:
$ ssh hosting_kenny@fluorine.locum.ru
$ ps ax
PID TTY STAT TIME COMMAND
1157 pts/1 SNs 0:01 -bash
3414 ? SNl 0:02 unicorn_rails master -Dc /etc/unicorn/blog.kenny.rb
3442 ? SNl 0:00 unicorn_rails worker[0] -Dc /etc/unicorn/blog.kenny.rb
7607 pts/1 RN+ 0:00 ps ax
24885 ? Sl 0:06 unicorn_rails master -Dc /etc/unicorn/railsblog.kenny.rb
24956 ? Sl 0:01 unicorn_rails worker[0] -Dc /etc/unicorn/railsblog.kenny.rb
Если у вас нет процесса unicorn, который соответствует вашему проекту, то просто нужно его запустить. Для этого нужно перейти в папку проекта и выполнить команду:
$ cd ~/projects/blog/current
$ rvm use 2.1.5 do bundle exec unicorn_rails -Dc "/etc/unicorn/blog.kenny.rb"
Здесь blog - название проекта, kenny - логин пользователя на хостинге locum.
Предупреждение: Чтобы легко разрабатывать на Ruby on Rails, используйте на своем ПК ОС Linux. Мы используем Ubuntu 14.04 x64.
Мы будем деплоить простое Ruby on Rails приложение, созданное по уроку. Вы можете деплоить свой проект. Главное, чтобы он был работоспособен у вас на ПК, когда вы запускаете сервер разработки командой rails s.
1. Создадим в админке хостинга locum.ru проект. В админке хостинга: Услуги > Проекты > кнопка "Создать проект".
Тип проекта: Ruby on Rails. Имя: blog. Создать базу данных: PostgreSQL.
После создания проекта в его настройках вы увидите сервер, к которому он привязан. В нашем случае это - fluorine. В настройках проекта также выберем версию интерпретатора Ruby: 2.1.5.
Нужно подождать некоторое время (у нас это заняло 5-10 мин.), чтобы адрес, к которому проект привязан, стал доступен: http://blog.kenny.lclients.ru/ , где kenny - имя пользователя на хостинге locum.
Перейдя по адресу проекта, вы увидите страницу стандартного приветствия: Welcome aboard
2. Для деплоя будем применять capistrano, поэтому нужно обязательно поместить проект в GIT-репозиторий. Поскольку хостинг locum позволяет создать приватный GIT-репозиторий, то мы этим воспользуемся. О том, как это сделать, можно узнать в уроке по созданию git-репозитория на хостинге locum.
3. Проверим окружение нашего локального ПК.
3.1. Проверим версию ruby и rails:
$ ruby -v
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]
$ rails -v
Rails 4.1.8
Примечание: На вашем ПК можно установить несколько версий ruby. Это можно сделать при помощи rvm manager. Установите ту версию, которая будет использоваться на сервере. В нашем случае, это ruby 2.1.5.
3.2. Проверим, установлен ли у нас capistrano:
$ cap -V
Capistrano Version: 3.2.1 (Rake Version: 10.3.2)
Если нет, установим:
$ sudo apt-get install capistrano
Примечание: После установки капистрано при попытке выполнить cap -V может возникнуть ошибка: cannot load such file -- capistrano/cli. Для ее устранения попробуйте удалить гем capistrano, сделать bundle update и снова установить гем capistrano:
$ gem uninstall capistrano
$ bundle update
$ gem install capistrano
4. Для корректной работы capistrano с нашим локальным проектом, добавим следующие строки в Gemfile:
gem 'capistrano' gem 'capistrano-rails' gem 'capistrano-bundler' gem 'capistrano-rvm' gem 'unicorn'
Мы изменили Gemfile, поэтому нужно дать команду на установку новых гемов:
$ bundle install
5. На нашем ПК даем capistrano команду на генерацию нужных файлов:
$ cap install
Будут выполнены следующие действия:
mkdir -p config/deploy
create config/deploy.rb
create config/deploy/staging.rb
create config/deploy/production.rb
mkdir -p lib/capistrano/tasks
6. Теперь нужно корректно настроить файл config/deploy.rb. Но прежде чем это сделать, давайте получим значение переменной $PATH на сервере locum.
$ ssh hosting_kenny@fluorine.locum.ru
$ rvm use ruby-2.1.5
$ echo $PATH
Хостинг locum использует rvm. В настройках проекта в админке мы задали, что будем использовать версию 2.1.5. Поэтому здесь мы перешли на использование этой версии ruby и получили значение переменной $PATH для данной версии. Полученное значение нужно поместить в параметр path метода set :default_env в файле config/deploy.rb:
# config valid only for Capistrano 3.1 lock '3.2.1' application = 'blog' login = 'kenny' $user = 'hosting_' + login $server = 'fluorine.locum.ru' rvm_ruby_string = '2.1.5' deploy_to = "/home/#{ $user }/projects/#{ application }" unicorn_conf = "/etc/unicorn/#{ application }.#{ login }.rb" unicorn_pid = "/var/run/unicorn/#{ $user }/#{ application }.#{ login }.pid" unicorn_start_cmd = "(cd #{ deploy_to }/current; rvm use #{ rvm_ruby_string } do bundle exec unicorn_rails -Dc #{ unicorn_conf })" set :application, application set :repo_url, "ssh://#{ $user }@#{ $server }/home/#{ $user }/git/#{ application }.git" # Default branch is :master # ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }.call # Default deploy_to directory is /var/www/my_app set :deploy_to, deploy_to # Default value for :scm is :git # set :scm, :git # Default value for :format is :pretty # set :format, :pretty # Default value for :log_level is :debug # set :log_level, :debug # Default value for :pty is false set :pty, true # Default value for :linked_files is [] # set :linked_files, %w{config/database.yml} # Default value for linked_dirs is [] # set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system} # Default value for default_env is {} set :default_env, { # Выполните на удаленном сервере # $ echo $PATH и результат поместите сюда: path: '/usr/local/rvm/gems/ruby-2.1.5/bin:/usr/local/rvm/gems/ruby-2.1.5@global/bin:/usr/local/rvm/rubies/ruby-2.1.5/bin:/usr/local/rvm/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin:/home/hosting_kenny/.gem/ruby/1.8/bin:/var/lib/gems/1.8/bin:/home/hosting_kenny/local/lib/python2.7/site-packages:/home/hosting_kenny/local/lib:/home/hosting_kenny/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games' } # Default value for keep_releases is 5 # set :keep_releases, 5 namespace :deploy do desc 'Restart application' task :restart do on roles(:app), in: :sequence, wait: 5 do # Your restart mechanism here, for example: # execute :touch, release_path.join('tmp/restart.txt') end end after :publishing, :restart after :restart, :clear_cache do on roles(:web), in: :groups, limit: 3, wait: 10 do # Here we can do anything such as: # within release_path do # execute :rake, 'cache:clear' # end end end end7. Расскомментируем следующие строки в Capfile нашего проекта blog и убедимся, что он включает следующие команды:
require 'capistrano/deploy' require 'capistrano/rvm' require 'capistrano/bundler' require 'capistrano/rails/assets' require 'capistrano/rails/migrations'
8. Пока capistrano не знает, как делать деплой на продакшен. Исправим это, отредактировав файл config/deploy/production.rb:
connect_to = "#{$user}@#{$server}" role :app, [connect_to] role :web, [connect_to] role :db, [connect_to]
Все остальные строки в этом файле следует закомментировать.
9. Попробуем дать команду на деплой приложения в продакшен. Для этого у себя на локальном ПК выполните команду, находясь в папке проекта:
$ cap production deploy
Может возникнуть ошибка: Gemfile:28: syntax error, unexpected ':', expecting $end gem 'sdoc', '~> 0.4.0', group: :doc, а также такая ошибка: syntax error, unexpected ':', expecting $end gem 'spring', group: :development
Для устранения, нужно удалить в Gemfile проекта вторые части строк и оставить так:
gem 'sdoc', '~> 0.4.0'
gem 'spring'
Важно: Перед запуском команды cap production deploy ВСЕ ИЗМЕНЕНИЯ в файлах проекта должны быть отправлены на удаленный репозиторий (команда git push), т.к. именно оттуда capistrano берет файлы для деплоя.
Возможные ошибки при деплое Ruby on Rails
1. При попытке перейти по адресу проекта, к примеру, http://blog.kenny.lclients.ru возникает ошибка 502 Bad Gateway.Скорее всего не запущен процесс сервера unicorn, обслуживающий коннекты к данному адресу.
Зайдите на сервер locum и выполните команду:
$ ssh hosting_kenny@fluorine.locum.ru
$ ps ax
PID TTY STAT TIME COMMAND
1157 pts/1 SNs 0:01 -bash
3414 ? SNl 0:02 unicorn_rails master -Dc /etc/unicorn/blog.kenny.rb
3442 ? SNl 0:00 unicorn_rails worker[0] -Dc /etc/unicorn/blog.kenny.rb
7607 pts/1 RN+ 0:00 ps ax
24885 ? Sl 0:06 unicorn_rails master -Dc /etc/unicorn/railsblog.kenny.rb
24956 ? Sl 0:01 unicorn_rails worker[0] -Dc /etc/unicorn/railsblog.kenny.rb
Если у вас нет процесса unicorn, который соответствует вашему проекту, то просто нужно его запустить. Для этого нужно перейти в папку проекта и выполнить команду:
$ cd ~/projects/blog/current
$ rvm use 2.1.5 do bundle exec unicorn_rails -Dc "/etc/unicorn/blog.kenny.rb"
Здесь blog - название проекта, kenny - логин пользователя на хостинге locum.
Комментариев нет:
Отправить комментарий