VPS для Ruby on Rails: puma и nginx
Rails на production — это связка puma как сервера приложений и nginx как reverse proxy. Разберём установку Ruby через rbenv, запуск puma под systemd через unix-сокет и настройку nginx.
Содержание
Архитектура деплоя Rails
['Классическая схема production-деплоя Rails состоит из двух слоёв. Puma — многопоточный сервер приложений, который держит Ruby-процессы. nginx стоит перед ним, отдаёт статику, терминирует TLS и балансирует нагрузку.', 'Связь между ними удобнее делать через unix-сокет, а не TCP-порт: это быстрее и не занимает сетевой порт. nginx обращается к сокету, puma слушает его.', '- puma — сервер приложений, потоки и воркеры.
- nginx — статика, TLS, проксирование.
- unix-сокет — быстрая связь между ними.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.
Арендовать VPS для RailsУстановка Ruby через rbenv
['Системный Ruby часто устаревший, поэтому ставим нужную версию через rbenv. Понадобятся зависимости для сборки нативных гемов.', 'sudo apt update\nsudo apt install -y git curl libssl-dev libreadline-dev zlib1g-dev build-essential libyaml-dev nginx nodejs\ngit clone https://github.com/rbenv/rbenv.git ~/.rbenv\ngit clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build\necho \'export PATH="$HOME/.rbenv/bin:$PATH"\' >> ~/.bashrc\necho \'eval "$(rbenv init -)"\' >> ~/.bashrc\nsource ~/.bashrc\nrbenv install 3.3.4\nrbenv global 3.3.4']
Подготовка приложения
['Клонируем код, ставим гемы в production-режиме, компилируем ассеты и мигрируем БД.', "cd /opt/railsapp\nbundle config set --local without 'development test'\nbundle install\nRAILS_ENV=production bundle exec rails assets:precompile\nRAILS_ENV=production bundle exec rails db:migrate", 'Секретный ключ и переменные окружения задаём через RAILS_MASTER_KEY или .env, не коммитя их в репозиторий. Для базы данных в production используйте PostgreSQL, а строку подключения передавайте переменной DATABASE_URL — так конфигурация остаётся вне кода.', 'RAILS_ENV=production DATABASE_URL=postgres://user:pass@localhost/app_prod \\\n bundle exec rails db:migrate']
puma под systemd
['Puma запускаем как systemd-сервис, слушающий unix-сокет. В config/puma.rb укажите bind на сокет.', '# config/puma.rb\nbind "unix:///opt/railsapp/tmp/sockets/puma.sock"\nworkers 2\nthreads 5, 5\nenvironment "production"', '[Unit]\nDescription=Puma for Rails\nAfter=network.target\n\n[Service]\nUser=deploy\nWorkingDirectory=/opt/railsapp\nExecStart=/home/deploy/.rbenv/shims/bundle exec puma -C config/puma.rb\nRestart=always\nEnvironment=RAILS_ENV=production\n\n[Install]\nWantedBy=multi-user.target', 'sudo systemctl daemon-reload\nsudo systemctl enable --now puma\njournalctl -u puma -f', 'Для фоновых задач Rails обычно поднимают отдельный процесс — Sidekiq или GoodJob — как самостоятельный systemd-сервис. Он живёт рядом с puma, читает ту же очередь и перезапускается независимо, что удобно при деплое.']
nginx перед puma
['nginx проксирует запросы в сокет puma и сам отдаёт скомпилированные ассеты из public — это разгружает Ruby.', 'upstream puma {\n server unix:///opt/railsapp/tmp/sockets/puma.sock;\n}\nserver {\n listen 80;\n server_name example.com;\n root /opt/railsapp/public;\n location / {\n try_files $uri @puma;\n }\n location @puma {\n proxy_pass http://puma;\n proxy_set_header Host $host;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n }\n}', 'sudo nginx -t && sudo systemctl reload nginx\nsudo certbot --nginx -d example.com']
Ресурсы и типичные ошибки
['Каждый воркер puma держит копию приложения в памяти, поэтому Rails заметно требователен к RAM — планируйте от 2 ГБ. Сборка нативных гемов и precompile ассетов упираются в CPU и диск: AMD EPYC + NVMe у MAATRIX ускоряют деплой, а ежедневные бэкапы страхуют БД. Локации UK/США и оплата из России (карта РФ, СБП, крипта, MAAT) закрывают вопрос зарубежного сервера.', '- Забыли precompile — стили и скрипты не грузятся в production.
- Нет RAILS_MASTER_KEY — приложение не расшифрует credentials и упадёт при старте.
- Слишком много воркеров — нехватка RAM и OOM.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.
Арендовать VPS для RailsЧастые вопросы
Сколько воркеров puma ставить?
Ориентируйтесь на число ядер, но учитывайте RAM: каждый воркер держит копию приложения. На 2 ГБ обычно 2 воркера по несколько потоков.
Зачем unix-сокет вместо порта?
Сокет быстрее TCP на одной машине и не занимает сетевой порт. Для связи nginx и puma на одном сервере это оптимально.
Как деплоить обновления Rails?
Стяните код, выполните bundle install, assets:precompile, db:migrate и перезапустите puma. Инструменты вроде Capistrano автоматизируют это с zero-downtime.