Как развернуть приложение Rails с помощью Git Hooks в Ubuntu 14.04

Вступление

В этом руководстве мы покажем вам, как использовать ловушки Git для автоматизации развертывания производственной среды вашего приложения Rails на удаленном сервере Ubuntu 14.04. Использование ловушек Git позволит вам развернуть приложение, просто отправив свои изменения на рабочий сервер, вместо того, чтобы вручную извлекать и выполнять такие вещи, как выполнение миграций базы данных. Поскольку вы продолжаете работать над своим приложением, настройка некоторых видов автоматических развертываний, таких как перехватчики Git, сэкономит ваше время в долгосрочной перспективе.

Эта конкретная настройка использует простую ловушку Git «после получения», в дополнение к Puma в качестве сервера приложений, Nginx в качестве обратного прокси-сервера для Puma и PostgreSQL в качестве базы данных.

Если вы новичок в Git Hooks и хотели бы узнать больше, прежде чем двигаться дальше, прочитайте этот учебник: https://www.digitalocean.com/community/tutorials/how-to-use-git-hooks-to-automate-development -and-deploy-tasks [Как использовать Git Hooks для автоматизации задач разработки и развертывания].

Предпосылки

Вам потребуется доступ к пользователю без полномочий root с привилегиями суперпользователя на вашем сервере Ubuntu. В нашем примере настройки мы будем использовать пользователя с именем ++. Из этого туториала Вы узнаете, как его настроить: Initial Setup Server с Ubuntu 14.04. Если вы хотите выполнить развертывание без ввода пароля, обязательно установите ключи SSH.

Вам нужно будет установить Ruby на ваш сервер. Если вы еще этого не сделали, вы можете установить его вместе с Rails, используя https://www.digitalocean.com/community/tutorials/how-to-install-ruby-on-rails-with-rbenv-on-ubuntu -14-04 [rbenv] или RVM.

Вам также понадобится приложение Rails, управляемое в git-репозитории на вашей локальной машине разработки. Если у вас его нет и вы хотите его подписать, мы предоставим простой пример приложения.

Давайте начнем!

Установить PostgreSQL

Большинство рабочих сред Rails используют PostgreSQL в качестве базы данных, поэтому давайте сейчас установим его на ваш сервер.

На вашем * производственном * сервере обновите apt-get:

sudo apt-get update

Затем установите PostgreSQL с помощью этих команд:

sudo apt-get install postgresql postgresql-contrib libpq-dev

Создать производственную базу данных пользователя

Для простоты давайте назовем пользователя рабочей базы данных таким же, как имя вашего приложения. Например, если ваше приложение называется «appname», вы должны создать пользователя PostgreSQL следующим образом:

sudo -u postgres createuser -s

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

sudo -u postgres psql

Затем установите пароль для пользователя базы данных, «appname» в примере, например:

\password

Введите желаемый пароль и подтвердите его.

Выйдите из консоли PostgreSQL с помощью этой команды:

\q

Теперь мы готовы настроить ваше приложение с правильной информацией о подключении к базе данных.

Подготовьте ваше приложение Rails

На вашем * компьютере разработки *, скорее всего, на вашем локальном компьютере, мы подготовим ваше приложение для развертывания.

Необязательно: Создайте приложение Rails

В идеале у вас уже есть приложение Rails, которое вы хотите развернуть. Если это так, вы можете пропустить этот подраздел и сделать соответствующие замены, следуя далее. Если нет, то первым шагом является создание нового приложения Rails.

Эти команды создадут новое приложение Rails с именем appname в нашем домашнем каталоге. Не стесняйтесь заменить выделенное «имя приложения» чем-то другим:

cd ~
rails new

Затем перейдите в каталог приложения:

cd

Для нашего примера приложения мы сгенерируем контроллер скаффолда, чтобы у нашего приложения было что отображать:

rails generate scaffold Task title:string note:text

Теперь давайте удостоверимся, что наше приложение находится в репозитории git.

Инициализировать Git Repo

Если по какой-либо причине ваше приложение еще не находится в Git-репозитории, инициализируйте его и выполните начальную фиксацию.

На вашем * компьютере разработки * перейдите в каталог вашего приложения. В нашем примере наше приложение называется appname и находится в нашем домашнем каталоге:

cd
git init
git add -A
git commit -m 'initial commit'

Теперь давайте настроим наше приложение, чтобы подготовить его к подключению к нашей производственной базе данных PostgreSQL.

