# SoulSync WebUI - Docker Deployment Guide

## Release Channels

SoulSync publishes two Docker image tracks:

- **Stable — `boulderbadgedad/soulsync:latest`** (Docker Hub). Hand-promoted from the `dev` branch when a batch of changes is ready. Default in `docker-compose.yml`.
- **Nightly — `ghcr.io/nezreka/soulsync:dev`** (GHCR). Rebuilt every night and on every push to `dev`. Faster access to new features at the cost of occasional instability.
- **Version-tagged — `:2.3`, `:2.4`, etc.** on both registries for pinning to a specific release.

To switch a running install to the nightly channel, edit the `image:` line in `docker-compose.yml` to `ghcr.io/nezreka/soulsync:dev` and run `docker-compose pull && docker-compose up -d`. See the [main README](../README.md#release-channels) for the full channel guide.

## 🐳 Quick Start

### Prerequisites
- Docker Engine 20.10+
- Docker Compose 1.29+
- At least 2GB RAM and 10GB free disk space

### 1. Setup
```bash
# Clone or download the repository
git clone <your-repo-url>
cd newmusic

# Run setup script
chmod +x docker-setup.sh
./docker-setup.sh
```

### 2. Configure
Edit `config/config.json` with your API keys and server settings:
```json
{
  "spotify": {
    "client_id": "your_spotify_client_id",
    "client_secret": "your_spotify_client_secret"
  },
  "plex": {
    "url": "http://your-plex-server:32400",
    "token": "your_plex_token"
  }
}
```

### 3. Deploy
```bash
# Start SoulSync
docker-compose up -d

# View logs
docker-compose logs -f

# Access the web interface
open http://localhost:8008
```

## 📁 Volume Mounts

SoulSync requires persistent storage for:

- **`./config`** → `/app/config` - Configuration files
- **`./data`** → `/app/data` - SQLite database files  
- **`./logs`** → `/app/logs` - Application logs
- **`./downloads`** → `/app/downloads` - Downloaded music files
- **`./Transfer`** → `/app/Transfer` - Processed/matched music files

## 🔧 Configuration Options

### Environment Variables
```yaml
environment:
  - FLASK_ENV=production              # Flask environment
  - PYTHONPATH=/app                   # Python path
  - SOULSYNC_CONFIG_PATH=/app/config/config.json  # Config file location
  - SOULSYNC_LOG_LEVEL=INFO           # Optional startup log level override, takes precedence over the UI-configured log level
  - TZ=America/New_York               # Timezone
```

### Port Configuration
Default port is `8008`. To change:
```yaml
ports:
  - "9999:8008"  # Access on port 9999
```

### Resource Limits
Adjust based on your system:
```yaml
deploy:
  resources:
    limits:
      cpus: '4.0'      # Max CPU cores
      memory: 4G       # Max RAM
    reservations:
      cpus: '1.0'      # Minimum CPU
      memory: 1G       # Minimum RAM
```

## 🚀 Advanced Setup

### Multi-Architecture Support
The Docker image supports both AMD64 and ARM64:
```bash
# Build for specific architecture
docker buildx build --platform linux/amd64,linux/arm64 -t soulsync-webui .
```

### Custom Network
For integration with other containers:
```yaml
networks:
  media:
    external: true
```

### External Services
Connect to external Plex/Jellyfin servers:
```yaml
extra_hosts:
  - "plex.local:192.168.1.100"
  - "jellyfin.local:192.168.1.101"
```

## 🔍 Troubleshooting

### Check Container Status
```bash
docker-compose ps
docker-compose logs soulsync
```

### Common Issues

**Permission Denied**
```bash
sudo chown -R 1000:1000 config database logs downloads Transfer
```

**Port Already in Use**
```bash
# Check what's using port 8888
sudo lsof -i :8888
# Change port in docker-compose.yml
```

**Out of Memory**
```bash
# Increase memory limits in docker-compose.yml
# Or free up system memory
```

### Health Check
The container includes health checks:
```bash
docker inspect --format='{{.State.Health.Status}}' soulsync-webui
```

## 📊 Monitoring

### View Real-time Logs
```bash
docker-compose logs -f --tail=100
```

### Container Stats  
```bash
docker stats soulsync-webui
```

### Database Size
```bash
du -sh database/
```

## 🔄 Updates

### Pull Latest Image
```bash
docker-compose pull
docker-compose up -d
```

### Backup Before Update
```bash
# Backup data
tar -czf soulsync-backup-$(date +%Y%m%d).tar.gz config/ database/ logs/

# Update
docker-compose pull && docker-compose up -d
```

## 🛠️ Development

### Build Local Image
```bash
docker build -t soulsync-webui .
```

### Development Mode
```yaml
# In docker-compose.yml
environment:
  - FLASK_ENV=development
volumes:
  - .:/app  # Mount source code for live reload
```

## 🔐 Security

### Non-Root User
The container runs as user `soulsync` (UID 1000) for security.

### Network Security
```yaml
# Restrict to localhost only
ports:
  - "127.0.0.1:8888:8888"
```

### Firewall
```bash
# Allow only local access
sudo ufw allow from 192.168.1.0/24 to any port 8888
```

## 📋 Complete Example

Here's a complete `docker-compose.yml` for production:

```yaml
version: '3.8'

services:
  soulsync:
    build: .
    container_name: soulsync-webui
    restart: unless-stopped
    ports:
      - "8888:8888"
    volumes:
      - ./config:/app/config
      - ./data:/app/data  
      - ./logs:/app/logs
      - ./downloads:/app/downloads
      - ./Transfer:/app/Transfer
      - /mnt/music:/music:ro  # Your music library
    environment:
      - FLASK_ENV=production
      - TZ=America/New_York
      - PYTHONPATH=/app
    deploy:
      resources:
        limits:
          cpus: '2.0'
          memory: 2G
        reservations:
          cpus: '0.5'
          memory: 512M
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8888/"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
```

## 🎯 Production Checklist

- [ ] Configure proper API keys in `config/config.json`
- [ ] Set appropriate resource limits
- [ ] Configure proper volume mounts
- [ ] Set up log rotation
- [ ] Configure firewall rules
- [ ] Set up backup strategy
- [ ] Test health checks
- [ ] Verify external service connectivity
