version: '3.8' services: postgres: build: context: ./docker/postgres dockerfile: Dockerfile container_name: rippy-postgres environment: POSTGRES_DB: rippy POSTGRES_USER: rippy POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-rippy123} volumes: - postgres_data:/var/lib/postgresql/data - ./docker/postgres/init.sql:/docker-entrypoint-initdb.d/init.sql ports: - "5432:5432" networks: - rippy-backend restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U rippy -d rippy"] interval: 10s timeout: 5s retries: 5 redis: build: context: ./docker/redis dockerfile: Dockerfile container_name: rippy-redis command: redis-server --appendonly yes volumes: - redis_data:/data ports: - "6379:6379" networks: - rippy-backend restart: unless-stopped healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 api: build: context: ./docker/api dockerfile: Dockerfile container_name: rippy-api environment: - DATABASE_URL=postgresql://rippy:${POSTGRES_PASSWORD:-rippy123}@postgres:5432/rippy - REDIS_URL=redis://redis:6379/0 - SECRET_KEY=${SECRET_KEY:-change-me-in-production} - TMDB_API_KEY=${TMDB_API_KEY:-} - THEtvdb_API_KEY=${THEtvdb_API_KEY:-} - MUSICBRAINZ_USER_AGENT=Rippy/1.0 volumes: - ./docker/api/main.py:/app/main.py ports: - "8000:8000" networks: - rippy-backend - rippy-frontend depends_on: postgres: condition: service_healthy redis: condition: service_healthy restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 30s timeout: 10s retries: 3 worker: build: context: ./docker/worker dockerfile: Dockerfile container_name: rippy-worker environment: - DATABASE_URL=postgresql://rippy:${POSTGRES_PASSWORD:-rippy123}@postgres:5432/rippy - REDIS_URL=redis://redis:6379/0 - CELERY_BROKER_URL=redis://redis:6379/0 - CELERY_RESULT_BACKEND=redis://redis:6379/0 - DISC_DEVICE_PATH=/dev/disc - PYTHONPATH=/app volumes: - ./docker/worker:/app - ./udev:/app/udev - /dev:/dev:ro networks: - rippy-backend depends_on: postgres: condition: service_healthy redis: condition: service_healthy restart: unless-stopped privileged: true ui: build: context: ./docker/ui dockerfile: Dockerfile container_name: rippy-ui ports: - "80:80" networks: - rippy-frontend depends_on: api: condition: service_healthy restart: unless-stopped networks: rippy-backend: driver: bridge rippy-frontend: driver: bridge volumes: postgres_data: redis_data: