79 lines
2.8 KiB
Bash
79 lines
2.8 KiB
Bash
#!/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"
|
|
|
|
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"
|
|
|
|
# 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
|