services: postgres: image: postgres:18-alpine environment: POSTGRES_DB: canvas POSTGRES_USER: canvas POSTGRES_PASSWORD: canvas ports: - "15432:5432" volumes: - postgres18-data:/var/lib/postgresql healthcheck: test: ["CMD-SHELL", "pg_isready -U canvas -d canvas"] interval: 5s timeout: 5s retries: 20 redis: image: redis:8-alpine command: ["redis-server", "--appendonly", "yes"] ports: - "16379:6379" volumes: - redis-data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 5s retries: 20 minio: image: minio/minio:RELEASE.2025-09-07T16-13-09Z command: ["server", "/data", "--console-address", ":9001"] environment: MINIO_ROOT_USER: canvas MINIO_ROOT_PASSWORD: canvas-secret volumes: - minio-data:/data ports: - "19000:9000" - "19001:9001" healthcheck: test: ["CMD", "mc", "ready", "local"] interval: 5s timeout: 5s retries: 20 api: build: context: ../server command: ["/app/img-infinite-canvas", "-f", "/app/etc/config.yaml", "-mode", "api"] depends_on: postgres: condition: service_healthy redis: condition: service_healthy minio: condition: service_healthy volumes: - ./config/api.docker.yaml:/app/etc/config.yaml:ro ports: - "8888:8888" worker: build: context: ../server command: ["/app/img-infinite-canvas", "-f", "/app/etc/config.yaml", "-mode", "worker"] depends_on: postgres: condition: service_healthy redis: condition: service_healthy minio: condition: service_healthy volumes: - ./config/api.docker.yaml:/app/etc/config.yaml:ro web: build: context: ../frontend environment: NEXT_PUBLIC_API_PROXY: http://api:8888 depends_on: - api ports: - "3000:3000" volumes: postgres18-data: redis-data: minio-data: