#!/usr/bin/env bash # SelfHeal Kafka Setup Script (Dev / Lab Only) # ------------------------------------------- # Single-node Kafka broker with ZooKeeper for lab / Quickstart usage. # # This script: # * Downloads Kafka (default 3.7.0, Scala 2.13) # * Starts ZooKeeper and a single Kafka broker on localhost:9092 # * Creates the SelfHeal topics: # - selfheal.alerts.raw.generic # - selfheal.alerts.normalized # - actions-review # - alerts-dlq # # Usage: # ./selfheal-setup-kafka.sh # or: # KAFKA_VERSION=3.7.2 ./selfheal-setup-kafka.sh # # NOTE: This is for dev / lab only. For production, use a proper Kafka # cluster (KRaft or managed Kafka) and just point SelfHeal at it. set -euo pipefail KAFKA_VERSION="${KAFKA_VERSION:-3.7.0}" SCALA_SUFFIX="2.13" KAFKA_TGZ="kafka_${SCALA_SUFFIX}-${KAFKA_VERSION}.tgz" KAFKA_DIR="$HOME/kafka_${SCALA_SUFFIX}-${KAFKA_VERSION}" KAFKA_URL="https://downloads.apache.org/kafka/${KAFKA_VERSION}/${KAFKA_TGZ}" ZOOKEEPER_CONFIG="$KAFKA_DIR/config/zookeeper.properties" SERVER_CONFIG="$KAFKA_DIR/config/server.properties" ZOOKEEPER_DATA_DIR="$KAFKA_DIR/zookeeper-data" KAFKA_LOG_DIR="$KAFKA_DIR/kafka-logs" echo "==> SelfHeal Kafka setup (dev / lab only)" echo " KAFKA_VERSION = ${KAFKA_VERSION}" echo " KAFKA_DIR = ${KAFKA_DIR}" echo "" # 1) Ensure basic tools echo "==> Installing prerequisites (curl, tar, Java)..." sudo apt-get update -y sudo apt-get install -y curl tar openjdk-17-jre-headless # 2) Download Kafka if needed if [ ! -d "$KAFKA_DIR" ]; then echo "==> Kafka directory not found. Downloading ${KAFKA_TGZ} ..." cd "$HOME" if [ ! -f "$KAFKA_TGZ" ]; then echo " Downloading from: ${KAFKA_URL}" curl -fSL "$KAFKA_URL" -o "$KAFKA_TGZ" else echo " Found existing tarball: $KAFKA_TGZ" fi echo "==> Extracting Kafka to $KAFKA_DIR ..." tar xzf "$KAFKA_TGZ" else echo "==> Using existing Kafka directory: $KAFKA_DIR" fi cd "$KAFKA_DIR" # 3) Configure ZooKeeper and Kafka paths echo "==> Configuring ZooKeeper and Kafka log directories ..." mkdir -p "$ZOOKEEPER_DATA_DIR" mkdir -p "$KAFKA_LOG_DIR" # zookeeper.properties: dataDir sed -i "s|^dataDir=.*|dataDir=$ZOOKEEPER_DATA_DIR|" "$ZOOKEEPER_CONFIG" # server.properties: log.dirs and listeners if grep -q "^log.dirs=" "$SERVER_CONFIG"; then sed -i "s|^log.dirs=.*|log.dirs=$KAFKA_LOG_DIR|" "$SERVER_CONFIG" else echo "log.dirs=$KAFKA_LOG_DIR" >> "$SERVER_CONFIG" fi if grep -q "^listeners=" "$SERVER_CONFIG"; then sed -i "s|^listeners=.*|listeners=PLAINTEXT://:9092|" "$SERVER_CONFIG" else echo "listeners=PLAINTEXT://:9092" >> "$SERVER_CONFIG" fi echo "==> Starting ZooKeeper (background)..." if pgrep -f "org.apache.zookeeper.server.quorum.QuorumPeerMain" >/dev/null 2>&1; then echo " ZooKeeper already running; skipping start." else nohup bin/zookeeper-server-start.sh "$ZOOKEEPER_CONFIG" > "$KAFKA_DIR/zookeeper.log" 2>&1 & sleep 10 fi echo "==> Starting Kafka broker (background)..." if pgrep -f "kafka.Kafka" >/dev/null 2>&1; then echo " Kafka broker already running; skipping start." else nohup bin/kafka-server-start.sh "$SERVER_CONFIG" > "$KAFKA_DIR/kafka.log" 2>&1 & sleep 15 fi # 5) Create SelfHeal topics echo "==> Creating SelfHeal topics (if not present)..." TOPICS=( "selfheal.alerts.raw.generic" "selfheal.alerts.normalized" "actions-review" "alerts-dlq" ) for t in "${TOPICS[@]}"; do echo " -> Ensuring topic '$t' exists..." bin/kafka-topics.sh --create \ --if-not-exists \ --bootstrap-server localhost:9092 \ --topic "$t" \ --partitions 3 \ --replication-factor 1 done echo "==> Current topics:" bin/kafka-topics.sh --list --bootstrap-server localhost:9092 || true echo "" echo "==> Kafka lab setup complete." echo " Broker is listening on localhost:9092 via ZooKeeper." echo "" echo " To stop processes manually (lab only):" echo " pkill -f kafka.Kafka || true" echo " pkill -f org.apache.zookeeper.server.quorum.QuorumPeerMain || true" echo "" echo " In /etc/selfheal/selfheal.env, set:" echo " KAFKA_BOOTSTRAP=localhost:9092" echo " KAFKA_BOOTSTRAP_SERVERS=localhost:9092" echo " KAFKA_INCOMING_TOPIC=selfheal.alerts.raw.generic" echo " ALERTS_TOPIC=selfheal.alerts.normalized" echo " ACTION_REVIEW_TOPIC=actions-review" echo " ALERTS_DLQ_TOPIC=alerts-dlq" echo "" echo " For production, point SelfHeal at your organisation's real Kafka" echo " cluster or a managed Kafka service instead of this single-node lab setup."