Настройка Rails-сервера на DigitalOcean


DigitalOcean

В прошлой статье мы говорили о настройке Rails-окружения для разработки. Теперь пришло время для настройки боевого сервера.

Для этого необходимо зарегистрироваться на DigitalOcean (реферальная ссылка, после регистрации вы получити $10 на свой счет) и создать Droplet. В качестве ОС необходимо выбрать Ubuntu 14.04.

Настройка сервера

Заходим на сервер под root:

$ ssh root@[IP-адрес сервера]

В первую очередь создаем нового пользователя:

root@droplet:~# adduser deploy

Добавляем его в группу sudo, чтобы у него были привилегии root:

root@droplet:~# gpasswd -a deploy sudo

Затем настраиваем вход на сервер по ssh-ключам. Для этого генерируем ключ на локальном компьютере:

$ ssh-keygen -t rsa

Заходим на сервер под новым пользователем:

root@droplet:~# su - deploy

Создаем директорию ssh:

deploy@droplet:~$ mkdir .ssh
deploy@droplet:~$ chmod 700 .ssh

Копируем публичный ключ с локального компьютера:

$ cat ~/.ssh/id_rsa.pub

И сохраняем его в файл ~/.ssh/authorized_keys на сервере. Далее меняем права на этот файл и переключаемся снова на пользователя root:

deploy@droplet:~$ chmod 600 .ssh/authorized_keys
deploy@droplet:~$ exit

Для большей безопасности, запрещаем вход на сервере через ssh под пользователем root. Для этого открываем файл /etc/ssh/sshd_config и находим следующую строчку:

PermitRootLogin yes

Меняем её на:

PermitRootLogin no

И перезапускаем ssh:

root@droplet:~# service ssh restart

Обратно заходим под пользователем deploy:

root@droplet:~# su - deploy

Приступаем к настройке временной зоны. Выбираем из списка “Europe/Moscow”:

deploy@droplet:~$ sudo dpkg-reconfigure tzdata

Настраиваем локаль, для этого открываем файл /etc/default/locale и добавляем туда следующее:

LANGUAGE='en_US.UTF-8'
LC_ALL='en_US.UTF-8'
LANG='en_US.UTF-8'
LC_TYPE='en_US.UTF-8'

Запускаем команду перенастройки:

deploy@droplet:~$ sudo locale-gen en_US.UTF-8
deploy@droplet:~$ sudo dpkg-reconfigure locales

Установка ПО

С настройкой сервера мы закончили, приступаем к установке ПО. Устанавливаем ntp для автоматической синхронизации времени:

deploy@droplet:~$ sudo apt-get update
deploy@droplet:~$ sudo apt-get install ntp

Далее устанавливаем Redis и PostgreSQL:

deploy@droplet:~$ sudo apt-get install redis-server postgresql libpq-dev

Установка Ruby

Устанавливаем необходимые зависимости:

deploy@droplet:~$ sudo apt-get install git curl autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev

В качестве менеджера версий Ruby, мы будем использовать rbenv. После установки перезапускаем текущую сессию bash:

deploy@droplet:~$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
deploy@droplet:~$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
deploy@droplet:~$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
deploy@droplet:~$ source ~/.bashrc

Устанавливаем дополнительные плагины, необходимые для установки Ruby:

deploy@droplet:~$ git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)/plugins/ruby-build"
deploy@droplet:~$ git clone https://github.com/rbenv/rbenv-vars.git "$(rbenv root)/plugins/rbenv-vars" 

Находим последнюю стабильную версию Ruby:

deploy@droplet:~$ rbenv install -l

На момент написания статьи - это 2.2.3:

2.2.0
2.2.1
2.2.2
2.2.3
2.3.0-dev

Устанавливаем Ruby и перезапускаем текущую сессию bash:

deploy@droplet:~$ rbenv install 2.2.3
deploy@droplet:~$ rbenv global 2.2.3
deploy@droplet:~$ source ~/.bashrc

