SmailGeoDNS поддерживает репликацию данных между мастер и слейв серверами через REST API.
- Идентичный код: мастер и слейв работают на одном и том же бинарнике
- Настройка через конфиг: режим работы (master/slave) настраивается в config.yaml
- Автоматическая синхронизация: слейв автоматически запрашивает данные у мастера с заданным интервалом
- Полная синхронизация: синхронизируются все зоны, записи и шаблоны
replication:
mode: "master"Мастер-сервер:
- Принимает запросы на
/sync/exportи возвращает все данные - Разрешает изменения через REST API и веб-интерфейс
- Является источником данных для слейв-серверов
replication:
mode: "slave"
master_url: "http://master-server:8080"
sync_interval_sec: 60
api_token: "your-secure-token-here"Параметры слейва:
- mode: должен быть
"slave" - master_url: URL мастер-сервера (с протоколом и портом)
- sync_interval_sec: интервал синхронизации в секундах (по умолчанию 60)
- api_token: токен для авторизации на мастер-сервере
Важно: При включении режима slave автоматически отключаются:
admin.enabled: false- веб-интерфейс администратораupdate.enabled: false- DNS обновления через API
Это защищает слейв от прямых изменений и обеспечивает read-only режим.
# Создайте конфиг для мастера
cp examples/config.master.yaml config.yaml
# Запустите мастер
./namedotМастер будет слушать на порту 8080 и готов принимать запросы репликации.
# Создайте конфиг для слейва
cp examples/config.slave.yaml config.yaml
# Отредактируйте master_url на реальный адрес мастера
# Например: master_url: "http://192.168.1.100:8080"
# Запустите слейв
./namedotСлейв автоматически начнет синхронизацию с мастером каждые 60 секунд (или с интервалом, указанным в конфиге).
Логи мастера:
Master mode enabled: ready to serve replication data
Логи слейва:
Slave mode enabled: syncing from http://master-server:8080 every 60 seconds
Starting periodic sync every 1m0s
Starting sync from master...
Fetched 5 zones and 3 templates from master
Sync completed successfully
Возвращает все данные для репликации (зоны и шаблоны).
Требуется авторизация: Bearer token
Ответ:
{
"zones": [
{
"id": 1,
"name": "example.com.",
"rrsets": [
{
"id": 1,
"name": "example.com.",
"type": "A",
"ttl": 300,
"records": [
{
"data": "192.168.1.1",
"country": "US"
}
]
}
]
}
],
"templates": [...]
}Импортирует данные на слейв-сервер.
Требуется авторизация: Bearer token
Запрос: тот же формат что и ответ /sync/export
Ответ:
{
"status": "ok",
"zones": 5,
"templates": 3
}-
Используйте надежные токены:
# Генерация токена openssl rand -base64 32 -
HTTPS в продакшене: используйте reverse proxy (nginx, traefik) с TLS
-
Firewall: ограничьте доступ к REST API только с доверенных IP
-
Модификации на слейве: автоматически отключаются при
mode: "slave"update.enabled→ автоматически устанавливается вfalseadmin.enabled→ автоматически устанавливается вfalse
Проверка здоровья:
curl http://slave-server:8080/healthПроверка синхронизации:
# На мастере
curl -H "Authorization: Bearer your-token" http://master:8080/zones
# На слейве (должны быть те же данные)
curl -H "Authorization: Bearer your-token" http://slave:8080/zones- Проверьте логи слейва на наличие ошибок
- Проверьте доступность мастера:
curl http://master:8080/health - Проверьте правильность токена
- Проверьте firewall и сетевую доступность
master returned status 401: Unauthorized
Решение: убедитесь что replication.api_token на слейве совпадает с api_token на мастере.
Увеличьте sync_interval_sec если у вас большой объем данных и редкие изменения.
Уменьшите sync_interval_sec если нужна более частая синхронизация (минимум рекомендуется 10 секунд).
┌─────────────┐
│ Master │
│ Server │
│ │
│ - REST API │
│ - Web UI │
│ - DNS │
└──────┬──────┘
│
│ HTTP GET /sync/export
│ (каждые N секунд)
│
▼
┌─────────────┐
│ Slave │
│ Server │
│ │
│ - DNS only │
│ (read-only) │
└─────────────┘
Процесс синхронизации:
- Слейв по таймеру отправляет GET /sync/export на мастер
- Мастер возвращает все зоны и шаблоны с записями
- Слейв вызывает локальный POST /sync/import
- /sync/import обновляет локальную БД в транзакции
- DNS сервер на слейве использует обновленные данные
- Односторонняя репликация: только master → slave
- Полная синхронизация: при каждом sync передаются все данные
- Нет conflict resolution: слейв всегда перезаписывает свои данные данными мастера
- Нет каскадной репликации: слейв не может быть мастером для других слейвов
SmailGeoDNS supports data replication between master and slave servers via REST API.
- Identical code: master and slave run on the same binary
- Configuration-based: mode (master/slave) is configured in config.yaml
- Automatic synchronization: slave automatically requests data from master at configurable intervals
- Full synchronization: all zones, records, and templates are synchronized
replication:
mode: "master"Master server:
- Accepts requests to
/sync/exportand returns all data - Allows modifications via REST API and web interface
- Acts as the data source for slave servers
replication:
mode: "slave"
master_url: "http://master-server:8080"
sync_interval_sec: 60
api_token: "your-secure-token-here"Slave parameters:
- mode: must be
"slave" - master_url: master server URL (with protocol and port)
- sync_interval_sec: synchronization interval in seconds (default: 60)
- api_token: token for master server authentication
Important: When slave mode is enabled, the following are automatically disabled:
admin.enabled: false- web admin interfaceupdate.enabled: false- DNS updates via API
This protects the slave from direct modifications and ensures read-only mode.
# Create master config
cp examples/config.master.yaml config.yaml
# Start master
./namedotMaster will listen on port 8080 and be ready to accept replication requests.
# Create slave config
cp examples/config.slave.yaml config.yaml
# Edit master_url to point to actual master server
# Example: master_url: "http://192.168.1.100:8080"
# Start slave
./namedotSlave will automatically start synchronizing with master every 60 seconds (or at the interval specified in config).
Master logs:
Master mode enabled: ready to serve replication data
Slave logs:
Slave mode enabled: syncing from http://master-server:8080 every 60 seconds
Starting periodic sync every 1m0s
Starting sync from master...
Fetched 5 zones and 3 templates from master
Sync completed successfully
Returns all data for replication (zones and templates).
Authentication required: Bearer token
Response:
{
"zones": [
{
"id": 1,
"name": "example.com.",
"rrsets": [
{
"id": 1,
"name": "example.com.",
"type": "A",
"ttl": 300,
"records": [
{
"data": "192.168.1.1",
"country": "US"
}
]
}
]
}
],
"templates": [...]
}Imports data to slave server.
Authentication required: Bearer token
Request: same format as /sync/export response
Response:
{
"status": "ok",
"zones": 5,
"templates": 3
}-
Use strong tokens:
# Generate token openssl rand -base64 32 -
HTTPS in production: use reverse proxy (nginx, traefik) with TLS
-
Firewall: restrict REST API access to trusted IPs only
-
Slave modifications: automatically disabled when
mode: "slave"update.enabled→ automatically set tofalseadmin.enabled→ automatically set tofalse
Health check:
curl http://slave-server:8080/healthSynchronization check:
# On master
curl -H "Authorization: Bearer your-token" http://master:8080/zones
# On slave (should return same data)
curl -H "Authorization: Bearer your-token" http://slave:8080/zones- Check slave logs for errors
- Verify master availability:
curl http://master:8080/health - Verify token is correct
- Check firewall and network connectivity
master returned status 401: Unauthorized
Solution: ensure replication.api_token on slave matches api_token on master.
Increase sync_interval_sec if you have large amounts of data and infrequent changes.
Decrease sync_interval_sec if you need more frequent synchronization (minimum recommended: 10 seconds).
┌─────────────┐
│ Master │
│ Server │
│ │
│ - REST API │
│ - Web UI │
│ - DNS │
└──────┬──────┘
│
│ HTTP GET /sync/export
│ (every N seconds)
│
▼
┌─────────────┐
│ Slave │
│ Server │
│ │
│ - DNS only │
│ (read-only) │
└─────────────┘
Synchronization process:
- Slave sends GET /sync/export to master on timer
- Master returns all zones and templates with records
- Slave calls local POST /sync/import
- /sync/import updates local DB in transaction
- DNS server on slave uses updated data
- One-way replication: master → slave only
- Full synchronization: all data is transferred on each sync
- No conflict resolution: slave always overwrites its data with master's data
- No cascading replication: slave cannot be a master for other slaves