Первая часть и вторая часть про настройки сервера. Перейдём к третьей части.
Произведём некоторые настройки на нашей ЛОКАЛЬНОЙ машине(на вашем компютере где вы разработали ваше приложение)
Создайте в корне приложения файл .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/.bashr
c
Сразу после строчек
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
Поздравляю Вас с запуском вашего приложения! Оставьте отзыв если это Вам помогло или возникнут какие либо проблемы. Постараюсь помочь Вам в решении, да и сам опыта наберусь (так как представляется мне, что хоть я и учёл самые важные ошибки, их может быть гораздо больше). Спасибо!