# Cloudflare Domain Manager Wiki home — synced from repository on `main` when this file changes. ## UI Design contract (Frame surface, ReUI kit): [`docs/ui-design-contract.md`](ui-design-contract.md) ## Overview Manage Cloudflare zones, DNS records, domain groups, and TLS certificate expiry from a single UI. ## Configuration | Variable | Description | |----------|-------------| | `CLOUDFLARE_API_TOKEN` | API token with Zone.DNS permissions | | `DATABASE_URL` | SQLite path (`sqlite:/data/app.db`) | | `JWT_SECRET` | JWT signing secret | | `ADMIN_USERNAME` | Admin username | | `ADMIN_PASSWORD_HASH` | Argon2 hash (empty = dev `admin`/`admin`) | | `LOG_LEVEL` | Уровень логов API (`info`, `debug`) | | `HEALTH_CHECK_CRON` | Cron для health-check (default `*/30 * * * * *`) | | `HEALTH_DEGRADED_FAILURES` | Ошибок подряд до `degraded` (default `1`) | | `HEALTH_DOWN_FAILURES` | Ошибок подряд до `down` (default `2`) | | `HEALTH_SUCCESS_RECOVERIES` | Успехов подряд для recovery `CHECKING → HEALTHY` (default `2`) | | `HEALTH_LATENCY_WARN_MS` | Латентность-порог для `degraded` (default `1000`) | ## Load balancing & health checks Группа сервисов может иметь общий домен (`service_groups.domain`). Балансировка и health-check работают на двух уровнях: - **Общий домен группы** — A-записи формируются из IP сервисов группы; режим LB и параметры health-check настраиваются в карточке группы. - **Несколько FQDN на сервис** — через `service_bindings` один сервис может быть привязан к нескольким hostname в разных зонах (уникальность `(domain_id, service_id, hostname)`). - **Привязка сервиса с multi-A** — режим LB и health-check настраиваются в карточке сервиса для каждой привязки с несколькими IP; для IP задаются вес/приоритет. - **Ноды** — first-class адреса сервиса (`nodes` + `binding_nodes`); IP-пулы `service_ips` / `service_binding_ips` пишутся dual-write. - **Change IP** — `POST /api/v1/service-bindings/:id/change-ip` (preview + PATCH DNS). - **Change Domain** — перенос привязок между зонами `POST /api/v1/services/:id/change-domain`. Режимы LB: `round_robin`, `failover`, `weighted`. В Cloudflare free `weighted` работает как `round_robin` (одна A на IP). `unknown` **не** считается healthy и не попадает в пул, пока нет успешных проб; восстановление — `UNHEALTHY → CHECKING → HEALTHY` после `HEALTH_SUCCESS_RECOVERIES` (default 2). Reconcile DNS запускается cron-задачей `health-check`. Cloudflare Health Checks — официальный API зоны, Workers не используются. ## Docker Один alpine-контейнер (API + SPA + SQLite). Образы `cfdm` и `cloudflare-domain-manager` — один манифест. ```bash docker pull git.shx.one/denozord/cfdm:latest # drop-in для прежнего тега: docker pull git.shx.one/denozord/cloudflare-domain-manager:latest docker run -d -p 8080:8080 -v cfdm-data:/data \ -e CLOUDFLARE_API_TOKEN=... \ -e JWT_SECRET=... \ git.shx.one/denozord/cfdm:latest ``` Compose: корневой `docker-compose.yml` или `deploy/compose/docker-compose.example.yaml`. Сборка: `deploy/docker` (bake). Релизы: [`docs/releasing.md`](releasing.md).