version: '3.8' services: postgres: image: postgres:16-alpine container_name: captcha-postgres environment: POSTGRES_DB: captcha_forge POSTGRES_USER: pgsql POSTGRES_PASSWORD: ${PG_PASSWORD:-tianai-captcha-pg} ports: - "5432:5432" volumes: - pg-data:/var/lib/postgresql/data - ./sql/init.sql:/docker-entrypoint-initdb.d/01-init.sql healthcheck: test: ["CMD-SHELL", "pg_isready -U pgsql -d captcha_forge"] interval: 10s timeout: 5s retries: 5 redis: image: redis:7-alpine container_name: captcha-redis ports: - "6379:6379" volumes: - redis-data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 minio: image: minio/minio:latest container_name: captcha-minio environment: MINIO_ROOT_USER: ${MINIO_USER:-minioadmin} MINIO_ROOT_PASSWORD: ${MINIO_PASSWORD:-minioadmin} ports: - "9000:9000" - "9001:9001" volumes: - minio-data:/data command: server /data --console-address ":9001" healthcheck: test: ["CMD", "mc", "ready", "local"] interval: 10s timeout: 5s retries: 5 captcha-platform: build: context: . dockerfile: Dockerfile container_name: captcha-platform environment: SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/captcha_forge SPRING_DATASOURCE_USERNAME: pgsql SPRING_DATASOURCE_PASSWORD: ${PG_PASSWORD:-tianai-captcha-pg} SPRING_DATA_REDIS_HOST: redis SPRING_DATA_REDIS_PORT: 6379 MINIO_ENDPOINT: http://minio:9000 MINIO_ACCESS_KEY: ${MINIO_USER:-minioadmin} MINIO_SECRET_KEY: ${MINIO_PASSWORD:-minioadmin} JWT_SECRET: ${JWT_SECRET:-tianai-captcha-jwt-secret-key-must-be-at-least-256-bits-long-for-hs256} ports: - "18200:18200" depends_on: postgres: condition: service_healthy redis: condition: service_healthy minio: condition: service_healthy healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:18200/api/admin/stats || exit 1"] interval: 30s timeout: 10s retries: 3 captcha-admin: build: context: ../tianai-captcha-platform-ui dockerfile: Dockerfile container_name: captcha-admin ports: - "3000:80" depends_on: - captcha-platform volumes: pg-data: redis-data: minio-data: