Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BwxdSt4reTm7Dj1oxRvpP3
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-проба, используется как DockerHEALTHCHECKчерез встроенный 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.
-
Скопировать пример конфигурации:
cp .env.example .env -
Сгенерировать ключ шифрования секретов (провайдеров/каналов) — ровно 32 байта в base64 — и вписать его в
.envкакDNS_AR_ENC_KEY:openssl rand -base64 32Также задать
POSTGRES_PASSWORD(без дефолта — сервис не поднимется без явного пароля). -
Поднять стек (postgres + app), сборка образа приложения — на лету:
docker compose up -d --build # или: make docker-upappстартует только после того, какpostgresстанет healthy; миграции схемы БД приложение накатывает само при старте. -
Открыть 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)
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).