В данном посте я решил поделиться опытом разворачивания rails сервера на Amazon. Все предыдущие rails проекты я выкладывал на готовые сервера. Это были частные сервера, или широко известный сервис heroku. И единственные команды, которые я посылал серверу, были cap deploy и cap deploy:cold. Но в последнем проекте заказчик пожелал разместить сайт на своем амазоновском образе, поэтому пришлось погрузиться в тему более глубоко.
Сайт должен работать на http сервере nginx, для групповой разработки использовался git, а также rvm для гибкой настройки ruby и набора gem для нужд сайта с сохранением возможности разместить ещё один проект. И все это должно было опубликовываться через capistrano.
На первом этапе необходимо было определиться с версией linux. В наличии было следующие дистрибутивы: Oneiric Ocelot и bitnami amazon machine image. Первая была достаточна сыра, об второй поговорим подробнее. Bitnami – это операционная система основанная на ubuntu 10.04, в ко > /etc/init.d/nginx
chmod +x /etc/init.d/nginx
update-rc.d nginx defaults
/торую добавлено несколько дополнительных пакетов, которые должны облегчить жизнь. Но, как всегда, это был не наш случай. Одним из установленных «улучшений» был apache. Первое, что нам нужно – это остановить этот сервер и удалить инициализатор. Для этого зайдем под root и выполним следующую команду:
Также переместим daemon в каталог, например, back_up на всякий случай.
Далее установим необходимые библиотеки
После установим глобальный rvm. Для это выполним напишем в терминале:
Поправим файлы /root/.bashrc и /etc/skel/.bashrc. Строку [ -z "$PS1" ] && return заменим на:
Сохраняем файл и делаем перезагрузку.Кроме настройки загрузки rvm, неплохо указать несколько gems необходимых для любой версии ruby и gemset. Это в первую очередь bundler, capistrano, passenger и rake. Так что добавим следующее в /usr/local/rvm/gemsets/global.gems
Далее установим Ruby EE для быстрой работы rails:
Установим его как интерпретатор ruby по умолчанию:
После создадим для сайта дополнительный gemset:
Так как создать пользователя с возможностью доступа через ssh не представляло возможности, то пришлось создать каталог в $HOME пользователя bitnami для хранения версий сайта, логов и прочих вещей.
Теперь неплохо было бы установить nginx и passenger
Если вы получите ошибку про то, что rvmsudo не найден, то можно посмотреть в папку /usr/local/rvm/bin или добавить его в переменную $PATH для постоянного использования.
После ответа на простые вопросы от установщика, вы получите рабочий nginx, который необходимо настроить. Для этого откроем файл конфигурации по адресу /opt/nginx/conf/nginx.conf, где поменяем значение passenger_ruby на /usr/local/bin/passenger_ruby.
Далее необходимо указать где располагается папка сайта. В файле вставим строку 'root', ниже строки 'server', и укажем /home/bitnami/foo_site/application/current/public. Где 'foo_site' папка с нашим будущим сайтом. После закомментируем раздел location.Далее загрузим daemon для nginx и запустим его под root:
Теперь можно зайти в браузере по полученному от Amazon домену и увидеть ошибку от nginx. Все работает как надо.
Далее будет разговор про гит. Если вы не хотите, чтобы репозиторий был где-то в другом месте(например на github), следующий раздел для вас.
Существует множество менеджеров git репозиториев, но я остановился на популярном gitosis. Установим его на сервер:
Далее создадим пользователя git
Зайдем как пользователь git:
Добавим git в sudoers файл:
Создадим для него ssh ключ:
Далее создадим VPS сервер:
Далее создадим репозиторий сайта, для этого откроем файл /home/git/gitosis-admin/gitosis.conf и вставим такое:
[
Рассмотрим каждый элемент детальней:
Также в папке keydir необходимо создать файл developer1@mail.com.pub с вашим ключом
Так как gitosis сам по себе git репозиторий, то после любого изменения настроек необходимо сделать commit & push:
Далее создайте папку /home/git/repositories/foo_site.git, в которой инициализируем репозиторий
Все теперь вы можете использовать git repositories по адресу git@amazon-domain:foo_site
В вашем локальном проекте выполним команду capify.
Она создаст файл Capfile и config/deploy.rb
В файле deploy.rb добавьте:
После проведите команду cap deploy:setup.
Поздравляю, вы успешно создали сервер с git, который имеет достаточный функционал.
Пост про nginx + rvm
Создание git server
Основные задачи
Сайт должен работать на http сервере nginx, для групповой разработки использовался git, а также rvm для гибкой настройки ruby и набора gem для нужд сайта с сохранением возможности разместить ещё один проект. И все это должно было опубликовываться через capistrano.
Первый этап
На первом этапе необходимо было определиться с версией linux. В наличии было следующие дистрибутивы: Oneiric Ocelot и bitnami amazon machine image. Первая была достаточна сыра, об второй поговорим подробнее. Bitnami – это операционная система основанная на ubuntu 10.04, в ко > /etc/init.d/nginx
chmod +x /etc/init.d/nginx
update-rc.d nginx defaults
/торую добавлено несколько дополнительных пакетов, которые должны облегчить жизнь. Но, как всегда, это был не наш случай. Одним из установленных «улучшений» был apache. Первое, что нам нужно – это остановить этот сервер и удалить инициализатор. Для этого зайдем под root и выполним следующую команду:
/etc/init.d/bitnami stop
Также переместим daemon в каталог, например, back_up на всякий случай.
Далее установим необходимые библиотеки
apt-get install build-essential bison openssl libreadline5 libreadline-dev
curl git-core zlib1g zlib1g-dev libssl-dev sqlite3 libreadline-dev libxml2-dev git-core subversion autoconf
После установим глобальный rvm. Для это выполним напишем в терминале:
bash < <(curl -L raw.github.com/wayneeseguin/rvm/1.3.0/contrib/install-system-wide)
Поправим файлы /root/.bashrc и /etc/skel/.bashrc. Строку [ -z "$PS1" ] && return заменим на:
if [[ -n "$PS1" ]]; then
## и добавим в конце файла следующее
fi
Сохраняем файл и делаем перезагрузку.Кроме настройки загрузки rvm, неплохо указать несколько gems необходимых для любой версии ruby и gemset. Это в первую очередь bundler, capistrano, passenger и rake. Так что добавим следующее в /usr/local/rvm/gemsets/global.gems
bundler -v~>1.0.18
rake –v~>0.9.2
capistrano –v ~>2.9.0
passenger –v ~>3.0.9
Далее установим Ruby EE для быстрой работы rails:
rvm install ree
Установим его как интерпретатор ruby по умолчанию:
rvm use ree --default
После создадим для сайта дополнительный gemset:
rvm gemset create foo_site
Так как создать пользователя с возможностью доступа через ssh не представляло возможности, то пришлось создать каталог в $HOME пользователя bitnami для хранения версий сайта, логов и прочих вещей.
mkdir foo_site
Теперь неплохо было бы установить nginx и passenger
gem install passenger
rvmsudo passenger-install-nginx-module
Если вы получите ошибку про то, что rvmsudo не найден, то можно посмотреть в папку /usr/local/rvm/bin или добавить его в переменную $PATH для постоянного использования.
После ответа на простые вопросы от установщика, вы получите рабочий nginx, который необходимо настроить. Для этого откроем файл конфигурации по адресу /opt/nginx/conf/nginx.conf, где поменяем значение passenger_ruby на /usr/local/bin/passenger_ruby.
Далее необходимо указать где располагается папка сайта. В файле вставим строку 'root', ниже строки 'server', и укажем /home/bitnami/foo_site/application/current/public. Где 'foo_site' папка с нашим будущим сайтом. После закомментируем раздел location.Далее загрузим daemon для nginx и запустим его под root:
curl -L raw.github.com/jnstq/rails-nginx-passenger-ubuntu/master/nginx/nginx > /etc/init.d/nginx
chmod +x /etc/init.d/nginx
update-rc.d nginx defaults
/etc/init.d/nginx start
Теперь можно зайти в браузере по полученному от Amazon домену и увидеть ошибку от nginx. Все работает как надо.
Далее будет разговор про гит. Если вы не хотите, чтобы репозиторий был где-то в другом месте(например на github), следующий раздел для вас.
Настраиваем git
Существует множество менеджеров git репозиториев, но я остановился на популярном gitosis. Установим его на сервер:
sudo apt-get install gitosis
Далее создадим пользователя git
sudo adduser git
Зайдем как пользователь git:
sudo su git
Добавим git в sudoers файл:
%git ALL=(ALL) ALL
Создадим для него ssh ключ:
ssh-keygen -t dsa
Далее создадим VPS сервер:
sudo -H -u git gitosis-init < ~/.ssh/id_dsa.pub
git clone git@your_amazon_dns:gitosis-admin
Далее создадим репозиторий сайта, для этого откроем файл /home/git/gitosis-admin/gitosis.conf и вставим такое:
[
group foo_site]
writable = foo_site
members = git@domU-12-31-38-04-1D-DE developer1@mail.com developer2@mail.com
Рассмотрим каждый элемент детальней:
group foo_site – задает имя репозитория
writable = foo_site – папка для хранения репозитория
members = git@domU-12-31-38-04-1D-DE developer1@mail.com developer2@mail.com – задание коммитеров
Также в папке keydir необходимо создать файл developer1@mail.com.pub с вашим ключом
Так как gitosis сам по себе git репозиторий, то после любого изменения настроек необходимо сделать commit & push:
git commit –am ‘new changes’ && git push
Далее создайте папку /home/git/repositories/foo_site.git, в которой инициализируем репозиторий
git init -- bare /home/git/repositories/foo_site.git
Все теперь вы можете использовать git repositories по адресу git@amazon-domain:foo_site
Настройка capistrano
В вашем локальном проекте выполним команду capify.
Она создаст файл Capfile и config/deploy.rb
В файле deploy.rb добавьте:
$:.unshift(File.expand_path('./lib', ENV['rvm_path']))
require "rvm/capistrano"
require 'bundler/capistrano'
#require 'capistrano/ext/multistage'# добавит возможности создавать ветки
require 'capistrano_colors'#добавит радости от просмотра процесса публикации
default_run_options[:pty] = true
ssh_options[:forward_agent] = true
set :using_rvm, true
set :rvm_ruby_string, 'ree@foo_site'#указывает версию ruby и имя gemset
set :rvm_type, :system
set :scm, 'git'#указывает формат хранения кода
set :scm_verbose, true
set :git_enable_submodules, 1
set :deploy_via, :remote_cache
set :repository, ‘наш репозиторий’
set :user, 'bitnami'
set :use_sudo, false
set :stack, :passenger
after "deploy:update", "deploy:cleanup"
set :branch, "master"
server «ваш амазон домен», :web, :app, :db, :primary => true
set :keep_releases, 4
set :deploy_to, '/home/bitnami/foo_site /application'
set :bundle_without, [:test, :development]
После проведите команду cap deploy:setup.
Поздравляю, вы успешно создали сервер с git, который имеет достаточный функционал.
Полезная информация по теме
Пост про nginx + rvm
Создание git server