In diesem kleinen Beitrag möchte ich euch zeigen, wie ihr eine Flask Application mittels systemd unter Linux deployen könnt. Ich schreibe diesen Beitrag, da die Angaben in der Offizielle Dokumentation ein Rechte-Problem aufweisen, sodass ein restart der Anwendung mit einem 502 Fehler beim nächsten Zugriff quitiert wird.
Die App sollte sich im home Verzeichniss eines unpreveligierten Benutzers befinden.
Der Autostart lässt sich einfach und zeitgemäß via systemd realisieren. Als Proxy empfehle ich nginx. appname bitte durch den Namen der App ersetzten, appuser durch den Benutzer ersetzten, unter dem die Web App laufen soll.
/etc/systemd/system/gunicorn.service:
[Unit]
Description=appname daemon
Requires=appname.socket
After=network.target
[Service]
PIDFile=/run/gunicorn/pid
User=appuser
Group=appgroup
RuntimeDirectory=appname
WorkingDirectory=/home/appuser/applicationroot
ExecStart=/usr/bin/gunicorn3 --pid /run/appname/pid \
--bind unix:/run/appname.socket appname:app
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
/etc/systemd/system/gunicorn.socket:
[Unit]
Description=appname socket
[Socket]
ListenStream=/run/appname.socket
[Install]
WantedBy=sockets.target
/etc/tmpfiles.d/gunicorn.conf:
d /run/appname 0755 appuser appgroup -
/etc/nginx/sites-available/mynginx:
server {
listen 80;
listen [::]:80;
server_name example.com;
# Gunicorn
location / {
uwsgi_pass unix:/run/appname.socket;
uwsgi_param Host $host;
uwsgi_param X-Real-IP $remote_addr;
uwsgi_param X-Forwarded-For $proxy_add_x_forwarded_for;
uwsgi_param X-Forwarded-Proto $http_x_forwarded_proto;
}
}
Nginx Seite aktivieren:
sudo ln -s /etc/nginx/sites-available/mynginx /etc/nginx/sites-enabled/mynginx
Möchte man, dass seine gunicorn app erst beim 1. Zugriff startet (empfohlen), folegende Befehle ausführen:
sudo systemctl enable appname.socket
sudo systemctl start appname.socket
sudo systemctl restart nginx
Oder man möchte, dass seine gunicorn app direkt mit dem System hochfährt:
sudo systemctl enable appname.socket
sudo systemctl enable appname.service
sudo systemctl start appname.socket
sudo systemctl restart nginx