Difference between revisions of "Pubapps Systemd Use"
Moskalenko (talk | contribs) |
Moskalenko (talk | contribs) (→Script) |
||
Line 12: | Line 12: | ||
=Script= | =Script= | ||
− | Example systemd script | + | |
+ | ==Python== | ||
+ | Example generic python web application systemd script | ||
<pre> | <pre> | ||
[Unit] | [Unit] | ||
Line 30: | Line 32: | ||
WantedBy=multi-user.target | WantedBy=multi-user.target | ||
+ | </pre> | ||
+ | |||
+ | ==R Shiny== | ||
+ | <pre> | ||
+ | [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 | ||
</pre> | </pre> | ||
Revision as of 16:30, 5 August 2024
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