44 lines
1.1 KiB
Python
44 lines
1.1 KiB
Python
"""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
|