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

yes, definitely, I like the dhcp integration, but that is not necessary