""" Инициализация 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)