- Full PWA support with offline capabilities - Comprehensive search across songs, playlists, and channels - Offline playlist manager with download tracking - Pre-built frontend for zero-build deployment - Docker-based deployment with docker compose - Material-UI dark theme interface - YouTube audio download and management - Multi-user authentication support
195 lines
5.5 KiB
Bash
Executable file
195 lines
5.5 KiB
Bash
Executable file
#!/bin/bash
|
|
# Migration script for existing Soundwave deployments
|
|
|
|
set -e
|
|
|
|
echo "🔄 Soundwave Data Persistence Migration"
|
|
echo "========================================"
|
|
echo ""
|
|
echo "This script will:"
|
|
echo "1. Stop existing containers"
|
|
echo "2. Backup current database (if exists)"
|
|
echo "3. Create persistent data directory"
|
|
echo "4. Migrate database to new location"
|
|
echo "5. Rebuild and restart containers"
|
|
echo ""
|
|
|
|
# Colors
|
|
GREEN='\033[0;32m'
|
|
RED='\033[0;31m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m'
|
|
|
|
# Confirm
|
|
read -p "Continue with migration? (y/n) " -n 1 -r
|
|
echo
|
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
echo "Migration cancelled."
|
|
exit 0
|
|
fi
|
|
|
|
echo ""
|
|
echo "Step 1: Stopping containers..."
|
|
echo "-------------------------------"
|
|
docker-compose down
|
|
echo -e "${GREEN}✅ Containers stopped${NC}"
|
|
|
|
echo ""
|
|
echo "Step 2: Creating backup..."
|
|
echo "--------------------------"
|
|
BACKUP_DIR="backup_$(date +%Y%m%d_%H%M%S)"
|
|
mkdir -p "$BACKUP_DIR"
|
|
|
|
# Backup database if exists in backend/
|
|
if [ -f "backend/db.sqlite3" ]; then
|
|
echo "Found database in backend/"
|
|
cp backend/db.sqlite3 "$BACKUP_DIR/"
|
|
echo -e "${GREEN}✅ Database backed up to $BACKUP_DIR/${NC}"
|
|
else
|
|
echo -e "${YELLOW}⚠️ No database found in backend/ (might be first run)${NC}"
|
|
fi
|
|
|
|
# Backup audio if exists
|
|
if [ -d "audio" ] && [ "$(ls -A audio)" ]; then
|
|
echo "Backing up audio directory..."
|
|
du -sh audio
|
|
# Don't copy audio, just note it
|
|
echo "audio/ → Already in volume (no action needed)"
|
|
echo -e "${GREEN}✅ Audio files already in persistent volume${NC}"
|
|
fi
|
|
|
|
echo ""
|
|
echo "Step 3: Creating data directory..."
|
|
echo "-----------------------------------"
|
|
mkdir -p data
|
|
mkdir -p cache
|
|
mkdir -p audio
|
|
mkdir -p es
|
|
mkdir -p redis
|
|
echo -e "${GREEN}✅ Persistent directories created${NC}"
|
|
|
|
echo ""
|
|
echo "Step 4: Migrating database..."
|
|
echo "------------------------------"
|
|
if [ -f "backend/db.sqlite3" ]; then
|
|
echo "Moving database to data/"
|
|
mv backend/db.sqlite3 data/
|
|
echo -e "${GREEN}✅ Database migrated to data/db.sqlite3${NC}"
|
|
else
|
|
echo -e "${YELLOW}⚠️ No database to migrate (will be created fresh)${NC}"
|
|
fi
|
|
|
|
# Create .gitignore in data/
|
|
cat > data/.gitignore << 'EOF'
|
|
# Persistent database files
|
|
db.sqlite3
|
|
*.sqlite3-journal
|
|
*.sqlite3-shm
|
|
*.sqlite3-wal
|
|
EOF
|
|
echo -e "${GREEN}✅ Created data/.gitignore${NC}"
|
|
|
|
echo ""
|
|
echo "Step 5: Rebuilding containers..."
|
|
echo "---------------------------------"
|
|
echo "This may take a few minutes..."
|
|
docker-compose build --no-cache
|
|
echo -e "${GREEN}✅ Containers rebuilt${NC}"
|
|
|
|
echo ""
|
|
echo "Step 6: Starting services..."
|
|
echo "----------------------------"
|
|
docker-compose up -d
|
|
echo -e "${GREEN}✅ Services started${NC}"
|
|
|
|
echo ""
|
|
echo "Step 7: Waiting for services to initialize..."
|
|
echo "----------------------------------------------"
|
|
sleep 10
|
|
|
|
# Check if services are running
|
|
if docker ps | grep -q soundwave; then
|
|
echo -e "${GREEN}✅ Soundwave container is running${NC}"
|
|
else
|
|
echo -e "${RED}❌ Soundwave container failed to start${NC}"
|
|
echo "Check logs with: docker-compose logs soundwave"
|
|
exit 1
|
|
fi
|
|
|
|
echo ""
|
|
echo "Step 8: Verifying database location..."
|
|
echo "---------------------------------------"
|
|
DB_PATH=$(docker exec soundwave python -c "from django.conf import settings; print(settings.DATABASES['default']['NAME'])" 2>/dev/null || echo "ERROR")
|
|
|
|
if [[ $DB_PATH == *"/app/data/"* ]]; then
|
|
echo -e "${GREEN}✅ Database correctly configured at: $DB_PATH${NC}"
|
|
else
|
|
echo -e "${RED}❌ Database path incorrect: $DB_PATH${NC}"
|
|
echo "Expected: /app/data/db.sqlite3"
|
|
exit 1
|
|
fi
|
|
|
|
# Check if database file exists
|
|
if docker exec soundwave test -f /app/data/db.sqlite3 2>/dev/null; then
|
|
echo -e "${GREEN}✅ Database file exists in container${NC}"
|
|
|
|
# Get user count
|
|
USER_COUNT=$(docker exec soundwave python manage.py shell -c "from user.models import Account; print(Account.objects.count())" 2>/dev/null || echo "0")
|
|
echo " Users in database: $USER_COUNT"
|
|
else
|
|
echo -e "${YELLOW}⚠️ Database file not found - running migrations...${NC}"
|
|
docker exec soundwave python manage.py migrate
|
|
echo -e "${GREEN}✅ Migrations complete${NC}"
|
|
fi
|
|
|
|
echo ""
|
|
echo "Step 9: Testing persistence..."
|
|
echo "-------------------------------"
|
|
echo "Testing container restart..."
|
|
docker-compose restart soundwave
|
|
sleep 5
|
|
|
|
# Check database still exists
|
|
if docker exec soundwave test -f /app/data/db.sqlite3 2>/dev/null; then
|
|
echo -e "${GREEN}✅ Database persists after restart${NC}"
|
|
else
|
|
echo -e "${RED}❌ Database lost after restart!${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
echo ""
|
|
echo "========================================"
|
|
echo "🎉 Migration Complete!"
|
|
echo "========================================"
|
|
echo ""
|
|
echo "Summary:"
|
|
echo "--------"
|
|
echo "✅ Containers rebuilt with new configuration"
|
|
echo "✅ Database moved to persistent volume"
|
|
echo "✅ Data will now survive container rebuilds"
|
|
echo "✅ Backup saved in: $BACKUP_DIR/"
|
|
echo ""
|
|
echo "Next steps:"
|
|
echo "-----------"
|
|
echo "1. Test the application: http://localhost:8889"
|
|
echo "2. Verify your data is intact"
|
|
echo "3. Test persistence:"
|
|
echo " docker-compose down"
|
|
echo " docker-compose up -d"
|
|
echo " # Data should still be there!"
|
|
echo ""
|
|
echo "Logs:"
|
|
echo "-----"
|
|
echo "docker-compose logs -f soundwave"
|
|
echo ""
|
|
echo "Documentation:"
|
|
echo "--------------"
|
|
echo "• docs/QUICK_REFERENCE.md - Quick guide"
|
|
echo "• docs/DATA_PERSISTENCE_FIX.md - Technical details"
|
|
echo "• docs/OFFLINE_PLAYLISTS_GUIDE.md - PWA features"
|
|
echo ""
|
|
|
|
# Show service status
|
|
echo "Current Status:"
|
|
echo "---------------"
|
|
docker-compose ps
|