Устанавливаем и настраиваем Bundler, чтобы он хранил все гемы в директори проекта:

deploy@droplet:~$ gem install bundler
deploy@droplet:~$ bundle config --global path vendor/bundle
deploy@droplet:~$ bundle config --global bin vendor/bundle/bin

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

В качестве веб-сервера у нас будет выступать Nginx, а сервера приложений - Passenger. Для установки необходимо добавить PGP-ключ:

deploy@droplet:~$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7

Создаем файл /etc/apt/sources.list.d/passenger.list и добавляем в него новый источник:

deb https://oss-binaries.phusionpassenger.com/apt/passenger trusty main

Меняем права на этот файл:

deploy@droplet:~$ sudo chown root: /etc/apt/sources.list.d/passenger.list
deploy@droplet:~$ sudo chmod 600 /etc/apt/sources.list.d/passenger.list

Обновляем список пакетов и устанавливаем Nginx и Passenger:

deploy@droplet:~$ sudo apt-get update
deploy@droplet:~$ sudo apt-get install nginx-extras passenger

Переходим к настройке Nginx, открываем файл /etc/nginx/nginx.conf и находим там следующие строчки:

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

Их необходимо заменить на:

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

Создание тестового проекта

Теперь остается только проверить, что все работает, для этого создадим тестовый проект. Для этого нам понадобится установить Ruby on Rails и SQLite:

deploy@droplet:~$ gem install rails --no-document
deploy@droplet:~$ sudo apt-get install libsqlite3-dev

Создаем новый проект:

deploy@droplet:~$ rails new testapp --skip-bundle
deploy@droplet:~$ cd testapp

Для запуска тестового проекта нам понадобится JavaScript runtime библиотека. Открываем Gemfile и находим строчку:

# gem 'therubyracer',  platforms: :ruby

Заменяем её на:

gem 'therubyracer',  platforms: :ruby

Запускаем установку зависимостей проекта:

deploy@droplet:~$ bundle

Для того чтобы наш тестовый проект был доступен по IP-адресу, необходимо отключить настройки по умолчанию у Nginx. Для этого открываем файл /etc/nginx/sites-available/default и находим следующие строчки:

listen 80 default_server;
listen [::]:80 default_server;

Меняем их на:

# listen 80 default_server;
# listen [::]:80 default_server;

Создаем файл настроек для тестового проекта:

deploy@droplet:~$ sudo touch /etc/nginx/sites-available/testapp

И добавляем туда следующее содержимое:

server {
  listen 80 default_server;
  server_name www.mydomain.com;
  passenger_enabled on;
  passenger_app_env development;
  passenger_ruby /home/deploy/.rbenv/shims/ruby;
  root /home/deploy/testapp/public;
}

Создаем символьную ссылку для этого файла:

deploy@droplet:~$ sudo ln -s /etc/nginx/sites-available/testapp /etc/nginx/sites-enabled/testapp

Перезапускаем nginx:

deploy@droplet:~$ sudo nginx -s reload

На этом все, настройка сервера завершена. Теперь можно открыть в браузере страницу с IP-адресом вашего сервера и увидеть, что все работает.

Источники:

Похожие записи

Автоматическая проверка кода с помощью Vexor

Пошаговая инструкция, что для этого нужно сделать.

Управление зависимостями через Homebrew

Управление внешними зависимостями проекта c помощью Homebrew Bundle.

Класс Set и уникальные коллекции объектов

Рассмотрим решение одной задачи с использованием класса Set и DDD.

Настройка Passenger для работы с Action Cable

Решаем проблему работы WebSocket-сервера через Phusion Passenger.

Резервное копирование GitLab с помощью rsync

Мини-проект для автоматического резервного копирования GitLab c помощью Ruby и rsync.

Настройка Rails-окружения на OS X Yosemite

Полноценное рабочее окружение на OS X 10.10 Yosemite: Ruby, Homebrew, Oh My ZSH, rbenv и многое другое.