Пошаговая настройка Ruby on Rails сервера с нуля на Ubuntu 14.04

Инструкция по ручному деплою для новичков

Posted by Vlad Zaets on July 30, 2014

Upd (March 5th, 2015): В принципе, эту инструкцию я написал для личного использования, но в итоге залил на хабр в песочницу. Там меня раскритиковали что это все сильно по-нубски, никаких тебе Capistrano, chef, Ansible, ect. Но инструкция предназначена для новичков, которые что-то соорудили на Rails, и теперь им нужно выставить это на свежеоплаченную VPS-ку за 5 долларов.
А где дешевле всего арендовать VPS-сервер и как получить VPS на 2 месяца бесплатно читайте в этом посте.

На сервере мы будем использовать:

  • Ubuntu 14.04 (берем последнюю LTS-версию)
  • nginx + passenger (по-моему, отличная связка)
  • rvm (удобно)
  • Ruby 2.2.0 (берем последнюю stable-версию)
  • PostgreSQL (я использовал 9.3)
  • git

Для начала у вас уже должен быть сервер с включенным SSH-сервером, который мы взяли у VPS-провайдера.

Шаг 0. Подготовка окружения.

Логинимся к нему через свой любимый SSH-клиент. Скорее всего, у вас будет только root-аккаунт.

$ ssh [email protected]

Законнектились? Для начала создаем нового пользователя и заходим под ним. В качестве примера используется имя пользователя deploy:

$ sudo adduser deploy
$ sudo adduser deploy sudo
$ su deploy

Создаем ключи для доступа к нашему серверу. Данный шаг не обязателен, и сервер будет работать и без него, но для безопасности это необходимо. Будет использовать утилита ssh-copy-id. В терминале вашего компьютера (не на сервере!) вводим:

$ ssh-copy-id [email protected]

P.S. на моем компьютере OS X, но это применимо почти к любой *nix-системе. Для windows ищите как это сделать отдельно, либо пропускайте этот шаг и пользуйтесь паролем.

Шаг 1. Устанавливаем все необходимое.

1.1. Устанавливаем Ruby

$ sudo apt-get update
$ sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev python-software-properties

P.S. не уверен что этот шаг или все эти пакеты нужны, но где-то я это скопипастил, впрочем на данном этапе лишние пакеты не критичны.

1.2. Устанавливаем rvm

sudo apt-get install libgdbm-dev libncurses5-dev automake libtool bison libffi-dev
curl -L https://get.rvm.io | bash -s stable
source ~/.rvm/scripts/rvm
echo "source ~/.rvm/scripts/rvm" >> ~/.bashrc
rvm install 2.2.0
rvm use 2.2.0 --default
ruby -v

Команда для rubygems не устанавливать документацию:

$ echo "gem: --no-ri --no-rdoc" > ~/.gemrc

1.3. Устанавливаем nginx

# Install Phusion's PGP key to verify packages
gpg --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7
gpg --armor --export 561F9B9CAC40B2F7 | sudo apt-key add -

# Add HTTPS support to APT
sudo apt-get install apt-transport-https

# Add the passenger repository
sudo sh -c "echo 'deb https://oss-binaries.phusionpassenger.com/apt/passenger trusty main' >> /etc/apt/sources.list.d/passenger.list"
sudo chown root: /etc/apt/sources.list.d/passenger.list
sudo chmod 600 /etc/apt/sources.list.d/passenger.list
sudo apt-get update

# Install nginx and passenger
sudo apt-get install nginx-full passenger

Введите следующую команду и проверьте что ip сервера в браузере теперь выдает nginx welcome page.

$ sudo service nginx start

Теперь нужно открыть конфиг файл nginx. Для этого я использовал редактор nano, который сразу есть в Ubuntu. Вводим команду:

$ sudo nano /etc/nginx/nginx.conf

Вам нужно раскомментировать две строчки:

passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
passenger_ruby /usr/bin/ruby;

Адрес во второй строчке нужно изменить на следующий. Не забудьте заменить имя пользователя deploy на своего:

/home/deploy/.rvm/wrappers/ruby-2.2.0/ruby

1.4. Устанавливаем PostgreSQL

$ sudo apt-get install postgresql postgresql-contrib libpq-dev

Создаем пользователя (т.н. роль) в нашей бд. Логин и название бд в данном случае одинаковые и в качестве примера используется app_name:

$ sudo -u postgres createuser --superuser app_name
$ sudo -u postgres psql

Задаем пароль:

\password app_name

Жмем Ctrl+d для выхода, после чего создаем базу данных:

$ sudo -u postgres createdb app_name

Шаг 2. Перенос приложения на сервер

Воспользуемся git. Сначала переходим в папку вашего юзера:

$ cd /home/deploy

Идем на bitbucket.org или github.com, в общем, туда, где лежит ваш код и ищем ссылку на наш репозитарий и копируем ее в консоль сервера. Выглядит команда вот так:

$ git clone https:[email protected]/deploy/app_name.git

Теперь в папке вашего пользователя у вас есть папка с вашим приложением app_name.

Шаг 3. Немного настроек

Теперь нужно снова внести изменения в конфиг nginx. Открываем файл:

$ sudo nano /etc/nginx/sites-enabled/default

Теперь нам необходимо заменить содержимое следующим текстом. Вместо имени домена можно вписать ip-адрес, если у вас его еще нет. Так же не забудьте заменить имя пользователя deploy на своего:

server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

        server_name mydomain.com;
        passenger_enabled on;
        rails_env    production;
        root         /home/deploy/myapp/public;

        # redirect server error pages to the static page /50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}

Удалять построчно можно комбинацией клавиш Ctrl+k

Теперь проверьте ваш config/database.yml файл, правильно ли указаны настройки подключения к базе данных. Должно быть:

production:
  adapter: postgresql
  encoding: unicode
  database: app_name
  pool: 5
  host: localhost
  username: app_name
  password: db_password

Теперь необходимо внести изменения в конфиг PostgreSQL:

$ sudo nano /etc/postgresql/9.3/main/pg_hba.conf

В этой строчке надо поменять «peer» на «md5»:

local   all             postgres                                peer

Теперь еще нужно доустановить JS Runtime, я использовал nodejs:

$ sudo apt-get install nodejs

Теперь переходим в папку с нашим приложением и выполняем миграцию бд и компиляцию assets:

$ rake db:migrate RAILS_ENV=production
$ rake assets:precompile RAILS_ENV=production

Перезагружаем nginx и сервер должен работать:

$ sudo service nginx restart