Показаны сообщения с ярлыком Ruby. Показать все сообщения
Показаны сообщения с ярлыком Ruby. Показать все сообщения

среда, 11 ноября 2015 г.

Собственный хостинг репозиториев с помощью GitLab

Забрал отсюда, спасибо авторам


Техническая справка

Git — распределённая система управления версиями файлов. Проект был создан Линусом Торвальдсом для управления разработкой ядра Linux. Git используют такие проекты, как Chromium, jQuery, PHP, MediaWiki и прочие. Программа является свободной и выпущена под лицензией GNU GPL версии 2.
Статья о Git на Википедии
GitLab существует как в виде SAAS — веб-сайта с открытой регистрацией, так и в качестве индивидуального решения — GitLab Community Edition, которое можно установить на свой сервер и настроить под собственные нужды. Процесс установки достаточно долгий и требует root-доступа к серверу. Для стабильной работы GitLab требует от сервера как минимум двухъядерный процессор и 2 Гб ОЗУ. Такая конфигурация обеспечит быструю работу приложения и поддержку до 500 пользователей. GitLab поддерживает множество различных дистрибутивов Linux, но инструкция по установке расчитана на Debian/Ubuntu.

Установка

Установку можно разбить на несколько этапов:
  • установка необходимых системных утилит
  • установка Ruby
  • создание пользователя для SSH-подключений к GitLab
  • установка и настройка GitLab Shell
  • установка и настройка базы данных
  • установка и настройка самого GitLab
  • установка и настройка Nginx
Список внушительный, однако подавляющее большинство этапов состоят исключительно из консольных команд и занимают считаные секунды. Тем более, что какие-то из компонентов из списка выше на большинстве серверов уже установлены и им требуется лишь незначительная конфигурация. Итак, приступим.

Установка необходимых системных утилит

Для установки и настройки всех компонент, необходимых для работы GitLab, нам понадобятся: утилита sudo, набор библиотек для компиляции Ruby, актуальная версия Git и почтовый сервер.
Перед установкой каких-либо пакетов через утилиту apt-get, следует обновить список источников и существущие пакеты, выполнив в консоли такие команды:
apt-get update -y
apt-get upgrade -y
Здесь и далее команды нужно выполнять от имени пользователя root.
Первой в списке необходимых компонент идет утилита sudo. Она установлена на большинстве эксплуатируемых серверов. Но если вдруг ваш сервер совсем чист и непорочен, для ее установки необходимо выполнить в консоли следущую команду:
apt-get install sudo -y
Теперь установим библиотеки для компиляции Ruby:
sudo apt-get install -y build-essential zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev curl openssh-server redis-server checkinstall libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev logrotate
Убедитесь, что на сервере установлен git, и его версия не ниже 1.7.10:
sudo apt-get install -y git-core
git --version
Если установлена устаревшая версия, нужно удалить ее:
sudo apt-get remove git-core
Если git не установлен либо был удален предыдущей командой, нужно скачать и скомпилировать его:
# Устанавливаем библиотеки, необходимые для компиляции
sudo apt-get install -y libcurl4-openssl-dev libexpat1-dev gettext libz-dev libssl-dev build-essential

# Загружаем и компилируем исходники
cd /tmp
curl --progress https://git-core.googlecode.com/files/git-1.9.0.tar.gz | tar xz
cd git-1.9.0/
make prefix=/usr/local all
sudo make prefix=/usr/local install
Обратите внимание на версию git. На момент написания это версия 1.9.0. Уточнить, какая версия git является актуальной, можно на официальной странице проекта.
И наконец, если не установлен почтовый сервер, вот команда для его установки:
sudo apt-get install -y postfix
В процессе установки почтовый сервер попросит себя сконфигурировать. Для этого нужно выбрать на появившемся экране пункт «Internet Site» и указать правильное имя хоста — IP-адрес или доменное имя.

Установка Ruby

Для работы GitLab требуется Ruby 2.1.6. Если у вас уже установлен Ruby 1.8, его необходимо удалить перед установкой новой версии:
sudo apt-get remove ruby1.8
Теперь скачаем и скомпилируем Ruby 2.1.6:

mkdir /tmp/ruby && cd /tmp/ruby
curl -L --progress http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.6.tar.gz | tar xz
cd ruby-2.1.6
./configure --disable-install-rdoc
make
sudo make install
Помимо самого Ruby нам понадобится библиотека bundler:
sudo gem install bundler --no-ri --no-rdoc

Создание пользователя для SSH-подключений к GitLab

Создадим для SSH-подключений пользователя git:
sudo adduser --disabled-login --gecos 'GitLab' git

Установка и настройка GitLab Shell

GitLab Shell — это отдельная утилита для управления SSH-доступом и репозиториями. Для ее установки необходимо выполнить следущие команды:
# Переходим в домашнюю директорию
cd /home/git

# Загружаем исходный код
sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-shell.git -b v1.9.3
cd gitlab-shell

# Создаем конфигурационный файл
sudo -u git -H cp config.yml.example config.yml
После выполнения команд нужно отредактировать файл config.yml. В нем в настройке gitlab_url нужно указать будущий адрес GitLab, например:
gitlab_url: http://gitlab.example.com/"
Теперь устанавливаем и инициализируем утилиту:
sudo -u git -H ./bin/install

Установка и настройка базы данных

Для работы GitLab требует базу данных. Разработчики GitLab рекомендуют использовать PostgreSQL, однако поддержка MySQL также присутствует. Для установки PostgreSQL, выполните:
sudo apt-get install -y postgresql-9.1 postgresql-client libpq-dev
Для установки MySQL:
sudo apt-get install -y mysql-server mysql-client libmysqlclient-dev
sudo mysql_secure_installation
Во время установки необходимо будет придумать и ввести пароль root пользователя MySQL.
Теперь нужно создать саму базу данных для работы GitLab. Для этого нужно выполнить несколько SQL-запросов. Начнем с PostgreSQL. В командной строке это делается так:
# Логинимся в PostgreSQL
sudo -u postgres psql -d template1

# Создаем пользователя для GitLab
template1=# CREATE USER git;

# Создаем базу данных для GitLab и даем доступ к ней созданному пользователю
template1=# CREATE DATABASE gitlabhq_production OWNER git;

# Выходим из PostgreSQL
template1=# \q
Теперь MySQL (не забудьте вместо $password поставить хороший, крепкий пароль):
# Логинимся в MySQL
mysql -u root -p

# Тут нужно будет ввести пароль root пользователя MySQL

# Создаем пользователя для GitLab
# вводить 'mysql>' не нужно, он показан для наглядности процесса
# и не забудьте в следущей команде заменить $password на настоящий пароль!
mysql> CREATE USER 'git'@'localhost' IDENTIFIED BY '$password';

# Устанавливаем тип базы данных
mysql> SET storage_engine=INNODB;

