Deploy Rails приложения с Capistrano, Nginx, Unicorn. Часть 3\3

Deploy Rails приложения с Capistrano, Nginx, Unicorn. Часть 3\3

Первая часть и вторая часть про настройки сервера. Перейдём к третьей части.

Произведём некоторые настройки на нашей ЛОКАЛЬНОЙ машине(на вашем компютере где вы разработали ваше приложение)

Создайте в корне приложения файл .ruby-version (с точкой в начале) и впишите в неё версию руби

2.2.2

Внесите изменения в Gemfile

ruby '2.2.2'

gem 'unicorn'

gem 'capistrano-rails', group: :development

Запустите bundler и установите гемы

bundle install

Установите заглушки (binstubs) для Capistrano

bundle binstubs capistrano

Инициализируем capistrano

bin/cap install

В файл Capfile, в корне вашего приложения, сразу после require 'capistrano/deploy' добавьте следующую строчку

require 'capistrano/rails'

Добавьте / Замените конфигурации в config/deploy.rb

set :application, 'myrailsapp'
set :repo_url, 'https://github.com/BadAllOff/myrailsapp.git'
set :deploy_to, '/opt/www/myrailsapp'
set :user, 'deploy'
set :linked_dirs, %w{log tmp/pids tmp/cache tmp/sockets}

#файлы ниже надо будет создать на сервере
append :linked_files, 'config/master.key', 'config/database.yml'

namespace :deploy do
 %w[start stop restart].each do |command|
   desc 'Manage Unicorn'
   task command do
     on roles(:app), in: :sequence, wait: 1 do
       execute "/etc/init.d/unicorn_#{fetch(:application)} #{command}"
     end
   end
 end

 after :publishing, :restart
end

У меня бывал глюк с подключением по SSH, решилось заменой на HTTPS адрес

set :repo_url, 'https://github.com/BadAllOff/myrailsapp.git'

Если же надо подключиться к приватному репозиторию, можно сделать следующим образом:

set :repo_url, "https://#{ENV['GITHUB_USERNAME']}:#{ENV['GITHUB_PASSWORD']}@github.com/BadAllOff/myrailsapp.git"

ENV['GITHUB_USERNAME'] и ENV['GITHUB_PASSWORD'] можно указать в переменных окружения, Capistrano это обычный руби код и все правила руби в нём работают. Переменные окружения можно глянутьв консоли рельсов 'rails c'


 

Изменим конфигурацию в /config/deploy/production.rb на ip вашего сервера или доменное имя. Тут мы как бы ролям app web и db дали полномочия пользователя deploy на сервере

role :app, %w{deploy@0.0.0.0}

role :web, %w{deploy@0.0.0.0} # Управляет asset pipeline

role :db, %w{deploy@0.0.0.0} # Работает с БД

Создадим config/unicorn.rb файл с таким контентом (незабываем изменять myrailsapp если у вас свои названия для папок и прочее):

root = "/opt/www/myrailsapp/current"

working_directory root

pid "#{root}/tmp/pids/unicorn.pid"

stderr_path "#{root}/log/unicorn.log" # логи ошибок

stdout_path "#{root}/log/unicorn.log" # логи сервака

listen "/tmp/unicorn.myrailsapp.sock"

worker_processes 1

timeout 30

Закомментируем username и password в config/database.yml. На сервере наше приложение будет использовать имя пользователя под которым запущенно приложение (т.е. deploy) как название РОЛИ для базы данных. А мы помним что специально для этого мы ранее и создали роль deploy в posтgres-е. Поэтому переопределение имени пользователя нам только помешает подключиться.

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5

production:

  <<: *default
  database: myrailsapp_production
  host: '' 
  username: deploy

Но конечно ничто вам не мешает создать в postgres ещё одну роль под именем “myrailsapp”, дать ей права на определённую бд, и записать её пароль в переменную окружения на сервере. Это уже на ваше усмотрение, как вам удобно. Внизу я покажу куда можно записать пароль если вы решите следовать таким путём.

Внесём изменения в наш репозиторий на git

git add .

git commit -m 'Added settings to deploy app'

git push

Создадим секретный ключ для использования на сервере

bin/rake secret

НА СЕРВЕРЕ! Заходим на сервер под пользователем username.

Установим переменные окружения:

sudo
nano /home/deploy/.bashrc

Сразу после строчек

export PATH="$HOME/.rbenv/bin:$PATH"

eval "$(rbenv init -)"

впишите следующее:

export SECRET_KEY_BASE=ВАШСГЕНЕРИРОВАННЫЙСЕКРЕТНЫЙКЛЮЧЬ

В Rails 5.2 еще используеться файл secrets.yml но он обявлен устаревшим. Теперь всё данны храняться в защифрованном виде в файле credentials.yml.enc (редактировать который можно командой: EDITOR=nano bin/rails secrets:edit). Нужно также ввести новую переменную окружения для расшифровки файла. Там же, в файле .bashrc, вводим новую переменную (название рекомендовано самими рельсами), значение для переменной берем из файла /config/master.key:

export RAILS_MASTER_KEY=STRINGFROMMASTERKEYFILE

Если вы решили всё таки использовать другу роль для подключения к бд, cюда же вы можете вписать и пароль от вашего БД

export MYRAILSAPP_DATABASE_PASSWORD=ВАШПАРОЛЬОТДБ

ПРИМЕЧАНИЕ! Если вы УЖЕ используете гем Devise в вашем приложении, то добавьте строку в /config/initializers/devise.rb

config.secret_key = ENV['DEVICE_CONFIG_SECRET_KEY']

и добавить в окружение переменную

export DEVICE_CONFIG_SECRET_KEY='секретныйключьможетесгенерироватьегосами'

Сохраним, дадим башу перегрузить переменные

. ~/.bashrc

и перезапускаем nginx

sudo service nginx restart

НА ВАШЕМ КОМПЮТЕРЕ запустим некоторую предварительную проверку

bin/cap production git:check

если появится ошибка:

DEBUG [4618dd23] Warning: Permanently added 'github.com,192.30.252.129' (RSA) to the list of known hosts.

DEBUG [4618dd23] Permission denied (publickey).

DEBUG [4618dd23] fatal: Could not read from remote repository.

DEBUG [4618dd23]

DEBUG [4618dd23] Please make sure you have the correct access rights

DEBUG [4618dd23] and the repository exists.

Попробуйте изменить строку set :repo_url в config/deploy.rb на https :

set :repo_url, 'https://github.com/RebelioUS/myrailsapp.git'

ещё одна проверка (должна пройти без запинки):

bin/cap production deploy:check

И вот! Торжественный момент развёртывания Вашего приложения!

bin/cap production deploy

Зайдём на наш домен и ...

ВУАЛЯ! Работает!

Теперь после каждого коммита на гитхаб Вы можете перезапустить сервер с обновлённым приложением одной командой

bin/cap production deploy

Для полной уверенности перегрузите сервер

sudo reboot

Поздравляю Вас с запуском вашего приложения! Оставьте отзыв если это Вам помогло или возникнут какие либо проблемы. Постараюсь помочь Вам в решении, да и сам опыта наберусь (так как представляется мне, что хоть я и учёл самые важные ошибки, их может быть гораздо больше). Спасибо!


Comments

Log In and Leave a comment

Back