diff --git a/entrypoint.sh b/entrypoint.sh index 75f67bb..7be6f52 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -78,23 +78,23 @@ start_app() { echo "Node is Primary. Starting Navidrome..." # Ensure shared directories exist - mkdir -p /shared_data/plugins /shared_data/cache /shared_data/backup /shared_data/artist_images + mkdir -p /shared_data/plugins /shared_data/cache /shared_data/backup /shared_data/artist_images /shared_data/artwork - # SEEDING LOGIC: If DB doesn't exist, restore from backup + # SEEDING LOGIC: If DB doesn't exist in cluster, restore from backup + # LiteFS 0.5.x: check if DB file exists in FUSE mount if [ ! -f /data/navidrome.db ]; then echo "Database /data/navidrome.db not found. Looking for backups to seed..." local latest_backup=$(ls -t /shared_data/backup/navidrome.db_*.bak 2>/dev/null | head -n 1) if [ -n "$latest_backup" ]; then echo "Seeding from $latest_backup..." - # We use litefs import to properly initialize the distributed state litefs import -name navidrome.db "$latest_backup" else echo "No backups found. Navidrome will start with a fresh database." fi fi - # Wait for LiteFS to expose the DB file in the FUSE mount - echo "Waiting for /data/navidrome.db..." + # Wait for LiteFS to expose the DB file + echo "Waiting for /data/navidrome.db to be exposed by LiteFS..." local db_timeout=30 local db_count=0 while [ ! -f /data/navidrome.db ] && [ $db_count -lt $db_timeout ]; do @@ -102,25 +102,28 @@ start_app() { db_count=$((db_count + 1)) done - if [ ! -f /data/navidrome.db ]; then - echo "ERROR: /data/navidrome.db did not appear after ${db_timeout}s" - return 1 - fi - - # Bind mount the DB so Navidrome finds it in its DataFolder - touch /shared_data/navidrome.db - mount --bind /data/navidrome.db /shared_data/navidrome.db + # Setup local data folder with symlinks + # This avoids "mkdir /data/artwork: operation not permitted" + # and avoids SMB symlink/mount issues + rm -rf /local/navidrome_data + mkdir -p /local/navidrome_data + + ln -s /data/navidrome.db /local/navidrome_data/navidrome.db + ln -s /shared_data/cache /local/navidrome_data/cache + ln -s /shared_data/plugins /local/navidrome_data/plugins + ln -s /shared_data/artwork /local/navidrome_data/artwork + ln -s /shared_data/backup /local/navidrome_data/backup # Configuration - export ND_DATAFOLDER="/shared_data" - export ND_CACHEFOLDER="/shared_data/cache" - export ND_BACKUP_PATH="/shared_data/backup" - export ND_PLUGINS_FOLDER="/shared_data/plugins" + export ND_DATAFOLDER="/local/navidrome_data" + export ND_CACHEFOLDER="/local/navidrome_data/cache" + export ND_BACKUP_PATH="/local/navidrome_data/backup" + export ND_PLUGINS_FOLDER="/local/navidrome_data/plugins" export ND_ARTISTIMAGEFOLDER="artist_images" /app/navidrome & NAVIDROME_PID=$! - echo "Navidrome running (PID: $NAVIDROME_PID) with data folder at /shared_data (DB bind-mounted to /data)" + echo "Navidrome running (PID: $NAVIDROME_PID) with DataFolder at /local/navidrome_data" } # Stop Navidrome @@ -130,7 +133,6 @@ stop_app() { kill -SIGTERM "${NAVIDROME_PID}" wait "${NAVIDROME_PID}" 2>/dev/null || true NAVIDROME_PID=0 - umount /shared_data/navidrome.db 2>/dev/null || true fi } diff --git a/litefs.yml b/litefs.yml index 6ec7de5..0653aaf 100644 --- a/litefs.yml +++ b/litefs.yml @@ -13,7 +13,7 @@ lease: advertise-url: "http://${ADVERTISE_IP}:20202" consul: url: "${CONSUL_URL}" - key: "litefs/navidrome" + key: "litefs/navidrome-v6" ttl: "30s" lock-delay: "5s"