Supervisor na VPS — zarządzanie procesami Python, Node.js i Celery
Opublikowano: 9 kwietnia 2026 · Kategoria: VPS
Uruchamiasz aplikację Python z Gunicornem lub workery Celery i chcesz, żeby automatycznie startowały po restarcie VPS i wznawiały pracę po awarii? Supervisor (supervisord) to sprawdzone narzędzie do zarządzania procesami w tle — prostsze niż systemd dla aplikacji użytkownika i bardziej elastyczne niż screen/tmux.
Instalacja Supervisora
# Ubuntu / Debian sudo apt update && sudo apt install supervisor -y # CentOS / Rocky Linux sudo dnf install supervisor -y # Python pip (najnowsza wersja) pip install supervisor # Uruchom i włącz przy starcie sudo systemctl enable --now supervisor # Sprawdź status sudo systemctl status supervisor
Konfiguracja — Gunicorn + Django/Flask
Utwórz plik konfiguracyjny /etc/supervisor/conf.d/myapp.conf:
[program:myapp]
; Komenda startowa — ścieżka do venv + Gunicorn
command=/var/www/myapp/venv/bin/gunicorn myapp.wsgi:application
--workers 3
--bind 127.0.0.1:8000
--timeout 120
--log-level info
; Katalog roboczy aplikacji
directory=/var/www/myapp
; Użytkownik (nie root!)
user=www-data
; Automatyczny start i restart
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
; Logi
stdout_logfile=/var/log/supervisor/myapp.log
stderr_logfile=/var/log/supervisor/myapp.err.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=5
; Zmienne środowiskowe
environment=DJANGO_SETTINGS_MODULE="myapp.settings.production",
DATABASE_URL="postgresql://user:pass@localhost/myapp"
Po każdej zmianie pliku .conf: sudo supervisorctl reread && sudo supervisorctl update.
Konfiguracja — Celery worker
[program:celery-worker]
command=/var/www/myapp/venv/bin/celery
-A myapp
worker
--loglevel=info
--concurrency=4
-n worker1@%%h
directory=/var/www/myapp
user=www-data
autostart=true
autorestart=true
stopwaitsecs=600
stopasgroup=true
killasgroup=true
stdout_logfile=/var/log/supervisor/celery-worker.log
stderr_logfile=/var/log/supervisor/celery-worker.err.log
[program:celery-beat]
command=/var/www/myapp/venv/bin/celery
-A myapp
beat
--loglevel=info
--scheduler django_celery_beat.schedulers:DatabaseScheduler
directory=/var/www/myapp
user=www-data
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/celery-beat.log
stderr_logfile=/var/log/supervisor/celery-beat.err.log Konfiguracja — Node.js / Next.js
[program:nextjs-app] command=/usr/bin/node /var/www/nextapp/.next/standalone/server.js directory=/var/www/nextapp user=nodeuser autostart=true autorestart=true environment=NODE_ENV="production",PORT="3000",HOST="127.0.0.1" stdout_logfile=/var/log/supervisor/nextjs.log stderr_logfile=/var/log/supervisor/nextjs.err.log
Dla Node.js rozważ też PM2 — ma dedykowane funkcje jak cluster mode i reload bez downtime. Supervisor jest lepszy gdy zarządzasz mieszanką technologii (Python + Node).
supervisorctl — zarządzanie procesami
# Status wszystkich procesów sudo supervisorctl status # Start / stop / restart konkretnego procesu sudo supervisorctl start myapp sudo supervisorctl stop myapp sudo supervisorctl restart myapp # Przeładuj konfigurację (po dodaniu nowego .conf) sudo supervisorctl reread sudo supervisorctl update # Logi w czasie rzeczywistym sudo supervisorctl tail -f myapp sudo supervisorctl tail -f myapp stderr # Interaktywny shell sudo supervisorctl
Porównanie: Supervisor vs systemd vs PM2
| Cecha | Supervisor | systemd | PM2 |
|---|---|---|---|
| Uprawnienia | Root lub user | Root (systemctl) | User (bez root) |
| Języki/frameworki | Dowolne | Dowolne (OS-level) | Node.js (głównie) |
| Cluster mode | Przez grupy | Przez instancje | Wbudowany |
| Reload bez downtime | Nie wprost | Tak (ExecReload) | Tak (pm2 reload) |
| Web interface | supervisord web UI | Brak (cockpit extra) | PM2 Plus (płatny) |
| Najlepszy dla | Python, mieszane stosy | Usługi systemowe | Node.js production |
Grupy procesów
Supervisor pozwala grupować procesy i zarządzać nimi jednym poleceniem:
[group:myapp-stack] programs=myapp,celery-worker,celery-beat ; Zarządzanie całą grupą: ; sudo supervisorctl start myapp-stack:* ; sudo supervisorctl stop myapp-stack:* ; sudo supervisorctl restart myapp-stack:*
Dobre praktyki
- Nigdy nie uruchamiaj jako root — ustaw
user=www-datalub dedykowany user aplikacji - Używaj
stopasgroup=truedla procesów z subprocess (Gunicorn, Celery) — Supervisor zabije cały drzewo procesów - Rotacja logów — ustaw
stdout_logfile_maxbytesistdout_logfile_backupsżeby logi nie zapchały dysku - Zmienne środowiskowe przez
environment=— nie w.env(Supervisor go nie wczytuje automatycznie) - Testuj konfigurację przed dodaniem — uruchom komendę ręcznie jako docelowy user, żeby upewnić się że działa przed wpisaniem do Supervisora