gonets/SRV/main.py

70 lines
3.8 KiB
Python
Raw Normal View History

2025-10-14 11:42:57 +05:00
"""
Инициализация 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
2025-11-19 15:03:02 +05:00
import logging
from pathlib import Path
2025-11-25 13:52:54 +05:00
import os
2025-11-19 15:03:02 +05:00
# Логируем в файл 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__":
2025-11-25 13:52:54 +05:00
# 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
2025-11-27 13:11:15 +05:00
uvicorn.run(target, host="0.0.0.0", port=8001, reload=reload_enabled, ssl_keyfile="/etc/gonets/certs/gonets.key", ssl_certfile="/etc/gonets/certs/gonets.crt")