Обновить конфигурацию базы данных

На вашем * компьютере разработки * перейдите в каталог вашего приложения, если вы еще не там. В нашем примере наше приложение называется appname и находится в нашем домашнем каталоге:

cd

Теперь откройте файл конфигурации базы данных в вашем любимом редакторе. Мы будем использовать + vi +:

vi config/database.yml

Найдите раздел * production * конфигурации базы данных вашего приложения и замените его информацией о подключении к производственной базе данных. Если вы точно следовали приведенному примеру, он будет выглядеть примерно так (подставьте любые значения там, где это необходимо):

config / database.yml выдержка

production:
 <<: *default
 host: localhost
 adapter: postgresql
 encoding: utf8
 database:
 pool: 5
 username: <%= ENV['_DATABASE_USER'] %>
 password: <%= ENV['_DATABASE_PASSWORD'] %>

Сохранить и выйти. Это указывает на то, что производственная среда приложения должна использовать базу данных PostgreSQL с именем «appname_production» на локальном хосте-производственном сервере. Обратите внимание, что для имени пользователя и пароля базы данных заданы переменные среды. Мы уточним это на сервере позже.

Обновить Gemfile

Если в вашем Gemfile еще не указан гем адаптера PostgreSQL, + pg + и гем Puma, вы должны добавить их сейчас.

Откройте Gemfile вашего приложения в вашем любимом редакторе. Мы будем использовать + vi + здесь:

vi Gemfile

Добавьте следующие строки в Gemfile:

Gemfile выдержка

group :production do
 gem 'pg'
 gem 'puma'
end

Сохранить и выйти. Это указывает, что среда + production должна использовать гемы` + pg + и + puma + `.

Настроить Puma

Перед настройкой Puma вы должны посмотреть, сколько процессорных ядер у вашего сервера. Вы можете легко сделать это на своем сервере с помощью этой команды:

grep -c processor /proc/cpuinfo

Теперь на своей * машине разработки * добавьте конфигурацию Puma в + config / puma.rb +. Откройте файл в текстовом редакторе:

vi config/puma.rb

Скопируйте и вставьте эту конфигурацию в файл:

конфиг / puma.rb

# Change to match your CPU core count
workers

# Min and Max threads per worker
threads 1, 6

app_dir = File.expand_path("../..", __FILE__)
shared_dir = "#{app_dir}/shared"

# Default to production
rails_env = ENV['RAILS_ENV'] || "production"
environment rails_env

# Set up socket location
bind "unix://#{shared_dir}/sockets/puma.sock"

# Logging
stdout_redirect "#{shared_dir}/log/puma.stdout.log", "#{shared_dir}/log/puma.stderr.log", true

# Set master PID and state locations
pidfile "#{shared_dir}/pids/puma.pid"
state_path "#{shared_dir}/pids/puma.state"
activate_control_app

on_worker_boot do
 require "active_record"
 ActiveRecord::Base.connection.disconnect! rescue ActiveRecord::ConnectionNotEstablished
 ActiveRecord::Base.establish_connection(YAML.load_file("#{app_dir}/config/database.yml")[rails_env])
end

Измените число + working + на количество ядер ЦП вашего сервера. В примере предполагается, что у вас есть 2 ядра.

Сохранить и выйти. Это настраивает Puma с указанием местоположения вашего приложения, а также расположения его сокета, журналов и PID. Не стесняйтесь изменять файл или добавлять любые другие параметры, которые вам требуются.

Передайте ваши последние изменения:

git add -A
git commit -m 'added pg and puma'

Прежде чем двигаться дальше, создайте секретный ключ, который будет использоваться для производственной среды вашего приложения:

rake secret
rake secret sample output:29cc5419f6b0ee6b03b717392c28f5869eff0d136d8ae388c68424c6e5dbe52c1afea8fbec305b057f4b071db1646473c1f9a62f803ab8386456ad3b29b14b89

Вы скопируете вывод и будете использовать его для установки вашего приложения + SECRET_KEY_BASE на следующем шаге.

Создать скрипт Puma Upstart

Давайте создадим скрипт инициализации Upstart, чтобы мы могли легко запускать и останавливать Puma и гарантировать, что он запустится при загрузке.

На своем * рабочем сервере * загрузите инструмент Jungle Upstart из репозитория Puma GitHub в свой домашний каталог:

