#!/bin/bash # 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}..." curl -s -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}..." curl -s -X PUT "${CONSUL_HTTP_ADDR}/v1/agent/service/deregister/${id}" } echo "Starting Consul registration loop..." LAST_STATE="unknown" while true; do if /usr/local/bin/litefs is-primary > /dev/null 2>&1; then CURRENT_STATE="primary" else CURRENT_STATE="replica" fi if [ "$CURRENT_STATE" != "$LAST_STATE" ]; then echo "State changed from ${LAST_STATE} to ${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