Pull to refresh

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

Источники:

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.