Docker Container zum Update mehrerer Sub-Domains

Servus,

ich nutze ipv64.net mit mehreren Subdomains auf unterschiedlichen DNS Adressen. Um jetzt nur bestimmte Einträge eines Ziels (externe IP) zu aktualisieren, habe ich einen Docker Container gebaut.

Ich würde mich freuen, wenn ihr mir hier Kritik, Vorschläge, Kommentare da lassen würdet :slight_smile:

Erst einmal nötige Ordner und Files erstellen

mkdir ipv64_updater

cd ipv64_updater

mkdir logs

mkdir data

touch data/domains.txt

touch data/last_ip.txt

nun das docker-compose-file erstellen und den folgenden Text einfügen.

nano docker-compose.yml

services:
ddns-ipv64:
image: alpine:latest
container_name: ddns-ipv64
volumes:
- ./data:/data
# - ./data/domains.txt:/data/domains.txt
# - ./data/last_ip.txt:/data/last_ip.txt
- ./entrypoint.sh:/entrypoint.sh
- ./logs:/logs
environment:
- TZ=Europe/Berlin
- AUTH_TOKEN=<YOUR_Security_Level_2_key>
restart: unless-stopped
command: sh -c "apk add --no-cache curl jq && sh /entrypoint.sh"

den AUTH_TOKEN findet ihr auf eurer Domainseite nach den Subdomains.

Jetzt das eigentliche Skript erstellen und den Text einfügen

nano entrypoint.sh

#!/bin/sh
set -e

# =====================
# Konfiguration
# =====================
DOMAINS_FILE="/data/domains.txt"
LOG_FILE="/logs/ip_change.log"
LAST_IP_FILE="/data/last_ip.txt"
AUTH_TOKEN="${AUTH_TOKEN}"
CHECK_INTERVAL=60 # Sekunden zwischen IP-Checks
API_URL="https://ipv4.ipv64.net/update.php"

# =====================
# Initialisierung
# =====================
echo "$(date '+%Y-%m-%d %H:%M:%S') - DDNS Script gestartet" | tee -a "$LOG_FILE"

# Lade letzte bekannte IP
if [ -f "$LAST_IP_FILE"]; then
last_ip=$(cat "$LAST_IP_FILE")
else
last_ip=""
fi

# =====================
# Funktionen
# =====================
get_current_ip() {
curl -s-4 https://api64.ipify.org
}

update_domain() {
local domain="$1"
local ip="$2"
echo "$(date '+%Y-%m-%d %H:%M:%S') - Aktualisiere $domain auf $ip" | tee -a "$LOG_FILE"

response=$(curl -s "${API_URL}?domain=${domain}&ip=${ip}&key=${AUTH_TOKEN}")

# Prüfen auf Status
status=$(echo "$response" | jq -r '.status')
info=$(echo "$response" | jq -r '.info')

if ["$status"="ok"]; then
if ["$info"="nochg"]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - $domain bereits auf $ip, keine Änderung nötig" | tee -a "$LOG_FILE"
else
echo "$(date '+%Y-%m-%d %H:%M:%S') - Update erfolgreich für $domain: $info" | tee -a "$LOG_FILE"
fi
else
echo "$(date '+%Y-%m-%d %H:%M:%S') - FEHLER: Update fehlgeschlagen für $domain: $response" | tee -a "$LOG_FILE"
fi
}

# =====================
# Hauptschleife
# =====================
while true; do
current_ip=$(get_current_ip)

if [ -z "$current_ip"]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - WARNUNG: Konnte aktuelle IP nicht ermitteln" | tee -a "$LOG_FILE"
elif ["$current_ip"!="$last_ip"]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - IP Änderung erkannt: $last_ip → $current_ip" | tee -a "$LOG_FILE"
last_ip="$current_ip"
echo "$last_ip">"$LAST_IP_FILE"

# Update alle Domains
while IFS= read -r domain || [ -n "$domain"]; do
[ -z "$domain"] && continue
update_domain"$domain" "$current_ip"
done <"$DOMAINS_FILE"
else
echo "$(date '+%Y-%m-%d %H:%M:%S') - IP unverändert: $current_ip" | tee -a "$LOG_FILE"
fi

sleep$CHECK_INTERVAL
done

nun noch das domains-file erstellen und die gewünschten URLs eintragen. Beispiel: deinesubdomain.meinedomain.dns64.de

nano data/domains.txt

subdomain.domain
2ndsubdomain.domain

nun mit docker compose up das ganze starten und die domains sollten die IP des rechners im Netz bekommen.

Nun habe ich festgestellt, dass nur die ersten 3 Domains aktualisiert werden - aber dann nichts mehr passiert.

Habt ihr eine Idee - ob ich wischen den Domains eine pause (sleep) von 1 Sekunden oder mehr eintragen muss?

Gruß

habt ihr eine Idee?

Ich habs das per Script mal gelösst und musste einen Sleep von 3sec einfügen, weil ipv64 so schnell nicht antwortete auf mehrer Update hintereinander.

Hi @Tuxtom007 - danke für die Rückmeldung!

Das werde ich testen. noch mal Danke!

ist ja auch nicht mehr als ein Skript aber ich kann es in meinem Docker Sammelsurium besser managen.

Viele Grüße

Bei mir lief das auf der OPNSense, da brauch ich kein extra Docker zu nutzen, hab da eh keine Lust drauf :slight_smile: