Как стать автором
Обновить

Развертывание 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

Источники:

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.