chore(#16): каркас пакетов backend, тестов и заглушки ui/deploy/tests
This commit is contained in:
@@ -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).
|
||||
@@ -0,0 +1,5 @@
|
||||
"""Привилегированный агент awg-dash: туннель, маршрутизация, GeoIP, DNS, метрики."""
|
||||
|
||||
__version__ = "0.0.1"
|
||||
|
||||
__all__ = ["__version__"]
|
||||
@@ -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/`.
|
||||
@@ -0,0 +1,5 @@
|
||||
"""FastAPI-приложение awg-dash: REST API v1, WebSocket, статика UI."""
|
||||
|
||||
__version__ = "0.0.1"
|
||||
|
||||
__all__ = ["__version__"]
|
||||
@@ -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__
|
||||
Reference in New Issue
Block a user