Flask + Gunicorn + Caddy Webservice

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

1 Gedanke zu „Flask + Gunicorn + Caddy Webservice“

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.