Files
zeekay cb46f347b6 testnet: multi-node dexd DEX testnet harness (evo amd64 + spark arm64)
deploy/testnet: one-command-per-box bring-up for a fleet of standalone
`dexd run` venues across two boxes, a cross-arch determinism proof, and a
ZAP load/throughput bench (drives the existing cmd/dexbench).

- compose.yml + gen-compose.sh: N independent venues/box (default 3, scales
  to ~11), one ZAP port/node, per-node data dirs, 128GB-box resource caps.
- Dockerfile: pure-Go CPU image (dexd + dexbench), native amd64/arm64.
- Makefile: make up/bench/verify/down — git pull + one command per box.
- topology.md: honest consensus model (independent venues, deterministic
  per-node genesis, no gossip) + the luxd `dexd plugin` BFT path.
- overlay/: opt-in hanzozt (OpenZiti) tunneler for NAT; direct 2.5GbE is the
  default for true wire numbers.
- README.md: exact per-box commands, 128GB sizing, reading bench output.

Validated locally: signed place/cross load 0 rejects (cross=1 fill/submit);
dexbench -verify across two independent venues PASS (byte-identical 3-fill
multi-level sweep).
2026-06-26 13:22:15 -07:00

74 lines
2.5 KiB
Bash
Executable File

#!/usr/bin/env bash
# gen-compose.sh — emit compose.gen.yml with N independent dexd venues.
#
# Same shape as the hand-written compose.yml (the 3-node reference), generated for
# any N. Reads .env if present; every value falls back to a sane default.
#
# N=11 ./gen-compose.sh # writes compose.gen.yml with 11 venues
# docker compose -f compose.gen.yml up -d
#
# Node i: host port BASE_PORT+i -> container 9099, volume dexN-data, mem/cpu caps.
set -euo pipefail
cd "$(dirname "$0")"
# Load .env (export every assignment) if it exists.
if [ -f .env ]; then set -a; . ./.env; set +a; fi
N="${N:-3}"
DEX_IMAGE="${DEX_IMAGE:-dexd-testnet:local}"
BASE_PORT="${BASE_PORT:-9099}"
BIND_ADDR="${BIND_ADDR:-0.0.0.0}"
NODE_MEM="${NODE_MEM:-6g}"
NODE_CPUS="${NODE_CPUS:-4.0}"
OUT="${OUT:-compose.gen.yml}"
case "$N" in (*[!0-9]*|"") echo "gen-compose: N must be a positive integer (got '$N')" >&2; exit 2;; esac
[ "$N" -ge 1 ] || { echo "gen-compose: N must be >= 1" >&2; exit 2; }
{
echo "# GENERATED by gen-compose.sh — N=${N}. Do not edit; re-run the generator."
echo "# ${N} independent dexd venues (own zapdb + own sealer). See topology.md."
echo
echo "x-venue: &venue"
echo " image: ${DEX_IMAGE}"
echo " restart: unless-stopped"
echo " stop_grace_period: 30s"
echo " healthcheck:"
echo ' test: ["CMD", "nc", "-z", "127.0.0.1", "9099"]'
echo " interval: 10s"
echo " timeout: 3s"
echo " retries: 5"
echo " start_period: 10s"
echo " deploy:"
echo " resources:"
echo " limits:"
echo " cpus: \"${NODE_CPUS}\""
echo " memory: ${NODE_MEM}"
echo " reservations:"
echo " memory: 512m"
echo " ulimits:"
echo " nofile: { soft: 1048576, hard: 1048576 }"
echo " networks: [dexnet]"
echo
echo "services:"
for i in $(seq 0 $((N-1))); do
port=$((BASE_PORT + i))
echo " dex${i}:"
echo " <<: *venue"
echo " container_name: dex${i}"
echo ' command: ["run", "-addr", "0.0.0.0:9099", "-db", "/data/db"]'
echo " ports: [\"${BIND_ADDR}:${port}:9099\"]"
echo " volumes: [\"dex${i}-data:/data\"]"
echo " labels: { dexd.testnet.node: \"${i}\" }"
done
echo
echo "networks:"
echo " dexnet:"
echo " driver: bridge"
echo
echo "volumes:"
for i in $(seq 0 $((N-1))); do echo " dex${i}-data:"; done
} > "$OUT"
echo "wrote ${OUT}: ${N} venues, host ports ${BASE_PORT}..$((BASE_PORT+N-1)) on ${BIND_ADDR}, ${NODE_MEM}/${NODE_CPUS}cpu each"