mirror of
https://github.com/Ride-The-Lightning/RTL.git
synced 2026-08-13 12:33:07 +02:00
The setup in docker/ has been unable to start since Feb 2021. The boltz
service added in f817ae39 references BOLTZ_* variables that are not in .env
(so its ports render as ":" and compose rejects the file with "invalid
proto"), a ./boltz build context that has never existed in the repo, and
boltz_data/boltz_shared volumes that are never declared. Because compose
validates the whole project up front, this broke every service: "docker
compose up -d bitcoind", the first command in the README, failed too.
Rather than repair a five-year-old file pinned to bitcoind 0.19.0 and lnd
0.12.0-beta, this replaces it.
What changed:
- bitcoind 30.0 and 3x lnd 0.20.0-beta, using Polar's images. They are
multi-arch, so nothing is built locally and this works on arm64. The old
setup built bitcoind and lnd from local Dockerfiles.
- Three nodes, not one: alice -> bob -> carol. bob forwards, so RTL's
routing and forwarding screens have data. Two nodes leave them empty.
- scripts/seed.sh funds the nodes, opens channels, and makes payments with
fixed amounts. A fresh run reproduces identical state, so screenshots
taken before and after a change differ only by the change. It is
deliberately not idempotent and refuses to run against a seeded network,
since re-running would double-fund it.
- rtl/RTL-Config.regtest.json configures all three nodes. RTL rewrites its
config on startup, so an init container stages a copy into a volume: a
read-only bind mount makes RTL exit with EROFS, and a writable one would
let RTL modify a tracked file. It is not named RTL-Config.json because
.gitignore matches that bare name at any depth.
- bin/ln-cli now takes a node name and passes --lnddir=/home/lnd/.lnd,
because 'docker compose exec' lands as root while lnd's datadir is under
/home/lnd. Both helpers use compose v2.
- README rewritten to match.
Boltz, Core Lightning and Eclair are left out of this pass. Polar publishes
multi-arch clightning and eclair images, so adding them later needs compose
services, config entries and seed adapters, but no image building.
Verified from a clean 'down -v': all nodes sync, channels go active, 5/5
payments route through bob, bob records 5 forwards, and RTL serves the UI
with all three nodes configured. Two independent from-scratch runs produced
identical balances.
The old bitcoind/ and lnd/ build contexts are now unreferenced but left in
place for a follow-up.
183 lines
6.1 KiB
YAML
183 lines
6.1 KiB
YAML
# Regtest dev fixture for RTL: bitcoind + 3 LND nodes + RTL.
|
|
#
|
|
# NOT suitable for production. All credentials are throwaway.
|
|
#
|
|
# Topology is alice -> bob -> carol, so bob forwards payments and RTL's
|
|
# routing/forwarding screens have data in them. See README.md.
|
|
#
|
|
# Node images come from Polar (https://lightningpolar.com), which publishes
|
|
# multi-arch (amd64 + arm64) builds. Nothing is built locally.
|
|
|
|
volumes:
|
|
bitcoind_data:
|
|
alice_data:
|
|
bob_data:
|
|
carol_data:
|
|
rtl_db:
|
|
rtl_config:
|
|
|
|
x-lnd: &lnd
|
|
image: polarlightning/lnd:0.20.0-beta
|
|
restart: unless-stopped
|
|
depends_on:
|
|
- bitcoind
|
|
|
|
services:
|
|
bitcoind:
|
|
container_name: ${COMPOSE_PROJECT_NAME}_bitcoind
|
|
image: polarlightning/bitcoind:30.0
|
|
restart: unless-stopped
|
|
command:
|
|
- bitcoind
|
|
- -server=1
|
|
- -regtest=1
|
|
# rpcauth hash for ${BITCOIN_RPC_USER}/${BITCOIN_RPC_PASSWORD}. '$$' escapes
|
|
# compose interpolation and reaches bitcoind as a single '$'.
|
|
- -rpcauth=rtldev:8a1f2c3d4e5b6a7c8d9e0f1a2b3c4d5e$$010df4b32c5e9a556cba1857eb5865990c983d8a56dadc0fdbf457cf90073c6c
|
|
- -zmqpubrawblock=tcp://0.0.0.0:${BITCOIN_ZMQ_BLOCK_PORT}
|
|
- -zmqpubrawtx=tcp://0.0.0.0:${BITCOIN_ZMQ_TX_PORT}
|
|
- -txindex=1
|
|
- -dnsseed=0
|
|
- -rpcbind=0.0.0.0
|
|
- -rpcallowip=0.0.0.0/0
|
|
- -rpcport=${BITCOIN_RPC_PORT}
|
|
- -listen=1
|
|
- -listenonion=0
|
|
- -fallbackfee=0.0002
|
|
ports:
|
|
- "${BITCOIN_RPC_PORT}:${BITCOIN_RPC_PORT}"
|
|
volumes:
|
|
- bitcoind_data:/home/bitcoin/.bitcoin
|
|
|
|
# --alias / --externalip / --tlsextradomain are per-node on purpose: the alias
|
|
# is what RTL displays, and the extradomain must match the hostname RTL dials
|
|
# (https://alice:8080) or TLS validation fails.
|
|
alice:
|
|
<<: *lnd
|
|
container_name: ${COMPOSE_PROJECT_NAME}_alice
|
|
command:
|
|
- lnd
|
|
- --noseedbackup
|
|
- --trickledelay=5000
|
|
- --alias=alice
|
|
- --externalip=alice
|
|
- --tlsextradomain=alice
|
|
- --tlsextradomain=${COMPOSE_PROJECT_NAME}_alice
|
|
- --tlsextradomain=host.docker.internal
|
|
- --listen=0.0.0.0:${LIGHTNING_P2P_PORT}
|
|
- --rpclisten=0.0.0.0:${LIGHTNING_RPC_PORT}
|
|
- --restlisten=0.0.0.0:${LIGHTNING_REST_PORT}
|
|
- --bitcoin.active
|
|
- --bitcoin.regtest
|
|
- --bitcoin.node=bitcoind
|
|
- --bitcoind.rpchost=${BITCOIN_HOST}:${BITCOIN_RPC_PORT}
|
|
- --bitcoind.rpcuser=${BITCOIN_RPC_USER}
|
|
- --bitcoind.rpcpass=${BITCOIN_RPC_PASSWORD}
|
|
- --bitcoind.zmqpubrawblock=tcp://${BITCOIN_HOST}:${BITCOIN_ZMQ_BLOCK_PORT}
|
|
- --bitcoind.zmqpubrawtx=tcp://${BITCOIN_HOST}:${BITCOIN_ZMQ_TX_PORT}
|
|
- --accept-keysend
|
|
- --accept-amp
|
|
ports:
|
|
- "${ALICE_REST_PORT}:${LIGHTNING_REST_PORT}"
|
|
volumes:
|
|
- alice_data:/home/lnd/.lnd
|
|
|
|
bob:
|
|
<<: *lnd
|
|
container_name: ${COMPOSE_PROJECT_NAME}_bob
|
|
command:
|
|
- lnd
|
|
- --noseedbackup
|
|
- --trickledelay=5000
|
|
- --alias=bob
|
|
- --externalip=bob
|
|
- --tlsextradomain=bob
|
|
- --tlsextradomain=${COMPOSE_PROJECT_NAME}_bob
|
|
- --tlsextradomain=host.docker.internal
|
|
- --listen=0.0.0.0:${LIGHTNING_P2P_PORT}
|
|
- --rpclisten=0.0.0.0:${LIGHTNING_RPC_PORT}
|
|
- --restlisten=0.0.0.0:${LIGHTNING_REST_PORT}
|
|
- --bitcoin.active
|
|
- --bitcoin.regtest
|
|
- --bitcoin.node=bitcoind
|
|
- --bitcoind.rpchost=${BITCOIN_HOST}:${BITCOIN_RPC_PORT}
|
|
- --bitcoind.rpcuser=${BITCOIN_RPC_USER}
|
|
- --bitcoind.rpcpass=${BITCOIN_RPC_PASSWORD}
|
|
- --bitcoind.zmqpubrawblock=tcp://${BITCOIN_HOST}:${BITCOIN_ZMQ_BLOCK_PORT}
|
|
- --bitcoind.zmqpubrawtx=tcp://${BITCOIN_HOST}:${BITCOIN_ZMQ_TX_PORT}
|
|
- --accept-keysend
|
|
- --accept-amp
|
|
ports:
|
|
- "${BOB_REST_PORT}:${LIGHTNING_REST_PORT}"
|
|
volumes:
|
|
- bob_data:/home/lnd/.lnd
|
|
|
|
carol:
|
|
<<: *lnd
|
|
container_name: ${COMPOSE_PROJECT_NAME}_carol
|
|
command:
|
|
- lnd
|
|
- --noseedbackup
|
|
- --trickledelay=5000
|
|
- --alias=carol
|
|
- --externalip=carol
|
|
- --tlsextradomain=carol
|
|
- --tlsextradomain=${COMPOSE_PROJECT_NAME}_carol
|
|
- --tlsextradomain=host.docker.internal
|
|
- --listen=0.0.0.0:${LIGHTNING_P2P_PORT}
|
|
- --rpclisten=0.0.0.0:${LIGHTNING_RPC_PORT}
|
|
- --restlisten=0.0.0.0:${LIGHTNING_REST_PORT}
|
|
- --bitcoin.active
|
|
- --bitcoin.regtest
|
|
- --bitcoin.node=bitcoind
|
|
- --bitcoind.rpchost=${BITCOIN_HOST}:${BITCOIN_RPC_PORT}
|
|
- --bitcoind.rpcuser=${BITCOIN_RPC_USER}
|
|
- --bitcoind.rpcpass=${BITCOIN_RPC_PASSWORD}
|
|
- --bitcoind.zmqpubrawblock=tcp://${BITCOIN_HOST}:${BITCOIN_ZMQ_BLOCK_PORT}
|
|
- --bitcoind.zmqpubrawtx=tcp://${BITCOIN_HOST}:${BITCOIN_ZMQ_TX_PORT}
|
|
- --accept-keysend
|
|
- --accept-amp
|
|
ports:
|
|
- "${CAROL_REST_PORT}:${LIGHTNING_REST_PORT}"
|
|
volumes:
|
|
- carol_data:/home/lnd/.lnd
|
|
|
|
# RTL rewrites its config file on startup, so it cannot be given the tracked
|
|
# template directly: a bind mount would either be read-only (RTL exits with
|
|
# EROFS) or would let RTL scribble into a version-controlled file. Instead the
|
|
# template is copied into a volume that 'down -v' discards, which keeps the
|
|
# source pristine and every run starting from identical config.
|
|
rtl-config-init:
|
|
container_name: ${COMPOSE_PROJECT_NAME}_rtl_config_init
|
|
image: busybox:1.36
|
|
command: >
|
|
sh -c "cp /template/RTL-Config.regtest.json /config/RTL-Config.json &&
|
|
chmod 644 /config/RTL-Config.json &&
|
|
echo 'config staged'"
|
|
volumes:
|
|
- ./rtl/RTL-Config.regtest.json:/template/RTL-Config.regtest.json:ro
|
|
- rtl_config:/config
|
|
|
|
rtl:
|
|
container_name: ${COMPOSE_PROJECT_NAME}_rtl
|
|
image: shahanafarooqui/rtl:v0.15.8
|
|
restart: unless-stopped
|
|
depends_on:
|
|
rtl-config-init:
|
|
condition: service_completed_successfully
|
|
alice:
|
|
condition: service_started
|
|
bob:
|
|
condition: service_started
|
|
carol:
|
|
condition: service_started
|
|
ports:
|
|
- "${RTL_PORT}:${RTL_PORT}"
|
|
environment:
|
|
RTL_CONFIG_PATH: /RTL/config
|
|
volumes:
|
|
- rtl_config:/RTL/config
|
|
- alice_data:/lnd/alice:ro
|
|
- bob_data:/lnd/bob:ro
|
|
- carol_data:/lnd/carol:ro
|
|
- rtl_db:/RTL/database
|