embeddevio ea63e904b4
ci / lint (pull_request) Successful in 47s
contract-openapi / openapi-contract (push) Successful in 53s
contract-openapi / ts-client-is-current (push) Successful in 36s
contract-openapi / openapi-contract (pull_request) Successful in 58s
contract-openapi / ts-client-is-current (pull_request) Successful in 42s
ci / unit (pull_request) Successful in 53s
ci / security (pull_request) Successful in 1m21s
ci / build (pull_request) Successful in 40s
ci / image-scan (pull_request) Failing after 7s
ci / push (pull_request) Has been skipped
ci / lint (push) Successful in 50s
ci / unit (push) Successful in 52s
ci / security (push) Successful in 1m19s
ci / build (push) Successful in 39s
ci / image-scan (push) Failing after 3s
ci / push (push) Has been skipped
fix(#61): x/crypto v0.58.0 + x/net v0.62.0
После бампа Go 1.26 / alpine 3.23 в образе остались только Go-модули:
  x/crypto v0.43.0 — 5 HIGH (ssh*, фиксы до v0.55.0)
  x/net    v0.45.0 — 16 HIGH (http2/idna/dnsmessage, фиксы до v0.60.0)
Оба подняты на актуальные версии из proxy.golang.org (v0.58.0 / v0.62.0).
В alpine 3.23.7 находок нет (66 пакетов).

Refs #61
2026-10-29 21:51:41 +03:00
2026-10-16 22:45:47 +03:00

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.

S
Description
awg-dash 🚀
Readme MIT 537 KiB
Languages
Python 85.4%
Shell 12.3%
Makefile 2.3%