You've already forked directdnsonly
123 lines
3.7 KiB
Markdown
123 lines
3.7 KiB
Markdown
# DaDNS - DNS Management System
|
|
|
|
## Features
|
|
- Multi-backend DNS management (BIND, CoreDNS MySQL)
|
|
- Parallel backend dispatch — all enabled backends updated simultaneously
|
|
- Persistent queue — zone updates survive restarts
|
|
- Automatic record-count verification and drift reconciliation
|
|
- Thread-safe operations
|
|
- Loguru-based logging
|
|
|
|
## Installation
|
|
```bash
|
|
poetry install
|
|
poetry run dadns
|
|
```
|
|
|
|
## Concurrent Multi-Backend Processing
|
|
|
|
DaDNS propagates every zone update to all enabled backends in parallel using a
|
|
queue-based worker architecture.
|
|
|
|
### Architecture
|
|
|
|
```
|
|
DirectAdmin zone push
|
|
│
|
|
▼
|
|
Persistent Queue (persist-queue, survives restarts)
|
|
│
|
|
▼
|
|
save_queue_worker (single daemon thread, sequential dequeue)
|
|
│
|
|
├─ 1 backend enabled ──▶ direct call (no thread overhead)
|
|
│
|
|
└─ N backends enabled ──▶ ThreadPoolExecutor(max_workers=N)
|
|
│
|
|
┌─────┴─────┐
|
|
▼ ▼
|
|
bind coredns_dc1 ...
|
|
(concurrent, as_completed)
|
|
```
|
|
|
|
### How it works
|
|
|
|
1. **Queue consumer** — A single background thread drains the persistent save
|
|
queue. Items are processed one zone at a time, in order.
|
|
|
|
2. **Single-backend path** — When only one backend is enabled, the zone is
|
|
written directly with no extra thread spawning.
|
|
|
|
3. **Parallel-backend path** — When two or more backends are enabled, a
|
|
`ThreadPoolExecutor` with one thread per backend dispatches all writes
|
|
simultaneously. Results are collected with `as_completed`, so a slow or
|
|
failing backend does not block the others.
|
|
|
|
4. **Record verification** — After each successful write, the backend's stored
|
|
record count is compared against the authoritative count parsed from the
|
|
source zone file (the DirectAdmin zone). Mismatches trigger automatic
|
|
reconciliation: extra records are removed and the count is re-verified.
|
|
|
|
5. **Batch telemetry** — The worker tracks batch start time and emits a summary
|
|
log on queue drain, including zones processed, failures, elapsed time, and
|
|
throughput (zones/sec).
|
|
|
|
### Log output (example)
|
|
|
|
```
|
|
INFO | 📥 Batch started — 12 zone(s) queued for processing
|
|
DEBUG | Processing example.com across 2 backends concurrently: bind, coredns_dc1
|
|
DEBUG | Parallel processing of example.com across 2 backends completed in 43ms
|
|
SUCCESS | 📦 Batch complete — 12/12 zone(s) processed successfully in 1.8s (6.7 zones/sec)
|
|
```
|
|
|
|
### Adding backends
|
|
|
|
Enable additional backends in `config/app.yml`. Each enabled backend is
|
|
automatically included in the parallel dispatch — no code changes required.
|
|
|
|
```yaml
|
|
dns:
|
|
backends:
|
|
bind:
|
|
enabled: true
|
|
coredns_dc1:
|
|
enabled: true
|
|
host: "mysql-dc1"
|
|
coredns_dc2:
|
|
enabled: true # adds a third parallel worker automatically
|
|
host: "mysql-dc2"
|
|
```
|
|
|
|
## Configuration
|
|
|
|
Edit `config/app.yml` for backend settings. Credentials can be overridden via
|
|
environment variables using the `DADNS_` prefix (e.g.
|
|
`DADNS_APP_AUTH_PASSWORD`).
|
|
|
|
### Config Files
|
|
#### `config/app.yml`
|
|
```yaml
|
|
timezone: Pacific/Auckland
|
|
log_level: INFO
|
|
queue_location: ./data/queues
|
|
|
|
app:
|
|
auth_username: directdnsonly
|
|
auth_password: changeme # override with DADNS_APP_AUTH_PASSWORD
|
|
|
|
dns:
|
|
default_backend: bind
|
|
backends:
|
|
bind:
|
|
enabled: true
|
|
zones_dir: ./data/zones
|
|
named_conf: ./data/named.conf.include
|
|
|
|
coredns_mysql:
|
|
enabled: true
|
|
host: "127.0.0.1"
|
|
port: 3306
|
|
database: "coredns"
|
|
username: "coredns"
|
|
password: "password" |