#!/usr/bin/env bash # Downloads Apache Kafka 4.3.1 (checksum-verified), formats a single-node KRaft cluster and starts it. # Usage: scripts/broker-up.sh [client-port] (default 9092; the controller uses client-port + 1) set -euo pipefail VERSION=4.3.1 PORT="${1:-9092}" CTRL=$((PORT + 1)) HOME_DIR="${KAFKA_DIR:-$(cd "$(dirname "$0")/.." && pwd)/.kafka}" TGZ="kafka_2.13-${VERSION}.tgz" mkdir -p "$HOME_DIR" && cd "$HOME_DIR" if [ ! -d "kafka_2.13-${VERSION}" ]; then curl -fsSL -o "$TGZ" "https://downloads.apache.org/kafka/${VERSION}/${TGZ}" curl -fsSL -o "${TGZ}.sha512" "https://downloads.apache.org/kafka/${VERSION}/${TGZ}.sha512" # The .sha512 file is "name: HEX HEX HEX ..." in groups, so compare after stripping spaces and the name. expected="$(sed 's/^[^:]*: *//' "${TGZ}.sha512" | tr -d ' \n' | tr 'A-F' 'a-f')" actual="$(sha512sum "$TGZ" | cut -d' ' -f1)" [ "$expected" = "$actual" ] || { echo "checksum mismatch for $TGZ" >&2; exit 1; } tar -xzf "$TGZ" fi cd "kafka_2.13-${VERSION}" sed -i "s#^listeners=.*#listeners=PLAINTEXT://:${PORT},CONTROLLER://:${CTRL}#" config/server.properties sed -i "s#^advertised.listeners=.*#advertised.listeners=PLAINTEXT://localhost:${PORT}#" config/server.properties sed -i "s#^controller.quorum.bootstrap.servers=.*#controller.quorum.bootstrap.servers=localhost:${CTRL}#" config/server.properties sed -i "s#^log.dirs=.*#log.dirs=${HOME_DIR}/data-${PORT}#" config/server.properties if [ ! -d "${HOME_DIR}/data-${PORT}" ]; then bin/kafka-storage.sh format --standalone -t "$(bin/kafka-storage.sh random-uuid | tail -1)" -c config/server.properties fi export KAFKA_HEAP_OPTS="${KAFKA_HEAP_OPTS:--Xmx512m -Xms512m}" setsid nohup bin/kafka-server-start.sh config/server.properties > "${HOME_DIR}/broker-${PORT}.log" 2>&1 < /dev/null & for _ in $(seq 1 60); do bin/kafka-topics.sh --bootstrap-server "localhost:${PORT}" --list > /dev/null 2>&1 && break sleep 2 done echo "broker up on localhost:${PORT}; share.version feature:" bin/kafka-features.sh --bootstrap-server "localhost:${PORT}" describe | grep share.version