feat(docker): auto-setup Lightning channels for unified regtest mode
Add automatic channel setup to dev.sh for seamless ATM development: - Add ensure_lnd4_channel() to open channels from lnd-1 hub to lnd-3 and lnd-4 - lnd-4 receives channel for Lightning.Pub invoice creation - lnd-3 receives channel for paying invoices (ATM funding) - Auto-fund lnd-1 via mining if balance is low - Include retry logic for channel opening (5 attempts) - Mine extra blocks and wait for graph propagation to avoid NO_ROUTE errors - Show channel balance in status output This makes the unified mode fully functional from a clean slate: ./docker/dev.sh up --fund # Sets up regtest, channels, and funds ATM ./docker/dev.sh atm # Launch ATM application Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
c3564beccf
commit
90eceeafd9
1 changed files with 157 additions and 2 deletions
159
docker/dev.sh
159
docker/dev.sh
|
|
@ -86,18 +86,165 @@ is_lnd4_ready() {
|
||||||
docker exec lnbits-lnd-4-1 lncli --network=regtest --rpcserver=lnd-4:10009 getinfo &>/dev/null 2>&1
|
docker exec lnbits-lnd-4-1 lncli --network=regtest --rpcserver=lnd-4:10009 getinfo &>/dev/null 2>&1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lnd4_has_channels() {
|
||||||
|
local channel_count=$(docker exec lnbits-lnd-4-1 lncli --network=regtest --rpcserver=lnd-4:10009 listchannels 2>/dev/null | grep -c '"chan_id"' || echo "0")
|
||||||
|
[[ "$channel_count" -gt 0 ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
lnd4_has_active_channels() {
|
||||||
|
docker exec lnbits-lnd-4-1 lncli --network=regtest --rpcserver=lnd-4:10009 listchannels 2>/dev/null | grep -q '"active": true'
|
||||||
|
}
|
||||||
|
|
||||||
is_lightning_pub_ready() {
|
is_lightning_pub_ready() {
|
||||||
docker logs lamassu-lightning-pub 2>&1 | grep -q "LightningPub listening"
|
docker logs lamassu-lightning-pub 2>&1 | grep -q "LightningPub listening"
|
||||||
}
|
}
|
||||||
|
|
||||||
get_lnd4_balance() {
|
get_lnd4_balance() {
|
||||||
docker exec lnbits-lnd-4-1 lncli --network=regtest walletbalance 2>/dev/null | grep -oP '"total_balance":\s*"\K[0-9]+' || echo "0"
|
docker exec lnbits-lnd-4-1 lncli --network=regtest --rpcserver=lnd-4:10009 walletbalance 2>/dev/null | grep -oP '"total_balance":\s*"\K[0-9]+' || echo "0"
|
||||||
|
}
|
||||||
|
|
||||||
|
get_lnd4_channel_balance() {
|
||||||
|
docker exec lnbits-lnd-4-1 lncli --network=regtest --rpcserver=lnd-4:10009 channelbalance 2>/dev/null | grep -oP '"local_balance"[^}]*"sat":\s*"\K[0-9]+' || echo "0"
|
||||||
}
|
}
|
||||||
|
|
||||||
#############################################################################
|
#############################################################################
|
||||||
# Regtest Management
|
# Regtest Management
|
||||||
#############################################################################
|
#############################################################################
|
||||||
|
|
||||||
|
is_lnd1_ready() {
|
||||||
|
# Check if lnd-1 is fully ready (can make RPC calls)
|
||||||
|
docker exec lnbits-lnd-1-1 lncli --network=regtest --rpcserver=lnd-1:10009 getinfo &>/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
wait_for_lnd1() {
|
||||||
|
log "Waiting for lnd-1 to be ready..."
|
||||||
|
local attempts=0
|
||||||
|
while ! is_lnd1_ready && [[ $attempts -lt 30 ]]; do
|
||||||
|
sleep 2
|
||||||
|
attempts=$((attempts + 1))
|
||||||
|
done
|
||||||
|
is_lnd1_ready
|
||||||
|
}
|
||||||
|
|
||||||
|
ensure_lnd4_channel() {
|
||||||
|
# Ensure lnd-4 has a channel so it can create invoices
|
||||||
|
# Also ensure lnd-3 has a channel so it can pay invoices (for funding)
|
||||||
|
# Opens channels from lnd-1 (hub) to both lnd-3 and lnd-4
|
||||||
|
|
||||||
|
if lnd4_has_active_channels; then
|
||||||
|
log "lnd-4 has active channels"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "Setting up Lightning channels for ATM..."
|
||||||
|
|
||||||
|
# Wait for lnd-1 to be ready (it's the funding hub)
|
||||||
|
if ! wait_for_lnd1; then
|
||||||
|
error "lnd-1 failed to start"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
success "lnd-1 is ready"
|
||||||
|
|
||||||
|
# Give lnd-1 a moment to fully initialize (getinfo succeeds before all subsystems ready)
|
||||||
|
sleep 5
|
||||||
|
|
||||||
|
# Check if lnd-1 has funds, if not fund it
|
||||||
|
local lnd1_balance=$(docker exec lnbits-lnd-1-1 lncli --network=regtest --rpcserver=lnd-1:10009 walletbalance 2>/dev/null | grep -oP '"confirmed_balance":\s*"\K[0-9]+' | head -1 || echo "0")
|
||||||
|
lnd1_balance="${lnd1_balance:-0}"
|
||||||
|
if [[ "$lnd1_balance" -lt 100000000 ]]; then
|
||||||
|
log "Funding lnd-1 with mining rewards..."
|
||||||
|
local lnd1_addr=$(docker exec lnbits-lnd-1-1 lncli --network=regtest --rpcserver=lnd-1:10009 newaddress p2wkh 2>/dev/null | grep -oP '"address":\s*"\K[^"]+')
|
||||||
|
docker exec lnbits-bitcoind-1 bitcoin-cli -regtest generatetoaddress 110 "$lnd1_addr" &>/dev/null
|
||||||
|
sleep 3
|
||||||
|
success "lnd-1 funded"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Get pubkeys
|
||||||
|
local lnd4_pubkey=$(docker exec lnbits-lnd-4-1 lncli --network=regtest --rpcserver=lnd-4:10009 getinfo 2>/dev/null | grep -oP '"identity_pubkey":\s*"\K[^"]+')
|
||||||
|
local lnd3_pubkey=$(docker exec lnbits-lnd-3-1 lncli --network=regtest --rpcserver=lnd-3:10009 getinfo 2>/dev/null | grep -oP '"identity_pubkey":\s*"\K[^"]+')
|
||||||
|
|
||||||
|
if [[ -z "$lnd4_pubkey" ]] || [[ -z "$lnd3_pubkey" ]]; then
|
||||||
|
error "Could not get LND pubkeys"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Connect lnd-1 to lnd-3 and lnd-4
|
||||||
|
log "Connecting nodes..."
|
||||||
|
docker exec lnbits-lnd-1-1 lncli --network=regtest --rpcserver=lnd-1:10009 \
|
||||||
|
connect "${lnd3_pubkey}@lnd-3:9735" &>/dev/null || true
|
||||||
|
docker exec lnbits-lnd-1-1 lncli --network=regtest --rpcserver=lnd-1:10009 \
|
||||||
|
connect "${lnd4_pubkey}@lnd-4:9735" &>/dev/null || true
|
||||||
|
|
||||||
|
# Retry loop for opening channels (server may still be initializing)
|
||||||
|
local result3="" result4="" attempts=0
|
||||||
|
while [[ $attempts -lt 5 ]]; do
|
||||||
|
# Open channel to lnd-3: 10M sats, push 5M so lnd-3 has sending capacity
|
||||||
|
if [[ -z "$result3" ]] || echo "$result3" | grep -q "still in the process of starting"; then
|
||||||
|
result3=$(docker exec lnbits-lnd-1-1 lncli --network=regtest --rpcserver=lnd-1:10009 \
|
||||||
|
openchannel --node_key="$lnd3_pubkey" --local_amt=10000000 --push_amt=5000000 2>&1)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Open channel to lnd-4: 10M sats, push 5M so lnd-4 has receiving capacity
|
||||||
|
if [[ -z "$result4" ]] || echo "$result4" | grep -q "still in the process of starting"; then
|
||||||
|
result4=$(docker exec lnbits-lnd-1-1 lncli --network=regtest --rpcserver=lnd-1:10009 \
|
||||||
|
openchannel --node_key="$lnd4_pubkey" --local_amt=10000000 --push_amt=5000000 2>&1)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if both succeeded
|
||||||
|
if echo "$result3" | grep -q "funding_txid" && echo "$result4" | grep -q "funding_txid"; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
attempts=$((attempts + 1))
|
||||||
|
if [[ $attempts -lt 5 ]]; then
|
||||||
|
log "Waiting for LND to be fully ready... (attempt $attempts/5)"
|
||||||
|
sleep 5
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
log "Opening channel lnd-1 -> lnd-3..."
|
||||||
|
log "Opening channel lnd-1 -> lnd-4..."
|
||||||
|
|
||||||
|
local channels_opened=false
|
||||||
|
if echo "$result3" | grep -q "funding_txid" || echo "$result4" | grep -q "funding_txid"; then
|
||||||
|
channels_opened=true
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$channels_opened" == "true" ]]; then
|
||||||
|
log "Mining blocks to confirm channels..."
|
||||||
|
|
||||||
|
# Mine 10 blocks to confirm channels and allow graph propagation
|
||||||
|
local addr=$(docker exec lnbits-bitcoind-1 bitcoin-cli -regtest getnewaddress 2>/dev/null)
|
||||||
|
docker exec lnbits-bitcoind-1 bitcoin-cli -regtest generatetoaddress 10 "$addr" &>/dev/null
|
||||||
|
|
||||||
|
# Wait for channels to become active
|
||||||
|
local attempts=0
|
||||||
|
while ! lnd4_has_active_channels && [[ $attempts -lt 20 ]]; do
|
||||||
|
sleep 2
|
||||||
|
attempts=$((attempts + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
if lnd4_has_active_channels; then
|
||||||
|
# Wait a bit more for graph propagation
|
||||||
|
log "Waiting for network graph to sync..."
|
||||||
|
sleep 10
|
||||||
|
# Mine a few more blocks to trigger announcements
|
||||||
|
docker exec lnbits-bitcoind-1 bitcoin-cli -regtest generatetoaddress 6 "$addr" &>/dev/null
|
||||||
|
sleep 5
|
||||||
|
success "Channels active - lnd-3 and lnd-4 ready"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
warn "Channels opened but not yet active, may need more time"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
error "Failed to open channels"
|
||||||
|
echo "lnd-3 result: $result3"
|
||||||
|
echo "lnd-4 result: $result4"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
start_regtest() {
|
start_regtest() {
|
||||||
if is_regtest_running; then
|
if is_regtest_running; then
|
||||||
log "Regtest network already running"
|
log "Regtest network already running"
|
||||||
|
|
@ -128,6 +275,9 @@ start_regtest() {
|
||||||
error "lnd-4 failed to start"
|
error "lnd-4 failed to start"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Ensure lnd-4 has a channel for invoices
|
||||||
|
ensure_lnd4_channel || warn "Could not setup lnd-4 channel (funding may fail)"
|
||||||
}
|
}
|
||||||
|
|
||||||
stop_regtest() {
|
stop_regtest() {
|
||||||
|
|
@ -336,8 +486,10 @@ show_status() {
|
||||||
echo " Withdraw API: http://${local_ip}:1777"
|
echo " Withdraw API: http://${local_ip}:1777"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
|
local lnd4_channel_balance=$(get_lnd4_channel_balance)
|
||||||
echo -e "${CYAN}lnd-4 (Lightning.Pub backend)${NC}"
|
echo -e "${CYAN}lnd-4 (Lightning.Pub backend)${NC}"
|
||||||
echo " Balance: ${lnd4_balance} sats"
|
echo " Channel Balance: ${lnd4_channel_balance} sats"
|
||||||
|
echo " Wallet Balance: ${lnd4_balance} sats"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
echo -e "${CYAN}ATM App${NC}"
|
echo -e "${CYAN}ATM App${NC}"
|
||||||
|
|
@ -413,6 +565,9 @@ cmd_up() {
|
||||||
echo " Start with: regtest-start"
|
echo " Start with: regtest-start"
|
||||||
echo " Or use: ./dev.sh up --standalone"
|
echo " Or use: ./dev.sh up --standalone"
|
||||||
exit 1
|
exit 1
|
||||||
|
elif [[ "$standalone" != "true" ]]; then
|
||||||
|
# Regtest already running, but ensure lnd-4 has channels
|
||||||
|
ensure_lnd4_channel || warn "Could not setup lnd-4 channel (funding may fail)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 2. Build from worktree if specified
|
# 2. Build from worktree if specified
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue