Pubapps Systemd Use
back to Web_Application_Hosting
Introduction
If your web applications hosted on the pubapps infrastructure is architected to run as a backend process that is then reverse proxied via the pubweb* webservers you will need a way to start the application when a server in the pubapps infrastructure (pubcontainer* node, individual VM, or pubweb* webservers for lightweight backends) is restarted. We encourage you to consider using a systemd in user mode, which can automate the start/stop/restart process. This help article should help you create and use such a user systemd script for a web application.
Configuration
Systemd has two modes of operation - system-wide, which requires the service scripts to be in a system location and operated by root and a user mode. You will be using the user mode.
- Create a user systemd directory under your /pubapps/PROJECT/ $HOME directory in pubapps
mkdir -p .config/systemd/user/
- Add a service script for the application, e.g. ~/.config/systemd/user/projprod.service or projdev.service
Script
Python
Example generic python web application systemd script
[Unit] Description=MyProject (Production) After=network.target [Service] Type=simple WorkingDirectory=/pubapps/myinstance/myproject/prod/ ExecStart=/pubapps/myinstance/myproject/prod/conda/bin/python3 run/runserver.py TimeoutSec=30 RestartSec=15s Restart=always [Install] WantedBy=multi-user.target
R Shiny
[Unit] Description=MyShinyApp After=network.target StartLimitIntervalSec=0 [Service] Type=simple Restart=always RestartSec=5 WorkingDirectory=/pubapps/myproject/shinyapp/prod/app ExecStart=nohup R --no-echo --no-restore --file=run.R > /pubapps/myproject/shinyapp/prod/logs/app.log 2>&1 EnvironmentFile=/pubapps/myproject/shinyapp/prod/env.sh [Install] WantedBy=multi-user.target
Use
Login linger mode
- Enable user linger mode to avoid having your application be shut down when you log out:
loginctl enable-linger $USER
Manage the application
- Initial load of the configuration to enable the service
systemctl --user enable projprod
- Reload configuration (after every change of the systemd service script)
systemctl --user daemon-reload
- Start service
systemctl --user start projprod
- Stop service
systemctl --user stop projprod
- Restart service
systemctl --user restart projprod
- Check if the service is running
systemctl --user status projprod
HA Setup on pubweb servers
Since we have two pubapps web/proxy servers you need to have a copy of the app running on every pubweb[1,2] server to account for the HA (High Availability) configuration of the pubapps infrastructure where a secondary pubweb webserver will take over if there is an issue with the main webserver.
Additional Information
For additional information search web for 'systemd user mode'. E.g. https://wiki.archlinux.org/title/Systemd/User