Complete Flask → FastAPI migration with: - FastAPI app with session auth, Azure AD SSO, rate limiting - SQLite-backed session store (survives restarts) - Bulk AI metadata generation with SSE progress - Admin panel (user management, audit log, AI usage) - Subpath deployment support (ROOT_PATH config) - Docker + deploy.sh for production deployment - Test suite (auth, upload, templates, imports, admin, sessions) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
7.4 KiB
Docker Deployment Guide
Complete guide for deploying Oliver Metadata Tool using Docker.
Prerequisites
- Docker 20.10+ installed
- Docker Compose 2.0+ installed
- 2GB+ available disk space
- Network access for pulling base images
Quick Start
1. Build and Start
# Using docker-compose directly
docker-compose up -d
# Or using the helper script
./docker-run.sh build
./docker-run.sh start
2. Access Application
Open browser at: http://localhost:5001
Default credentials:
- Username:
tester - Password:
oliveradmin
3. View Logs
# Using docker-compose
docker-compose logs -f
# Or using the helper script
./docker-run.sh logs
Configuration
Environment Variables
Create .env file in project root (optional):
# Required for AI metadata generation
OPENAI_API_KEY=your-openai-api-key-here
# Optional: AI Configuration
AI_MODEL=gpt-4o-mini
MAX_TOKENS=500
TEMPERATURE=0.5
# Optional: Microsoft SSO
AZURE_CLIENT_ID=your-azure-client-id
AZURE_CLIENT_SECRET=your-azure-client-secret
AZURE_TENANT_ID=your-azure-tenant-id
REDIRECT_URI=http://localhost:5001/auth/callback
# Optional: Flask secret key
SECRET_KEY=your-secret-key-here
Docker Compose Configuration
The docker-compose.yml file includes:
- Port mapping:
5001:5001 - Persistent volumes:
uploads:/app/uploads- Temporary file uploadsdatabase:/app/data- SQLite databaseoutput:/app/output- Processed files, backups, reports
- Auto-restart: Container restarts unless explicitly stopped
- Health checks: Every 30 seconds
Management Commands
Using docker-run.sh Script
# Build image
./docker-run.sh build
# Start application
./docker-run.sh start
# Stop application
./docker-run.sh stop
# Restart application
./docker-run.sh restart
# View logs
./docker-run.sh logs
# Show status
./docker-run.sh status
# Clean up (removes data!)
./docker-run.sh clean
Using Docker Compose Directly
# Build image
docker-compose build
# Start in background
docker-compose up -d
# Start with logs
docker-compose up
# Stop
docker-compose down
# Restart
docker-compose restart
# View logs
docker-compose logs -f
# Check status
docker-compose ps
# Remove containers and volumes (deletes data!)
docker-compose down -v
Data Persistence
Volumes
Three Docker volumes persist data between container restarts:
-
uploads -
/app/uploads- Temporary file uploads during processing
- Cleared when files are downloaded
-
database -
/app/data- SQLite database (
oliver_metadata.db) - User accounts, sessions, audit logs
- SQLite database (
-
output -
/app/output- Processed files
- Backups
- Reports
- Templates
Backup Data
# Backup database
docker-compose exec oliver-metadata tar -czf /tmp/backup.tar.gz /app/data
docker cp oliver-metadata-tool:/tmp/backup.tar.gz ./backup-$(date +%Y%m%d).tar.gz
# Or backup entire volumes
docker run --rm -v oliver-metadata_database:/data -v $(pwd):/backup alpine tar -czf /backup/database-backup.tar.gz -C /data .
Restore Data
# Stop container
docker-compose down
# Remove old volume
docker volume rm oliver-metadata_database
# Recreate volume and restore
docker run --rm -v oliver-metadata_database:/data -v $(pwd):/backup alpine tar -xzf /backup/database-backup.tar.gz -C /data
# Start container
docker-compose up -d
Troubleshooting
Container won't start
# Check logs
docker-compose logs
# Check if port is in use
lsof -i :5001
# Rebuild image
docker-compose build --no-cache
Permission issues
# Check volume permissions
docker-compose exec oliver-metadata ls -la /app/uploads /app/data /app/output
# Fix permissions (if needed)
docker-compose exec oliver-metadata chown -R root:root /app/uploads /app/data /app/output
Database locked errors
# Stop container
docker-compose down
# Start with fresh database
docker volume rm oliver-metadata_database
docker-compose up -d
ExifTool not found
ExifTool is installed in the Docker image. Verify:
docker-compose exec oliver-metadata exiftool -ver
Should output version 12.15+
Memory issues
Increase Docker memory allocation:
- Docker Desktop → Settings → Resources → Memory
- Recommended: 2GB minimum, 4GB+ for large batches
Production Deployment
Security Recommendations
-
Change default credentials
- Create new users via web interface
- Disable or remove test account
-
Use environment variables
- Never commit
.envto git - Use secrets management (Docker secrets, Kubernetes secrets)
- Never commit
-
Enable HTTPS
- Use reverse proxy (nginx, Traefik, Caddy)
- Terminate SSL at proxy level
-
Set custom secret key
SECRET_KEY=$(openssl rand -hex 32) -
Limit file upload size
- Default: 500MB
- Adjust via nginx/proxy if needed
Reverse Proxy Example (nginx)
server {
listen 80;
server_name metadata.example.com;
location / {
proxy_pass http://localhost:5001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Increase timeouts for large file uploads
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_send_timeout 300;
}
}
Resource Limits
Add to docker-compose.yml:
services:
oliver-metadata:
# ... existing config ...
deploy:
resources:
limits:
cpus: '2.0'
memory: 4G
reservations:
cpus: '1.0'
memory: 2G
System Requirements
Container Resources
- CPU: 1-2 cores (AI generation can use more)
- Memory: 2GB minimum, 4GB recommended
- Disk: 5GB+ (depends on file volume)
Host Requirements
- OS: Linux, macOS, Windows with WSL2
- Docker: 20.10+
- Architecture: x86_64/amd64 (ARM64 may work but untested)
Updates
Update to latest version
# Pull latest code
git pull origin main
# Rebuild image
docker-compose build
# Restart containers
docker-compose up -d
Update Python dependencies
# Rebuild without cache
docker-compose build --no-cache
# Restart
docker-compose up -d
Monitoring
Health Checks
Built-in health check runs every 30 seconds:
# Check health status
docker ps
# View health check logs
docker inspect oliver-metadata-tool | jq '.[0].State.Health'
Resource Usage
# Real-time stats
docker stats oliver-metadata-tool
# Container info
docker inspect oliver-metadata-tool
Support
For issues or questions:
- Check logs:
docker-compose logs -f - Verify configuration:
docker-compose config - Test connection:
curl http://localhost:5001/login - Open GitHub issue with logs and configuration
FAQ
Q: Can I change the port?
A: Yes, edit docker-compose.yml port mapping: "8080:5001"
Q: Does this work on ARM (Apple Silicon)?
A: Should work but untested. Try building with --platform linux/arm64
Q: How do I use my own database?
A: Mount external database file as volume: ./my-db.db:/app/data/oliver_metadata.db
Q: Can I run multiple instances? A: Yes, change port mapping and container name in docker-compose.yml for each instance
Q: Does it support S3 storage? A: Not yet, but you can mount S3 as volume using FUSE/s3fs