# KalamDB 3-Node Cluster Configuration # # This compose file runs a 3-node KalamDB cluster with Raft consensus. # All nodes share the same network and can communicate via their container names. # # Usage: # ./cluster.sh start # Build and start the cluster # ./cluster.sh stop # Stop the cluster # ./cluster.sh status # Check cluster status # ./cluster.sh logs # View all logs # ./cluster.sh clean # Stop and remove all data # # Port Mapping: # Node 1: HTTP 8081, Raft 9091 # Node 2: HTTP 8082, Raft 9092 # Node 3: HTTP 8083, Raft 9093 services: # ============================================================================ # Node 1 - Initial leader candidate # ============================================================================ kalamdb-node1: image: jamals86/kalamdb:latest container_name: kalamdb-node1 hostname: kalamdb-node1 ports: - "8081:8080" # HTTP API - "9091:9090" # Raft gRPC volumes: - node1_data:/data - shared_storage:/data/storage # Optional: Override server.toml with your own configuration # - ./server1.toml:/config/server.toml:ro environment: KALAMDB_SERVER_HOST: "0.0.0.0" KALAMDB_CLUSTER_ID: "${KALAMDB_CLUSTER_ID:-docker-cluster}" KALAMDB_NODE_ID: "${KALAMDB_NODE_ID_NODE1:-1}" KALAMDB_CLUSTER_RPC_ADDR: "${KALAMDB_CLUSTER_RPC_ADDR_NODE1:-kalamdb-node1:9090}" KALAMDB_CLUSTER_API_ADDR: "${KALAMDB_CLUSTER_API_ADDR_NODE1:-http://kalamdb-node1:8080}" KALAMDB_CLUSTER_PEERS: "${KALAMDB_CLUSTER_PEERS_NODE1:-2@kalamdb-node2:9090@http://kalamdb-node2:8080;3@kalamdb-node3:9090@http://kalamdb-node3:8080}" KALAMDB_ROOT_PASSWORD: "${KALAMDB_ROOT_PASSWORD:-kalamdb123}" KALAMDB_JWT_SECRET: "${KALAMDB_JWT_SECRET:-kalamdb-docker-dev-secret-please-change-32chars}" networks: - kalamdb-cluster restart: unless-stopped command: ["/usr/local/bin/kalamdb-server", "/config/server.toml"] healthcheck: test: ["CMD", "/usr/local/bin/busybox", "wget", "--spider", "-q", "http://127.0.0.1:8080/v1/api/healthcheck"] interval: 10s timeout: 5s start_period: 30s retries: 3 # ============================================================================ # Node 2 # ============================================================================ kalamdb-node2: image: jamals86/kalamdb:latest container_name: kalamdb-node2 hostname: kalamdb-node2 ports: - "8082:8080" # HTTP API - "9092:9090" # Raft gRPC volumes: - node2_data:/data - shared_storage:/data/storage # Optional: Override server.toml with your own configuration # - ./server2.toml:/config/server.toml:ro environment: KALAMDB_SERVER_HOST: "0.0.0.0" KALAMDB_CLUSTER_ID: "${KALAMDB_CLUSTER_ID:-docker-cluster}" KALAMDB_NODE_ID: "${KALAMDB_NODE_ID_NODE2:-2}" KALAMDB_CLUSTER_RPC_ADDR: "${KALAMDB_CLUSTER_RPC_ADDR_NODE2:-kalamdb-node2:9090}" KALAMDB_CLUSTER_API_ADDR: "${KALAMDB_CLUSTER_API_ADDR_NODE2:-http://kalamdb-node2:8080}" KALAMDB_CLUSTER_PEERS: "${KALAMDB_CLUSTER_PEERS_NODE2:-1@kalamdb-node1:9090@http://kalamdb-node1:8080;3@kalamdb-node3:9090@http://kalamdb-node3:8080}" KALAMDB_ROOT_PASSWORD: "${KALAMDB_ROOT_PASSWORD:-kalamdb123}" KALAMDB_JWT_SECRET: "${KALAMDB_JWT_SECRET:-kalamdb-docker-dev-secret-please-change-32chars}" networks: - kalamdb-cluster depends_on: kalamdb-node1: condition: service_started restart: unless-stopped command: ["/usr/local/bin/kalamdb-server", "/config/server.toml"] healthcheck: test: ["CMD", "/usr/local/bin/busybox", "wget", "--spider", "-q", "http://127.0.0.1:8080/v1/api/healthcheck"] interval: 10s timeout: 5s start_period: 30s retries: 3 # ============================================================================ # Node 3 # ============================================================================ kalamdb-node3: image: jamals86/kalamdb:latest container_name: kalamdb-node3 hostname: kalamdb-node3 ports: - "8083:8080" # HTTP API - "9093:9090" # Raft gRPC volumes: - node3_data:/data - shared_storage:/data/storage # Optional: Override server.toml with your own configuration # - ./server3.toml:/config/server.toml:ro environment: KALAMDB_SERVER_HOST: "0.0.0.0" KALAMDB_CLUSTER_ID: "${KALAMDB_CLUSTER_ID:-docker-cluster}" KALAMDB_NODE_ID: "${KALAMDB_NODE_ID_NODE3:-3}" KALAMDB_CLUSTER_RPC_ADDR: "${KALAMDB_CLUSTER_RPC_ADDR_NODE3:-kalamdb-node3:9090}" KALAMDB_CLUSTER_API_ADDR: "${KALAMDB_CLUSTER_API_ADDR_NODE3:-http://kalamdb-node3:8080}" KALAMDB_CLUSTER_PEERS: "${KALAMDB_CLUSTER_PEERS_NODE3:-1@kalamdb-node1:9090@http://kalamdb-node1:8080;2@kalamdb-node2:9090@http://kalamdb-node2:8080}" KALAMDB_ROOT_PASSWORD: "${KALAMDB_ROOT_PASSWORD:-kalamdb123}" KALAMDB_JWT_SECRET: "${KALAMDB_JWT_SECRET:-kalamdb-docker-dev-secret-please-change-32chars}" networks: - kalamdb-cluster depends_on: kalamdb-node1: condition: service_started restart: unless-stopped command: ["/usr/local/bin/kalamdb-server", "/config/server.toml"] healthcheck: test: ["CMD", "/usr/local/bin/busybox", "wget", "--spider", "-q", "http://127.0.0.1:8080/v1/api/healthcheck"] interval: 10s timeout: 5s start_period: 30s retries: 3 # ============================================================================ # Cluster Network # ============================================================================ networks: kalamdb-cluster: driver: bridge ipam: config: - subnet: 172.28.0.0/16 # ============================================================================ # Persistent Volumes # ============================================================================ volumes: node1_data: driver: local node2_data: driver: local node3_data: driver: local shared_storage: driver: local