cd ~
wget https://raw.githubusercontent.com/puma/puma/master/tools/jungle/upstart/puma-manager.conf
wget https://raw.githubusercontent.com/puma/puma/master/tools/jungle/upstart/puma.conf

Теперь откройте предоставленный файл + puma.conf +, чтобы мы могли настроить пользователя развертывания Puma:

vi puma.conf

Найдите две строки, которые задают + setuid + и + setgid +, и замените «apps» на имя пользователя и группы вашего развертывания. Например, если ваш пользователь развертывания называется «deploy», строки должны выглядеть следующим образом:

puma.conf отрывок 1 из 2

setuid
setgid

Теперь найдите строку с этим: + exec / bin / bash << 'EOT' +. Добавьте следующие строки под ним, убедившись, что вы подставили имя пользователя и пароль PostgreSQL, а также секретный код граблей, который вы создали ранее:

puma.conf выдержка 2 из 2

 export _DATABASE_USER=''
 export _DATABASE_PASSWORD=''
 export SECRET_KEY_BASE=''

Сохранить и выйти.

Теперь скопируйте сценарии в каталог сервисов Upstart:

sudo cp puma.conf puma-manager.conf /etc/init

Скрипт + puma-manager.conf + ссылается на + / etc / puma.conf + для приложений, которыми он должен управлять. Давайте создадим и отредактируем этот файл инвентаря сейчас:

sudo vi /etc/puma.conf

