Hier eine „einfache“ Variante ein Flask Projekt mit Gunicorn und Caddy zu betreiben.
Caddy ist ein Webserver welcher in GO geschrieben ist und von sich aus bereits HTTPS mit Letsencrypt macht, dabei ist Caddy ultraleicht einzurichten. In dem Beispiel verwenden wir Caddy um mit dem Backend Gunicorn Webserver zu sprechen, Caddy fungiert hier als Reverse Proxy.
Informationen zu Caddy: Caddy – The Ultimate Server with Automatic HTTPS (caddyserver.com)
Die Testumgebung ist Fedora 34 geht aber auf anderen Distributionen wie Ubuntu / Debian.
Pakete installieren
Für Fedora 34
dnf install caddy python3 python3-pip python3-wheel
Für Ubuntu/Debian
apt install python3 python3-pip python3-wheel apt install -y debian-keyring debian-archive-keyring apt-transport-https curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo apt-key add - curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list apt update apt install caddy
User erstellen
useradd -s /bin/bash -d /opt/myproject -m -U myproject
Virtual environment erstellen
su - myproject python3 -m venv venv source ~/venv/bin/activate
Installation der python Pakete
pip install gunicorn flask
Unser Flask Demo
myproject.py
from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "<h1>Testseite</h1>" if __name__ == "__main__": app.run(host='0.0.0.0')
wsgi.py
from myproject import app if __name__ == "__main__": app.run()
Autostart gunicorn mit systemd
Um gunicorn automatisch von Systemd starten zu lassen muss ein neuer Service eingerichtet werden.
/etc/systemd/system/myproject.service
[Unit] Description=Gunicorn instance to serve myproject After=network.target [Service] User=myproject Group=myproject WorkingDirectory=/opt/myproject Environment="PATH=/opt/myproject/venv/bin" ExecStart=/opt/myproject/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:9000 -m 007 wsgi:app [Install] WantedBy=multi-user.target
Service aktivieren und Autostart einrichten
systemctl daemon-reload systemctl enable --now myproject systemctl start myproject
Der gunicorn Service sollte nun laufen.
# systemctl status myproject ● myproject.service - Gunicorn instance to serve myproject Loaded: loaded (/etc/systemd/system/myproject.service; enabled; vendor preset: disabled) Active: active (running) since Thu 2021-05-19 20:54:27 CEST; 8min ago Main PID: 19855 (gunicorn) Tasks: 4 (limit: 2268) Memory: 56.7M CPU: 706ms CGroup: /system.slice/myproject.service ├─19855 /opt/myproject/venv/bin/python3 /opt/myproject/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:9000 -m 007 wsgi:app ├─19856 /opt/myproject/venv/bin/python3 /opt/myproject/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:9000 -m 007 wsgi:app ├─19857 /opt/myproject/venv/bin/python3 /opt/myproject/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:9000 -m 007 wsgi:app └─19858 /opt/myproject/venv/bin/python3 /opt/myproject/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:9000 -m 007 wsgi:app
Caddy einrichten
In der Caddy Konfiguration wird der DNS Name angegeben, hier im Beispiel testserver.lanbugs.de. Für diese Domain wird automatisch ein Letsencrypt Zertifikat erstellt sobald der Service gestartet wird.
/etc/caddy/Caddyfile
testserver.lanbugs.de { reverse_proxy localhost:9000 log { output file /var/log/caddy_access.log { roll_size 1gb roll_keep 5 roll_keep_for 720h } } }
Service aktivieren und Autostart einrichten
systemctl enable --now caddy systemctl start caddy
Caddy sollte nun laufen.
# systemctl status caddy ● caddy.service - Caddy web server Loaded: loaded (/usr/lib/systemd/system/caddy.service; enabled; vendor preset: disabled) Active: active (running) since Wed 2021-05-19 11:26:46 CEST; 23h ago Docs: https://caddyserver.com/docs/ Main PID: 13163 (caddy) Tasks: 7 (limit: 2268) Memory: 18.5M CPU: 9.434s CGroup: /system.slice/caddy.service └─13163 /usr/bin/caddy run --environ --config /etc/caddy/Caddyfile