services: zookeeper: image: confluentinc/cp-zookeeper:7.6.0 hostname: zookeeper container_name: zookeeper ports: - "2181:2181" environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 volumes: - zookeeper-data:/var/lib/zookeeper/data - zookeeper-logs:/var/lib/zookeeper/log kafka1: image: confluentinc/cp-kafka:7.6.0 hostname: kafka1 container_name: kafka1 depends_on: - zookeeper ports: - "9092:9092" - "9101:9101" environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181' KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka1:29092,PLAINTEXT_HOST://localhost:9092 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3 KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2 KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3 KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 KAFKA_JMX_PORT: 9101 KAFKA_JMX_HOSTNAME: localhost KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'true' volumes: - kafka1-data:/var/lib/kafka/data kafka2: image: confluentinc/cp-kafka:7.6.0 hostname: kafka2 container_name: kafka2 depends_on: - zookeeper ports: - "9093:9093" - "9102:9102" environment: KAFKA_BROKER_ID: 2 KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181' KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka2:29093,PLAINTEXT_HOST://localhost:9093 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3 KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2 KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3 KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 KAFKA_JMX_PORT: 9102 KAFKA_JMX_HOSTNAME: localhost KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'true' volumes: - kafka2-data:/var/lib/kafka/data kafka3: image: confluentinc/cp-kafka:7.6.0 hostname: kafka3 container_name: kafka3 depends_on: - zookeeper ports: - "9094:9094" - "9103:9103" environment: KAFKA_BROKER_ID: 3 KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181' KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka3:29094,PLAINTEXT_HOST://localhost:9094 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3 KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2 KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3 KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 KAFKA_JMX_PORT: 9103 KAFKA_JMX_HOSTNAME: localhost KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'true' volumes: - kafka3-data:/var/lib/kafka/data cassandra: image: cassandra:5.0 hostname: cassandra container_name: cassandra ports: - "9042:9042" # CQL native transport port - "7000:7000" # Inter-node cluster communication - "7199:7199" # JMX monitoring port environment: CASSANDRA_CLUSTER_NAME: 'MyCluster' CASSANDRA_DC: 'dc1' CASSANDRA_RACK: 'rack1' CASSANDRA_ENDPOINT_SNITCH: 'GossipingPropertyFileSnitch' CASSANDRA_NUM_TOKENS: 256 # Reduce memory usage for local development MAX_HEAP_SIZE: '512M' HEAP_NEWSIZE: '128M' # Override JVM opts to limit direct memory to fit in container JVM_OPTS: '-Xms512M -Xmx512M -XX:MaxDirectMemorySize=256M' volumes: - cassandra-data:/var/lib/cassandra # Limit container memory (increased to accommodate heap + direct memory + overhead) mem_limit: 2g memswap_limit: 2g # Disable swap for better performance mem_swappiness: 0 # Allow memory locking (reduces warnings) ulimits: memlock: -1 nofile: soft: 65536 hard: 65536 healthcheck: test: ["CMD-SHELL", "cqlsh -e 'describe cluster'"] interval: 30s timeout: 10s retries: 5 imgproxy: image: darthsim/imgproxy:latest hostname: imgproxy container_name: imgproxy ports: - "9525:9525" environment: IMGPROXY_BIND: ":9525" IMGPROXY_ONLY_PRESETS: "true" IMGPROXY_BASE_URL: "http://localhost:9525" IMGPROXY_USE_ETAG: "true" IMGPROXY_PRESETS: "fullsize=resizing_type:fit/width:2000/height:2000/format:jpeg,thumb=resizing_type:fit/width:200/height:200/format:jpeg" restart: unless-stopped volumes: zookeeper-data: zookeeper-logs: kafka1-data: kafka2-data: kafka3-data: cassandra-data: