[Unit] Description=TESM Web App After=network.target [Service] Type=simple User=root WorkingDirectory=/srv/tesm # Produktiver WSGI-Server (gunicorn) statt Flasks eigenem app.run()- # Entwicklungsserver -- siehe requirements.txt für die ausführliche # Begründung von "--workers 1" (In-Memory-Zustand) und "--worker-class # gthread" (blockierende WebSocket-Threads für das Browser-SSH-Terminal). # "--timeout 0" deaktiviert Gunicorns Worker-Timeout: der greift sonst # nach 30s auch bei einer offenen, aber gerade inaktiven SSH-Terminal- # WebSocket-Verbindung und würde den Worker (und damit JEDE Verbindung, # da nur ein Prozess läuft) killen. # "--bind 127.0.0.1:5000" statt 0.0.0.0: Flask/Gunicorn soll ausschließlich # über den nginx-Reverse-Proxy (siehe Einstellungen -> NGINX) erreichbar # sein, nicht zusätzlich direkt und unverschlüsselt über Port 5000 aus dem # Netz -- nginx selbst greift ohnehin nur über 127.0.0.1 zu. ExecStart=/srv/tesm/venv/bin/gunicorn --workers 1 --worker-class gthread --threads 16 \ --timeout 0 --bind 127.0.0.1:5000 app:app Restart=always RestartSec=5 [Install] WantedBy=multi-user.target