version: "3.7" services: # ───────────── infra core ───────────── zookeeper: image: confluentinc/cp-zookeeper:latest environment: ZOOKEEPER_CLIENT_PORT: 2181 ports: [ "2181:2181" ] networks: [ kafka_network ] healthcheck: test: [ "CMD", "nc", "-z", "localhost", "2181" ] interval: 10s retries: 5 start_period: 20s timeout: 5s kafka: image: confluentinc/cp-kafka:latest container_name: kafka ports: - "9093:9093" # internal listener - "9094:9094" # outside listener - "9999:9999" # classic JMX (optional) - "8778:8778" # Jolokia HTTP → Telegraf environment: KAFKA_OPTS: "-javaagent:/jolokia/jolokia-agent.jar=port=8778,host=0.0.0.0" # standard listeners KAFKA_LISTENERS: INSIDE://0.0.0.0:9093,OUTSIDE://0.0.0.0:9094 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka:9093,OUTSIDE://localhost:9094 KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_BROKER_ID: 1 KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false" # ── JMX + Jolokia ── KAFKA_JMX_PORT: 9999 # KAFKA_OPTS: > # -javaagent:/jolokia/jolokia-agent.jar=port=8778,host=0.0.0.0 volumes: - kafka-data:/var/lib/kafka - ./monitoring:/jolokia:ro depends_on: zookeeper: condition: service_healthy networks: [ kafka_network ] # simple topic/partition browser (unchanged) kafka-manager: image: hlebalbau/kafka-manager:latest environment: ZK_HOSTS: "zookeeper:2181" ports: [ "9000:9000" ] depends_on: [ kafka ] networks: [ kafka_network ] # ───────────── monitoring stack ───────────── influxdb: image: influxdb:2.7 ports: - "8086:8086" environment: # ─── AUTOMATED FIRST-TIME SETUP ─── DOCKER_INFLUXDB_INIT_MODE: setup DOCKER_INFLUXDB_INIT_USERNAME: admin DOCKER_INFLUXDB_INIT_PASSWORD: admin123 DOCKER_INFLUXDB_INIT_ORG: local DOCKER_INFLUXDB_INIT_BUCKET: kafka_metrics DOCKER_INFLUXDB_INIT_ADMIN_TOKEN: my-super-secret-token # ─ optional retention ─ DOCKER_INFLUXDB_INIT_RETENTION: 168h networks: [ kafka_network ] volumes: - influxdb-data:/var/lib/influxdb2 grafana: image: grafana/grafana-oss:12.0.0 # or :latest container_name: grafana ports: - "3000:3000" environment: GF_SECURITY_ADMIN_USER: admin GF_SECURITY_ADMIN_PASSWORD: admin123 # GF_INSTALL_PLUGINS: grafana-influxdb-flux-datasource depends_on: [ influxdb ] networks: [ kafka_network ] telegraf: image: telegraf:1.30 environment: - INFLUX_TOKEN=6StfowdGd-9-z5YoU3fuEStNYwqmBpv6pUVosfDvaCWpYufv_bW2SRRWRHZ7P2W9NnHUgv5h9oSzbgVt-INBMQ== - INFLUX_ORG=local - INFLUX_BUCKET=kafka_metrics depends_on: [ kafka, influxdb ] networks: [ kafka_network ] volumes: - ./monitoring/telegraf.conf:/etc/telegraf/telegraf.conf:ro - ./monitoring:/jolokia:ro networks: kafka_network: driver: bridge volumes: kafka-data: influxdb-data: