services: # MinIO S3-compatible storage for Paimon minio: image: minio/minio:RELEASE.2025-09-07T16-13-09Z container_name: minio ports: - "9000:9000" - "9001:9001" environment: MINIO_ROOT_USER: admin MINIO_ROOT_PASSWORD: password123 MINIO_PROMETHEUS_AUTH_TYPE: public 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 # MinIO bucket initialization minio-init: image: minio/mc:RELEASE.2025-08-13T08-35-41Z container_name: minio-init depends_on: minio: condition: service_healthy entrypoint: > /bin/sh -c " /usr/bin/mc alias set minio http://minio:9000 admin password123; /usr/bin/mc mb --ignore-existing minio/warehouse; /usr/bin/mc mb --ignore-existing minio/checkpoints; echo 'MinIO buckets created successfully'; " zookeeper: image: zookeeper:3.9.2 container_name: zk restart: unless-stopped coordinator-server: build: context: . dockerfile: Dockerfile.fluss image: fluss-paimon:local container_name: fluss-coordinator command: coordinatorServer depends_on: zookeeper: condition: service_started minio-init: condition: service_completed_successfully environment: - | FLUSS_PROPERTIES= zookeeper.address: zookeeper:2181 bind.listeners: FLUSS://coordinator-server:9123 metrics.reporters: prometheus metrics.reporter.prometheus.port: 9249 datalake.format: paimon datalake.paimon.metastore: filesystem datalake.paimon.warehouse: s3://warehouse/ datalake.paimon.s3.endpoint: http://minio:9000 datalake.paimon.s3.access-key: admin datalake.paimon.s3.secret-key: password123 datalake.paimon.s3.path.style.access: true tablet-server: build: context: . dockerfile: Dockerfile.fluss image: fluss-paimon:local container_name: fluss-tablet command: tabletServer depends_on: coordinator-server: condition: service_started minio-init: condition: service_completed_successfully environment: - | FLUSS_PROPERTIES= zookeeper.address: zookeeper:2181 bind.listeners: FLUSS://tablet-server:9123 data.dir: /tmp/fluss/data remote.data.dir: /tmp/fluss/remote-data metrics.reporters: prometheus metrics.reporter.prometheus.port: 9249 datalake.format: paimon datalake.paimon.metastore: filesystem datalake.paimon.warehouse: s3://warehouse/ datalake.paimon.s3.endpoint: http://minio:9000 datalake.paimon.s3.access-key: admin datalake.paimon.s3.secret-key: password123 datalake.paimon.s3.path.style.access: true jobmanager: build: . container_name: flink-jobmanager command: jobmanager ports: - "8083:8081" # Flink Web UI - "9249:9249" # Prometheus metrics environment: - | FLINK_PROPERTIES= jobmanager.rpc.address: jobmanager volumes: - ./conf:/opt/flink/conf depends_on: - minio-init healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:8081/ || exit 1"] interval: 30s timeout: 10s retries: 5 taskmanager: build: . container_name: flink-taskmanager command: taskmanager ports: - "9250:9249" # Prometheus metrics depends_on: jobmanager: condition: service_healthy environment: - | FLINK_PROPERTIES= jobmanager.rpc.address: jobmanager taskmanager.numberOfTaskSlots: 4 volumes: - ./conf:/opt/flink/conf # Prometheus for metrics collection prometheus: image: prom/prometheus:v2.45.0 container_name: prometheus ports: - "9090:9090" volumes: - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/consoles' - '--storage.tsdb.retention.time=200h' - '--web.enable-lifecycle' # Grafana for visualization grafana: image: grafana/grafana:10.0.0 container_name: grafana ports: - "3000:3000" volumes: - grafana_data:/var/lib/grafana - ./monitoring/grafana/provisioning:/etc/grafana/provisioning environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=admin - GF_USERS_ALLOW_SIGN_UP=false depends_on: - prometheus volumes: minio_data: driver: local prometheus_data: driver: local grafana_data: driver: local networks: default: name: fluss-paimon-network