Files
dns-autoresolver/README.md
T

93 lines
4.7 KiB
Markdown
Raw 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.
# DNS Autoresolver
Утилита автонастройки и проверки DNS-зон: multi-tenant сервис, который сверяет
фактическое состояние зоны у провайдера (Selectel DNS API v2) с шаблоном
записей, показывает диф и применяет изменения только вручную — никакого
автоматического apply без подтверждения оператора.
## Возможности
- **Multi-tenant**: проекты, аккаунты провайдера, домены — с авторизацией
(регистрация/логин, сессии).
- **Провайдер Selectel**: чтение зон/RRSet, диф против шаблона, ручной apply.
- **Шаблоны записей**: неймспейс-независимая модель `Record`, движок диффа
шаблон ↔ зона.
- **Диф + ручной apply**: изменения показываются перед применением, apply —
явное действие оператора.
- **Расписание проверок**: планировщик периодически гоняет read-only
check+notify (без Apply), пишет историю проверок и статус drift.
- **Уведомления**: каналы Telegram и Webhook, per-channel статус доставки.
- **Метрики**: Prometheus `/metrics` (публичный, без auth, только агрегаты).
- **Health-check**: `/healthz` — liveness-проба, используется как
Docker `HEALTHCHECK` через встроенный CLI-режим `app -healthcheck`.
## Стек
Go 1.26 (statically-linked бинарь, SPA встроена через `embed`), React +
Vite (SPA), PostgreSQL 17, Prometheus client, distroless/static-debian12
рантайм-образ.
## Запуск в Docker
Требуется Docker Engine + Docker Compose v2.
1. Скопировать пример конфигурации:
```bash
cp .env.example .env
```
2. Сгенерировать ключ шифрования секретов (провайдеров/каналов) — ровно
32 байта в base64 — и вписать его в `.env` как `DNS_AR_ENC_KEY`:
```bash
openssl rand -base64 32
```
Также задать `POSTGRES_PASSWORD` (без дефолта — сервис не поднимется без
явного пароля).
3. Поднять стек (postgres + app), сборка образа приложения — на лету:
```bash
docker compose up -d --build
# или: make docker-up
```
`app` стартует только после того, как `postgres` станет healthy;
миграции схемы БД приложение накатывает само при старте.
4. Открыть UI: http://localhost:8080
- Метрики (Prometheus): http://localhost:8080/metrics
- Health-check: http://localhost:8080/healthz
Остановить стек: `docker compose down` (или `make docker-down`).
Логи приложения: `docker compose logs -f app` (или `make docker-logs`).
### Переменные окружения (`.env`)
| Переменная | Назначение | По умолчанию |
|---------------------|----------------------------------------------------------|--------------|
| `POSTGRES_USER` | пользователь PostgreSQL | `dnsar` |
| `POSTGRES_PASSWORD` | пароль PostgreSQL — **обязателен**, без дефолта | — |
| `POSTGRES_DB` | имя БД | `dnsar` |
| `APP_PORT` | порт публикации приложения на хосте | `8080` |
| `DNS_AR_ENC_KEY` | ключ шифрования секретов, base64 → ровно 32 байта — **обязателен** | — |
Секреты передаются только через переменные окружения, никогда — в образ,
логи или git.
## Локальная разработка (без Docker)
```bash
make build # go build ./...
make test # go test ./...
make web # сборка SPA (npm ci && npm run build) в internal/web/dist
make build-all # web + build
```
Для запуска бинаря напрямую нужны те же переменные окружения:
`DNS_AR_DB_DSN`, `DNS_AR_ENC_KEY` (обязательные), `DNS_AR_LISTEN`
(по умолчанию `:8080`).