paladin-ai 0.4.3

Enterprise AI orchestration framework with multi-agent coordination patterns
Documentation
services:
  redis:
    image: redis:7-alpine
    container_name: paladin-redis
    ports:
      - "6379:6379"
    command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD:-changeme}
    volumes:
      - redis_data:/data
    environment:
      - REDIS_REPLICATION_MODE=master
    healthcheck:
      test: [ "CMD", "redis-cli", "-a", "${REDIS_PASSWORD:-changeme}", "--no-auth-warning", "ping" ]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 15s
    networks:
      - paladin-network
    restart: unless-stopped

  minio:
    image: minio/minio:latest
    container_name: paladin-minio
    ports:
      - "9000:9000"
      - "9001:9001"
    environment:
      MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin}
      MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin}
      MINIO_BROWSER_REDIRECT_URL: ${MINIO_BROWSER_REDIRECT_URL:-http://localhost:9001}
    command: server /data --console-address ":9001"
    volumes:
      - minio_data:/data
    healthcheck:
      test: [ "CMD", "curl", "-f", "http://localhost:9000/minio/health/live" ]
      interval: 30s
      timeout: 20s
      retries: 3
      start_period: 30s
    networks:
      - paladin-network
    restart: unless-stopped

  # MinIO Client for bucket initialization
  minio-init:
    image: minio/mc:latest
    container_name: paladin-minio-init
    depends_on:
      minio:
        condition: service_healthy
    environment:
      MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin}
      MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin}
    entrypoint: |
      /bin/sh -c "
      echo 'Waiting for MinIO to be ready...'
      until mc alias set minio http://minio:9000 \$$MINIO_ROOT_USER \$$MINIO_ROOT_PASSWORD; do
        echo 'MinIO not ready, waiting...'
        sleep 2
      done
      echo 'MinIO is ready. Creating buckets...'
      mc mb minio/paladin-files --ignore-existing
      mc mb minio/paladin-analysis --ignore-existing
      mc mb minio/paladin-reports --ignore-existing
      mc mb minio/paladin-backups --ignore-existing
      echo 'Setting bucket policies...'
      mc anonymous set public minio/paladin-files
      echo 'Bucket initialization complete'
      "
    networks:
      - paladin-network

  paladin-app:
    build:
      context: ..
      dockerfile: Dockerfile
    container_name: paladin-app
    ports:
      - "8080:8080"
    depends_on:
      redis:
        condition: service_healthy
      minio:
        condition: service_healthy
      minio-init:
        condition: service_completed_successfully
    environment:
      # Redis configuration
      - APP_REDIS_HOST=redis
      - APP_REDIS_PORT=6379
      - APP_REDIS_PASSWORD=${REDIS_PASSWORD:-}
      - APP_REDIS_DB=0
      - APP_REDIS_CONNECTION_TIMEOUT=30
      - APP_REDIS_KEY_PREFIX=paladin:queue
      - APP_REDIS_MAX_RETRIES=3
      - APP_REDIS_ENABLE_PRIORITY_QUEUES=true

      # MinIO configuration
      - APP_MINIO_ENDPOINT=minio:9000
      - APP_MINIO_ACCESS_KEY=${MINIO_ROOT_USER:-minioadmin}
      - APP_MINIO_SECRET_KEY=${MINIO_ROOT_PASSWORD:-minioadmin}
      - APP_MINIO_BUCKET=paladin-files
      - APP_MINIO_SECURE=false
      - APP_MINIO_PATH_STYLE=true
      - APP_MINIO_CONNECTION_TIMEOUT=30
      - APP_MINIO_REQUEST_TIMEOUT=300
      - APP_MINIO_MAX_IDLE_CONNS=10
      - APP_MINIO_MAX_FILE_SIZE=104857600 # 100MB
      - APP_MINIO_ALLOWED_EXTENSIONS=txt,md,json,pdf,doc,docx,jpg,png,gif,rs,py,js,html,css,xml

      # Application configuration
      - APP_SERVER_HOST=0.0.0.0
      - APP_SERVER_PORT=8080
      - APP_LLM_TYPE=${LLM_TYPE:-openai}
      - APP_LLM_URL=${LLM_URL:-https://api.openai.com/v1}
      - APP_LLM_API_KEY=${LLM_API_KEY}
      - APP_MAX_FILE_SIZE=${MAX_FILE_SIZE:-10485760}

      # Message service configuration
      - MESSAGE_SERVICE_MAX_QUEUE_SIZE=10000
      - MESSAGE_SERVICE_WORKER_THREADS=4
      - MESSAGE_SERVICE_ENABLE_PERSISTENCE=true
      - MESSAGE_SERVICE_DEFAULT_TTL_SECONDS=3600
      - MESSAGE_SERVICE_RETRY_ATTEMPTS=3
      - MESSAGE_SERVICE_RETRY_DELAY_MS=1000

      # Logging
      - RUST_LOG=${RUST_LOG:-info}
      - RUST_BACKTRACE=${RUST_BACKTRACE:-0}
    volumes:
      - app_data:/app/data
      - ./config:/app/config:ro
    networks:
      - paladin-network
    restart: unless-stopped
    healthcheck:
      test: [ "CMD", "curl", "-f", "http://localhost:8080/health" ]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s

  redis-commander:
    image: rediscommander/redis-commander:latest
    container_name: paladin-redis-commander
    ports:
      - "8081:8081"
    depends_on:
      - redis
    environment:
      - REDIS_HOSTS=local:redis:6379:0:${REDIS_PASSWORD:-}
      - HTTP_USER=${REDIS_COMMANDER_USER:-admin}
      - HTTP_PASSWORD=${REDIS_COMMANDER_PASSWORD:-admin}
    networks:
      - paladin-network
    restart: unless-stopped
    profiles:
      - dev
      - debug

  # Optional: Redis Insight for advanced Redis monitoring
  redis-insight:
    image: redislabs/redisinsight:latest
    container_name: paladin-redis-insight
    ports:
      - "8001:8001"
    depends_on:
      - redis
    volumes:
      - redis_insight_data:/db
    networks:
      - paladin-network
    restart: unless-stopped
    profiles:
      - dev
      - debug

  qdrant:
    image: qdrant/qdrant:latest
    container_name: paladin-qdrant
    ports:
      - "6333:6333" # HTTP API
      - "6334:6334" # gRPC API
    environment:
      - QDRANT__SERVICE__HTTP_PORT=6333
      - QDRANT__SERVICE__GRPC_PORT=6334
    volumes:
      - qdrant_data:/qdrant/storage
    healthcheck:
      test: [ "CMD", "curl", "-f", "http://localhost:6333/health" ]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 30s
    networks:
      - paladin-network
    restart: unless-stopped
    profiles:
      - dev
      - test

volumes:
  redis_data:
    driver: local
  minio_data:
    driver: local
  app_data:
    driver: local
  redis_insight_data:
    driver: local
  qdrant_data:
    driver: local

networks:
  paladin-network:
    driver: bridge