build: docker compose (app + postgres) with healthchecks and .env

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BwxdSt4reTm7Dj1oxRvpP3
This commit is contained in:
2026-07-04 16:27:16 +07:00
parent 675136e488
commit 77ca0200ae
4 changed files with 153 additions and 0 deletions
+92
View File
@@ -0,0 +1,92 @@
# 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`).