- deploy/api_stub.py: make_server() выделен из main(), main(argv) — тесты поднимают настоящий сервер на порту 0 (покрытие api_stub.py 0 % -> 98 %). - Makefile: make test-deploy (гейт ≥70 % через tests/deploy/pytest.ini), test-netns-ci прокидывает AWG_NS_EXEC_MODE. Refs #21, Refs #15, Refs #56
awg-dash
VPN-шлюз AmneziaWG с интеллектуальной маршрутизацией: один Docker-образ = туннель + policy routing + split-tunnel (GeoIP / DNS) + REST API v1 + Web UI (тёмная тема).
- Эпик и декомпозиция: Gitea issue #15 (
embeddevio/awg-dash). - Исполнение: Hermes Kanban, борда
awg-dash(hermes kanban --board awg-dash list). - PoC-референс:
embeddevio/amneziawg-docker-gateway(bash + iptables,docs/technical-specification.md).
Архитектура
Два процесса в одном образе:
| Процесс | Пользователь | Ответственность |
|---|---|---|
awg-agent |
root | awg/wg-интерфейс, iptables/ipset, dnsmasq, policy routing, метрики |
awg-api |
непривилегированный | FastAPI: REST API v1, WebSocket, статика UI |
Обмен — unix-socket /run/awg/agent.sock; состояние — SQLite в /data, конфиги .conf в /config.
Принятые решения зафиксированы в docs/adr/.
Быстрый старт (после релиза 1.0)
docker run -dit --name=vpn-gateway \
--network=host \
--device=/dev/net/tun:/dev/net/tun \
--cap-add=NET_ADMIN --cap-add=SYS_MODULE \
--restart always \
-v /srv/awg/config:/config -v /srv/awg/data:/data \
registry.example.com/vpn-gateway:latest
Web UI: http://<host>:8080. До релиза образ собирается локально: make build.
Разработка
make venv # локальное окружение (.venv)
make lint # ruff + mypy
make test # pytest + coverage (порог 70%)
make build # docker build образа (задача #18)
make dev-up # dev-стенд (задача #21)
Сетевые тесты выполняются в netns-стенде (tests/netns/), без реального VPN-провайдера.
Структура репозитория
| Путь | Назначение |
|---|---|
backend/awg_agent/ |
привилегированный агент: туннель, маршрутизация, GeoIP, DNS, метрики |
backend/awg_api/ |
FastAPI-приложение (REST + WS + статика UI) |
backend/tests/ |
unit/integration-тесты (pytest) |
ui/ |
React + TypeScript + Tailwind + shadcn-ui |
deploy/ |
Dockerfile, compose-профили, entrypoint, Grafana-дашборд |
docs/adr/ |
архитектурные решения |
tests/netns/ |
сетевой тестовый стенд |
Процесс разработки
1 задача = 1 issue = 1 ветка feat/<issue>-slug = 1 PR.
Гейты мержа: CI green, coverage нового кода ≥ 70 %, security scan low/none, ревью владельца роли.
Merge в main и деплой в prod — только TechLead после гейтов. Все операции с репозиторием — через Gitea MCP.