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}

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

development:

  <<: *default

  database: myrailsapp_development

  username: myrailsapp

password: <%= ENV['MYRAILSAPP_DATABASE_PASSWORD'] %>

test:

  <<: *default

  database: myrailsapp_test

  username: myrailsapp

password: <%= ENV['MYRAILSAPP_DATABASE_PASSWORD'] %>

production:

  <<: *default

  database: myrailsapp_production

  # username: myrailsapp

  # password: <%= ENV['MYRAILSAPP_DATABASE_PASSWORD'] %>

Если на сервере, возникнут проблемы с подключением к БД постгресу, Следует изменить настройки для БД. Надо позволить БД давать доступ от локальных пользователей. Тут на наглийском, но вы поймете)

Configuration

  1. Edit postgre configuration file:

    sudo nano /etc/postgresql/POSTGRE_VERSION/main/pg_hba.conf
    
  2. Change all configuration access to:

    # Database administrative login by Unix domain socket
    local   all             all                                     trust
    
    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    
    # "local" is for Unix domain socket connections only
    local   all             all                                     trust
    # IPv4 local connections:
    host    all             all             127.0.0.1/32            trust
    # IPv6 local connections:
    host    all             all             ::1/128                 trust
    
  3. Restart postgre server

    sudo /etc/init.d/postgresql restart
    
  4. Enjoy :)

 

Но конечно ничто вам не мешает создать в 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=ВАШСГЕНЕРИРОВАННЫЙСЕКРЕТНЫЙКЛЮЧЬ

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

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

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

config.secret_key = ENV['DEVICE_CONFIG_SECRET_KEY']

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

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

Из за того как Capistrano подключается к вашему серверу, с переменными окружения тоже могут быть проблемы. Поэтому рекомендую хранить переменные окружения вместо .bashrc .bash_profile .profile вот здесь:

sudo -H nano /etc/environment

А вот отличный ответ почему всё так происходит (рекомендую ознакомиться, сэкономите кучу нервов при деплое непонимая почему капистрано не видит переменные)

Capistrano makes its connection as a non-login, non-interactive shell. It will not automatically evaluate the various home scripts.

How Capistrano makes its connection is described here:http://capistranorb.com/documentation/advanced-features/ptys/

What files are evaluated on the various shell modes is described here:https://github.com/rbenv/rbenv/wiki/Unix-shell-initialization#bash

A number of other ways to set environment variables is shown here: Capistrano: Can I set an environment variable for the whole cap session?

A duplicate question is here: https://superuser.com/questions/564926/profile-is-not-loaded-when-using-ssh-ubuntu

The FAQ section for this question is here: http://capistranorb.com/documentation/faq/why-does-something-work-in-my-ssh-session-but-not-in-capistrano/

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

. ~/.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