; PaganOS Web v2 – konfiguracja uWSGI (produkcja) ; ; PO CO uWSGI, a nie serwer deweloperski Flaska: dev-server nie jest do produkcji ; (brak zarządzania workerami, słaba odporność na błędy, ostrzeżenie w logach). ; PO CO HTTP na 127.0.0.1:8000, a nie gniazdo unix: nginx ma WSPÓLNY upstream ; `pagan_web` (127.0.0.1:8000) używany przez wiele vhostów (paganlinux.eu, git., ; repo., build., docs.). Dzięki temu podmiana serwera nie rusza ani jednej linii ; konfiguracji nginx — mniejsze ryzyko, zero downtime. [uwsgi] plugins = python3 chdir = /opt/pagan-web-v2 module = app:app ; JEDEN proces: aplikacja przy imporcie odpala wątek w tle (jednorazowy test ; aktualizacji pakietów) — nie chcemy go mnożyć. Równoległość dają wątki ; (tak było w dev-serwerze Flaska), a dzięki nim działają strumienie SSE ; (/build/api/stream, /admin/terminal/stream/). master = true processes = 1 threads = 32 enable-threads = true single-interpreter = true ; Nasłuch HTTP na pętli zwrotnej (upstream nginx). http-socket = 127.0.0.1:8000 buffer-size = 32768 ; Harakiri celowo wyłączone (domyślnie 0): długo żyjące strumienie SSE nie mogą ; być zabijane przez limity czasu. need-app = true die-on-term = true vacuum = true ; ── Reload bez 60-sekundowej przerwy ── ; Domyślnie uWSGI czeka 60 s, aż workery „grzecznie" skończą obsługę — a otwarte ; strumienie SSE żyją długo, więc `systemctl reload` zamrażałby ruch na minutę. ; `no-threads-wait` nie czeka na zamknięcie wątków, a mercy ograniczamy do 5 s. no-threads-wait = true reload-mercy = 5 worker-reload-mercy = 5 ; Logi: celowo BEZ `logto` — uWSGI pisze wtedy wprost na fd stdout/stderr, ; które systemd kieruje do journald (journalctl -u pagan-web). ; UWAGA: `logto = /dev/stdout` NIE działa pod systemd — uWSGI próbuje ; `open()`-ować /dev/stdout i dostaje "No such device or address".