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-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:
- 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
- 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 - APP_MINIO_ALLOWED_EXTENSIONS=txt,md,json,pdf,doc,docx,jpg,png,gif,rs,py,js,html,css,xml
- 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_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
- 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
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" - "6334:6334" 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