name: development networks: develop: name: develop external: true volumes: cassandra: influx-config: influx-data: postgres: redis: kafka: services: influxdb: image: influxdb:2.7.12-alpine container_name: InfluxDB restart: unless-stopped environment: DOCKER_INFLUXDB_INIT_MODE: setup DOCKER_INFLUXDB_INIT_USERNAME: influx DOCKER_INFLUXDB_INIT_PASSWORD: password DOCKER_INFLUXDB_INIT_ADMIN_TOKEN: influxdbToken== DOCKER_INFLUXDB_INIT_ORG: hlaeja_ltd DOCKER_INFLUXDB_INIT_BUCKET: device-data networks: - develop ports: - 8086:8086 volumes: - influx-data:/var/lib/influxdb2 - influx-config:/etc/influxdb2 postgres: image: postgres:17.5-alpine container_name: PostgreSQL restart: unless-stopped environment: POSTGRES_USER: postgres POSTGRES_PASSWORD : password ports: - 5432:5432 networks: - develop volumes: - postgres:/var/lib/postgresql/data cassandra: image: cassandra:5.0.4 container_name: Cassandra restart: unless-stopped environment: CASSANDRA_USER: cassandra CASSANDRA_PASSWORD: password networks: - develop ports: - 9042:9042 volumes: - cassandra:/var/lib/cassandra redis: image: redis:8.0.3-alpine container_name: Redis restart: unless-stopped environment: REDIS_PASSWORD: password networks: - develop ports: - 6379:6379 volumes: - redis:/data kafka: image: bitnami/kafka:latest container_name: Kafka restart: unless-stopped ports: - 9091:9091 environment: # ---- KRaft single-node (broker + controller) ---- - KAFKA_ENABLE_KRAFT=yes - KAFKA_CFG_PROCESS_ROLES=broker,controller - KAFKA_CFG_NODE_ID=1 - KAFKA_KRAFT_CLUSTER_ID=Q1BGMDAwMDAwMDAwMDAwMA - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka:9093 # ---- Listeners ---- # Bind all, three names: INTERNAL (cluster+in-docker clients), EXTERNAL (host clients), CONTROLLER (KRaft) - KAFKA_CFG_LISTENERS=INTERNAL://:9092,EXTERNAL://:9091,CONTROLLER://:9093 # How clients discover us: - KAFKA_CFG_ADVERTISED_LISTENERS=INTERNAL://kafka:9092,EXTERNAL://localhost:9091 - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,INTERNAL:SASL_PLAINTEXT,EXTERNAL:SASL_PLAINTEXT - KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNAL # ---- SASL/PLAIN (no TLS) ---- # Enable PLAIN globally and for both listeners - KAFKA_CFG_SASL_ENABLED_MECHANISMS=PLAIN - KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL=PLAIN - KAFKA_CFG_LISTENER_NAME_INTERNAL_SASL_ENABLED_MECHANISMS=PLAIN - KAFKA_CFG_LISTENER_NAME_EXTERNAL_SASL_ENABLED_MECHANISMS=PLAIN # Users (Bitnami helper vars wire JAAS for you) - KAFKA_CLIENT_USERS=kafka - KAFKA_CLIENT_PASSWORDS=password - KAFKA_INTER_BROKER_USER=broker - KAFKA_INTER_BROKER_PASSWORD=password # Dev-friendly defaults - KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true - KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=1 - KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=1 - KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=1 - KAFKA_HEAP_OPTS=-Xms512m -Xmx512m volumes: - kafka:/bitnami/kafka networks: - develop kafka-ui: image: provectuslabs/kafka-ui:latest container_name: KafkaUi restart: unless-stopped depends_on: - kafka ports: - "9090:8080" environment: # Optional: allow adding clusters dynamically in UI - DYNAMIC_CONFIG_ENABLED=true # First cluster: local Docker Kafka - KAFKA_CLUSTERS_0_NAME=local - KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=kafka:9092 - KAFKA_CLUSTERS_0_PROPERTIES_SECURITY_PROTOCOL=SASL_PLAINTEXT - KAFKA_CLUSTERS_0_PROPERTIES_SASL_MECHANISM=PLAIN - KAFKA_CLUSTERS_0_PROPERTIES_SASL_JAAS_CONFIG=org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka" password="password"; networks: - develop