f4a7819bb3
This makes it possible to continue to use lncli without --rpcserver inside the docker container even if the GRPC port exposed on the host machine is different. This is the case on my machine since I am running a mainnet LND node on my machine so port 10009 is already used. I could change the port to 20009 via LND_GRPC_PORT and STACKER_LND_GRPC_PORT (they can even have the same port) but then lncli inside the container needs to be aware of that which means that the sndev script would need to parse .env.development (or some other "magic") to know the GRPC port inside the container. However, I decided that using standard ports inside the container is better to keep the sndev script simple at the cost of having to think about host vs container ports since they are different now. One reason for that is that I think one even does not need to think about the host ports since they aren't even needed? But that's another topic.
387 lines
11 KiB
YAML
387 lines
11 KiB
YAML
version: "3"
|
|
services:
|
|
db:
|
|
container_name: db
|
|
build: ./docker/db
|
|
restart: unless-stopped
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "PGPASSWORD=${POSTGRES_PASSWORD} pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB} -h 127.0.0.1 && psql -U ${POSTGRES_USER} ${POSTGRES_DB} -c 'SELECT 1 FROM users LIMIT 1'"]
|
|
interval: 10s
|
|
timeout: 10s
|
|
retries: 10
|
|
start_period: 1m
|
|
expose:
|
|
- "5432"
|
|
ports:
|
|
- "5431:5432"
|
|
env_file:
|
|
- .env.development
|
|
volumes:
|
|
- ./docker/db/seed.sql:/docker-entrypoint-initdb.d/seed.sql
|
|
- db:/var/lib/postgresql/data
|
|
labels:
|
|
CONNECT: "localhost:5431"
|
|
app:
|
|
container_name: app
|
|
build:
|
|
context: ./
|
|
args:
|
|
- UID=${CURRENT_UID}
|
|
- GID=${CURRENT_GID}
|
|
restart: unless-stopped
|
|
healthcheck:
|
|
test: ["CMD", "curl", "-f", "http://localhost:3000"]
|
|
interval: 10s
|
|
timeout: 10s
|
|
retries: 10
|
|
start_period: 1m
|
|
depends_on:
|
|
db:
|
|
condition: service_healthy
|
|
restart: true
|
|
env_file:
|
|
- .env.development
|
|
expose:
|
|
- "3000"
|
|
ports:
|
|
- "3000:3000"
|
|
volumes:
|
|
- ./:/app
|
|
labels:
|
|
CONNECT: "localhost:3000"
|
|
worker:
|
|
container_name: worker
|
|
build:
|
|
context: ./worker
|
|
args:
|
|
- UID=${CURRENT_UID}
|
|
- GID=${CURRENT_GID}
|
|
restart: unless-stopped
|
|
depends_on:
|
|
db:
|
|
condition: service_healthy
|
|
restart: true
|
|
app:
|
|
condition: service_healthy
|
|
restart: true
|
|
env_file:
|
|
- .env.development
|
|
volumes:
|
|
- ./:/app
|
|
entrypoint: ["/bin/sh", "-c"]
|
|
command:
|
|
- npm run worker:dev
|
|
imgproxy:
|
|
container_name: imgproxy
|
|
image: darthsim/imgproxy:v3.23.0
|
|
profiles:
|
|
- images
|
|
healthcheck:
|
|
test: [ "CMD", "imgproxy", "health" ]
|
|
interval: 10s
|
|
timeout: 10s
|
|
retries: 10
|
|
start_period: 1m
|
|
restart: unless-stopped
|
|
env_file:
|
|
- .env.development
|
|
ports:
|
|
- "3001:8080"
|
|
expose:
|
|
- "8080"
|
|
labels:
|
|
- "CONNECT=localhost:3001"
|
|
s3:
|
|
container_name: s3
|
|
image: localstack/localstack:s3-latest
|
|
# healthcheck:
|
|
# test: ["CMD-SHELL", "awslocal", "s3", "ls", "s3://uploads"]
|
|
# interval: 10s
|
|
# timeout: 10s
|
|
# retries: 10
|
|
# start_period: 1m
|
|
restart: unless-stopped
|
|
profiles:
|
|
- images
|
|
env_file:
|
|
- .env.development
|
|
environment:
|
|
- DEBUG=1
|
|
ports:
|
|
- "4566:4566"
|
|
expose:
|
|
- "4566"
|
|
volumes:
|
|
- 's3:/var/lib/localstack'
|
|
- './docker/s3/init-s3.sh:/etc/localstack/init/ready.d/init-s3.sh'
|
|
- './docker/s3/cors.json:/etc/localstack/init/ready.d/cors.json'
|
|
labels:
|
|
- "CONNECT=localhost:4566"
|
|
opensearch:
|
|
image: opensearchproject/opensearch:2.12.0
|
|
container_name: opensearch
|
|
profiles:
|
|
- search
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "curl -ku admin:${OPENSEARCH_INITIAL_ADMIN_PASSWORD} --silent --fail localhost:9200/_cluster/health || exit 1"]
|
|
interval: 10s
|
|
timeout: 10s
|
|
retries: 10
|
|
start_period: 1m
|
|
restart: unless-stopped
|
|
env_file:
|
|
- .env.development
|
|
environment:
|
|
- OPENSEARCH_INITIAL_ADMIN_PASSWORD=mVchg1T5oA9wudUh
|
|
ports:
|
|
- 9200:9200 # REST API
|
|
- 9600:9600 # Performance Analyzer
|
|
volumes:
|
|
- os:/usr/share/opensearch/data
|
|
labels:
|
|
CONNECT: "localhost:9200"
|
|
command: >
|
|
bash -c '
|
|
set -m
|
|
/usr/share/opensearch/opensearch-docker-entrypoint.sh &
|
|
until curl -sS "http://localhost:9200/_cat/health?h=status" -ku admin:${OPENSEARCH_INITIAL_ADMIN_PASSWORD} | grep -q "green\|yellow"; do
|
|
echo "Waiting for OpenSearch to start..."
|
|
sleep 1
|
|
done
|
|
echo "OpenSearch started."
|
|
curl \
|
|
-H "Content-Type: application/json" \
|
|
-X PUT \
|
|
-d '{"mappings":{"properties":{"text":{"type":"text","analyzer":"english","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"title":{"type":"text","analyzer":"english","fields":{"keyword":{"type":"keyword","ignore_above":256}}}}}}' \
|
|
"http://localhost:9200/item" \
|
|
-ku admin:${OPENSEARCH_INITIAL_ADMIN_PASSWORD}
|
|
echo "OpenSearch index created."
|
|
fg
|
|
'
|
|
os-dashboard:
|
|
image: opensearchproject/opensearch-dashboards:2.12.0
|
|
container_name: os-dashboard
|
|
restart: unless-stopped
|
|
profiles:
|
|
- search
|
|
depends_on:
|
|
opensearch:
|
|
condition: service_healthy
|
|
restart: true
|
|
env_file:
|
|
- .env.development
|
|
environment:
|
|
- opensearch.ssl.verificationMode=none
|
|
- OPENSEARCH_HOSTS=http://opensearch:9200
|
|
- server.ssl.enabled=false
|
|
ports:
|
|
- 5601:5601
|
|
links:
|
|
- opensearch
|
|
labels:
|
|
CONNECT: "localhost:5601"
|
|
bitcoin:
|
|
image: polarlightning/bitcoind:26.0
|
|
container_name: bitcoin
|
|
restart: unless-stopped
|
|
profiles:
|
|
- payments
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "bitcoin-cli -chain=regtest -rpcport=${RPC_PORT} -rpcuser=${RPC_USER} -rpcpassword=${RPC_PASS} getblockchaininfo"]
|
|
interval: 10s
|
|
timeout: 10s
|
|
retries: 10
|
|
start_period: 1m
|
|
command:
|
|
- 'bitcoind'
|
|
- '-server=1'
|
|
- '-regtest=1'
|
|
- '-rpcauth=${RPC_USER}:${RPC_AUTH}'
|
|
- '-debug=1'
|
|
- '-zmqpubrawblock=tcp://0.0.0.0:${ZMQ_BLOCK_PORT}'
|
|
- '-zmqpubrawtx=tcp://0.0.0.0:${ZMQ_TX_PORT}'
|
|
- '-txindex=1'
|
|
- '-dnsseed=0'
|
|
- '-upnp=0'
|
|
- '-rpcbind=0.0.0.0'
|
|
- '-rpcallowip=0.0.0.0/0'
|
|
- '-rpcport=${RPC_PORT}'
|
|
- '-rest'
|
|
- '-listen=1'
|
|
- '-listenonion=0'
|
|
- '-fallbackfee=0.0002'
|
|
- '-blockfilterindex=1'
|
|
- '-peerblockfilters=1'
|
|
expose:
|
|
- "${RPC_PORT}"
|
|
- "${P2P_PORT}"
|
|
- "${ZMQ_BLOCK_PORT}"
|
|
- "${ZMQ_TX_PORT}"
|
|
volumes:
|
|
- bitcoin:/home/bitcoin/.bitcoin
|
|
labels:
|
|
ofelia.enabled: "true"
|
|
ofelia.job-exec.minecron.schedule: "@every 1m"
|
|
ofelia.job-exec.minecron.command: >
|
|
bash -c '
|
|
blockcount=$$(bitcoin-cli -chain=regtest -rpcport=${RPC_PORT} -rpcuser=${RPC_USER} -rpcpassword=${RPC_PASS} getblockcount 2>/dev/null)
|
|
if (( blockcount <= 0 )); then
|
|
echo "Mining 10 blocks to sn_lnd and stacker_lnd..."
|
|
bitcoin-cli -chain=regtest -rpcport=${RPC_PORT} -rpcuser=${RPC_USER} -rpcpassword=${RPC_PASS} generatetoaddress 100 ${LND_ADDR}
|
|
bitcoin-cli -chain=regtest -rpcport=${RPC_PORT} -rpcuser=${RPC_USER} -rpcpassword=${RPC_PASS} generatetoaddress 100 ${STACKER_LND_ADDR}
|
|
else
|
|
echo "Mining a block to sn_lnd... ${LND_ADDR}"
|
|
bitcoin-cli -chain=regtest -rpcport=${RPC_PORT} -rpcuser=${RPC_USER} -rpcpassword=${RPC_PASS} generatetoaddress 1 ${LND_ADDR}
|
|
echo "Mining a block to stacker_lnd... ${STACKER_LND_ADDR}"
|
|
bitcoin-cli -chain=regtest -rpcport=${RPC_PORT} -rpcuser=${RPC_USER} -rpcpassword=${RPC_PASS} generatetoaddress 1 ${STACKER_LND_ADDR}
|
|
fi
|
|
'
|
|
sn_lnd:
|
|
build:
|
|
context: ./docker/lnd
|
|
args:
|
|
- LN_NODE_FOR=sn
|
|
container_name: sn_lnd
|
|
restart: unless-stopped
|
|
profiles:
|
|
- payments
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "lncli", "getinfo"]
|
|
interval: 10s
|
|
timeout: 10s
|
|
retries: 10
|
|
start_period: 1m
|
|
depends_on:
|
|
bitcoin:
|
|
condition: service_healthy
|
|
restart: true
|
|
env_file:
|
|
- .env.development
|
|
command:
|
|
- 'lnd'
|
|
- '--noseedbackup'
|
|
- '--trickledelay=5000'
|
|
- '--alias=sn_lnd'
|
|
- '--externalip=sn_lnd'
|
|
- '--tlsextradomain=sn_lnd'
|
|
- '--tlsextradomain=host.docker.internal'
|
|
- '--listen=0.0.0.0:9735'
|
|
- '--rpclisten=0.0.0.0:10009'
|
|
- '--restlisten=0.0.0.0:8080'
|
|
- '--bitcoin.active'
|
|
- '--bitcoin.regtest'
|
|
- '--bitcoin.node=bitcoind'
|
|
- '--bitcoind.rpchost=bitcoin'
|
|
- '--bitcoind.rpcuser=${RPC_USER}'
|
|
- '--bitcoind.rpcpass=${RPC_PASS}'
|
|
- '--bitcoind.zmqpubrawblock=tcp://bitcoin:${ZMQ_BLOCK_PORT}'
|
|
- '--bitcoind.zmqpubrawtx=tcp://bitcoin:${ZMQ_TX_PORT}'
|
|
- '--protocol.wumbo-channels'
|
|
- '--maxchansize=1000000000'
|
|
- '--allow-circular-route'
|
|
- '--bitcoin.defaultchanconfs=1'
|
|
- '--maxpendingchannels=10'
|
|
expose:
|
|
- "9735"
|
|
ports:
|
|
- "${LND_REST_PORT}:8080"
|
|
- "${LND_GRPC_PORT}:10009"
|
|
volumes:
|
|
- sn_lnd:/home/lnd/.lnd
|
|
labels:
|
|
ofelia.enabled: "true"
|
|
ofelia.job-exec.sn_channel_cron.schedule: "@every 1m"
|
|
ofelia.job-exec.sn_channel_cron.command: >
|
|
su lnd -c bash -c "
|
|
if [ $$(lncli getinfo | jq '.num_active_channels + .num_pending_channels') -ge 3 ]; then
|
|
exit 0
|
|
else
|
|
lncli openchannel --node_key=$STACKER_LND_PUBKEY --connect stacker_lnd:9735 --sat_per_vbyte 1 \\
|
|
--min_confs 0 --local_amt=1000000000 --push_amt=500000000
|
|
fi
|
|
"
|
|
stacker_lnd:
|
|
build:
|
|
context: ./docker/lnd
|
|
args:
|
|
- LN_NODE_FOR=stacker
|
|
container_name: stacker_lnd
|
|
restart: unless-stopped
|
|
profiles:
|
|
- payments
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "lncli", "getinfo"]
|
|
interval: 10s
|
|
timeout: 10s
|
|
retries: 10
|
|
start_period: 1m
|
|
depends_on:
|
|
bitcoin:
|
|
condition: service_healthy
|
|
restart: true
|
|
env_file:
|
|
- .env.development
|
|
command:
|
|
- 'lnd'
|
|
- '--noseedbackup'
|
|
- '--trickledelay=5000'
|
|
- '--alias=stacker_lnd'
|
|
- '--externalip=stacker_lnd'
|
|
- '--tlsextradomain=stacker_lnd'
|
|
- '--tlsextradomain=host.docker.internal'
|
|
- '--listen=0.0.0.0:9735'
|
|
- '--rpclisten=0.0.0.0:10009'
|
|
- '--restlisten=0.0.0.0:8080'
|
|
- '--bitcoin.active'
|
|
- '--bitcoin.regtest'
|
|
- '--bitcoin.node=bitcoind'
|
|
- '--bitcoind.rpchost=bitcoin'
|
|
- '--bitcoind.rpcuser=${RPC_USER}'
|
|
- '--bitcoind.rpcpass=${RPC_PASS}'
|
|
- '--bitcoind.zmqpubrawblock=tcp://bitcoin:${ZMQ_BLOCK_PORT}'
|
|
- '--bitcoind.zmqpubrawtx=tcp://bitcoin:${ZMQ_TX_PORT}'
|
|
- '--protocol.wumbo-channels'
|
|
- '--maxchansize=1000000000'
|
|
- '--allow-circular-route'
|
|
- '--bitcoin.defaultchanconfs=1'
|
|
- '--maxpendingchannels=10'
|
|
expose:
|
|
- "9735"
|
|
ports:
|
|
- "${STACKER_LND_REST_PORT}:8080"
|
|
- "${STACKER_LND_GRPC_PORT}:10009"
|
|
volumes:
|
|
- stacker_lnd:/home/lnd/.lnd
|
|
labels:
|
|
ofelia.enabled: "true"
|
|
ofelia.job-exec.stacker_channel_cron.schedule: "@every 1m"
|
|
ofelia.job-exec.stacker_channel_cron.command: >
|
|
su lnd -c bash -c "
|
|
if [ $$(lncli getinfo | jq '.num_active_channels + .num_pending_channels') -ge 3 ]; then
|
|
exit 0
|
|
else
|
|
lncli openchannel --node_key=$LND_PUBKEY --connect sn_lnd:9735 --sat_per_vbyte 1 \\
|
|
--min_confs 0 --local_amt=1000000000 --push_amt=500000000
|
|
fi
|
|
"
|
|
channdler:
|
|
image: mcuadros/ofelia:latest
|
|
container_name: channdler
|
|
profiles:
|
|
- payments
|
|
depends_on:
|
|
- bitcoin
|
|
- sn_lnd
|
|
- stacker_lnd
|
|
restart: unless-stopped
|
|
command: daemon --docker -f label=com.docker.compose.project=${COMPOSE_PROJECT_NAME}
|
|
volumes:
|
|
- /var/run/docker.sock:/var/run/docker.sock:ro
|
|
volumes:
|
|
db:
|
|
os:
|
|
bitcoin:
|
|
sn_lnd:
|
|
stacker_lnd:
|
|
s3:
|