ADR-003: egress policy engine + PG17 migration + AI automation vision
This commit is contained in:
116
ADR-003-egress-pg17-automation.md
Normal file
116
ADR-003-egress-pg17-automation.md
Normal file
@@ -0,0 +1,116 @@
|
||||
# ADR-003: Egress Policy Engine, PostgreSQL 17 и AI-автоматизация инфраструктуры
|
||||
|
||||
**Статус:** Принято | **Дата:** 2026-09-11 | **Спринт:** 9
|
||||
|
||||
## Контекст
|
||||
|
||||
1. **Telegram API заблокирован в РФ** — n8n не мог отправлять уведомления о сбоях мониторинга.
|
||||
2. **n8n v2.38+ требует Postgres 17+** — на CT 151 был Postgres 14.23.
|
||||
3. **БД были размазаны** — SQLite в n8n, Postgres на CT 151, временный Docker-postgres17.
|
||||
4. **Отсутствие актуальной документации** — ADR-001/002 устарели, новые решения не зафиксированы.
|
||||
5. **Crash-loop смежных сервисов** — headscale падал с 9 сентября из-за рассинхрона пароля БД и конфига.
|
||||
|
||||
## Решение
|
||||
|
||||
### Слой 1. Egress Policy Engine
|
||||
|
||||
n8n (CT 108, Docker)
|
||||
-> http_proxy/https_proxy = http://192.168.1.10:10888
|
||||
sing-box (PVE, 0.0.0.0:10888, iptables ACCEPT)
|
||||
-> rule: domain_suffix telegram.org -> vps-egress
|
||||
-> rule: ip_is_private / buryans.ru -> direct
|
||||
Tailscale (100.x.x.x)
|
||||
tinyproxy (VPS buryan-edge, 100.78.31.42:8888)
|
||||
-> api.telegram.org (Амстердам)
|
||||
|
||||
**Правила реализации:**
|
||||
- Node.js читает ТОЛЬКО lowercase proxy-переменные: в compose обязательны оба регистра (6 переменных: HTTP_PROXY+http_proxy, HTTPS_PROXY+https_proxy, NO_PROXY+no_proxy).
|
||||
- CT 108 работает в Tailscale userspace-networking: контейнеры ходят в tailnet только через LAN-IP PVE (192.168.1.10), где sing-box имеет kernel-доступ к tailnet.
|
||||
- oauth2-proxy с OAUTH2_PROXY_SKIP_AUTH_ROUTES=^/webhook — без этого webhook-и режутся SSO (302 вместо 200).
|
||||
|
||||
### Слой 2. Централизованная БД (CT 151)
|
||||
|
||||
- **Миграция:** PostgreSQL 14.23 -> 17.11 через pg_upgradecluster --link.
|
||||
- **Кластер 14 оставлен на порту 5433** как rollback на 7 дней.
|
||||
- **Pre-upgrade:** pg_dumpall + точечные дампы критичных БД.
|
||||
- **Обязательные пакеты:** postgresql-17-pgvector (для immich), postgis при использовании.
|
||||
- **Рабочая БД:** n8n_central (владелец Roman Buryan, 4 workflow, 2 credentials).
|
||||
- **Архив:** БД n8n (история executions до миграции).
|
||||
- **Cold-backup:** SQLite database.sqlite (99M), /opt/postgres17-data, JSON-экспорты.
|
||||
|
||||
### Слой 3. AI-Driven Infrastructure Automation (видение)
|
||||
|
||||
**Наблюдение спринта 9:** AI-ассистент за ~15 запросов:
|
||||
- Составил полную карту инфраструктуры (27 LXC, Docker-стеки, systemd-сервисы, матрица БД)
|
||||
- Выполнил миграцию мажорной версии БД с pg_upgrade
|
||||
- Восстановил данные из 4 разных источников
|
||||
- Диагностировал и починил crash-loop headscale (37 часов простоя)
|
||||
- Освободил диск CT 110 (95% -> 81%)
|
||||
|
||||
**Roadmap автоматизации:**
|
||||
|
||||
| Спринт | Задача | Результат |
|
||||
|---|---|---|
|
||||
| **10** | AI-аудит инфраструктуры | Cron-обход всех CT -> отчёт-снимок в Gitea, детект дрейфа |
|
||||
| **11** | Auto-ADR | AI сравнивает снимки, сам предлагает ADR/PR; человек ревьюит |
|
||||
| **12** | Self-healing runbooks | Типовые аварии чинятся по runbook; новый фикс -> новый документ |
|
||||
| **13** | Predictive migrations | Мониторинг EOL, предложение окна миграции ДО аварии |
|
||||
| **14** | Шаблонный деплой | compose + oauth2-proxy + БД + backup одной командой |
|
||||
|
||||
**Принципы безопасности:**
|
||||
- AI работает read-only + proposals; write-действия только после human approve.
|
||||
- Любая деструктивная операция начинается с бэкапа (правило спринта 9).
|
||||
- Все изменения фиксируются в Gitea (infra-as-docs).
|
||||
- Секреты ротируются регулярно, токены имеют минимальные scopes.
|
||||
|
||||
## Последствия
|
||||
|
||||
**Плюсы:**
|
||||
- Единая БД и бэкап-политика
|
||||
- Обход блокировок Telegram через VPS
|
||||
- Воспроизводимость всех операций
|
||||
- Экономия 10+ часов ручного аудита в месяц
|
||||
- Документация как код
|
||||
|
||||
**Риски:**
|
||||
- VPS как single point of failure egress (митигация: резервный VPS)
|
||||
- AI-ошибки (митигация: human review, бэкапы, rollback-кластер PG14)
|
||||
- Рост числа токенов/секретов (митигация: ротация, vault-решение в Sprint 14)
|
||||
|
||||
## Триггеры пересмотра ADR
|
||||
|
||||
- n8n v3.x (требует Postgres 18+)
|
||||
- Блокировка IP VPS провайдером
|
||||
- Предоставление AI write-прав (тогда нужен новый ADR с контуром контроля)
|
||||
- Стоимость VPS превышает экономию от автоматизации
|
||||
|
||||
## Runbook: ключевые уроки спринта 9
|
||||
|
||||
1. **Экран setup n8n** = пустая таблица user, а не потеря данных. CLI-импорт не создаёт владельца.
|
||||
2. **pg_upgradecluster**, а не ручной pg_upgrade: Debian держит конфиги в /etc/postgresql/<ver>/main/.
|
||||
3. **Pre-upgrade checks** требуют ВСЕ расширения новой версии (pgvector, postgis).
|
||||
4. **COPY TO ломает JSON-экспорт** (экранирование обратных слешей); использовать psql -tAc "::text" или base64.
|
||||
5. **pct push читает файл с PVE-хоста**: сначала pct pull с исходного CT.
|
||||
6. **Дубли env в compose**: последнее значение побеждает. Не восстанавливать бэкапы вслепую.
|
||||
7. **Crash-loop сервиса** = сверить пароль в его конфиге с ролью БД (кейс headscale: 37 часов простоя).
|
||||
8. **no space left on device** в Docker = docker system prune -af --volumes + image prune.
|
||||
9. **paperless-ngx v3.x** использует /init как entrypoint, runworker устарел -> full-stack /init.
|
||||
|
||||
## Приложение: Компоненты инфраструктуры
|
||||
|
||||
| Компонент | Версия | Расположение | Порт |
|
||||
|---|---|---|---|
|
||||
| n8n | 2.38.7 | CT 108 (Docker) | 5680 |
|
||||
| postgres | 17.11 | CT 151 (systemd) | 5432 |
|
||||
| sing-box | 1.9.7 | PVE Host | 10888 |
|
||||
| tinyproxy | latest | VPS (100.78.31.42) | 8888 |
|
||||
| oauth2-proxy | latest | CT 108 (Docker) | 5678 |
|
||||
| headscale | latest | CT 201 (systemd) | 8080, 9090 |
|
||||
| paperless-ngx | 3.1.3 | CT 110 (Docker) | 8000 |
|
||||
| NPM | latest | VPS (193.233.210.184) | 81, 80, 443 |
|
||||
|
||||
---
|
||||
|
||||
**Автор:** AI Assistant + Roman Buryan
|
||||
**Дата создания:** 11 сентября 2026
|
||||
**Последнее обновление:** 12 сентября 2026
|
||||
Reference in New Issue
Block a user