Files
docs/ADR-003-egress-pg17-automation.md

117 lines
7.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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