chore(#16): каркас пакетов backend, тестов и заглушки ui/deploy/tests

This commit is contained in:
2026-10-21 23:28:59 +03:00
parent 63c4fa930d
commit 5647d339b1
8 changed files with 91 additions and 0 deletions
+16
View File
@@ -0,0 +1,16 @@
# awg_agent — привилегированный агент
Запускается как root в контейнере: всё, что требует NET_ADMIN и доступа к ядру.
| Модуль | Ответственность | Задача |
|---|---|---|
| `vpn/` | парсинг/валидация `.conf`, up/down/restart туннеля, `awg show` → статус | #22 |
| `watchdog/` | контроль handshake, авто-восстановление, fail-closed | #23 |
| `netfilter/` | iptables/ipset, policy routing, atomic swap, MSS clamping, IPv6 | #24 |
| `geoip/` | RIPE Stat, кэш-снапшот, расписание, fallback | #25 |
| `dns/` | dnsmasq, домены → ipset, защита от DNS-утечки | #26 |
| `routing/` | режимы (GeoIP / DNS / All-VPN / Direct-only), reconcile, исключения | #27 |
| `metrics/` | RX/TX, direct vs VPN, история, агрегаты | #28 |
| `devices/` | активные устройства LAN и их политики | #29 |
Интерфейс для `awg_api` — unix-socket `/run/awg/agent.sock` (см. ADR-002).
+5
View File
@@ -0,0 +1,5 @@
"""Привилегированный агент awg-dash: туннель, маршрутизация, GeoIP, DNS, метрики."""
__version__ = "0.0.1"
__all__ = ["__version__"]
+13
View File
@@ -0,0 +1,13 @@
# awg_api — control plane
Непривилегированный процесс: FastAPI + REST API v1 + WebSocket + отдача статики UI.
| Модуль | Ответственность | Задача |
|---|---|---|
| `app.py` | lifespan, конфиг, логирование, error model, статика | #31 |
| `routers/` | эндпоинты по OpenAPI (status, config, routing, devices, logs, auth) | #32 |
| `ws/` | `/api/v1/metrics/stream` | #33 |
| `security/` | токен, CSRF, rate limit, маскировка секретов | #34 |
| `store/` | SQLite (WAL), миграции, audit log, apply/rollback | #20 |
Контракт — `docs/openapi.yaml` (задача #19), TS-клиент генерируется в `ui/src/api/generated/`.
+5
View File
@@ -0,0 +1,5 @@
"""FastAPI-приложение awg-dash: REST API v1, WebSocket, статика UI."""
__version__ = "0.0.1"
__all__ = ["__version__"]
+13
View File
@@ -0,0 +1,13 @@
"""Скелетные тесты: пакеты импортируются, версия объявлена."""
import awg_agent
import awg_api
def test_versions_match() -> None:
assert awg_agent.__version__ == awg_api.__version__
def test_public_api_declared() -> None:
assert "__version__" in awg_agent.__all__
assert "__version__" in awg_api.__all__