#!/bin/bash set -x # Configuration SERVICE_NAME="navidrome" REPLICA_SERVICE_NAME="replica-navidrome" PORT=4533 CONSUL_HTTP_ADDR="${CONSUL_URL:-http://localhost:8500}" NODE_IP="${ADVERTISE_IP}" CHECK_INTERVAL="10s" # Tags for the Primary service (Traefik enabled) PRIMARY_TAGS='["navidrome","web","traefik.enable=true","urlprefix-/navidrome","tools","traefik.http.routers.navidromelan.rule=Host(`navidrome.service.dc1.consul`)","traefik.http.routers.navidromewan.rule=Host(`m.fbleagh.duckdns.org`)","traefik.http.routers.navidromewan.middlewares=dex@consulcatalog","traefik.http.routers.navidromewan.tls=true"]' # Tags for the Replica service REPLICA_TAGS='["navidrome-replica"]' register_service() { local name=$1 local tags=$2 local id="navidrome-${NODE_IP}-${name}" echo "Registering as ${name} with ID ${id} at ${NODE_IP}:${PORT}..." curl -v -X PUT -d "{ \"ID\": \"${id}\", \"Name\": \"${name}\", \"Tags\": ${tags}, \"Address\": \"${NODE_IP}\", \"Port\": ${PORT}, \"Check\": { \"HTTP\": \"http://${NODE_IP}:${PORT}/app\", \"Interval\": \"${CHECK_INTERVAL}\", \"Timeout\": \"2s\" } }" "${CONSUL_HTTP_ADDR}/v1/agent/service/register" } deregister_service() { local name=$1 local id="navidrome-${NODE_IP}-${name}" echo "Deregistering ${name} with ID ${id}..." curl -v -X PUT "${CONSUL_HTTP_ADDR}/v1/agent/service/deregister/${id}" } echo "Starting Consul registration loop..." LAST_STATE="unknown" while true; do # In LiteFS 0.5, .primary file exists ONLY on replicas. # We check /data/.primary because /data is our mount point. if [ ! -f /data/.primary ]; then CURRENT_STATE="primary" else CURRENT_STATE="replica" fi echo "Current node state: ${CURRENT_STATE}" if [ "$CURRENT_STATE" != "$LAST_STATE" ]; then echo "State change detected: ${LAST_STATE} -> ${CURRENT_STATE}" if [ "$CURRENT_STATE" == "primary" ]; then deregister_service "$REPLICA_SERVICE_NAME" register_service "$SERVICE_NAME" "$PRIMARY_TAGS" else deregister_service "$SERVICE_NAME" register_service "$REPLICA_SERVICE_NAME" "$REPLICA_TAGS" fi LAST_STATE="$CURRENT_STATE" fi sleep 15 done