Skip to content

Instantly share code, notes, and snippets.

@besmirzanaj
Last active September 20, 2025 02:49
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
@besmirzanaj
Copy link
Author

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

@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.

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