feat: Implement load balancing and health check features for service groups, including DNS-based load balancing modes and health check configurations, enhancing service reliability and performance monitoring
Build, Test, and Push CFDM Docker Image / test (push) Successful in 4m0s
Build, Test, and Push CFDM Docker Image / build-and-push (push) Successful in 2m13s
Build, Test, and Push CFDM Docker Image / update-wiki (push) Failing after 6s
Build, Test, and Push CFDM Docker Image / create-release (push) Has been skipped

This commit is contained in:
Denozordec
2026-06-25 18:24:00 +07:00
parent e5dc483d43
commit 6a1498bf80
35 changed files with 5312 additions and 281 deletions
+27
View File
@@ -6,6 +6,8 @@ Self-hosted service for managing domains, DNS records, and SSL certificates via
- 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
@@ -52,3 +54,28 @@ shadcn CLI: `cd apps/web && pnpm dlx shadcn@latest add <component>`
## Documentation
See [docs/Home.md](docs/Home.md) and [CONTRIBUTING.md](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 |