Je ne vais pas vous refaire une explication de ce qu’est systemd.
Simplement partager comment faire tourner un projet Rails (7.0) sous Puma 5 et Sidekiq 6.
Je ne suis pas trop fan de systemd, je ne l’utilise que par obligation. Je ne suis pas sysadmin, et pour déployer un projet perso en ligne j’ai en gros le choix entre du metal et du cloud.
J’ai choisi le metal car ça me permet de faire ce que je veux sans contrainte et pour un coût moindre.
Initialement Puma se lançais au déploiement via Capistrano, en mode daemon, mais la version 5 à complètement supprimer cela.
A tort ou à raison n’est pas le sujet ici, on va se concentrer sur ce qu’il faut faire.
Pour chaque projet sur le serveur, je crée un user different. Je me trouve donc dans un répertoire du même nom que mon appli: /home/monappli.
Pour lancer un service il y a 2 possibilitées:
Pour un service en mode user il faut placer les fichiers de service à un endroit précis de home user: ~/.config/systemd/user/
En chemin absolu: /home/monappli/.config/systemd/user/
Une convention de nommage de ces fichiers est: monappli_leprogramme_env Essayez de la respecter, ça vous facilitera la vie avec tout ce qui utilise ce nommage par defaut.
Ici mon application Rails s’appelle: monappli
Nous somme sur un environnement nommé: staging
Nous allons lancer: puma
Le premier et plus important fichier est le fichier .service, donc monappli_puma_env.service
[Unit]
Description=Puma HTTP Server for monappli staging
After=network.target
Requires=monappli_puma_staging.socket
[Service]
Type=simple
Environment=RAILS_ENV=staging
WorkingDirectory=/srv/www/monappli/current/
ExecStart=/home/monappli/.rbenv/shims/puma -e staging -C /srv/www/monappli/shared/puma.rb /srv/www/monappli/current/config.ru
ExecStop=/home/monappli/.rbenv/shims/puma -e staging -C /srv/www/monappli/shared/puma.rb stop
ExecReload=/home/monappli/.rbenv/shims/puma -e staging -C /srv/www/monappli/shared/puma.rb phased-restart
PIDFile=/srv/www/monappli/shared/tmp/pids/puma.pid
Restart=always
RestartSec=8
KillMode=process
SyslogIdentifier=puma
[Install]
WantedBy=multi-user.target
[Unit]
Description=Puma HTTP Server Accept Sockets
[Socket]
ListenStream=0.0.0.0:9294
ListenStream=0.0.0.0:9295
NoDelay=true
ReusePort=true
Backlog=1024
[Install]
WantedBy=sockets.target
Passer en root:
systemctl daemon-reload
systemctl enable monappli_puma_env.service monappli_puma_env.socket
Repasser en user puis il suffit de taper le contenu de ExecStart, qui devrait marcher de lui-mĂŞme.
Ou encore depuis votre console locale:
cap puma:start
Si vous rajoutez Sidekiq, c’est la même chose
[Unit]
Description=sidekiq for monappli
After=syslog.target network.target
[Service]
Type=simple
Environment=RAILS_ENV=staging
WorkingDirectory=/srv/www/monappli/current
ExecStart=/home/monappli/.rbenv/bin/rbenv exec bundle exec sidekiq -e staging
StandardOutput=append:/srv/www/monappli/shared/log/sidekiq.log
StandardError=append:/srv/www/monappli/shared/log/sidekiq.error.log
RestartSec=20
Restart=on-failure
SyslogIdentifier=sidekiq
[Install]
WantedBy=default.target