Настройване на сървър и внедряване на rvm, rails, puma, nginx, mina

Бях подканен да създам тази статия от скорошна публикация за внедряване. Статията по-горе описва как да внедрите проект, базиран на rbenv, но аз ще опиша ситуацията с rvm и първоначалната настройка.

Задачи и изисквания

И така, дадено: най-простото приложение RubyOnRails. В случай на разгръщане на моя проект си поставям следните задачи:

  • OS Ubuntu LTS 14.04;
  • Nginx уеб сървър;
  • Puma Application Server;
  • Използване на RVM за инсталиране на необходимата ruby ​​версия;
  • Автоматично стартиране на приложението при стартиране на VPS сървъра, възможност за управление на приложението като услуга;
  • Автоматизиране на процеса на внедряване с помощта на mina;
Защо Ubuntu?Просто свикнах с него (по-точно с производното му - Linux Mint).

Защо пума, а не еднорог или пътник?Чувал съм добри неща за пума, но unicron има ужасен уебсайт. Passenger, според мен, нарушава принципа на единичната отговорност - искам да имам уеб сървър и сървърно приложение.

Защо RVM?Свикнал съм с него - имам го инсталиран на моята локална машина, искам да го видя и в производство.

Защо мина?Наистина е по-прост от capistrano и по-бърз. Скоростта се постига благодарение на факта, че за всяка задача capistrano създава отделна ssh връзка. Mina, от друга страна, генерира shell скрипт и го изпълнява в рамките на една връзка.

В този случай задачата лесно се разделя на 3 етапа:

  1. Уверете се, че приложението стартира правилно (все още без автоматизация);
  2. Настройте сървъра така, че нашето rails приложение да работи като пълноценна услуга;
  3. Въз основа на това настройте автоматизирано внедряване с помощта на mina.

Първо начало

Потребител, създаден на сървъраwebapp, от името на което ще работи нашето приложение. Инсталиран rvm (в този пример само за потребителя на webapp), ruby ​​на версията, от която се нуждаем, nginx и т.н. Gemfile съдържа следния ред:

Предварително зададени минути

Добавете следния ред към Gemfile:

След това ще генерираме конфигурационния файл с командата:

След това нека пренесем създадения файл config/deploy.rb в следната форма:

Също така искам да отбележа, че не добавям дадения mina конфигурационен файл към контрола на версиите.

Тогава нека изпълним командата:

И ще получим необходимата структура на папките на сървъра, както и конфигурационните файлове, които трябва да бъдат попълнени с правилните данни. Предполага се, че няма да добавяте тези файлове към контрола на версиите, а ще ги съхранявате изключително на сървъра. По-долу е даден пример за минимална конфигурация за puma.

Освен това нарочно не пазя файла puma.rb в контрола на версиите, защото Мисля, че конфигурацията за стартиране на сървъра може да бъде индивидуална, както и настройките на базата данни.

За забележка е достатъчно да създадете config/puma.sample.rb файл с пример в приложението.

Сега нека започнем "разгръщането" на нашето приложение:

Конфигуриране на nginxНека създадем файл /etc/nginx/sites-available/awesome със следното съдържание:

След това създаваме символна връзка:

И рестартирайте nginx:

Ръчно стартиране на приложениетоСега нека подготвим и стартираме нашия проект. Подгответе:

Отваряме проекта в браузъра - всичко трябва да работи.

Приложение като услуга

За да може приложението да работи като услуга и да се изпълнява при стартиране/рестартиране на системата, трябва да създадете init.d скрипт или конфигурация за стартиране.

Избрах upstart, защото резултатътфайлът излиза много по-кратък и лесен за четене.

За да направим правилно приятели между upstart и rvm, ние създаваме обвивка за изпълнимите файлове на нашите скъпоценни камъни:

След това създаваме първоначална конфигурация /etc/init/awesome.conf:

И сега можем да направим това:

Крайна автоматизация

Тъй като внедряването ще се извърши от името на потребителя на webapp и се нуждаем от права на суперпотребител, за да рестартираме услугата, ще добавим съответния ред към sudoers.

Отново minaВ случаи като този mina предлага използването на собствен модул mina/rvm, но rvm ни дава възможността да създаваме обвиващи псевдоними за версии на ruby ​​​​и gemset.

За да може пакетът wrappera да бъде стартиран по време на внедряването, трябва да добавите следния ред:

Нека добавим и задача за рестартиране на сървъра:

Всичко е готово!Сега можем да стартираме внедряването на проекта отново и да видим резултата:

Алтернативи

Като алтернатива помислете за puma-jungle. Това са шаблони за upstart и init.d скриптове, които работят правилно с rbenv, rvm и други мениджъри на версии.

В случай на rvm, трябва да се уверите, че версията на ruby ​​и gemset са правилно определени, ако се използва - за това можете да използвате файловете .ruby-version и .ruby-gemset.

Можете да ги поставите в контрола на версиите или можете да ги създадете по време на внедряването чрез mina. Ще трябва също да използвате библиотеката mina/rvm и да създадете задача за инсталиране на правилната версия на ruby ​​​​и gemset.

Всичко заедно може да изглежда така:

Можете да помогнете и да прехвърлите средства за развитието на сайта