Мы все знаем, как легко создать приложение на 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 |
Здесь мы инициализируем пустой репозиторий 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 |
Как вы можете видеть, этот файл развертывания использует единорога в качестве сервера (который я рекомендую из-за его стабильности, но вы можете использовать сервер по вашему выбору.) После того, как вы закончите настройку файла развертывания с вашей пользовательской конфигурацией, создайте два файла в вашей папке конфигурации: один с именем 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; | |
} |
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 |
Заключительные шаги
Создайте один конечный файл в папке конфигурации с именем 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 |
У нас есть все необходимые файлы, поэтому давайте настроим сервер для развертывания нашего приложения. Загрузите последние изменения в github и после этого выполните следующую команду:
cap deploy: настройка
Это создаст 2 папки в папке / <user> / apps / <app_name> на вашем сервере. а также некоторые ссылки на файлы конфигурации Unicorn и Nginx, чтобы разместить их в нужном месте. После завершения установки «cd» в / <user> / apps / <app_name> / shared / config и отредактируйте файл database.yml для работы с вашей базой данных.
Сделав это, предоставьте серверу доступ к репозиторию git, выполнив следующую команду на нашей машине для разработки:
SSH-добавить
Теперь мы все настроены и готовы к развертыванию. Давайте попробуем это, запустив:
крышка раскрыта: холодная
И смотреть, как это происходит. «Холодное» развертывание запустит миграцию, запустит и перезагрузит сервер. По моему опыту, это будет редко работать в первый раз, когда вы обычно получаете некоторые ошибки здесь и там. Ошибки обычно указывают вам правильное направление.
Если все прошло хорошо, поздравляю! Вы только что развернули свое приложение, используя Unicorn, Nginx и Capistrano. Надеюсь, вам понравилось!