# 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) ```bash 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://:8080`. До релиза образ собирается локально: `make build`. ## Разработка ```bash 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/-slug` = 1 PR. Гейты мержа: CI green, coverage нового кода ≥ 70 %, security scan low/none, ревью владельца роли. Merge в `main` и деплой в prod — только TechLead после гейтов. Все операции с репозиторием — через Gitea MCP.