# Dispatcharr - Modular Deployment Configuration
# This compose file runs Dispatcharr in modular mode with separate containers
# for web, celery workers, PostgreSQL database, and Redis cache.

services:
  # ============================================================================
  # Web Service
  # ============================================================================
  web:
    image: ghcr.io/dispatcharr/dispatcharr:latest
    container_name: dispatcharr_web
    restart: unless-stopped
    ports:
      - 9191:9191
    volumes:
      - ./data:/data
      #- ./certs:/certs:ro  # TLS certificates (optional)
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy
    extra_hosts:
      - "host.docker.internal:host-gateway"

    # --- Environment Configuration ---
    environment:
      # Deployment Mode
      - DISPATCHARR_ENV=modular

      # PostgreSQL Connection
      - POSTGRES_HOST=db
      - POSTGRES_PORT=5432
      - POSTGRES_DB=dispatcharr
      - POSTGRES_USER=dispatch
      - POSTGRES_PASSWORD=secret
      # PostgreSQL TLS (optional) — mount certs via the volume above
      #- POSTGRES_SSL=true                             # required to enable TLS
      #- POSTGRES_SSL_MODE=verify-full                 # optional: verify-full (default) | verify-ca | require
      #- POSTGRES_SSL_CA_CERT=/certs/postgres/ca.crt   # optional: CA cert to verify the server
      #- POSTGRES_SSL_CERT=/certs/postgres/client.crt  # optional: client cert (only if server requires client auth)
      #- POSTGRES_SSL_KEY=/certs/postgres/client.key   # optional: client key  (only if server requires client auth)

      # Redis Connection
      - REDIS_HOST=redis
      - REDIS_PORT=6379
      # Redis Authentication (Optional)
      # Uncomment and set if your Redis requires authentication:
      #- REDIS_PASSWORD=your_strong_redis_password
      #- REDIS_USER=your_redis_username  # For Redis 6+ ACL - see Redis service below
      # Redis TLS (optional) — mount certs via the volume above
      #- REDIS_SSL=true                                # required to enable TLS
      #- REDIS_SSL_VERIFY=true                         # optional: set false for self-signed certs without a CA
      #- REDIS_SSL_CA_CERT=/certs/redis/ca.crt         # optional: CA cert to verify the server
      #- REDIS_SSL_CERT=/certs/redis/client.crt        # optional: client cert (only if server requires client auth)
      #- REDIS_SSL_KEY=/certs/redis/client.key         # optional: client key  (only if server requires client auth)

      # Logging
      - DISPATCHARR_LOG_LEVEL=info

      # Legacy CPU Support (Optional)
      # Uncomment to enable legacy NumPy build for older CPUs (circa 2009)
      # that lack support for newer baseline CPU features:
      #- USE_LEGACY_NUMPY=true

      # Process Priority Configuration (Optional)
      # Lower values = higher priority. Range: -20 (highest) to 19 (lowest)
      # Negative values require cap_add: SYS_NICE (see below)
      #- UWSGI_NICE_LEVEL=-5   # uWSGI/FFmpeg/Streaming (default: 0, recommended: -5 for high priority)

    # --- Advanced Configuration ---
    # Uncomment to enable high priority for streaming (required if UWSGI_NICE_LEVEL < 0)
    #cap_add:
    #  - SYS_NICE

    # --- Hardware Acceleration (Optional) ---
    # Uncomment for GPU access (transcoding acceleration)
    #group_add:
    #  - video
    #  #- render  # Uncomment if your GPU requires it
    #devices:
    #  - /dev/dri:/dev/dri  # For Intel/AMD GPU acceleration (VA-API)

    # NVIDIA GPU Support (requires NVIDIA Container Toolkit)
    # Uncomment the following lines for NVIDIA GPU support
    #deploy:
    #  resources:
    #    reservations:
    #      devices:
    #        - driver: nvidia
    #          count: all
    #          capabilities: [gpu]

  # ============================================================================
  # Celery Service - Background task worker
  # ============================================================================
  celery:
    image: ghcr.io/dispatcharr/dispatcharr:latest
    container_name: dispatcharr_celery
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy
      web:
        condition: service_started
    volumes:
      - ./data:/data
      #- ./certs:/certs:ro  # TLS certificates (optional)
    extra_hosts:
      - "host.docker.internal:host-gateway"
    entrypoint: ["/app/docker/entrypoint.celery.sh"]

    # --- Environment Configuration ---
    environment:
      # Deployment Mode
      - DISPATCHARR_ENV=modular

      # Internal Service Communication
      # Must match the web service port for DVR recording and internal API calls
      - DISPATCHARR_PORT=9191

      # PostgreSQL — must match web service settings
      - POSTGRES_HOST=db
      - POSTGRES_PORT=5432
      - POSTGRES_DB=dispatcharr
      - POSTGRES_USER=dispatch
      - POSTGRES_PASSWORD=secret
      # PostgreSQL TLS — must match web service
      #- POSTGRES_SSL=true
      #- POSTGRES_SSL_MODE=verify-full
      #- POSTGRES_SSL_CA_CERT=/certs/postgres/ca.crt
      #- POSTGRES_SSL_CERT=/certs/postgres/client.crt
      #- POSTGRES_SSL_KEY=/certs/postgres/client.key

      # Redis — must match web service settings
      - REDIS_HOST=redis
      - REDIS_PORT=6379
      #- REDIS_PASSWORD=your_strong_redis_password
      #- REDIS_USER=your_redis_username
      # Redis TLS — must match web service
      #- REDIS_SSL=true
      #- REDIS_SSL_VERIFY=true
      #- REDIS_SSL_CA_CERT=/certs/redis/ca.crt
      #- REDIS_SSL_CERT=/certs/redis/client.crt
      #- REDIS_SSL_KEY=/certs/redis/client.key

      # Logging
      - DISPATCHARR_LOG_LEVEL=info

      # Process Priority Configuration (Optional)
      #- CELERY_NICE_LEVEL=5  # Celery/EPG/Background tasks (default: 5, low priority; Range: -20 to 19)

      # Legacy CPU Support (Optional)
      # Uncomment to enable legacy NumPy build for older CPUs (circa 2009)
      # that lack support for newer baseline CPU features:
      #- USE_LEGACY_NUMPY=true

      # Django Configuration
      - DJANGO_SETTINGS_MODULE=dispatcharr.settings
      - PYTHONUNBUFFERED=1

    # --- Advanced Configuration ---
    # Uncomment to enable high priority for Celery (required if CELERY_NICE_LEVEL < 0)
    #cap_add:
    #  - SYS_NICE

  # ============================================================================
  # PostgreSQL
  # ============================================================================
  db:
    image: postgres:17
    container_name: dispatcharr_db
    restart: unless-stopped
    ports:
      - "5436:5432"
    environment:
      - POSTGRES_DB=dispatcharr
      - POSTGRES_USER=dispatch
      - POSTGRES_PASSWORD=secret
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U dispatch -d dispatcharr"]
      interval: 5s
      timeout: 5s
      retries: 5

  # ============================================================================
  # Redis
  # ============================================================================
  redis:
    image: redis:latest
    container_name: dispatcharr_redis
    restart: unless-stopped

    # --- Authentication Configuration (Optional) ---
    # By default, Redis runs without authentication.
    # Choose ONE of the following options if authentication is required:

    # Option 1: Password-only authentication (Redis <6 or default user)
    #command: ["redis-server", "--requirepass", "your_strong_redis_password"]

    # Option 2: Redis 6+ ACL with username + password (requires custom config file - see Redis documentation for configuration)
    #command: ["redis-server", "/etc/redis/redis.conf"]
    #volumes:
    #  - ./redis.conf:/etc/redis/redis.conf:ro

    # --- Health Check Configuration ---
    healthcheck:
      # Default: No authentication
      test: ["CMD", "redis-cli", "ping"]

      # If using Option 1 (password-only), uncomment this instead:
      #test: ["CMD", "redis-cli", "-a", "your_strong_redis_password", "ping"]

      # If using Option 2 (Redis 6+ ACL), uncomment this instead:
      #test: ["CMD", "redis-cli", "--user", "your_redis_username", "-a", "your_strong_redis_password", "ping"]

      interval: 5s
      timeout: 5s
      retries: 5

# ==============================================================================
# Volumes
# ==============================================================================
volumes:
  postgres_data:
