69 lines
3.7 KiB
Python
69 lines
3.7 KiB
Python
"""
|
||
Инициализация 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)
|