Статьи

Развертывание приложения Rails в облаке с помощью Unicorn, Nginx и Capistrano

Мы все знаем, как легко создать приложение на Rails, но как быть, когда ваше приложение готово к работе?

Первое, что вам нужно сделать, это настроить сервер и установить соответствующие библиотеки, поэтому запустите окно терминала и SSH на своем сервере, после того как вы это сделаете, вам нужно будет выполнить несколько команд.

Настройка сервера

Как только вы закончите настройку вашего сервера, вам нужно установить Ruby, для этого вы можете использовать RVM или rbenv, но я оставлю этот выбор вам.

Загрузка на github

Далее мы собираемся загрузить наше приложение на github. Отправляйтесь на github и создайте новый репозиторий. После того, как вы это сделаете, запустите терминал на вашем локальном компьютере и введите «cd» в корень вашего приложения rails. Теперь я предполагаю, что у вас уже есть некоторый опыт работы с командами git. Если нет, то не бойтесь, у нас есть все это. Как только вы окажетесь в корне своего приложения rails, выполните следующие команды:

git init
git add .
git commit -m «<message>»
git remote add origin [email protected]:<username>/<git repo>.git
git push origin master

view raw
gistfile1.txt
hosted with ❤ by GitHub

Здесь мы инициализируем пустой репозиторий git внутри корня приложения rails и добавляем все ваши файлы в репозиторий git (если вам нужно игнорировать файлы, вы можете отредактировать файл .gitignore.) Далее мы предоставили сообщение к коммиту и добавлен удаленный источник , который будет отслеживать наше локальное развитие. Наконец, мы перенесли изменения в нашей основной ветке в github.

Установка Капистрано

Мы почти там! Настало время настроить Capistrano для развертывания, и первым делом добавьте его в Gemfile:

  жемчужина капистрано 

Сохраните Gemfile и запустите

  расслоение 

Команда для установки драгоценного камня. Далее мы собираемся описать наш проект, запустив окно терминала:

capify .

Это создаст 2 файла: один файл Cap, который будет помещен в вашу корневую папку. Кстати, если вы используете конвейер ресурсов rails, вам нужно будет раскомментировать строку -load ‘deploy / assets’-. Второй файл — это файл deploy.rb, который будет помещен в папку config вашего приложения rails. В deploy.rb вы настроите все команды, которые capistrano будет выполнять на нашем удаленном сервере. Вы можете скопировать и вставить приведенный здесь пример:

require «bundler/capistrano»
# Define your server here
server «<server>», :web, :app, :db, primary: true
# Set application settings
set :application, «<app_name>»
set :user, «<deployment_user>» # As defined on your server
set :deploy_to, «/home/#{user}/apps/#{application}« # Directory in which the deployment will take place
set :deploy_via, :remote_cache
set :use_sudo, false
set :scm, «git»
set :repository, «[email protected]:<git_user>/#{application}.git»
set :branch, «master»
default_run_options[:pty] = true
ssh_options[:forward_agent] = true
after «deploy», «deploy:cleanup» # keep only the last 5 releases
namespace :deploy do
%w[start stop restart].each do |command|
desc «#{command} unicorn server»
task command, roles: :app, except: {no_release: true} do
run «/etc/init.d/unicorn_#{application} #{command}« # Using unicorn as the app server
end
end
task :setup_config, roles: :app do
sudo «ln -nfs #{current_path}/config/nginx.conf /etc/nginx/sites-enabled/#{application}«
sudo «ln -nfs #{current_path}/config/unicorn_ini.sh /etc/init.d/unicorn_#{application}«
run «mkdir -p #{shared_path}/config»
put File.read(«config/database.yml»), «#{shared_path}/config/database.yml»
puts «Now edit the config files in #{shared_path}
end
after «deploy:setup», «deploy:setup_config»
task :symlink_config, roles: :app do
run «ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml»
end
after «deploy:finalize_update», «deploy:symlink_config»
desc «Make sure local git is in sync with remote.»
task :check_revision, roles: :web do
unless `git rev-parse HEAD` == `git rev-parse origin/master`
puts «WARNING: HEAD is not the same as origin/master»
puts «Run `git push` to sync changes.»
exit
end
end
before «deploy», «deploy:check_revision»
end

view raw
deploy.rb
hosted with ❤ by GitHub

Как вы можете видеть, этот файл развертывания использует единорога в качестве сервера (который я рекомендую из-за его стабильности, но вы можете использовать сервер по вашему выбору.) После того, как вы закончите настройку файла развертывания с вашей пользовательской конфигурацией, создайте два файла в вашей папке конфигурации: один с именем nginx.conf , а другой с именем unicorn.rb . Не стесняйтесь использовать примеры, представленные здесь:

nginx.conf