# Создаем базу данных для GitLab
mysql> CREATE DATABASE IF NOT EXISTS `gitlabhq_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;

# Даем доступ к созданной базе данных пользователю GitLab
mysql> GRANT SELECT, LOCK TABLES, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON `gitlabhq_production`.* TO 'git'@'localhost';

# Выходим из MySQL
mysql> \q

Установка и настройка самого GitLab

Этот этап самый сложный, поэтому будем выполнять его пошагово. Первый шаг — загрузка исходников GitLab. Делается это через git и выглядит примерно вот так:
# Переходим в домашнюю директорию
cd /home/git

# Загружаем GitLab
sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-ce.git -b 6-8-stable gitlab
Обратите внимание на флаг -b 6-8-stable во второй команде. На момент написания этой статьи актуальным является GitLab версии 6.8. Однако рекомендую перед установкой уточнить эту информацию на официальном сайте проекта и подставить в эту команду правильную версию. Кроме того, вместе с GitLab периодически обновляется и GitLab Shell, это также нужно учесть.
Второй шаг — развертывание и настройка. Сюда входят создание необходимых файлов конфигурации, создание необходимых приложению папок и установка прав доступа на уже существующие папки:
# Переходим в папку GitLab
cd /home/git/gitlab

# Создаем файл конфигурации для GitLab
sudo -u git -H cp config/gitlab.yml.example config/gitlab.yml

# Выставляем владельца и права на папки log/ и tmp/
sudo chown -R git log/
sudo chown -R git tmp/
sudo chmod -R u+rwX log/
sudo chmod -R u+rwX tmp/

# Создаем папку для сателлитов и выставляем на нее права
sudo -u git -H mkdir /home/git/gitlab-satellites
sudo chmod u+rwx,g+rx,o-rwx /home/git/gitlab-satellites

# Выставляем права на папки tmp/pids/ и tmp/sockets/
sudo chmod -R u+rwX tmp/pids/
sudo chmod -R u+rwX tmp/sockets/

# Выставляем праав на папку public/uploads/
sudo chmod -R u+rwX  public/uploads

# Создаем файл конфигурации для сервера Unicorn
sudo -u git -H cp config/unicorn.rb.example config/unicorn.rb

# Создаем файл конфигурации для Rack attack
sudo -u git -H cp config/initializers/rack_attack.rb.example config/initializers/rack_attack.rb
После выполнения команд нужно отредактировать файл config/gitlab.yml. В нем нужно указать следующие настройки:
Настройка Раздел Описание Пример
host gitlab Cюда надо вписать адрес, по которому будет доступен GitLab gitlab.example.com
email_from gitlab Тут нужно прописать email, с которого будет отправляться почта gitlab@example.com
support_emal gitlab Адрес тех. поддержки. Если его закомментировать, будет использован адрес из email_from support@example.com
bin_path git Установите значение /usr/local/bin/git, если компилировали git вручную на первом этапе установки /usr/local/bin/git
E-mail адрес из email_from также нужно установить в конфигурации git:
sudo -u git -H git config --global user.name "GitLab"
sudo -u git -H git config --global user.email "gitlab@example.com"
sudo -u git -H git config --global core.autocrlf input
Теперь нужно сконфигурировать базу данных. Для PostgreSQL:
sudo -u git cp config/database.yml.postgresql config/database.yml
sudo -u git -H chmod o-rwx config/database.yml
Для MySQL:
sudo -u git cp config/database.yml.mysql config/database.yml
sudo -u git -H chmod o-rwx config/database.yml
Не забудьте указать в файле config/database.yml логин и пароль для доступа к вашей базе данных. Следущий шаг — установка зависимостей. Делается это одной простой командой. Если вы используете PostgreSQL:
cd /home/git/gitlab
sudo -u git -H bundle install --deployment --without development test mysql aws
Если используете MySQL:
cd /home/git/gitlab
sudo -u git -H bundle install --deployment --without development test postgres aws
Теперь нужно инициализировать приложение. Сюда входят инициализация базы данных и установка ротации логов:
sudo -u git -H bundle exec rake gitlab:setup RAILS_ENV=production

# Тут нужно будет ввести yes для подтверждения создания таблиц в базе данных

# Создаем инициализационный скрипт
sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab

# Добавляем GitLab в местный авторан
sudo update-rc.d gitlab defaults 21

# Создаем ротатор логов
sudo cp lib/support/logrotate/gitlab /etc/logrotate.d/gitlab
Теперь осталось проверить статус приложения и запустить его. Проверяется статус такой командой:
sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production
Корректно установленное приложение должно выдавать примерно следущее:
Если все хорошо — приложение можно запускать:
sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production
sudo service gitlab start

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

Последний этап установки GitLab — установка и настройка сервера Nginx. Установка выглядит так:
sudo apt-get install -y nginx
Копируем конфигурационный файл Nginx из дистрибутива GitLab:
sudo cp lib/support/nginx/gitlab /etc/nginx/sites-available/gitlab
sudo ln -s /etc/nginx/sites-available/gitlab /etc/nginx/sites-enabled/gitlab
Не забудьте указать правильный адрес вашего GitLab в файле /etc/nginx/sites-available/gitlab в настройке server_name раздела server. Мне также пришлось указать IP-адрес сервера в настройке listen раздела server. Теперь нужно перезапустить сервер:
sudo service nginx restart
 
Готово! Установка и настройка GitLab окончена. Убедитесь, что все правильно настроено, выполнив команду:
sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production
Если все пункты списка зеленые — значит, приложение установлено и настроено верно и можно начинать работу. Для этого зайдите по адресу приложения и авторизуйтесь, используя данные по умолчанию:
Логин:  root
Пароль: 5iveL!fe
Не забудьте сменить пароль после авторизации! Приятной работы!

пятница, 30 октября 2015 г.

Установка нескольких версий Redmine с конкретными версиями ruby (nginx + passenger + rvm + Ubuntu 14.04)


Статья недоработана, но в плане справочной уже вполне себе :-)

 

Установка Nginx и Passenger


Установим PGP-ключ:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7

Добавим поддержку HTTPS для APT (APT репозиторий Phusion Passenger хранится на HTTPS-сервере):
sudo apt-get install apt-transport-https ca-certificates

Добавим сам репозиторий. В /etc/apt/sources.list.d/passenger.list поместим:
deb https://oss-binaries.phusionpassenger.com/apt/passenger trusty main

Затем установим соответствующие права и обновим списки пакетов:
sudo chown root: /etc/apt/sources.list.d/passenger.list
sudo chmod 600 /etc/apt/sources.list.d/passenger.lis
sudo apt-get update

Установим Nginx и Passenger:
sudo apt-get install nginx-extras passenger

Раскомментируем passenger_root и passenger_ruby в конфиге nginx: /etc/nginx/nginx.conf.

Перезапустим nginx:
sudo service nginx restart
 
Настроим nginx (пример): 
cat /etc/nginx/sites-available/redmine-test 
server {
  listen  8080;
  server_name project-t.centrofinans.ru;
  root /opt/redmine-3.1/public;
  passenger_user www-data;
  passenger_group www-data;
  passenger_enabled on;
  passenger_ruby /usr/local/rvm/gems/ruby-1.9.3-p551/wrappers/ruby;
  allow all;
  client_max_body_size      10m; # Max attachemnt size
}


Установка RVM и Rails


RVM нам нужен по нескольким причинам. Во-первых, велика вероятность, что в репозиториях убунты нету версии Ruby, которую вы используете в своём проекте. Во-вторых, через него удобнее установить Rails (чем через gem install rails), т.к. он подтягивает необходимые пакеты автоматически. В-третьих, если на сервере будет висеть несколько проектов, то вероятно, что они будут использовать разные версии Ruby, и тут нам поможет RVM.

gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
\curl -sSL https://get.rvm.io | bash -s stable --rails

После установки нужно выйти и зайти в шелл.

P.S. Если где-то в окружении не хватает rvm или rails, выполним "source /usr/local/rvm/scripts/rvm" или пропишем эту строку в profile (~/.profile или для всех /etc/profile).

 Нам нужна версия руби:


$ rvm install 1.9.3
 
Для удобства создадим для каждого проекта свой набор гемов:
$ rvm use 1.9.3
$ rvm gemset create redmine-3.1
 
Для того, чтобы rvm автоматически переключался на нужную версию руби и набор гемов делаем следующее:

$ echo "rvm use 1.9.3@redmine-3.1" > /opt/redmine-3.1/.rvmrc
 
Теперь в консоли при смене каталога проекта будет автоматически подключена нужная версия руби и набор 
гемов для проекта. 


Установка Redmine


cd /opt
svn co http://svn.redmine.org/redmine/branches/3.1-stable redmine-3.1
cd /opt/redmine-3.1
 
 
Чтобы указать необходимую версию Ruby выполним:

rvm use <версия Ruby>
passenger-config --ruby-command

На строке с префиксом "To use in Nginx :" скопируем оставшуюся часть и добавим в соответствующую запись server конфигурации nginx, завершив точкой с запятой (пример выше).



Add following lines
production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  password: redmine
  encoding: utf8
 

Plugins installation

Unarchive plugins to /plugins/ folder
cd /var/data/redmine bundle install

Configuring redmine

Setup redmine folder permissions

cd /var/data/redmine mkdir public/plugin_assets
chown -R www-data:www-data files log tmp public/plugin_assets config.ru chmod -R 755 files log tmp public/plugin_assets

Create database

mysql -u root -p Execute following lines to MySQL
CREATE DATABASE redmine character SET utf8; CREATE user 'redmine'@'localhost' IDENTIFIED BY 'redmine'; GRANT ALL privileges ON redmine.* TO 'redmine'@'localhost'; exit

Migrate database

cd /var/data/redmine bundle exec rake db:migrate bundle exec rake redmine:plugins

Generate session store

bundle exec rake generate_secret_token

Start web server

service nginx start

Restart Redmine

touch /var/data/redmine/tmp/restart.txt
 
 

RVM - несколько версий Ruby на одном сервере

Источник, спасибо автору.

Идея

Идея Ruby Version Manager состоит в разработке, где требуется иметь одновременно несколько версий Ruby и различные варианты Rails под ними.

Общая схема:

Представляет собой стандартную схему frontend + backend. В качестве backend выступает nginx с модулем passenger
  1. nginx (frontend) - проксирование, стандарт;
  2. nginx (backend's) - работа приложений через passenger:
    • каждый backend работает на порту 8<Ruby-version> (например, 8191, 8192);
    • каждое приложение, работая под версией Ruby, может использовать требуемый Rails (через gemset).
Сервер на котором производилась установка: Debian 5.0.8 i686.

Установка

Устанавливаем пакеты необходимые для компиляции:
apt-get install git-core git curl file   \
                gcc make automake autoconf automake1.9 \
                binutils g++ g++-multilib checkinstall
apt-get install libssl-dev libxslt-dev libxml2-dev
apt-get install libcurl4-openssl-dev libmysql++-dev
apt-get install libpcre3 libpcre3-dev

RVM

Установка RVM:
bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)
/etc/rvmrc
umask g+w
export rvm_path="/usr/local/rvm"
export rvm_source_path="${rvm_path}/src"
export rvm_log_path="${rvm_path}/log"
export rvm_bin_path="${rvm_path}/bin"
export rvm_gems_path="$rvm_path/gems"
export rvm_tmp_path="${rvm_tmp_path:-"$rvm_path/tmp"}"
export rvm_install_on_use_flag=0
export rvm_gemset_create_on_use_flag=0
# export rvm_make_flags="-j7"
export rvm_trust_rvmrcs_flag=1
export rvm_pretty_print_flag=1
~/.bashrc
if [ -s "$HOME/.rvm/scripts/rvm" ]; then
  source "$HOME/.rvm/scripts/rvm" # This loads RVM into a shell session.
elif [ -s "/usr/local/rvm/scripts/rvm" ]; then
  source "/usr/local/rvm/scripts/rvm"
fi

Ruby в RVM

Установка Ruby:
rvm package install zlib
rvm install 1.9.1-p378 --with-zlib-dir=$rvm_path/usr
rvm install 1.9.2-p180 --with-zlib-dir=$rvm_path/usr
Проверка выбора Ruby
# rvm --default use 1.9.1
# rvm list

rvm rubies
=> ruby-1.9.1-p378 [ i386 ]
   ruby-1.9.2-p180 [ i386 ]

Системный Passenger

Сборка и установка passenger:
cd /usr/local/src
wget http://rubyforge.org/frs/download.php/74471/passenger-3.0.5.tar.gz
tar -xzvf ./passenger-3.0.5.tar.gz
mv -f passenger-3.0.5 /usr/local/
Passenger установлен в /usr/local/passenger-3.0.5

Поддержка SSL в Ruby

Добавление поддержки SSL:
rvm gem install rack
rvm package install openssl
rvm use ruby-1.9.1-p378
cd /usr/local/rvm/src/ruby-1.9.1-p378/ext/openssl/
ruby extconf.rb
make
make install 
rvm use ruby-1.9.2-p180
cd /usr/local/rvm/src/ruby-1.9.2-p180/ext/openssl/
ruby extconf.rb
make
make install

Сборка backend (nginx + passenger-module)

Собираем nginx с модулем passenger. Исходники помещаем в /usr/local/src :
cd /usr/src
wget http://sysoev.ru/nginx/nginx-1.0.2.tar.gz
tar xzvf nginx-1.0.2.tar.gz
Далее необходимо скачать и развернуть исходники pcre-8.10
cd /usr/local/src/nginx-1.0.2
Сконфигурировать сборку:
sh ./configure \
 --prefix='/usr/local/nginx' \
 --with-http_ssl_module  \
 --with-pcre='/usr/local/src/pcre-8.10' \
 --add-module='/usr/local/passenger-3.0.5/ext/nginx' \
 --user=www-data \
 --group=www-data \
 --error-log-path=/var/log/nginx-rb/error.log \
 --pid-path=/var/run/nginx-rb.pid \
 --lock-path=/var/lock/nginx-rb.lock \
 --http-client-body-temp-path=/var/lib/nginx-rb/body \
 --http-proxy-temp-path=/var/lib/nginx-rb/proxy \
 --http-fastcgi-temp-path=/var/lib/nginx-rb/fastcgi \
 --with-http_ssl_module \
 --with-http_dav_module \
 --with-http_gzip_static_module \
 --with-http_stub_status_module \
 --without-mail_pop3_module \
 --without-mail_smtp_module \
 --without-mail_imap_module
В результате подготовлена сборка nginx-ruby-backend в каталог /usr/local/nginx Выполнить сборку debian-пакета:
checkinstall -D make install
Указать имя пакета "nginx-rb" и описание пакета "Nginx-1.0.2 (backend) with passenger-3.0.5 module"

Настройка

frontend

Стандартная настройка. Варианты проксирования:
  1. по количеству backends/приложений;
  2. "универсально" - в зависимости от $request_uri/$server_name переводить на тот или иной upstream.
Второй вариант потребует меньше конфигураций и изменений во frontend.

backend

На примере backend ruby-1.9.2. Настроим для запуска дополнительный экземпляр nginx-backend:
/usr/local/nginx/etc/nginx-rb-192.conf:
  • пути к pid/лог-файлам;
  • пути к sites-enabled;
  • порт листинга (например, 8192 = 8<ruby-version>);
  • глобальные настройки passenger/ruby:
      http {
          ...
          passenger_root /usr/local/passenger-3.0.5;
          passenger_ruby /path-to-ruby;
          ...
      }
    
Узнать путь к конфигурационному файлу nginx-rb-192.conf (pass-to-ruby):
# rvm use ruby-1.9.2-p180 && which ruby
/etc/init.d/nginx-rb-192:
Включить в автозапуск:
# update-rc.d nginx-rb-192 defaults

Passenger

В конфигурации виртуального хоста backend необходимо указать (минимально):
server {
    listen          8192;
    server_name     <app_name>.domain.tld;
    root            /home/applications/<app_name>/prod/bin/public;
    rails_env       production;
    passenger_user  <app_name_user>;
    passenger_group <app_name_user>;
    passenger_enabled on;
}

Ruby

Gemsets

Принципиально возможно использовать несколько версий Rails под каждой развернутой Ruby. Достигается это манипуляциями с RVM/Gemset. Пример. Для Ruby-1.9.2 необходимо иметь rails-2.3.5 и rails-3.0.5 Формируем 2 gemset'а:
# rvm ruby-1.9.2-p180
# rvm gemset create rails235 rails305
ERROR: Gemset 'rails305' does not exist, rvm gemset create 'rails305' first.
'rails235' gemset created (/usr/local/rvm/gems/ruby-1.9.2-p180@rails235).
'rails305' gemset created (/usr/local/rvm/gems/ruby-1.9.2-p180@rails305).
Ошибка в выводе не принципиальна, появляется не всегда.
В итоге под ruby-1.9.2 имеется 3 gemset'а:
  • global - набор по-умолчанию (gem'ы из него автоматически доступны из всех наборов)
  • rails235
  • rails305
В дальнейшем возможны следующий манипуляции:
  • в global устанавливать gem'ы, необходимые для базовой поддержки приложений (не требующие вариаций по версиям и т.п.);
  • в railsNNN - устанавливать непосредственно rails требуемой версии и связанные с ним gem'ы.
Возможно более разветвленное дерево gemset'ов (в данной статье не рассматривается). Установка gem в gemset (важен выбор назначения — ruby-<version>@<gemset>):
# rvm 1.9.2-p180@rails305
# gem install rails -v 2.3.5
# rvm 1.9.2-p180@rails306
# gem install rails -v 3.0.5
Информация по выбранному gemset'у:
# rvm gemset list
gemsets for ruby-1.9.2-p180 (found in /usr/local/rvm/gems/ruby-1.9.2-p180)
   global
   rails235
=> rails305

Приложения

Для использования возможностей RVM необходимо выдержать следующую схему размещения приложений:
Структура каталогов: /home/applications/<app_name>/<app_type> - корневой каталог (app_root) - домашний каталог пользователя-владельца приложений;
/home/applications/<app_name>/<app_type>/bin - каталог приложения (app_home) В каталогах создать (dot)rvmrc — файлы:
  • для app_root (непосредственно позволяет использовать RVM):
    rvm_path="/usr/local/rvm"
    rvm_trust_rvmrcs_flag=1
    rvm_install_on_use_flag=1
    
  • для app_home (позволяет автоматически выбирать при входе в этот каталог версию Ruby и, при необходимости, gemset под RVM):
    #!/usr/bin/env bash
    environment_id="ruby-1.9.2-p180@rails305"
    if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \
      && -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]] ; then
      \. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
    
      [[ -s ".rvm/hooks/after_use" ]] && . ".rvm/hooks/after_use"
    else
      rvm --create use "$environment_id"
    fi
    
Собственно выбор версии - environment_id. В app_home, в configure/ поместить файл setup_load_paths.rb:
if ENV['MY_RUBY_HOME'] && ENV['MY_RUBY_HOME'].include?('rvm')
  begin
    rvm_path     = File.dirname(File.dirname(ENV['MY_RUBY_HOME']))
    rvm_lib_path = File.join(rvm_path, 'lib')
    $LOAD_PATH.unshift rvm_lib_path
    require 'rvm'
    RVM.use_from_path! File.dirname(File.dirname(__FILE__))
  rescue LoadError
    # RVM is unavailable at this point.
    raise "RVM ruby lib is currently unavailable."
  end
end
# Select the correct item for which you use below.
# If you're not using bundler, remove it completely.
# If we're using a Bundler 1.0 beta
ENV['BUNDLE_GEMFILE'] = File.expand_path('../Gemfile', File.dirname(__FILE__))
require 'bundler/setup'
# Or Bundler 0.9...
if File.exist?(".bundle/environment.rb")
  require '.bundle/environment'
else
  require 'rubygems'
  require 'bundler'
  Bundler.setup
end

Контроль

Nginx

Штатные методы, с учетом наличия нескольких экземпляров.

Ruby

Вывод текущей версии Ruby:
# rvm list
Вывод текущего gemset:
# rvm gemset list
Вывод списка установленных gem:
# rvm gem list

Rails

Для перезапуска rails-процесса достаточно сделать в каталоге приложения:
# touch tmp/restart.txt

Passenger

Проверка статуса passenger:
  • /usr/local/passenger-3.0.5/bin/passenger-status
    
    Выдает несколько PID (по количеству backends);
  • /usr/local/passenger-3.0.5/bin/passenger-status <PID>
    
    Выдает статус rails-процессов по выбранному backend.

Ограничения

GEM могут быть установлены только от привилегированного пользователя. Для установки gem от имени непривилегированного пользователя требуется доработка.

Литература

  1. Phusion Passenger users guide, Nginx version
  2. NGINX
  3. Using RVM rubies with Passenger