DenozordecandCursor 1457389ae7
CD / update-wiki (push) Successful in 7s
quality / commitlint (push) Skipped
quality / changes (push) Successful in 8s
quality / api (push) Skipped
quality / docker-check (push) Skipped
quality / web (push) Successful in 55s
CD / quality (push) Successful in 1m6s
CD / publish (push) Successful in 1m36s
feat(services): объединить адреса сервиса в один блок формы
Общий FQDN, пул IP и доп. домен на строке IP — в одном Frame, без смены API.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-20 13:33:02 +07:00

Cloudflare Domain Manager

Self-hosted service for managing domains, DNS records, and SSL certificates via Cloudflare API.

Features

  • Domain and DNS record management (hybrid sync with Cloudflare)
  • Domain groups (local / vpn / external) and service tags
  • Service groups with common FQDN and DNS-based load balancing (Round Robin / Failover / Weighted)
  • Health checks (TCP / HTTP) with automatic DNS reconciliation on status change
  • SSL certificate expiry monitoring
  • React UI with TanStack Router & Query
  • Single Docker container deployment

Quick start

cp .env.example .env
# Edit CLOUDFLARE_API_TOKEN, JWT_SECRET

docker compose up -d

Open http://localhost:8080 — default login admin / admin (dev only).

Stack

  • Backend: Node.js 22, Fastify 5, Drizzle ORM, SQLite (apps/api)
  • Shared: Zod schemas (packages/shared), DB layer (packages/db)
  • Frontend: pnpm monorepo (apps/web + packages/ui), React, Vite, TanStack Router/Query/Table, shadcn/ui (base-nova), Recharts
  • CI: Gitea Actions (docs/releasing.md) — quality gates + semantic-release + bake (cfdm / cloudflare-domain-manager)

Development

pnpm install
pnpm --filter @cfdm/shared build
pnpm --filter @cfdm/db build

# API + SQLite (:8080)
pnpm --filter @cfdm/api dev

# Frontend (:5173, proxies /api → :8080)
pnpm --filter web dev
pnpm turbo build
pnpm turbo test

shadcn CLI: cd apps/web && pnpm dlx shadcn@latest add <component>

Documentation

See docs/Home.md, docs/releasing.md and CONTRIBUTING.md.

Load balancing & health checks

Группа сервисов может иметь общий домен (service_groups.domain). На общем домене и на привязках сервиса с несколькими A-записями включается балансировка и health-check:

  • Режимы LB: round_robin (по одной A на каждый up-IP), failover (A только для up-IP с минимальным приоритетом; бэкапы подключаются при падении primary), weighted (веса учитываются в БД; в Cloudflare free отображается как Round Robin, т.к. CF API не допускает дубликаты (name, type, content) A-записей — для истинного weighted нужен CF Load Balancer).
  • Health-check: TCP connect или HTTP (настраиваемый порт, путь, ожидаемый статус, интервал, таймаут). Результаты хранятся в ip_health_status (up / degraded / down / unknown) и опрашиваются UI с polling 10с.
  • Reconcile: при смене статуса IP cron перезаписывает A-записи в Cloudflare, оставляя только активные по политике LB. Реакция = TTL A-записи (ttl=1 proxied — минимальный).

Env для health-check:

Variable Default Description
HEALTH_CHECK_CRON */30 * * * * * Cron выражение для запуска проверок (каждые 30с)
HEALTH_DEGRADED_FAILURES 1 Порог последовательных ошибок → статус degraded
HEALTH_DOWN_FAILURES 2 Порог последовательных ошибок → статус down (IP убирается из DNS)
HEALTH_LATENCY_WARN_MS 1000 Латентность выше порога → degraded даже при успешном connect
S
Description
No description provided
Readme
115 MiB
v1.25.4
Latest
2026-09-03 20:46:37 +07:00
Languages
TypeScript 98.5%
JavaScript 0.7%
CSS 0.3%
Shell 0.2%
HCL 0.2%
Other 0.1%