"""Dedicated HTTP runtime role.""" from __future__ import annotations import stat import uvicorn from backup_tool.config import Settings from backup_tool.observability.logging import configure_logging, log_event def _prepare_socket(settings: Settings) -> str: path = settings.web_socket_path path.parent.mkdir(mode=0o750, parents=True, exist_ok=True) try: existing = path.lstat() except FileNotFoundError: return str(path) if not stat.S_ISSOCK(existing.st_mode): raise RuntimeError("web socket path is not a socket") path.unlink() return str(path) def run_web(settings: Settings) -> int: """Run exactly one ASGI server without reload or embedded background roles.""" from backup_tool.api.app import create_app configure_logging("web", settings.log_level) server = uvicorn.Server( uvicorn.Config( create_app(settings), uds=_prepare_socket(settings), log_level=settings.log_level.lower(), reload=False, workers=1, log_config=None, ) ) server.run() log_event("role_stopped", role="web") return 0