# 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`).