services: postgres: image: postgres:16 container_name: ecommrt_postgres command: ["postgres", "-c", "wal_level=logical"] environment: POSTGRES_USER: user POSTGRES_PASSWORD: pass POSTGRES_DB: ecommrt POSTGRES_INITDB_ARGS: "--encoding=UTF8" ports: - "5432:5432" volumes: - postgres-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U user -d ecommrt"] interval: 5s timeout: 3s retries: 10 start_period: 10s networks: - cdc-net kafka: image: apache/kafka:4.2.1 container_name: ecommrt_kafka ports: - "9092:9092" environment: KAFKA_NODE_ID: "1" KAFKA_PROCESS_ROLES: "broker,controller" KAFKA_CONTROLLER_QUORUM_VOTERS: "1@kafka:9093" KAFKA_LISTENERS: "PLAINTEXT://:9092,CONTROLLER://:9093" KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka:9092" KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT" KAFKA_CONTROLLER_LISTENER_NAMES: "CONTROLLER" KAFKA_INTER_BROKER_LISTENER_NAME: "PLAINTEXT" KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true" KAFKA_NUM_PARTITIONS: "10" KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: "1" KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: "1" KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: "1" CLUSTER_ID: "MkU3OEVBNTcwNTJENDM2Qk" volumes: - kafka-data:/var/lib/kafka/data healthcheck: test: ["CMD-SHELL", "/opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --list"] interval: 10s timeout: 5s retries: 10 start_period: 30s networks: - cdc-net kafka-ui: image: provectuslabs/kafka-ui:latest container_name: ecommrt_kafka_ui ports: - "8081:8080" environment: KAFKA_CLUSTERS_0_NAME: local KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9092 depends_on: kafka: condition: service_healthy networks: - cdc-net debezium: image: debezium/connect:2.7.3.Final container_name: ecommrt_debezium ports: - "8083:8083" environment: BOOTSTRAP_SERVERS: kafka:9092 GROUP_ID: "1" CONFIG_STORAGE_TOPIC: debezium_configs OFFSET_STORAGE_TOPIC: debezium_offsets STATUS_STORAGE_TOPIC: debezium_status depends_on: kafka: condition: service_healthy postgres: condition: service_healthy healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:8083/connectors || exit 1"] interval: 10s timeout: 5s retries: 15 start_period: 45s networks: - cdc-net clickhouse: image: clickhouse/clickhouse-server:latest container_name: ecommrt_clickhouse environment: CLICKHOUSE_USER: default CLICKHOUSE_PASSWORD: clickhouse CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: "0" ports: - "8123:8123" - "9000:9000" volumes: - clickhouse-data:/var/lib/clickhouse - clickhouse-logs:/var/log/clickhouse-server - ./clickhouse/init.sql:/docker-entrypoint-initdb.d/init.sql:ro healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8123/ping"] interval: 5s timeout: 3s retries: 10 start_period: 10s ulimits: nofile: soft: 262144 hard: 262144 networks: - cdc-net prometheus: image: prom/prometheus:v2.52.0 container_name: ecommrt_prometheus ports: - "9090:9090" volumes: - ./config/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro - prometheus-data:/prometheus command: - "--config.file=/etc/prometheus/prometheus.yml" - "--storage.tsdb.path=/prometheus" - "--web.console.libraries=/usr/share/prometheus/console_libraries" - "--web.console.templates=/usr/share/prometheus/consoles" healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:9090/-/healthy"] interval: 10s timeout: 5s retries: 5 start_period: 10s networks: - cdc-net grafana: image: grafana/grafana:11.0.0 container_name: ecommrt_grafana ports: - "3000:3000" environment: GF_SECURITY_ADMIN_USER: admin GF_SECURITY_ADMIN_PASSWORD: admin GF_USERS_ALLOW_SIGN_UP: "false" GF_AUTH_ANONYMOUS_ENABLED: "true" GF_AUTH_ANONYMOUS_ORG_ROLE: Viewer GF_AUTH_DISABLE_LOGIN_FORM: "true" GF_INSTALL_PLUGINS: grafana-clickhouse-datasource volumes: - ./grafana/provisioning:/etc/grafana/provisioning:ro - grafana-data:/var/lib/grafana depends_on: prometheus: condition: service_healthy healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/api/health"] interval: 10s timeout: 5s retries: 5 start_period: 30s networks: - cdc-net producer: build: . image: ecommrt_server container_name: ecommrt_producer command: ["./server", "producer"] ports: - "2112:2112" environment: KAFKA_BROKERS: "kafka:9092" DATA_FILE: "/app/data/olist/olist_orders_dataset.csv" NUM_WORKERS: "200" volumes: - ./data:/app/data:ro depends_on: kafka: condition: service_healthy deploy: resources: limits: cpus: "1.0" memory: 256M networks: - cdc-net consumer: image: ecommrt_server command: ["./server", "consumer"] expose: - "2113" deploy: replicas: 3 resources: limits: cpus: "0.5" memory: 256M reservations: cpus: "0.1" memory: 64M environment: KAFKA_BROKERS: "kafka:9092" POSTGRES_DSN: "postgres://user:pass@postgres:5432/ecommrt" depends_on: kafka: condition: service_healthy postgres: condition: service_healthy producer: condition: service_started restart: on-failure networks: - cdc-net networks: cdc-net: driver: bridge volumes: postgres-data: kafka-data: clickhouse-data: clickhouse-logs: prometheus-data: grafana-data: