#!/bin/bash set -e # Configuration from environment SERVICE_NAME="navidrome" SERVICE_ID="${SERVICE_NAME}-${NOMAD_ALLOC_ID:-$(hostname)}" 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"]' # --- Helper Functions --- # Register Service with TTL Check register_service() { echo "Registering service ${SERVICE_ID} with Consul..." curl -s -X PUT "${CONSUL_HTTP_ADDR}/v1/agent/service/register" -d "{ \"ID\": \"${SERVICE_ID}\", \"Name\": \"${SERVICE_NAME}\", \"Tags\": ${PRIMARY_TAGS}, \"Address\": \"${NODE_IP}\", \"Port\": ${PORT}, \"Check\": { \"DeregisterCriticalServiceAfter\": \"1m\", \"TTL\": \"15s\" } }" } # Send Heartbeat to Consul pass_ttl() { curl -s -X PUT "${CONSUL_HTTP_ADDR}/v1/agent/check/pass/service:${SERVICE_ID}" > /dev/null } # Deregister Service deregister_service() { echo "Deregistering service ${SERVICE_ID} from Consul..." curl -s -X PUT "${CONSUL_HTTP_ADDR}/v1/agent/service/deregister/${SERVICE_ID}" } # --- Cleanup --- cleanup() { echo "Shutting down..." deregister_service exit 0 } trap cleanup TERM INT # --- Main Logic --- echo "Starting Navidrome Primary Node..." # 1. Ensure shared directories exist on persistent host volume mkdir -p /data/plugins /data/cache /data/backup # 2. Tell Navidrome to use the database directly from the LiteFS mount. export ND_DBPATH="/litefs/navidrome.db?cache=shared&_busy_timeout=15000&_journal_mode=WAL&_foreign_keys=on" # 3. Register with Consul register_service # 4. Start Navidrome and Maintain TTL /app/navidrome & NAVIDROME_PID=$! echo "Navidrome running (PID: $NAVIDROME_PID)" while kill -0 $NAVIDROME_PID 2>/dev/null; do pass_ttl sleep 10 done cleanup