[Unit] Description=WROLPi Python API (Development) PartOf=wrolpi.target Conflicts=wrolpi-api.service [Service] Environment=PYTHONUNBUFFERED=1 # Sanic 25.x wants 'spawn' but our code uses 'fork' for multiprocessing. Environment=SANIC_START_METHOD_SET=1 # Required for yt-dlp to access GNOME keyring for browser cookie decryption. Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%U/bus ExecStart=/opt/wrolpi/venv/bin/python -m sanic main:api_app --host 0.0.0.0 --port 8081 -w 2 --reload --debug ExecReload=/bin/kill -HUP $MAINPID Group=wrolpi User=wrolpi WorkingDirectory=/opt/wrolpi/ Restart=on-failure # Signal only Sanic's main process on stop; it shuts its workers, the perpetual process and the multiprocessing # Manager down itself. Signalling the whole cgroup at once kills the Manager under main's own cleanup (broken # pipe, exit 1). Stragglers still get SIGKILL at TimeoutStopSec. KillMode=mixed # Higher than the App so the API can start. Nice=4 [Install] WantedBy=default.target