From c7315278830fcb68e780f107432cc44a101b3711 Mon Sep 17 00:00:00 2001 From: Roland Date: Thu, 22 Jan 2026 18:55:12 -0700 Subject: [PATCH] Reworking how Sanic is run for upgraded Sanic version --- docker-compose.yml | 4 ++++ etc/raspberrypios/wrolpi-api-dev.service | 2 ++ etc/raspberrypios/wrolpi-api.service | 2 ++ requirements.txt | 1 + wrolpi/api_utils.py | 6 ++++++ 5 files changed, 15 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index 6a55f197..16fbd4e8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -50,6 +50,10 @@ services: build: context: . dockerfile: docker/api/Dockerfile + environment: + # Sanic 25.x wants 'spawn' but our code uses 'fork' for multiprocessing. + # This tells Sanic to accept the existing start method. + - SANIC_START_METHOD_SET=1 volumes: - './main.py:/opt/wrolpi/main.py' - './wrolpi:/opt/wrolpi/wrolpi' diff --git a/etc/raspberrypios/wrolpi-api-dev.service b/etc/raspberrypios/wrolpi-api-dev.service index c257cf76..914de0ff 100644 --- a/etc/raspberrypios/wrolpi-api-dev.service +++ b/etc/raspberrypios/wrolpi-api-dev.service @@ -6,6 +6,8 @@ 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 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 diff --git a/etc/raspberrypios/wrolpi-api.service b/etc/raspberrypios/wrolpi-api.service index 9b06c760..365f0856 100644 --- a/etc/raspberrypios/wrolpi-api.service +++ b/etc/raspberrypios/wrolpi-api.service @@ -6,6 +6,8 @@ Conflicts=wrolpi-api-dev.service [Service] Environment=PYTHONUNBUFFERED=1 +# Sanic 25.x wants 'spawn' but our code uses 'fork' for multiprocessing. +Environment=SANIC_START_METHOD_SET=1 ExecStart=/opt/wrolpi/venv/bin/python -O -m sanic main:api_app --host 0.0.0.0 --port 8081 -w 5 ExecReload=/bin/kill -HUP $MAINPID Group=wrolpi diff --git a/requirements.txt b/requirements.txt index abe675f9..c07dc247 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,6 +13,7 @@ libzim==3.5.0 mock==5.1.0 psutil==6.0.0 psycopg2-binary==2.9.9 +pydantic>=2.0.0 pypdf==6.4.0 pytest-asyncio==0.24.0 pytest-xdist==3.5.0 diff --git a/wrolpi/api_utils.py b/wrolpi/api_utils.py index e526e23e..25295bcf 100644 --- a/wrolpi/api_utils.py +++ b/wrolpi/api_utils.py @@ -17,6 +17,12 @@ from wrolpi.vars import PYTEST logger = logger.getChild(__name__) +# Sanic 25.x wants to use 'spawn' as the multiprocessing start method, but our code +# uses 'fork' extensively (via multiprocessing.Manager, Event, Queue, etc.). +# Tell Sanic to use 'fork' and that the start method is already configured. +Sanic.start_method = "fork" +Sanic.START_METHOD_SET = True + # The only Sanic App, this is imported all over. api_app = Sanic(name='api_app', log_config=LOGGING_CONFIG)