gonets/SRV/main.py

69 lines
3.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Инициализация FastAPI-приложения GONETS.
Содержимое модуля:
- Создание экземпляра приложения FastAPI с метаданными (title, description, version).
- Подключение CORS-политики через `CORSMiddlewareConfig` с заранее заданными
доверенными источниками (localhost и стандартные порты фронтенда).
- Монтаж корневого роутера `api.router`, который инкапсулирует все `v1`-эндпоинты
(auth, subnet, ip, network, ufw, websocket, settings).
- Инициализация `NetworkService` на уровне приложения для подготовки сетевой
подсистемы (например, ленивые проверки окружения/зависимостей).
- Точка входа для локального запуска через `uvicorn` (режим разработки с reload).
Замечания по развертыванию:
- В прод-среде приложение запускается через `systemd` юнит `gonets.service`,
где в качестве команды используется `python3 SRV/main.py`.
- Для TLS можно использовать закомментированную строку с указанием
`ssl_keyfile` и `ssl_certfile` (сертификаты ожидаются в `/etc/gonets/certs`).
Безопасность и окружение:
- Перекрестные запросы (CORS) ограничены списком localhost-источников, что
соответствует типичной локальной разработке (Vite/DevServer и т.д.).
- Все пути и сервисы, требующие повышенных прав (например, системные команды),
должны выполняться в соответствующем окружении с необходимыми разрешениями.
"""
from fastapi import FastAPI
import uvicorn
from api.router import router
from config.cors import CORSMiddlewareConfig
from services.network_service import NetworkService
import logging
from pathlib import Path
import os
# Логируем в файл logs/app.log и одновременно в stdout
LOG_DIR = Path(__file__).resolve().parent / "logs"
LOG_DIR.mkdir(parents=True, exist_ok=True)
LOG_FILE = LOG_DIR / "app.log"
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
handlers=[
logging.StreamHandler(),
logging.FileHandler(LOG_FILE, encoding="utf-8"),
],
force=True, # переопределяем базовую конфигурацию, заданную в импортируемых модулях
)
# Глушим шум от hot-reload watchdog
logging.getLogger("watchfiles").setLevel(logging.WARNING)
app = FastAPI(
title="GONETS",
description="Панель для управления системными сервисами Linux",
version="0.0.3",
)
cors_config = CORSMiddlewareConfig(app)
cors_config.add_cors_middleware()
app.include_router(router)
network_service = NetworkService()
if __name__ == "__main__":
# reload режет Nuitka onefile (reloader ищет модуль main на ФС),
# поэтому по умолчанию выключаем; включается переменной GONETS_RELOAD=1 для локалки.
reload_enabled = os.getenv("GONETS_RELOAD", "").lower() in {"1", "true", "yes"}
target = "main:app" if reload_enabled else app
uvicorn.run(target, host="0.0.0.0", port=8001, reload=reload_enabled)