From dd2031eef5da5806366ba1722e4629bcabdf2873 Mon Sep 17 00:00:00 2001 From: Leo Vasanko Date: Thu, 19 Feb 2026 19:57:12 +0000 Subject: [PATCH] Fix runtime config update by Server Options panel. --- paskia/db/operations.py | 2 +- paskia/fastapi/admin/server_config.py | 8 +++----- paskia/fastapi/mainapp.py | 2 +- paskia/util/runtime.py | 28 +++++++++++++++++++++++++++ 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/paskia/db/operations.py b/paskia/db/operations.py index ccd8eae..4d0eeee 100644 --- a/paskia/db/operations.py +++ b/paskia/db/operations.py @@ -56,7 +56,7 @@ def is_username_taken(username: str, exclude_uuid: UUID | None = None) -> bool: # ------------------------------------------------------------------------- -async def update_config(config: Config) -> None: +def update_config(config: Config) -> None: """Update the stored configuration.""" with _db.transaction("update_config"): _db.config = config diff --git a/paskia/fastapi/admin/server_config.py b/paskia/fastapi/admin/server_config.py index 069780b..4f0683a 100644 --- a/paskia/fastapi/admin/server_config.py +++ b/paskia/fastapi/admin/server_config.py @@ -8,6 +8,7 @@ from paskia.fastapi.session import AUTH_COOKIE from paskia.globals import passkey from paskia.sansio import Passkey from paskia.util import hostutil +from paskia.util.runtime import update_runtime_config app = FastAPI(docs_url=None, redoc_url=None, openapi_url=None) @@ -79,9 +80,6 @@ async def admin_update_server_config( origins=origins, listen=config.listen, ) - await db.update_config(new_config) - - # Reload hostutil cached config so auth_host changes take effect - hostutil.reload_config() - + db.update_config(new_config) + update_runtime_config(new_config) return {"status": "ok"} diff --git a/paskia/fastapi/mainapp.py b/paskia/fastapi/mainapp.py index 222fd83..a1dec78 100644 --- a/paskia/fastapi/mainapp.py +++ b/paskia/fastapi/mainapp.py @@ -57,7 +57,7 @@ async def lifespan(app: FastAPI): # pragma: no cover - startup path # Bootstrap and persist config now that the full DB is loaded await bootstrap_if_needed(config=runtime.config) if runtime.save: - await db.update_config(runtime.config) + db.update_config(runtime.config) await flush() # Restore uvicorn info logging (suppressed during startup in dev mode) diff --git a/paskia/util/runtime.py b/paskia/util/runtime.py index df0713c..d338b03 100644 --- a/paskia/util/runtime.py +++ b/paskia/util/runtime.py @@ -29,3 +29,31 @@ def _load_config() -> "RuntimeConfig | None": return None return msgspec.json.decode(config_json.encode(), type=RuntimeConfig) + + +def update_runtime_config(new_config: Config) -> None: + """Update the runtime configuration with a new Config and refresh the cache.""" + current_runtime = _load_config() + if not current_runtime: + return # No runtime config to update + + # Recompute site_url and site_path based on new config + site_path = "/" if new_config.auth_host else "/auth/" + if new_config.auth_host: + site_url = new_config.auth_host + elif new_config.origins: + site_url = new_config.origins[0] + else: + # Keep current site_url if no auth_host and no origins + site_url = current_runtime.site_url + + new_runtime = RuntimeConfig( + config=new_config, + site_url=site_url, + site_path=site_path, + save=current_runtime.save, + ) + os.environ["PASKIA_CONFIG"] = msgspec.json.encode(new_runtime).decode() + + # Clear the cache so next access loads the updated config + _load_config.cache_clear()