Настройване на сървър и внедряване на rvm, rails, puma, nginx, mina
Бях подканен да създам тази статия от скорошна публикация за внедряване. Статията по-горе описва как да внедрите проект, базиран на rbenv, но аз ще опиша ситуацията с rvm и първоначалната настройка.
Задачи и изисквания
И така, дадено: най-простото приложение RubyOnRails. В случай на разгръщане на моя проект си поставям следните задачи:
- OS Ubuntu LTS 14.04;
- Nginx уеб сървър;
- Puma Application Server;
- Използване на RVM за инсталиране на необходимата ruby версия;
- Автоматично стартиране на приложението при стартиране на VPS сървъра, възможност за управление на приложението като услуга;
- Автоматизиране на процеса на внедряване с помощта на mina;
Защо пума, а не еднорог или пътник?Чувал съм добри неща за пума, но unicron има ужасен уебсайт. Passenger, според мен, нарушава принципа на единичната отговорност - искам да имам уеб сървър и сървърно приложение.
Защо RVM?Свикнал съм с него - имам го инсталиран на моята локална машина, искам да го видя и в производство.
Защо мина?Наистина е по-прост от capistrano и по-бърз. Скоростта се постига благодарение на факта, че за всяка задача capistrano създава отделна ssh връзка. Mina, от друга страна, генерира shell скрипт и го изпълнява в рамките на една връзка.
В този случай задачата лесно се разделя на 3 етапа:
- Уверете се, че приложението стартира правилно (все още без автоматизация);
- Настройте сървъра така, че нашето rails приложение да работи като пълноценна услуга;
- Въз основа на това настройте автоматизирано внедряване с помощта на 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.
Всичко заедно може да изглежда така:
Можете да помогнете и да прехвърлите средства за развитието на сайта