- Fix EXTENSION_SERVICE_URL default to localhost (was hardcoded LAN IP) - Fix strfry healthcheck (BusyBox nc lacks -z, use /proc/net/tcp) - Add LP healthcheck + depends_on strfry - Add regtest-bootstrap.sh: funds LND, opens channels, creates LP app - Add regtest.sh: single management script (up/down/reset/status/logs/lncli/bitcoin) - Minimal start uses only 3 containers (bitcoind, lnd-1, lnd-4) instead of 17 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
142 lines
4.9 KiB
Bash
Executable file
142 lines
4.9 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# regtest.sh — Manage the LP+LND regtest development environment
|
|
#
|
|
# Usage:
|
|
# ./regtest.sh up Start everything + bootstrap
|
|
# ./regtest.sh down Stop everything
|
|
# ./regtest.sh reset Full teardown (volumes + data) and fresh start
|
|
# ./regtest.sh status Show container status
|
|
# ./regtest.sh logs [svc] Tail logs (lp, relay, miner, lnd1, lnd4, bitcoind)
|
|
# ./regtest.sh lncli N Run lncli on LND-N (e.g. ./regtest.sh lncli 1 getinfo)
|
|
# ./regtest.sh bitcoin Run bitcoin-cli (e.g. ./regtest.sh bitcoin getblockcount)
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
REGTEST_DIR="${REGTEST_DIR:-$HOME/dev/local/docker/regtest}"
|
|
COMPOSE_FILE="${SCRIPT_DIR}/docker-compose.regtest.yml"
|
|
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
CYAN='\033[0;36m'
|
|
NC='\033[0m'
|
|
|
|
# -- Detect container prefix (regtest- or lnbits-) --
|
|
detect_prefix() {
|
|
if docker ps -f name=regtest-bitcoind-1 -f status=running --format '{{.Names}}' | grep -q .; then
|
|
echo "regtest"
|
|
elif docker ps -f name=lnbits-bitcoind-1 -f status=running --format '{{.Names}}' | grep -q .; then
|
|
echo "lnbits"
|
|
else
|
|
echo ""
|
|
fi
|
|
}
|
|
|
|
cmd_up() {
|
|
echo -e "${CYAN}Starting regtest (bitcoind + lnd-1 + lnd-4)...${NC}"
|
|
cd "$REGTEST_DIR" && docker compose up -d bitcoind lnd-1 lnd-4
|
|
|
|
echo -e "${CYAN}Starting lamassu services...${NC}"
|
|
docker compose -f "$COMPOSE_FILE" up -d
|
|
|
|
echo -e "${CYAN}Running bootstrap...${NC}"
|
|
"$SCRIPT_DIR/regtest-bootstrap.sh"
|
|
}
|
|
|
|
cmd_down() {
|
|
echo -e "${CYAN}Stopping lamassu services...${NC}"
|
|
docker compose -f "$COMPOSE_FILE" down 2>/dev/null || true
|
|
|
|
echo -e "${CYAN}Stopping regtest...${NC}"
|
|
cd "$REGTEST_DIR" && docker compose down 2>/dev/null || true
|
|
|
|
echo -e "${GREEN}All stopped.${NC}"
|
|
}
|
|
|
|
cmd_reset() {
|
|
echo -e "${CYAN}Full reset: tearing down everything + wiping data...${NC}"
|
|
|
|
docker compose -f "$COMPOSE_FILE" down -v 2>/dev/null || true
|
|
cd "$REGTEST_DIR" && docker compose down -v 2>/dev/null || true
|
|
|
|
# Clean LND data (root-owned from containers)
|
|
docker run --rm -v "$REGTEST_DIR/data:/data" alpine sh -c 'rm -rf /data/lnd-1/* /data/lnd-4/*' 2>/dev/null || true
|
|
|
|
echo -e "${GREEN}Clean. Starting fresh...${NC}"
|
|
cmd_up
|
|
}
|
|
|
|
cmd_status() {
|
|
echo -e "${CYAN}Containers:${NC}"
|
|
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' | grep -E 'regtest|lamassu|NAMES' | sort
|
|
|
|
PREFIX=$(detect_prefix)
|
|
if [ -n "$PREFIX" ]; then
|
|
echo ""
|
|
BLOCK=$(docker exec "${PREFIX}-bitcoind-1" bitcoin-cli -regtest getblockcount 2>/dev/null || echo "?")
|
|
echo -e " ${CYAN}Block height:${NC} ${BLOCK}"
|
|
|
|
for N in 1 4; do
|
|
SYNCED=$(docker exec "${PREFIX}-lnd-${N}-1" lncli --network regtest --rpcserver="lnd-${N}:10009" getinfo 2>/dev/null | jq -r '.synced_to_chain' 2>/dev/null || echo "?")
|
|
echo -e " ${CYAN}LND-${N} synced:${NC} ${SYNCED}"
|
|
done
|
|
|
|
LP_STATUS=$(curl -so /dev/null -w "%{http_code}" http://localhost:1776 2>/dev/null || echo "down")
|
|
echo -e " ${CYAN}LP status:${NC} ${LP_STATUS}"
|
|
|
|
EXT_STATUS=$(curl -so /dev/null -w "%{http_code}" http://localhost:1777 2>/dev/null || echo "down")
|
|
echo -e " ${CYAN}Extension:${NC} ${EXT_STATUS}"
|
|
fi
|
|
}
|
|
|
|
cmd_logs() {
|
|
local svc="${1:-lp}"
|
|
case "$svc" in
|
|
lp|lightning-pub) docker logs -f --tail 50 lamassu-lightning-pub ;;
|
|
relay|strfry) docker logs -f --tail 50 lamassu-relay ;;
|
|
miner) docker logs -f --tail 50 lamassu-miner ;;
|
|
lnd1|lnd-1) PREFIX=$(detect_prefix); docker logs -f --tail 50 "${PREFIX}-lnd-1-1" ;;
|
|
lnd4|lnd-4) PREFIX=$(detect_prefix); docker logs -f --tail 50 "${PREFIX}-lnd-4-1" ;;
|
|
bitcoind) PREFIX=$(detect_prefix); docker logs -f --tail 50 "${PREFIX}-bitcoind-1" ;;
|
|
*) echo "Unknown service: $svc (try: lp, relay, miner, lnd1, lnd4, bitcoind)"; exit 1 ;;
|
|
esac
|
|
}
|
|
|
|
cmd_lncli() {
|
|
local N="$1"; shift
|
|
PREFIX=$(detect_prefix)
|
|
if [ -z "$PREFIX" ]; then
|
|
echo -e "${RED}No running regtest found${NC}"; exit 1
|
|
fi
|
|
docker exec "${PREFIX}-lnd-${N}-1" lncli --network regtest --rpcserver="lnd-${N}:10009" "$@"
|
|
}
|
|
|
|
cmd_bitcoin() {
|
|
PREFIX=$(detect_prefix)
|
|
if [ -z "$PREFIX" ]; then
|
|
echo -e "${RED}No running regtest found${NC}"; exit 1
|
|
fi
|
|
docker exec "${PREFIX}-bitcoind-1" bitcoin-cli -regtest "$@"
|
|
}
|
|
|
|
# -- Main --
|
|
case "${1:-help}" in
|
|
up) cmd_up ;;
|
|
down) cmd_down ;;
|
|
reset) cmd_reset ;;
|
|
status) cmd_status ;;
|
|
logs) shift; cmd_logs "${1:-lp}" ;;
|
|
lncli) shift; cmd_lncli "$@" ;;
|
|
bitcoin) shift; cmd_bitcoin "$@" ;;
|
|
*)
|
|
echo "Usage: $0 {up|down|reset|status|logs|lncli|bitcoin}"
|
|
echo ""
|
|
echo " up Start everything + bootstrap"
|
|
echo " down Stop everything"
|
|
echo " reset Full teardown + fresh start"
|
|
echo " status Show container & service status"
|
|
echo " logs [s] Tail logs (lp, relay, miner, lnd1, lnd4, bitcoind)"
|
|
echo " lncli N Run lncli on LND-N (e.g. $0 lncli 1 getinfo)"
|
|
echo " bitcoin Run bitcoin-cli (e.g. $0 bitcoin getblockcount)"
|
|
;;
|
|
esac
|