feat(ddns-cert-sync): enhance Caddy reload logic and improve error handling
This commit is contained in:
+45
-17
@@ -9,8 +9,22 @@ set -euo pipefail
|
|||||||
LOCK_FILE="/tmp/caddy-ddns-cert-sync.lock"
|
LOCK_FILE="/tmp/caddy-ddns-cert-sync.lock"
|
||||||
STATE_FILE="/var/lib/caddy/last_ip.txt"
|
STATE_FILE="/var/lib/caddy/last_ip.txt"
|
||||||
LOG_FILE="/var/log/caddy-ddns-cert-sync.log"
|
LOG_FILE="/var/log/caddy-ddns-cert-sync.log"
|
||||||
CADDY_BIN="/usr/bin/caddy"
|
|
||||||
IP_CHECK_URL="https://api.ipify.org?format=txt"
|
IP_CHECK_URL="https://api.ipify.org?format=txt"
|
||||||
|
CRITICAL_DOMAINS=("recept.gynther.se" "jellyfin.gynther.se" "wetty.gynther.se")
|
||||||
|
DOCKER_CONTAINER_NAME="caddy"
|
||||||
|
|
||||||
|
# Create directory for state file if it doesn't exist
|
||||||
|
if [ ! -d "/var/lib/caddy" ]; then
|
||||||
|
sudo mkdir -p /var/lib/caddy
|
||||||
|
sudo touch "$STATE_FILE"
|
||||||
|
sudo chown $USER:$USER "$STATE_FILE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create log file if it doesn't exist
|
||||||
|
if [ ! -f "$LOG_FILE" ]; then
|
||||||
|
sudo touch "$LOG_FILE"
|
||||||
|
sudo chown $USER:$USER "$LOG_FILE"
|
||||||
|
fi
|
||||||
|
|
||||||
# Logging function
|
# Logging function
|
||||||
log() {
|
log() {
|
||||||
@@ -24,12 +38,15 @@ if [ -f "$LOCK_FILE" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Create lock file
|
# Create lock file
|
||||||
trap "rm -f '$LOCK_FILE'; exit" INT TERM EXIT
|
trap 'rm -f "$LOCK_FILE"; exit' INT TERM EXIT
|
||||||
touch "$LOCK_FILE"
|
touch "$LOCK_FILE"
|
||||||
|
|
||||||
# Get current public IP
|
# Get current public IP
|
||||||
get_current_ip() {
|
get_current_ip() {
|
||||||
curl -s --max-time 10 "$IP_CHECK_URL" || echo ""
|
curl -s --max-time 10 "$IP_CHECK_URL" || {
|
||||||
|
log "ERROR: Failed to fetch current IP from $IP_CHECK_URL"
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Read last known IP from state file
|
# Read last known IP from state file
|
||||||
@@ -56,6 +73,28 @@ test_https() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Reload Caddy in Docker container
|
||||||
|
reload_caddy_in_docker() {
|
||||||
|
if docker ps | grep -q "$DOCKER_CONTAINER_NAME"; then
|
||||||
|
log "Reloading Caddy in Docker container '$DOCKER_CONTAINER_NAME'..."
|
||||||
|
if docker exec "$DOCKER_CONTAINER_NAME" caddy reload --config /etc/caddy/Caddyfile; then
|
||||||
|
log "Caddy reloaded successfully in Docker."
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
log "ERROR: Failed to reload Caddy in Docker. Attempting container restart."
|
||||||
|
docker restart "$DOCKER_CONTAINER_NAME" || {
|
||||||
|
log "ERROR: Failed to restart Caddy container."
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
log "Caddy container restarted."
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log "ERROR: Caddy container '$DOCKER_CONTAINER_NAME' is not running."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# Main execution
|
# Main execution
|
||||||
log "Starting IP check and Caddy sync"
|
log "Starting IP check and Caddy sync"
|
||||||
|
|
||||||
@@ -90,24 +129,13 @@ log "IP changed from $LAST_IP to $CURRENT_IP. Triggering Caddy reload and TLS ve
|
|||||||
# Update state file
|
# Update state file
|
||||||
write_current_ip "$CURRENT_IP"
|
write_current_ip "$CURRENT_IP"
|
||||||
|
|
||||||
# Reload Caddy to ensure DNS and TLS are synchronized
|
# Reload Caddy in Docker
|
||||||
if [ -x "$CADDY_BIN" ]; then
|
if ! reload_caddy_in_docker; then
|
||||||
log "Reloading Caddy..."
|
log "ERROR: Failed to reload/restart Caddy in Docker."
|
||||||
if "$CADDY_BIN" reload --config /etc/caddy/Caddyfile; then
|
|
||||||
log "Caddy reloaded successfully."
|
|
||||||
else
|
|
||||||
log "ERROR: Failed to reload Caddy. Attempting restart."
|
|
||||||
"$CADDY_BIN" stop || true
|
|
||||||
sleep 2
|
|
||||||
"$CADDY_BIN" start --config /etc/caddy/Caddyfile --adapter caddyfile || log "ERROR: Failed to restart Caddy."
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
log "ERROR: Caddy binary not found at $CADDY_BIN"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Verify HTTPS for critical domains
|
# Verify HTTPS for critical domains
|
||||||
log "Running HTTPS verification for critical domains..."
|
log "Running HTTPS verification for critical domains..."
|
||||||
CRITICAL_DOMAINS=("recept.gynther.se" "jellyfin.gynther.se" "wetty.gynther.se")
|
|
||||||
for domain in "${CRITICAL_DOMAINS[@]}"; do
|
for domain in "${CRITICAL_DOMAINS[@]}"; do
|
||||||
if test_https "$domain"; then
|
if test_https "$domain"; then
|
||||||
log "HTTPS test PASSED for $domain"
|
log "HTTPS test PASSED for $domain"
|
||||||
|
|||||||
Reference in New Issue
Block a user