Skip to content

Instantly share code, notes, and snippets.

@besmirzanaj
Last active February 14, 2026 15:56
Show Gist options
  • Select an option

  • Save besmirzanaj/490c7f8ff61f6e9681fa5656220e3910 to your computer and use it in GitHub Desktop.

Select an option

Save besmirzanaj/490c7f8ff61f6e9681fa5656220e3910 to your computer and use it in GitHub Desktop.
sync two technitium servers
#!/bin/bash
# Author: Besmir Zanaj, 2024
# This is a very raw script to backup configs (no logs and no stats) from a technitium server
# to another
#
# first create two tokens: one on the source server and another one on the destination one
# fill out the vars below
# create a cronjob with this script on the destinaton host
# eg:
# 30 */6 * * * /path-to/technitium-sync.sh
set -euxo pipefail
src_dns_server='source.ip.address'
dst_dns_server='dest.ip.address'
src_dns_serverdomain='fqdn.of.source.server'
dst_dns_serverdomain='fqdn.of.dest.server'
src_dns_token='SOURCE_TECHNITIUM_TOKEN_HERE'
dst_dns_token='DEST_TECHNITIUM_TOKEN_HERE'
backup_file="/tmp/technitium-backup.zip"
# update the dhcp scope as per your local settings
dhcp_scope_name="local-home"
# Ensure required tools are installed
command -v curl >/dev/null 2>&1 || { echo "curl is not installed. Aborting." >&2; exit 1; }
# Check the primary server's health before running the script
echo "Checking primary Technitium server status"
status_code=$(curl --write-out %{http_code} --silent --output /dev/null http://$src_dns_server:5380)
if [[ "$status_code" -ne 200 ]] ; then
echo "Primary DNS server is not available. Skipping backup"
exit 1
else
echo "Getting the backup archive from the primary server"
curl -s "http://$src_dns_server:5380/api/settings/backup?token=$src_dns_token&blockLists=true&logs=false&scopes=true&stats=false&zones=true&allowedZones=true&blockedZones=true&dnsSettings=true&logSettings=true&authConfig=true&apps=true" -o $backup_file
fi
# restore_backup
if [[ -f "$backup_file" ]]; then
echo "Restoring the backup on $HOSTNAME"
curl -s --form file="@$backup_file" "http://$dst_dns_server:5380/api/settings/restore?token=$dst_dns_token&blockLists=true&logs=true&scopes=true&stats=true&apps=true&zones=true&allowedZones=true&blockedZones=true&dnsSettings=true&logSettings=true&deleteExistingFiles=true&authConfig=true" --output /dev/null
# wait for server to come back
echo "Waiting for 10 seconds for the destination server to start up"
sleep 10
# set dnsServerDomain on destination server
echo "Updating DNS server Domain in destination server"
curl -X POST "http://$dst_dns_server:5380/api/settings/set?token=$dst_dns_token&dnsServerDomain=$dst_dns_serverdomain"
# disable DHCP on the destination server
echo "disabling DHCP in destination server"
curl -X POST "http://$dst_dns_server:5380/api/dhcp/scopes/disable?token=$dst_dns_token&name=$dhcp_scope_name"
# cleanup
echo "Cleaning up temporary files"
rm -rf $backup_file
fi
@Lebowski89
Copy link

hi @Lebowski89, thank you for sharing this. Unfortunately I don't have a cluster of docker servers.

np, thank you for your blog. I just thought, if you wanted to install docker on your raspberry pi, you could make it a docker swarm worker and use your main server to deploy technitium to it. I've never owned a rpi, though, so not sure if installing docker on them has issues. Using a Beelink Mini-PC as a Swarm worker for the second Technitium instance.

@jarbelix
Copy link

I saw your article https://cloudalbania.com/2024-04-setup-an-high-availability-technitium-dns-server-cluster-at-home/ and I liked it a lot.

Since version 14.3, it includes a built-in Clustering feature to allow managing two or more DNS server instances from a single admin web console.

I believe synchronization is automatic.

Could you write a new article showing how to implement it?

@besmirzanaj
Copy link
Author

hi @jarbelix, fortunately the Technitium author has written an article already. I tried it and it works as expected
https://blog.technitium.com/2025/11/understanding-clustering-and-how-to.html

@jarbelix
Copy link

I read that article. It's really very detailed.

It would be interesting if you could show how to implement it on two DNS servers (master and slave) and import the entries from a zone that is still being maintained by another DNS service (for example, BIND).

I'm sure it would be a great help to many providers.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment