AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

puma を systemd でやる

久しぶりにシステムワイドで生の RoR アプリをインストール・デプロイする作業があったんだけど、puma.rb で指定でいる daemonize を利用してデーモン化しようとしたらダメだったので。

www.kanzennirikaisita.com

www.rochefort.dev

今どきシステムワイドにインストールするぅ? って言われそうだけど、諸般の事情があってコンテナに移行できないパターンもあるんや。

どうやる

AmazonLinux2 だったので、全部 systemd に預けることにしました。 カジュアルにやれば以下のような流れ。

sudo vi /etc/systemd/system/puma.service
sudo systemctl daemon-reload
sudo systemctl enable puma.service
sudo systemctl start puma.service
sudo systemctl status puma.service

/etc/systemd/system/puma.service

書き換える場所は以下。

  • WorkingDirectory=/var/www/example
    • このディレクトリ以下、 ./config/puma.rb が起動時に読み込まれる設定ファイルになる
  • Environment=RAILS_ENV=production
    • production 以外の ENV を生やしていればそれを
# original: https://www.rochefort.dev/posts/puma-systemd/

# /etc/systemd/system/puma.service
[Unit]
Description=Puma HTTP Server
After=network.target

[Service]
# Puma supports systemd's `Type=notify` and watchdog service
# monitoring, if the [sd_notify](https://github.com/agis/ruby-sdnotify) gem is installed,
# as of Puma 5.1 or later.
# On earlier versions of Puma or JRuby, change this to `Type=simple` and remove
# the `WatchdogSec` line.
Type=simple

User=ec2-user

WorkingDirectory=/var/www/example

# Helpful for debugging socket activation, etc.
#Environment=PUMA_DEBUG=1
Environment=RAILS_ENV=production
Environment=RAILS_SERVE_STATIC_FILES=1

ExecStart=/bin/bash -lc 'bundle exec puma -C config/puma.rb'

Restart=always

[Install]
WantedBy=multi-user.target

おまけ

puma.rb はこんな感じで、確認用に最低限にしている。

puma.rb

max_threads_count = ENV.fetch('RAILS_MAX_THREADS', 5)
min_threads_count = ENV.fetch('RAILS_MIN_THREADS') { max_threads_count }
threads min_threads_count, max_threads_count

worker_timeout 3600 if ENV.fetch('RAILS_ENV', 'production') == 'production'

bind 'unix:///var/www/example/tmp/sockets/puma.sock'

environment ENV.fetch('RAILS_ENV', 'development')

pidfile ENV.fetch('PIDFILE', 'tmp/pids/server.pid')