#!/usr/bin/env bash # Create three distinct Proxmox LXC guests and start a JetStream cluster on vmbr1. # Does not touch host loopback NATS (127.0.0.1:4222) or vmbr0. set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" # shellcheck disable=SC1091 . "$ROOT/cluster.env" # shellcheck disable=SC1091 . "$ROOT/scripts/lib-ct.sh" ct_require_proxmox mapfile -t rows < <(printf '%s\n' "$NODES" | awk 'NF==3 {print}') [[ ${#rows[@]} -eq 3 ]] || { echo "need exactly 3 nodes in cluster.env" >&2; exit 1; } declare -a VMIDS NAMES IPS for row in "${rows[@]}"; do # shellcheck disable=SC2086 set -- $row VMIDS+=("$1"); NAMES+=("$2"); IPS+=("$3") done i=0 for i in 0 1 2; do ct_ensure "${VMIDS[$i]}" "${NAMES[$i]}" "${IPS[$i]}" ct_bootstrap_user "${VMIDS[$i]}" done # Install nats-server + conf + systemd on each guest for i in 0 1 2; do routes="" for j in 0 1 2; do [[ $i -eq $j ]] && continue routes="${routes} nats-route://${IPS[$j]}:6222"$'\n' done tmpconf="$(mktemp)" NAME="${NAMES[$i]}" IP="${IPS[$i]}" CLUSTER="$CLUSTER_NAME" ROUTES="$routes" \ python3 - "$ROOT/conf/nats.conf.tmpl" "$tmpconf" <<'PY' import os, pathlib, sys t = pathlib.Path(sys.argv[1]).read_text() out = t.replace("{{NAME}}", os.environ["NAME"]).replace("{{IP}}", os.environ["IP"]).replace("{{CLUSTER}}", os.environ["CLUSTER"]).replace("{{ROUTES}}", os.environ["ROUTES"]) pathlib.Path(sys.argv[2]).write_text(out) PY sudo pct exec "${VMIDS[$i]}" -- bash -c 'cat > /tmp/nats.conf' < "$tmpconf" sudo pct exec "${VMIDS[$i]}" -- bash -c 'cat > /tmp/nats-server.service' < "$ROOT/systemd/nats-server.service" rm -f "$tmpconf" sudo pct exec "${VMIDS[$i]}" -- bash -lc " set -e export DEBIAN_FRONTEND=noninteractive id nats >/dev/null 2>&1 || useradd -r -s /usr/sbin/nologin nats install -d -m 755 -o nats -g nats /var/lib/nats/jetstream /etc/nats mv /tmp/nats.conf /etc/nats/nats.conf chown root:root /etc/nats/nats.conf chmod 644 /etc/nats/nats.conf if [[ ! -x /usr/local/bin/nats-server ]]; then curl -fsSL https://github.com/nats-io/nats-server/releases/download/v${NATS_VER}/nats-server-v${NATS_VER}-linux-amd64.tar.gz -o /tmp/nats.tgz tar -xzf /tmp/nats.tgz -C /tmp install -m 0755 /tmp/nats-server-v${NATS_VER}-linux-amd64/nats-server /usr/local/bin/nats-server rm -rf /tmp/nats.tgz /tmp/nats-server-v${NATS_VER}-linux-amd64 fi install -m 644 /tmp/nats-server.service /etc/systemd/system/nats-server.service systemctl daemon-reload systemctl enable --now nats-server " echo "nats-server ${NAMES[$i]} ${IPS[$i]}:4222 cluster ${IPS[$i]}:6222" done echo "cluster client URL: nats://${IPS[0]}:4222,nats://${IPS[1]}:4222,nats://${IPS[2]}:4222" echo "lab loopback NATS on the host is unchanged (127.0.0.1:4222)" echo "next: bash $ROOT/scripts/test.sh"