Каждая строка в этом файле должна содержать путь к приложению, которым вы хотите управлять + puma-manager +. Мы собираемся развернуть наше приложение в каталоге с именем «appname» в домашнем каталоге нашего пользователя. В нашем примере это будет следующим (обязательно обновите путь к месту, где будет жить ваше приложение:

/etc/puma.conf

/home//

Сохранить и выйти.

Теперь ваше приложение настроено на запуск во время загрузки через Upstart. Это означает, что ваше приложение запустится даже после перезагрузки вашего сервера. Помните, что мы не развернули приложение, поэтому пока не хотим его запускать.

Установите и настройте Nginx

Чтобы сделать приложение доступным для Интернета, мы должны использовать Nginx в качестве веб-сервера.

Установите Nginx, используя apt-get:

sudo apt-get install nginx

Теперь откройте блок сервера по умолчанию в текстовом редакторе:

sudo vi /etc/nginx/sites-available/default

Замените содержимое файла следующим блоком кода. Обязательно замените выделенные части соответствующими именами пользователей и приложений (в двух местах):

/ И т.д. / Nginx / сайты-отсутствуют / по умолчанию

upstream app {
   # Path to Puma SOCK file, as defined previously
   server unix:/home///shared/sockets/puma.sock fail_timeout=0;
}

server {
   listen 80;
   server_name localhost;

   root /home///public;

   try_files $uri/index.html $uri @app;

   location @app {
       proxy_pass http://app;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header Host $http_host;
       proxy_redirect off;
   }

   error_page 500 502 503 504 /500.html;
   client_max_body_size 4G;
   keepalive_timeout 10;
}

Сохранить и выйти. Это настраивает Nginx в качестве обратного прокси, поэтому HTTP-запросы перенаправляются на сервер приложений Puma через сокет Unix. Не стесняйтесь вносить любые изменения по своему усмотрению.

Мы пока не будем перезапускать Nginx, так как приложение еще не существует на сервере. Мы подготовим заявку дальше.

Подготовка производства Git Remote

На вашем * производственном сервере * установите git с помощью apt-get:

sudo apt-get install git

Затем создайте каталог для удаленного хранилища. Мы создадим пустой git-репозиторий в домашнем каталоге с именем «appname_production». Не стесняйтесь называть свой удаленный репозиторий как хотите (за исключением того, что не помещайте его в + ~ / appname +, потому что именно там мы будем развертывать приложение):

mkdir ~/
cd ~/
git init --bare

Поскольку это пустой репозиторий, рабочего каталога нет, и все файлы, которые находятся в .git в обычной установке, находятся в самом главном каталоге.

Нам нужно создать git hook после получения, который будет работать, когда рабочий сервер получит толчок git. Откройте файл + hooks / post-receive + в вашем редакторе:

vi hooks/post-receive

Скопируйте и вставьте следующий скрипт в файл + post-receive +:

Крючки / после приема

#!/bin/bash

GIT_DIR=/home/
WORK_TREE=/home/
export _DATABASE_USER=''
export _DATABASE_PASSWORD=''

export RAILS_ENV=production
. ~/.bash_profile

while read oldrev newrev ref
do
   if [[ $ref =~ .*/master$ ]];
   then
       echo "Master ref received.  Deploying master branch to production..."
       mkdir -p $WORK_TREE
       git --work-tree=$WORK_TREE --git-dir=$GIT_DIR checkout -f
       mkdir -p $WORK_TREE/shared/pids $WORK_TREE/shared/sockets $WORK_TREE/shared/log

       # start deploy tasks
       cd $WORK_TREE
       bundle install
       rake db:create
       rake db:migrate
       rake assets:precompile
       sudo restart puma-manager
       sudo service nginx restart
       # end deploy tasks
       echo "Git hooks deploy complete"
   else
       echo "Ref $ref successfully received.  Doing nothing: only the master branch may be deployed on this server."
   fi
done

Обязательно обновите следующие выделенные значения:

  • + GIT_DIR +: каталог чистого репозитория git, который вы создали ранее

  • + WORK_TREE +: каталог, в который вы хотите развернуть свое приложение (это должно соответствовать местоположению, которое вы указали в конфигурации Puma)

  • + APPNAME_DATABASE_USER +: имя пользователя PostgreSQL (требуется для задач rake)

  • + APPNAME_DATABASE_PASSWORD +: пароль PostgreSQL (необходим для задач rake)

Далее вы должны просмотреть команды между комментариями + # start deploy + и + # end deploy tasks +. Это команды, которые будут запускаться каждый раз, когда ветка master отправляется на рабочий git remote (+ appname_production +). Если вы оставите их как есть, сервер попытается сделать следующее для производственной среды вашего приложения:

  • Запустить упаковщик

  • Создать базу данных

  • Перенос базы данных

  • Прекомпилировать активы

  • Перезапустите Puma

  • Перезапустите Nginx

Если вы хотите внести какие-либо изменения или добавить проверку ошибок, не стесняйтесь делать это здесь.

Как только вы закончите просмотр сценария пост-получения, сохраните и выйдите.

Затем сделайте скрипт исполняемым:

chmod +x hooks/post-receive

Без пароля

Поскольку ловушка post-receive должна запускать команды sudo, мы позволим пользователю развертывания использовать без пароля + sudo + (замените здесь ваше имя пользователя deploy, если оно отличается):

sudo sh -c 'echo " ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/90-deploy'

Это позволит пользователю + deploy + запускать команды + sudo + без ввода пароля. Обратите внимание, что вы, вероятно, захотите ограничить то, какие команды, которые пользователь развертывания может запускать с привилегиями суперпользователя. Как минимум, вы захотите использовать аутентификацию по ключу SSH и отключить аутентификацию по паролю.

Добавить производство Git Remote

Теперь, когда у нас все настроено на рабочем сервере, давайте добавим рабочий git remote в репозиторий нашего приложения.

На своем * компьютере разработки * убедитесь, что вы находитесь в каталоге вашего приложения:

cd

Затем добавьте новый удаленный git с именем «production», который указывает на пустой репозиторий git, + appname_production +, который вы создали на своем производственном сервере. Замените имя пользователя (развертывание), IP-адрес сервера и имя удаленного хранилища (appname_production):

git remote add production @:

Теперь ваше приложение готово к развертыванию с помощью git push.

Развертывание в производство

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

git push production master

Это просто выталкивает вашу локальную главную ветку на удаленный рабочий, который вы создали ранее. Когда рабочий пульт получает push, он выполнит скрипт подключения + post-receive +, который мы установили ранее. Если вы все настроили правильно, ваше приложение теперь должно быть доступно по общедоступному IP-адресу вашего рабочего сервера.

Если вы использовали наше приложение-пример, вы должны иметь доступ к + http: /// tasks + в веб-браузере и увидеть что-то вроде этого:

изображение: https: //assets.digitalocean.com/articles/rails_githooks/tasks.png [Пример приложения Rails]

Заключение

Каждый раз, когда вы вносите изменения в свое приложение, вы можете запустить ту же команду git push для развертывания на вашем производственном сервере. Одно это должно сэкономить вам много времени в течение всего срока вашего проекта.

В этом руководстве рассматриваются только «пост-получение» ловушки, но есть несколько других типов ловушек, которые могут помочь улучшить автоматизацию процесса развертывания. Прочтите это руководство, чтобы узнать больше о хуках Git: Как использовать Git Крючки для автоматизации задач разработки и развертывания!

Related