docs(#16): ADR-001, ADR-002, индекс и шаблон ADR
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
# 002. Модульный монолит в одном образе, два процесса
|
||||
|
||||
- **Статус:** принято
|
||||
- **Контекст/issue:** #15, #18
|
||||
|
||||
## Контекст
|
||||
|
||||
ТЗ требует единый Docker-образ с минимальными параметрами запуска. Часть операций требует root
|
||||
(интерфейс awg, iptables/ipset, dnsmasq на порту 53), а веб-часть должна быть скомпрометирована безопасно — без root.
|
||||
|
||||
## Решение
|
||||
|
||||
Один образ, два процесса под супервизором `deploy/entrypoint.sh`:
|
||||
|
||||
| Процесс | Права | Ответственность |
|
||||
|---|---|---|
|
||||
| `awg-agent` | root, NET_ADMIN | туннель, netfilter, routing, dnsmasq, метрики |
|
||||
| `awg-api` | непривилегированный | FastAPI, REST/WS, статика UI |
|
||||
|
||||
Обмен — unix-socket `/run/awg/agent.sock`, общее состояние — SQLite в `/data` и конфиги в `/config`.
|
||||
|
||||
## Альтернативы
|
||||
|
||||
- **Микросервисы** (отдельные контейнеры agent/api/dns) — общая сеть, координация и дублирование
|
||||
привилегий; выгода масштабирования на одном шлюзе отсутствует.
|
||||
- **Один процесс под root** — проще, но даёт веб-слою полные права; неприемлемо.
|
||||
|
||||
## Последствия
|
||||
|
||||
- Супервизор обязан пробрасывать сигналы и коды выхода, иначе Docker не заметит падения процесса.
|
||||
- Права на unix-socket входят в security-проверки (#44).
|
||||
- Перезапуск API не разрывает туннель.
|
||||
Reference in New Issue
Block a user