upstream unicorn {
server unix:/tmp/unicorn.<app_name>.sock fail_timeout=0;
}
server {
listen 80 default deferred;
server_name <your_servername>;
if ($host = ‘<your_servername>’ ) {
rewrite ^/(.*)$ http://<your_servername>/$1 permanent;
}
root /home/deployer/apps/<app_name>/current/public;
location ^~ /assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
}
try_files $uri/index.html $uri @unicorn;
location @unicorn {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://unicorn;
}
error_page 500 502 503 504 /500.html;
client_max_body_size 4G;
keepalive_timeout 10;
}

view raw
nginx.conf
hosted with ❤ by GitHub

Unicorn.rb

# Define your root directory
root = «/home/deployer/apps/gifroll/current»
# Define worker directory for Unicorn
working_directory root
# Location of PID file
pid «#{root}/tmp/pids/unicorn.pid»
# Define Log paths
stderr_path «#{root}/log/unicorn.log»
stdout_path «#{root}/log/unicorn.log»
# Listen on a UNIX data socket
listen «/tmp/unicorn.gifroll.sock»
# 16 worker processes for production environment
worker_processes 16
# Load rails before forking workers for better worker spawn time
preload_app true
# Restart workes hangin’ out for more than 240 secs
timeout 240

view raw
unicorn.rb
hosted with ❤ by GitHub

Заключительные шаги

Создайте один конечный файл в папке конфигурации с именем unicorn_ini.sh, отредактируйте его, скопируйте и вставьте следующий код:

#!/bin/sh
### BEGIN INIT INFO
# Provides: unicorn
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Manage unicorn server
# Description: Start, stop, restart unicorn server for a specific application.
### END INIT INFO
set -e
# Feel free to change any of the following variables for your app:
TIMEOUT=${TIMEOUT-60}
APP_ROOT=/home/deployer/apps/<app_name>/current
PID=$APP_ROOT/tmp/pids/unicorn.pid
CMD=«cd $APP_ROOT; bundle exec unicorn -D -c $APP_ROOT/config/unicorn.rb -E production«
AS_USER=<user>
set -u
OLD_PIN=«$PID.oldbin«
sig () {
test -s «$PID« && kill$1 `cat $PID`
}
oldsig () {
test -s $OLD_PIN && kill$1 `cat $OLD_PIN`
}
run () {
if [ «$(id -un)« = «$AS_USER« ]; then
eval $1
else
su -c «$1«$AS_USER
fi
}
case «$1« in
start)
sig 0 && echo >&2 «Already running« && exit 0
run «$CMD«
;;
stop)
sig QUIT && exit 0
echo >&2 «Not running«
;;
force-stop)
sig TERM && exit 0
echo >&2 «Not running«
;;
restart|reload)
sig HUP && echo reloaded OK && exit 0
echo >&2 «Couldn’t reload, starting ‘$CMD‘ instead«
run «$CMD«
;;
upgrade)
if sig USR2 && sleep 2 && sig 0 && oldsig QUIT
then
n=$TIMEOUT
while test -s $OLD_PIN && test $n -ge 0
do
printf . && sleep 1 && n=$(( $n 1 ))
done
echo
if test $n -lt 0 && test -s $OLD_PIN
then
echo >&2 «$OLD_PIN still exists after $TIMEOUT seconds«
exit 1
fi
exit 0
fi
echo >&2 «Couldn’t upgrade, starting ‘$CMD‘ instead«
run «$CMD«
;;
reopen-logs)
sig USR1
;;
*)
echo >&2 «Usage: $0 <start|stop|restart|upgrade|force-stop|reopen-logs>«
exit 1
;;
esac

view raw
unicorn_ini.sh
hosted with ❤ by GitHub

У нас есть все необходимые файлы, поэтому давайте настроим сервер для развертывания нашего приложения. Загрузите последние изменения в github и после этого выполните следующую команду:

  cap deploy: настройка 

Это создаст 2 папки в папке / <user> / apps / <app_name> на вашем сервере. а также некоторые ссылки на файлы конфигурации Unicorn и Nginx, чтобы разместить их в нужном месте. После завершения установки «cd» в / <user> / apps / <app_name> / shared / config и отредактируйте файл database.yml для работы с вашей базой данных.

Сделав это, предоставьте серверу доступ к репозиторию git, выполнив следующую команду на нашей машине для разработки:

  SSH-добавить 

Теперь мы все настроены и готовы к развертыванию. Давайте попробуем это, запустив:

  крышка раскрыта: холодная 

И смотреть, как это происходит. «Холодное» развертывание запустит миграцию, запустит и перезагрузит сервер. По моему опыту, это будет редко работать в первый раз, когда вы обычно получаете некоторые ошибки здесь и там. Ошибки обычно указывают вам правильное направление.

Если все прошло хорошо, поздравляю! Вы только что развернули свое приложение, используя Unicorn, Nginx и Capistrano. Надеюсь, вам понравилось!