feat(docker): add dev.sh with auto-funding and ATM app setup
- Add dev.sh script for managing regtest development environment - Implement cmd_fund to fund ATM app owner via Lightning.Pub API - Add --fund flag to cmd_up for automatic funding on startup - Update setup_atm_app to write VITE_APP_ID to machine .env - Fix Electron IPC to pass appId and extensionApiUrl to renderer - Restructure repo from nested lamassu-next/ to root The dev.sh script now supports: - ./dev.sh up --fund # Start regtest and auto-fund ATM - ./dev.sh fund # Fund existing ATM app - ./dev.sh status # Show environment status - ./dev.sh reset # Clean restart Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
30a2eb2199
commit
c98f126ba7
180 changed files with 2695 additions and 9587 deletions
335
docker/start-with-regtest.sh
Executable file
335
docker/start-with-regtest.sh
Executable file
|
|
@ -0,0 +1,335 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# Start lamassu-next development environment with comprehensive regtest
|
||||
#
|
||||
# This script:
|
||||
# 1. Connects to the regtest environment at ~/dev/local/docker/regtest
|
||||
# 2. Starts Lightning.Pub with the specified image/worktree
|
||||
# 3. Creates and funds an ATM account
|
||||
# 4. Displays connection info for Zeus wallet and Lightning.Pub nprofile
|
||||
#
|
||||
# Prerequisites:
|
||||
# ~/dev/local/docker/regtest must be running:
|
||||
# cd ~/dev/local/docker/regtest && ./start-regtest
|
||||
#
|
||||
# Usage:
|
||||
# ./start-with-regtest.sh # Start with default image
|
||||
# ./start-with-regtest.sh --image myimage # Use specific Docker image
|
||||
# ./start-with-regtest.sh --worktree ~/path # Build from worktree
|
||||
# ./start-with-regtest.sh down # Stop services
|
||||
# ./start-with-regtest.sh logs # Follow logs
|
||||
# ./start-with-regtest.sh status # Show connection info
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
REGTEST_DIR="${REGTEST_DIR:-$HOME/dev/local/docker/regtest}"
|
||||
DEFAULT_IMAGE="lightning-pub-withdraw:latest"
|
||||
ATM_FUNDING_SATS=100000
|
||||
|
||||
# Colors
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
RED='\033[0;31m'
|
||||
BLUE='\033[0;34m'
|
||||
CYAN='\033[0;36m'
|
||||
BOLD='\033[1m'
|
||||
NC='\033[0m'
|
||||
|
||||
log() { echo -e "${GREEN}[lamassu]${NC} $1"; }
|
||||
warn() { echo -e "${YELLOW}[lamassu]${NC} $1"; }
|
||||
error() { echo -e "${RED}[lamassu]${NC} $1"; }
|
||||
info() { echo -e "${CYAN}[lamassu]${NC} $1"; }
|
||||
|
||||
# Get local IP for external wallet access
|
||||
get_local_ip() {
|
||||
ip route get 1 2>/dev/null | awk '{print $7; exit}' || hostname -I | awk '{print $1}'
|
||||
}
|
||||
|
||||
# Check if regtest is running
|
||||
check_regtest() {
|
||||
if ! docker network inspect lnbits_default &>/dev/null; then
|
||||
error "Regtest network not found!"
|
||||
echo ""
|
||||
echo "Start the regtest environment first:"
|
||||
echo " cd $REGTEST_DIR && ./start-regtest"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if lnd-4 is running (Lightning.Pub's backend)
|
||||
if ! docker exec lnbits-lnd-4-1 lncli --network=regtest getinfo &>/dev/null 2>&1; then
|
||||
warn "lnd-4 not responding. Waiting..."
|
||||
sleep 5
|
||||
fi
|
||||
}
|
||||
|
||||
# Build Lightning.Pub from worktree
|
||||
build_from_worktree() {
|
||||
local worktree="$1"
|
||||
local image_name="lightning-pub-custom:latest"
|
||||
|
||||
if [[ ! -d "$worktree" ]]; then
|
||||
error "Worktree not found: $worktree"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log "Building Lightning.Pub from $worktree..."
|
||||
docker build -t "$image_name" "$worktree"
|
||||
echo "$image_name"
|
||||
}
|
||||
|
||||
# Wait for Lightning.Pub to be ready and get nprofile
|
||||
wait_for_lightning_pub() {
|
||||
log "Waiting for Lightning.Pub to start..."
|
||||
local max_attempts=30
|
||||
local attempt=0
|
||||
|
||||
while [[ $attempt -lt $max_attempts ]]; do
|
||||
if docker logs lamassu-lightning-pub 2>&1 | grep -q "LightningPub listening"; then
|
||||
sleep 2 # Extra time for Nostr middleware
|
||||
return 0
|
||||
fi
|
||||
attempt=$((attempt + 1))
|
||||
sleep 2
|
||||
done
|
||||
|
||||
error "Lightning.Pub failed to start within 60 seconds"
|
||||
docker logs lamassu-lightning-pub 2>&1 | tail -20
|
||||
return 1
|
||||
}
|
||||
|
||||
# Get Lightning.Pub nprofile from logs
|
||||
get_nprofile() {
|
||||
docker logs lamassu-lightning-pub 2>&1 | grep -oP 'nprofile:\s*\K\S+' | tail -1
|
||||
}
|
||||
|
||||
# Get Lightning.Pub pubkey from logs
|
||||
get_pubkey() {
|
||||
docker logs lamassu-lightning-pub 2>&1 | grep -oP 'pubkey:\s*\K[a-f0-9]+' | tail -1
|
||||
}
|
||||
|
||||
# Generate lndconnect URL for Zeus (using lnd-3 which has REST exposed)
|
||||
generate_lndconnect() {
|
||||
local lnd_container="lnbits-lnd-3-1"
|
||||
local lnd_data="$REGTEST_DIR/data/lnd-3"
|
||||
local local_ip=$(get_local_ip)
|
||||
local rest_port=8082 # lnd-3's REST port
|
||||
|
||||
# Get cert and macaroon
|
||||
local cert_path="$lnd_data/tls.cert"
|
||||
local mac_path="$lnd_data/data/chain/bitcoin/regtest/admin.macaroon"
|
||||
|
||||
if [[ ! -f "$cert_path" ]] || [[ ! -f "$mac_path" ]]; then
|
||||
warn "lnd-3 credentials not found. Zeus connection string unavailable."
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Base64url encode (replace + with -, / with _, remove =)
|
||||
local cert_b64=$(base64 -w0 "$cert_path" | tr '+/' '-_' | tr -d '=')
|
||||
local mac_b64=$(base64 -w0 "$mac_path" | tr '+/' '-_' | tr -d '=')
|
||||
|
||||
echo "lndconnect://${local_ip}:${rest_port}?cert=${cert_b64}&macaroon=${mac_b64}"
|
||||
}
|
||||
|
||||
# Create and fund ATM account
|
||||
setup_atm_account() {
|
||||
log "Setting up ATM account..."
|
||||
|
||||
# Create app
|
||||
local app_response=$(curl -s -X POST http://localhost:1776/api/admin/app/add \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer lamassu-dev-admin-token" \
|
||||
-d '{"name":"atm-app","allow_user_creation":true}' 2>/dev/null)
|
||||
|
||||
if echo "$app_response" | grep -q '"status":"OK"'; then
|
||||
local app_id=$(echo "$app_response" | grep -oP '"id":"\K[^"]+')
|
||||
local app_token=$(echo "$app_response" | grep -oP '"auth_token":"\K[^"]+')
|
||||
log "Created ATM app: $app_id"
|
||||
|
||||
# Store app token for later use
|
||||
echo "$app_token" > "$SCRIPT_DIR/.atm-app-token"
|
||||
echo "$app_id" > "$SCRIPT_DIR/.atm-app-id"
|
||||
|
||||
# TODO: Fund the app by creating an invoice and paying from lnd-3
|
||||
# This requires the app to support invoice creation via HTTP API
|
||||
# For now, the app starts with 0 balance
|
||||
|
||||
return 0
|
||||
else
|
||||
warn "Failed to create ATM app: $app_response"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Display connection information
|
||||
show_connection_info() {
|
||||
local nprofile=$(get_nprofile)
|
||||
local pubkey=$(get_pubkey)
|
||||
local local_ip=$(get_local_ip)
|
||||
local lndconnect=$(generate_lndconnect 2>/dev/null || echo "")
|
||||
|
||||
echo ""
|
||||
echo -e "${BOLD}═══════════════════════════════════════════════════════════════${NC}"
|
||||
echo -e "${BOLD} LAMASSU REGTEST ENVIRONMENT ${NC}"
|
||||
echo -e "${BOLD}═══════════════════════════════════════════════════════════════${NC}"
|
||||
echo ""
|
||||
|
||||
echo -e "${CYAN}Lightning.Pub:${NC}"
|
||||
echo -e " Pubkey: ${GREEN}$pubkey${NC}"
|
||||
echo -e " nprofile: ${GREEN}$nprofile${NC}"
|
||||
echo ""
|
||||
|
||||
echo -e "${CYAN}Service URLs:${NC}"
|
||||
echo " Nostr Relay: ws://localhost:7777"
|
||||
echo " Lightning.Pub: http://localhost:1776"
|
||||
echo " Withdraw API: http://localhost:1777"
|
||||
echo " PostgreSQL: localhost:5432"
|
||||
echo ""
|
||||
|
||||
echo -e "${CYAN}External Access (from phone/other devices):${NC}"
|
||||
echo " Nostr Relay: ws://${local_ip}:7777"
|
||||
echo " Withdraw API: http://${local_ip}:1777"
|
||||
echo ""
|
||||
|
||||
if [[ -n "$lndconnect" ]]; then
|
||||
echo -e "${CYAN}Zeus Wallet Connection (lnd-3):${NC}"
|
||||
echo -e " ${GREEN}$lndconnect${NC}"
|
||||
echo ""
|
||||
echo " Scan this with Zeus to connect to lnd-3 for testing payments."
|
||||
echo ""
|
||||
fi
|
||||
|
||||
echo -e "${CYAN}ATM Configuration (apps/machine/.env):${NC}"
|
||||
echo " VITE_RELAY_URL=ws://localhost:7777"
|
||||
echo " VITE_LIGHTNING_PUB_PUBKEY=$pubkey"
|
||||
echo " VITE_EXTENSION_API_URL=http://localhost:1777"
|
||||
echo ""
|
||||
|
||||
echo -e "${CYAN}CLI Helpers:${NC}"
|
||||
echo " source $REGTEST_DIR/docker-scripts.sh"
|
||||
echo " bitcoin-cli-sim -generate 1 # Mine blocks"
|
||||
echo " lncli-sim 4 getinfo # lnd-4 (Lightning.Pub)"
|
||||
echo " lncli-sim 3 getinfo # lnd-3 (Zeus wallet)"
|
||||
echo ""
|
||||
echo -e "${BOLD}═══════════════════════════════════════════════════════════════${NC}"
|
||||
}
|
||||
|
||||
# Start services
|
||||
start() {
|
||||
local image="$DEFAULT_IMAGE"
|
||||
local worktree=""
|
||||
|
||||
# Parse arguments
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--image)
|
||||
image="$2"
|
||||
shift 2
|
||||
;;
|
||||
--worktree)
|
||||
worktree="$2"
|
||||
shift 2
|
||||
;;
|
||||
*)
|
||||
shift
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
log "Checking prerequisites..."
|
||||
check_regtest
|
||||
|
||||
# Build from worktree if specified
|
||||
if [[ -n "$worktree" ]]; then
|
||||
image=$(build_from_worktree "$worktree")
|
||||
fi
|
||||
|
||||
# Check if image exists
|
||||
if ! docker image inspect "$image" &>/dev/null; then
|
||||
error "Docker image not found: $image"
|
||||
echo ""
|
||||
echo "Either:"
|
||||
echo " 1. Build the image: docker build -t $image <path>"
|
||||
echo " 2. Use --worktree: ./start-with-regtest.sh --worktree ~/path/to/lightning-pub"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log "Using Lightning.Pub image: $image"
|
||||
|
||||
# Export environment variables
|
||||
export REGTEST_DATA_DIR="$REGTEST_DIR/data"
|
||||
export LIGHTNING_PUB_IMAGE="$image"
|
||||
export HOST_IP=$(get_local_ip)
|
||||
|
||||
log "Starting lamassu services..."
|
||||
docker compose -f "$SCRIPT_DIR/docker-compose.regtest.yml" up -d
|
||||
|
||||
# Wait for Lightning.Pub and setup
|
||||
if wait_for_lightning_pub; then
|
||||
setup_atm_account || true
|
||||
show_connection_info
|
||||
else
|
||||
error "Failed to start Lightning.Pub. Check logs with: $0 logs lightning-pub"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Stop services
|
||||
stop() {
|
||||
log "Stopping lamassu services..."
|
||||
docker compose -f "$SCRIPT_DIR/docker-compose.regtest.yml" down
|
||||
rm -f "$SCRIPT_DIR/.atm-app-token" "$SCRIPT_DIR/.atm-app-id"
|
||||
log "Services stopped."
|
||||
}
|
||||
|
||||
# Show logs
|
||||
logs() {
|
||||
docker compose -f "$SCRIPT_DIR/docker-compose.regtest.yml" logs -f "$@"
|
||||
}
|
||||
|
||||
# Show status/connection info
|
||||
status() {
|
||||
if ! docker ps --format '{{.Names}}' | grep -q lamassu-lightning-pub; then
|
||||
error "Services not running. Start with: $0 start"
|
||||
exit 1
|
||||
fi
|
||||
show_connection_info
|
||||
}
|
||||
|
||||
# Main
|
||||
case "${1:-start}" in
|
||||
start)
|
||||
shift || true
|
||||
start "$@"
|
||||
;;
|
||||
stop|down)
|
||||
stop
|
||||
;;
|
||||
logs)
|
||||
shift
|
||||
logs "$@"
|
||||
;;
|
||||
status|info)
|
||||
status
|
||||
;;
|
||||
*)
|
||||
echo "Usage: $0 [command] [options]"
|
||||
echo ""
|
||||
echo "Commands:"
|
||||
echo " start Start services (default)"
|
||||
echo " stop, down Stop services"
|
||||
echo " logs [service] Follow logs"
|
||||
echo " status, info Show connection info"
|
||||
echo ""
|
||||
echo "Options for 'start':"
|
||||
echo " --image <name> Use specific Docker image"
|
||||
echo " --worktree <path> Build from Lightning.Pub worktree"
|
||||
echo ""
|
||||
echo "Examples:"
|
||||
echo " $0 # Start with default image"
|
||||
echo " $0 --worktree ~/dev/lightning-pub/withdraw # Build and use worktree"
|
||||
echo " $0 --image lightning-pub-custom:v1 # Use specific image"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
Loading…
Add table
Add a link
Reference in a new issue