В прошлой статье мы говорили о настройке 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-адресом вашего сервера и увидеть, что все работает.
Источники: