soundwave/scripts/migrate.sh
Iulian 51679d1943 Initial commit - SoundWave v1.0
- 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
2025-12-16 23:43:07 +00:00

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