fix: use local DataFolder with symlinks to LiteFS DB
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 39s
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 39s
This commit is contained in:
@@ -78,23 +78,23 @@ start_app() {
|
|||||||
echo "Node is Primary. Starting Navidrome..."
|
echo "Node is Primary. Starting Navidrome..."
|
||||||
|
|
||||||
# Ensure shared directories exist
|
# 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
|
if [ ! -f /data/navidrome.db ]; then
|
||||||
echo "Database /data/navidrome.db not found. Looking for backups to seed..."
|
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)
|
local latest_backup=$(ls -t /shared_data/backup/navidrome.db_*.bak 2>/dev/null | head -n 1)
|
||||||
if [ -n "$latest_backup" ]; then
|
if [ -n "$latest_backup" ]; then
|
||||||
echo "Seeding from $latest_backup..."
|
echo "Seeding from $latest_backup..."
|
||||||
# We use litefs import to properly initialize the distributed state
|
|
||||||
litefs import -name navidrome.db "$latest_backup"
|
litefs import -name navidrome.db "$latest_backup"
|
||||||
else
|
else
|
||||||
echo "No backups found. Navidrome will start with a fresh database."
|
echo "No backups found. Navidrome will start with a fresh database."
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Wait for LiteFS to expose the DB file in the FUSE mount
|
# Wait for LiteFS to expose the DB file
|
||||||
echo "Waiting for /data/navidrome.db..."
|
echo "Waiting for /data/navidrome.db to be exposed by LiteFS..."
|
||||||
local db_timeout=30
|
local db_timeout=30
|
||||||
local db_count=0
|
local db_count=0
|
||||||
while [ ! -f /data/navidrome.db ] && [ $db_count -lt $db_timeout ]; do
|
while [ ! -f /data/navidrome.db ] && [ $db_count -lt $db_timeout ]; do
|
||||||
@@ -102,25 +102,28 @@ start_app() {
|
|||||||
db_count=$((db_count + 1))
|
db_count=$((db_count + 1))
|
||||||
done
|
done
|
||||||
|
|
||||||
if [ ! -f /data/navidrome.db ]; then
|
# Setup local data folder with symlinks
|
||||||
echo "ERROR: /data/navidrome.db did not appear after ${db_timeout}s"
|
# This avoids "mkdir /data/artwork: operation not permitted"
|
||||||
return 1
|
# and avoids SMB symlink/mount issues
|
||||||
fi
|
rm -rf /local/navidrome_data
|
||||||
|
mkdir -p /local/navidrome_data
|
||||||
# Bind mount the DB so Navidrome finds it in its DataFolder
|
|
||||||
touch /shared_data/navidrome.db
|
ln -s /data/navidrome.db /local/navidrome_data/navidrome.db
|
||||||
mount --bind /data/navidrome.db /shared_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
|
# Configuration
|
||||||
export ND_DATAFOLDER="/shared_data"
|
export ND_DATAFOLDER="/local/navidrome_data"
|
||||||
export ND_CACHEFOLDER="/shared_data/cache"
|
export ND_CACHEFOLDER="/local/navidrome_data/cache"
|
||||||
export ND_BACKUP_PATH="/shared_data/backup"
|
export ND_BACKUP_PATH="/local/navidrome_data/backup"
|
||||||
export ND_PLUGINS_FOLDER="/shared_data/plugins"
|
export ND_PLUGINS_FOLDER="/local/navidrome_data/plugins"
|
||||||
export ND_ARTISTIMAGEFOLDER="artist_images"
|
export ND_ARTISTIMAGEFOLDER="artist_images"
|
||||||
|
|
||||||
/app/navidrome &
|
/app/navidrome &
|
||||||
NAVIDROME_PID=$!
|
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
|
# Stop Navidrome
|
||||||
@@ -130,7 +133,6 @@ stop_app() {
|
|||||||
kill -SIGTERM "${NAVIDROME_PID}"
|
kill -SIGTERM "${NAVIDROME_PID}"
|
||||||
wait "${NAVIDROME_PID}" 2>/dev/null || true
|
wait "${NAVIDROME_PID}" 2>/dev/null || true
|
||||||
NAVIDROME_PID=0
|
NAVIDROME_PID=0
|
||||||
umount /shared_data/navidrome.db 2>/dev/null || true
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ lease:
|
|||||||
advertise-url: "http://${ADVERTISE_IP}:20202"
|
advertise-url: "http://${ADVERTISE_IP}:20202"
|
||||||
consul:
|
consul:
|
||||||
url: "${CONSUL_URL}"
|
url: "${CONSUL_URL}"
|
||||||
key: "litefs/navidrome"
|
key: "litefs/navidrome-v6"
|
||||||
ttl: "30s"
|
ttl: "30s"
|
||||||
lock-delay: "5s"
|
lock-delay: "5s"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user