Source code for gyoza.server.runner
"""Server runner.
Entry point called by ``gyoza server start``. Verifies connections and
starts the uvicorn server with configuration from environment variables.
Environment variables
---------------------
GYOZA_HOST
Host to bind to. Defaults to ``127.0.0.1``.
GYOZA_PORT
Port to bind to. Defaults to ``5555``.
GYOZA_RELOAD
Enable auto-reload for development. Defaults to ``false``.
GYOZA_WORKERS
Number of uvicorn worker processes. Defaults to ``1``.
GYOZA_LOG_LEVEL
Logging level (``debug``, ``info``, ``warning``, ``error``).
Defaults to ``info``.
"""
import logging
import os
import sys
import uvicorn
logger = logging.getLogger(__name__)
def _verify_connections() -> None:
"""Verify MongoDB connectivity before starting the server.
Raises
------
Exception
If the MongoDB ping fails.
"""
from gyoza.server.op_definition.mongo import (
_client,
op_definitions_collection,
)
from gyoza.server.op_run.mongo import op_runs_collection
_client.admin.command("ping")
logger.info("MongoDB connection successful")
logger.info("Database: %s", op_definitions_collection.database.name)
logger.info("OpDefinitions collection: %s", op_definitions_collection.name)
logger.info("OpRuns collection: %s", op_runs_collection.name)
[docs]
def start(
host: str | None = None,
port: int | None = None,
reload: bool | None = None,
workers: int | None = None,
log_level: str | None = None,
) -> None:
"""Start the gyoza server.
Parameters passed explicitly take precedence over environment variables,
which in turn take precedence over the built-in defaults. This lets the
``gyoza server start`` CLI pass Typer-parsed values directly.
Parameters
----------
host : str | None
Host to bind to.
port : int | None
Port to listen on.
reload : bool | None
Enable uvicorn auto-reload (development only).
workers : int | None
Number of uvicorn worker processes.
log_level : str | None
Logging level string.
"""
resolved_host = host or os.getenv("GYOZA_HOST", "127.0.0.1")
resolved_port = port or int(os.getenv("GYOZA_PORT", "5555"))
resolved_reload = (
reload
if reload is not None
else os.getenv("GYOZA_RELOAD", "false").lower() in ("true", "1")
)
resolved_workers = workers or int(os.getenv("GYOZA_WORKERS", "1"))
resolved_log_level = log_level or os.getenv("GYOZA_LOG_LEVEL", "info")
logging.basicConfig(
level=resolved_log_level.upper(),
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
stream=sys.stdout,
)
logger.info("Starting gyoza server on %s:%s", resolved_host, resolved_port)
try:
_verify_connections()
except Exception as e:
logger.error("Failed to connect to MongoDB: %s", e)
sys.exit(1)
uvicorn.run(
"gyoza.server.api.app:app",
host=resolved_host,
port=resolved_port,
reload=resolved_reload,
workers=resolved_workers if not resolved_reload else 1,
log_level=resolved_log_level,
)
if __name__ == "__main__":
start()