Развертывание Rails проекта с postgresql, nodejs и nginx
Введение
Бывает необходимо развернуть на удаленном сервере Rails проект без заморочек с докером. Почему-то в интернете информация по этой теме разбросана по частям (где-то только с postgres-ом, где-то только nginx). Я решил поставить точку в этом вопросе и собрать всю информацию в одном месте.
Команды выполнялиcь на старенькой, но надежной ubuntu 16.04 (на новых версиях тоже должно все работать). Rails проект с ruby 2.6.5.
Настоятельно рекомендую работать не из root-директории!
Устанавливаем NodeJs (если нужен)
Если в ваш Rails проект имеет frontend сторону, то необходимо установить NodeJS .
sudo apt-get install nodejs
Теперь поставим yarn.
npm install --global yarn
Установим nvm.
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
И выберем нужную нам версию ноды.
nvm install <NODE_VERSION>
nvm use <NODE_VERSION>
Устанавливаем Postgresql
Установим сам postgres и нужные, для его работы, пакеты.
sudo apt-get install postgresql postgresql-contrib libpq-dev
Добавим пользователя, который будет иметь доступ к нашей бд из проекта.
sudo -u postgres createuser -s <USER_NAME> --createdb
Теперь нужно добавить нашего пользователя в pg_hba.conf. Откроем файл в каком-нибудь редакторе.
/etc/postgresql/9.5/main/pg_hba.conf
И после слов "put your actual configuration here", вставим следующее строки:
host all YOUR_USER_NAME 127.0.0.1/32 trust
host all YOUR_USER_NAME ::1/128 trust
Перезапустим postgresql
sudo systemctl restart postgresql
Устанавливаем Ruby on Rails
Для начала установим rbenv.
sudo apt install rbenv
Поставим ruby-build т.к. rbenv без него работать не будет.
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
apt-get install -y libreadline-dev
Установим нужную версию рубей.
rbenv install <RB_VERSION>
Чтобы применить версию rbenv-а добавим его вызов в bash_profile.
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
Установим railties.
apt install ruby-railties
Устанавливаем Nginx
Nginx устанавливается и настраивается крайне просто.
sudo apt-get install nginx
После установки его нужно перезапустить.
sudo systemctl restart nginx
Проверим его работоспособность.
systemctl status nginx
В консоле должно появится что-то подобное:
● nginx.service ... Active: active (running) ...
А в браузере по адресу вашего хоста должна открыться вот такая страничка:

Теперь сделаем так, чтобы nginx проксировал наши запросы в приложение, а статику отдавал сам.
Откроем или добавим файлик c нашей конфигурацией.
nano /etc/nginx/sites-available/<YOUR_DOMAIN>
И сделаем что-то подобное
upstream puma {
server 127.0.0.1:5000;
}
server {
listen 80;
listen [::]:80;
server_name example.com;
root <PUBLIC_FOLDER_IN_RAILS_PROJECT>;
try_files $uri/index.html $uri @rails;
location @rails {
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://puma$request_uri;
}
location ^~ /assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
}
location ^~ /system/ {
gzip_static on;
expires max;
add_header Cache-Control public;
}
error_page 500 502 503 504 /500.html;
error_page 404 /404.html;
error_page 422 /422.html;
client_max_body_size 10M;
keepalive_timeout 10;
}
Здесь несколько нюансов:
ваша puma может работать не на 5000 порту
в production окружении проект лучше теперь запускать на localhost а не на 0.0.0.0 т.к мы теперь имеем прослойку в виде nginx
Источники: