Pull to refresh

Amazon on Rails

Reading time4 min
Views3K
В данном посте я решил поделиться опытом разворачивания 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 и выполним следующую команду:

/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
Tags:
Hubs:
Total votes 30: ↑27 and ↓3+24
Comments17

Articles