services: postgres: image: postgres:17-alpine environment: POSTGRES_DB: docuvault POSTGRES_USER: postgres POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - postgres_data:/var/lib/postgresql/data - ./docker/postgres/initdb.d:/docker-entrypoint-initdb.d:ro healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d docuvault"] interval: 10s timeout: 5s retries: 5 start_period: 10s minio: image: minio/minio:latest command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: ${MINIO_ROOT_USER} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD} # RESEARCH.md Finding 3, T-03-09: allow browser CORS preflight for direct PUT uploads. # Use FRONTEND_URL (plain string) not CORS_ORIGINS (pydantic JSON list format). MINIO_API_CORS_ALLOW_ORIGIN: ${FRONTEND_URL:-http://localhost:5173} MINIO_SERVER_URL: http://localhost:9000 ports: - "9000:9000" - "9001:9001" volumes: - minio_data:/data healthcheck: test: ["CMD", "mc", "ready", "local"] interval: 10s timeout: 5s retries: 5 start_period: 15s minio-init: image: minio/mc:latest depends_on: minio: condition: service_healthy environment: MINIO_ROOT_USER: ${MINIO_ROOT_USER} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD} MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY} MINIO_SECRET_KEY: ${MINIO_SECRET_KEY} MINIO_BUCKET: ${MINIO_BUCKET} entrypoint: ["/bin/sh", "-c"] command: - | set -eu mc alias set local http://minio:9000 "$$MINIO_ROOT_USER" "$$MINIO_ROOT_PASSWORD" mc mb --ignore-existing "local/$$MINIO_BUCKET" mc admin user add local "$$MINIO_ACCESS_KEY" "$$MINIO_SECRET_KEY" || true cat > /tmp/docuvault-policy.json <