#!/bin/bash set -e # Configuration from environment SERVICE_NAME="navidrome" PORT=4533 CONSUL_HTTP_ADDR="${CONSUL_URL:-http://localhost:8500}" NODE_IP="${ADVERTISE_IP}" # 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"]' NAVIDROME_PID="" SERVICE_ID="navidrome-${NODE_IP}-${SERVICE_NAME}" cleanup() { echo "Caught signal, shutting down..." if [ -n "$NAVIDROME_PID" ]; then echo "Stopping Navidrome (PID: $NAVIDROME_PID)..." kill -TERM "$NAVIDROME_PID" wait "$NAVIDROME_PID" || true fi echo "Deregistering service ${SERVICE_ID} from Consul..." curl -s -X PUT "${CONSUL_HTTP_ADDR}/v1/agent/service/deregister/${SERVICE_ID}" || true exit 0 } trap cleanup SIGTERM SIGINT echo "Starting leadership-aware entrypoint..." echo "Node IP: $NODE_IP" echo "Consul: $CONSUL_HTTP_ADDR" # Small sleep to let LiteFS settle and leadership election complete sleep 5 while true; do # In LiteFS 0.5, .primary file exists ONLY on replicas. if [ ! -f /data/.primary ]; then # PRIMARY STATE if [ -z "$NAVIDROME_PID" ] || ! kill -0 "$NAVIDROME_PID" 2>/dev/null; then echo "Node is Primary. Initializing Navidrome..." # Register in Consul echo "Registering as primary in Consul..." curl -s -X PUT -d "{ \"ID\": \"${SERVICE_ID}\", \"Name\": \"${SERVICE_NAME}\", \"Tags\": ${PRIMARY_TAGS}, \"Address\": \"${NODE_IP}\", \"Port\": ${PORT}, \"Check\": { \"HTTP\": \"http://${NODE_IP}:${PORT}/app\", \"Interval\": \"10s\", \"Timeout\": \"2s\" } }" "${CONSUL_HTTP_ADDR}/v1/agent/service/register" echo "Starting Navidrome with ND_DATABASE_PATH=/data/navidrome.db" export ND_DATABASE_PATH="/data/navidrome.db" export ND_DATAFOLDER="/local/data" # Start Navidrome /app/navidrome & NAVIDROME_PID=$! echo "Navidrome started with PID $NAVIDROME_PID" fi else # REPLICA STATE if [ -n "$NAVIDROME_PID" ] && kill -0 "$NAVIDROME_PID" 2>/dev/null; then echo "Node transitioned to Replica. Stopping Navidrome..." kill -TERM "$NAVIDROME_PID" wait "$NAVIDROME_PID" || true NAVIDROME_PID="" echo "Deregistering primary service from Consul..." curl -s -X PUT "${CONSUL_HTTP_ADDR}/v1/agent/service/deregister/${SERVICE_ID}" || true fi # We don't register anything for replicas in this version to keep it simple. # But we stay alive so LiteFS keeps running. fi sleep 5 done