久しぶりにシステムワイドで生の RoR アプリをインストール・デプロイする作業があったんだけど、puma.rb
で指定でいる daemonize
を利用してデーモン化しようとしたらダメだったので。
今どきシステムワイドにインストールするぅ? って言われそうだけど、諸般の事情があってコンテナに移行できないパターンもあるんや。
どうやる
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')