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()