fix readme

This commit is contained in:
2026-07-05 17:01:33 +07:00
parent 5215678fe6
commit 567d721311
3 changed files with 115 additions and 7 deletions
+54 -7
View File
@@ -8,12 +8,21 @@
## Возможности
- **Multi-tenant**: проекты, аккаунты провайдера, домены — с авторизацией
(регистрация/логин, сессии).
- **Провайдер Selectel**: чтение зон/RRSet, диф против шаблона, ручной apply.
- **Шаблоны записей**: неймспейс-независимая модель `Record`, движок диффа
шаблон ↔ зона.
- **Диф + ручной apply**: изменения показываются перед применением, apply —
явное действие оператора.
(регистрация/логин, сессии); всё изолировано по проекту.
- **Провайдер Selectel (Cloud DNS v2)**: авторизация через project IAM-токен
сервисного пользователя (не статический API-ключ — см. ниже), чтение
зон/RRSet, импорт зон, диф против шаблона, ручной apply.
- **Шаблоны записей с плейсхолдером `{{domain_name}}`**: один шаблон
переиспользуется на многих доменах — при проверке подставляется имя зоны.
Шаблон можно завести вручную или снять снимком с существующей зоны
(«создать шаблон из зоны», с авто-параметризацией имени домена).
- **Просмотр зоны без шаблона**: текущие записи зоны видны даже до привязки
шаблона; статус домена без шаблона — «без шаблона», а не `unknown`.
- **Диф + выборочный ручной apply**: чекбоксы на каждой записи (updates и
prunes), удаления по умолчанию сняты (opt-in). Удаления применяются
**перед** обновлениями — иначе провайдер отвергает конфликт (например
`CNAME` на имени, где ещё жива `A`-запись). При ошибке показывается
реальный ответ провайдера, а не generic-текст.
- **Расписание проверок**: планировщик периодически гоняет read-only
check+notify (без Apply), пишет историю проверок и статус drift.
- **Уведомления**: каналы Telegram и Webhook, per-channel статус доставки.
@@ -21,6 +30,35 @@
- **Health-check**: `/healthz` — liveness-проба, используется как
Docker `HEALTHCHECK` через встроенный CLI-режим `app -healthcheck`.
## Учётные данные Selectel
Cloud DNS v2 требует **project IAM-токен**, а не статический API-ключ. При
добавлении аккаунта Selectel в UI указываются данные **сервисного
пользователя**:
- имя сервисного пользователя,
- пароль,
- номер аккаунта (`account_id`, вида `123456`),
- имя проекта.
Сервисный пользователь создаётся в панели Selectel (раздел
[Пользователи и роли](https://my.selectel.ru/iam/users)) и ему выдаётся роль
на нужный проект. Приложение само обменивает эти данные на 24-часовой
IAM-токен (Identity API `cloud.api.selcloud.ru`) и кэширует его; данные
хранятся зашифрованными (AES-256-GCM), пароль не логируется. Учётные данные
проверяются пробным логином прямо при добавлении аккаунта.
## Рабочий процесс
1. Зарегистрироваться (self-registration, автоматически создаётся личный
проект).
2. Добавить аккаунт Selectel (данные сервисного пользователя, см. выше).
3. Импортировать зоны аккаунта — на каждую зону заводится домен.
4. Привязать шаблон: создать снимком из зоны или собрать вручную с
плейсхолдерами `{{domain_name}}`; без шаблона доступен только просмотр
записей.
5. Открыть диф домена, отметить нужные изменения/удаления, применить.
## Стек
Go 1.26 (statically-linked бинарь, SPA встроена через `embed`), React +
@@ -82,11 +120,20 @@ Vite (SPA), PostgreSQL 17, Prometheus client, distroless/static-debian12
```bash
make build # go build ./...
make test # go test ./...
make test # go test ./... (тесты internal/store требуют Docker — testcontainers)
make web # сборка SPA (npm ci && npm run build) в internal/web/dist
make build-all # web + build
go test ./internal/service/ -run TestName -v # один тест / пакет
cd web && npm run test -- --run # фронт-тесты (Vitest)
cd web && npx tsc --noEmit # проверка типов SPA
```
Для запуска бинаря напрямую нужны те же переменные окружения:
`DNS_AR_DB_DSN`, `DNS_AR_ENC_KEY` (обязательные), `DNS_AR_LISTEN`
(по умолчанию `:8080`).
> `internal/web/dist/` — цель `go:embed`; в git коммитится только плейсхолдер
> `index.html`. `npm run build` перезаписывает его — перед коммитом выполнить
> `git checkout internal/web/dist/index.html`, а реальный бандл собирать через
> `make web`.