video-processor/docker-compose.yml
Ryan Malloy 5ca1b7a07d Migrate to Procrastinate 3.x with backward compatibility for 2.x
- Add comprehensive compatibility layer supporting both Procrastinate 2.x and 3.x
- Implement version-aware database migration system with pre/post migrations for 3.x
- Create worker option mapping for seamless transition between versions
- Add extensive test coverage for all compatibility features
- Update dependency constraints to support both 2.x and 3.x simultaneously
- Provide Docker containerization with uv caching and multi-service orchestration
- Include demo applications and web interface for testing capabilities
- Bump version to 0.2.0 reflecting new compatibility features

Key Features:
- Automatic version detection and feature flagging
- Unified connector creation across PostgreSQL drivers
- Worker option translation (timeout → fetch_job_polling_interval)
- Database migration utilities with CLI and programmatic interfaces
- Complete Docker Compose setup with PostgreSQL, Redis, workers, and demos

Files Added:
- src/video_processor/tasks/compat.py - Core compatibility layer
- src/video_processor/tasks/migration.py - Migration utilities
- src/video_processor/tasks/worker_compatibility.py - Worker CLI
- tests/test_procrastinate_compat.py - Compatibility tests
- tests/test_procrastinate_migration.py - Migration tests
- Dockerfile - Multi-stage build with uv caching
- docker-compose.yml - Complete development environment
- examples/docker_demo.py - Containerized demo application
- examples/web_demo.py - Flask web interface demo

Migration Support:
- Procrastinate 2.x: Single migration command compatibility
- Procrastinate 3.x: Separate pre/post migration phases
- Database URL validation and connection testing
- Version-specific feature detection and graceful degradation
2025-09-05 10:38:12 -06:00

158 lines
4.2 KiB
YAML

# Docker Compose setup for Video Processor with Procrastinate
# Complete development and testing environment
version: '3.8'
services:
# PostgreSQL database for Procrastinate
postgres:
image: postgres:15-alpine
environment:
POSTGRES_DB: video_processor
POSTGRES_USER: video_user
POSTGRES_PASSWORD: video_password
POSTGRES_HOST_AUTH_METHOD: trust
volumes:
- postgres_data:/var/lib/postgresql/data
- ./docker/init-db.sql:/docker-entrypoint-initdb.d/init-db.sql
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U video_user -d video_processor"]
interval: 10s
timeout: 5s
retries: 5
networks:
- video_net
# Redis for additional caching (optional)
redis:
image: redis:7-alpine
ports:
- "6379:6379"
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
networks:
- video_net
# Video Processor API service
app:
build:
context: .
dockerfile: Dockerfile
target: development
environment:
- DATABASE_URL=postgresql://video_user:video_password@postgres:5432/video_processor
- PROCRASTINATE_DATABASE_URL=postgresql://video_user:video_password@postgres:5432/video_processor
- REDIS_URL=redis://redis:6379/0
- PYTHONPATH=/app
volumes:
- .:/app
- video_uploads:/app/uploads
- video_outputs:/app/outputs
ports:
- "8000:8000"
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
networks:
- video_net
command: ["python", "examples/docker_demo.py"]
# Procrastinate worker for background processing
worker:
build:
context: .
dockerfile: Dockerfile
target: worker
environment:
- PROCRASTINATE_DATABASE_URL=postgresql://video_user:video_password@postgres:5432/video_processor
- WORKER_CONCURRENCY=4
- WORKER_TIMEOUT=300
volumes:
- video_uploads:/app/uploads
- video_outputs:/app/outputs
depends_on:
postgres:
condition: service_healthy
networks:
- video_net
command: ["python", "-m", "video_processor.tasks.worker_compatibility", "worker"]
# Migration service (runs once to setup DB)
migrate:
build:
context: .
dockerfile: Dockerfile
target: migration
environment:
- PROCRASTINATE_DATABASE_URL=postgresql://video_user:video_password@postgres:5432/video_processor
depends_on:
postgres:
condition: service_healthy
networks:
- video_net
command: ["python", "-c", "
import asyncio;
from video_processor.tasks.migration import migrate_database;
asyncio.run(migrate_database('postgresql://video_user:video_password@postgres:5432/video_processor'))
"]
# Test runner service
test:
build:
context: .
dockerfile: Dockerfile
target: development
environment:
- DATABASE_URL=postgresql://video_user:video_password@postgres:5432/video_processor_test
- PROCRASTINATE_DATABASE_URL=postgresql://video_user:video_password@postgres:5432/video_processor_test
volumes:
- .:/app
depends_on:
postgres:
condition: service_healthy
networks:
- video_net
command: ["uv", "run", "pytest", "tests/", "-v", "--cov=src/", "--cov-report=html", "--cov-report=term"]
# Demo web interface (optional)
demo:
build:
context: .
dockerfile: Dockerfile
target: development
environment:
- DATABASE_URL=postgresql://video_user:video_password@postgres:5432/video_processor
- PROCRASTINATE_DATABASE_URL=postgresql://video_user:video_password@postgres:5432/video_processor
ports:
- "8080:8080"
volumes:
- .:/app
- video_uploads:/app/uploads
- video_outputs:/app/outputs
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
networks:
- video_net
command: ["python", "examples/web_demo.py"]
volumes:
postgres_data:
driver: local
video_uploads:
driver: local
video_outputs:
driver: local
networks:
video_net:
driver: bridge