-
-
Save besmirzanaj/490c7f8ff61f6e9681fa5656220e3910 to your computer and use it in GitHub Desktop.
| #!/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 | |
Am I safe to assume that if I'm not using the Technitium DHCP server then I can just remove those lines? I let my Unifi gateway handle DHCP and just use Technitium for DNS.
yes, definitely, I like the dhcp integration, but that is not necessary
Hi, any reason why you're not doing Docker Swarm services? That solves the high availability issue right there.
For Swarm, you cannot do network_mode: "host", but to work around that you do something like this:
networks:
- outside
networks:
outside:
external:
name: 'host'
I use a combination of Ansible and Docker Swarm to deploy all my docker services, including Technitium.
Edit: Just tried it myself, works just fine.
Each Technitium instance can have its own settings (just remove the DNS_SERVER_DOMAIN=dns01.home.arpa and do it in the app itself).
hi @Lebowski89, thank you for sharing this. Unfortunately I don't have a cluster of docker servers.
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.

Following the updated script, to optimize the DHCP leases, the solution is really simple.
On the Secondary technitium server DHCP settings, configure the "Offer Delay Time" to something higher than 1s (1000 ms), and leave the default 100ms on the Primary one. That means that the Primary Server will always be the first to offer the IP assignment and if it is not available, the second DNS server will take over.