--- # Usage: # # mkdir rpc && cd rpc # # git init # git remote add origin https://github.com/StakeSquid/ethereum-rpc-docker.git # git fetch origin vibe # git checkout origin/vibe # # docker run --rm alpine sh -c "printf '0x'; head -c32 /dev/urandom | xxd -p -c 64" > .jwtsecret # # env # ... # IP=$(curl ipinfo.io/ip) # DOMAIN=${IP}.traefik.me # COMPOSE_FILE=base.yml:rpc.yml:bitcoin/bitcoind/bitcoin-testnet-bitcoind-full.yml # # docker compose up -d # # curl -X POST https://${IP}.traefik.me/bitcoin-testnet \ # -H "Content-Type: application/json" \ # --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' services: bitcoin-testnet: image: ${BITCOIN_BITCOIND_IMAGE:-lncm/bitcoind}:${BITCOIN_TESTNET_BITCOIND_VERSION:-v27.2} sysctls: # TCP Performance net.ipv4.tcp_slow_start_after_idle: 0 # Disable slow start after idle net.ipv4.tcp_no_metrics_save: 1 # Disable metrics cache net.ipv4.tcp_rmem: 4096 87380 16777216 # Increase TCP read buffers net.ipv4.tcp_wmem: 4096 87380 16777216 # Increase TCP write buffers net.core.somaxconn: 32768 # Higher connection queue # Memory/Connection Management # net.core.netdev_max_backlog: 50000 # Increase network buffer net.ipv4.tcp_max_syn_backlog: 30000 # More SYN requests net.ipv4.tcp_max_tw_buckets: 2000000 # Allow more TIME_WAIT sockets ulimits: nofile: 1048576 # Max open files (for RPC/WS connections) user: root ports: - 13668:13668 - 13668:13668/udp expose: - 8545 - '28332' # ZMQ hashblock port - '28333' # ZMQ hashtx port - '28334' # ZMQ rawblock port - '28335' # ZMQ rawtx port entrypoint: [bitcoind] command: - -datadir=/data - -externalip=${IP} - -port=13668 - -printtoconsole - -rpcallowip=::/0 - -rpcauth=username:0b6623bdebb516ced10631668833e42a$$c478b38890678c51b9f013174a20addb317c2046b68c05e0250ff86e31a505f7 - -rpcbind=0.0.0.0 - -rpcport=8545 - -server - -testnet - -zmqpubhashblock=tcp://0.0.0.0:28332 - -zmqpubhashtx=tcp://0.0.0.0:28333 - -zmqpubrawblock=tcp://0.0.0.0:28334 - -zmqpubrawtx=tcp://0.0.0.0:28335 restart: unless-stopped stop_grace_period: 5m networks: - chains volumes: - ${BITCOIN_TESTNET_BITCOIND_FULL_DATA:-bitcoin-testnet-bitcoind-full}:/data - /slowdisk:/slowdisk logging: *logging-defaults labels: - prometheus-scrape.enabled=false - traefik.enable=true - traefik.http.middlewares.bitcoin-testnet-bitcoind-full-stripprefix.stripprefix.prefixes=/bitcoin-testnet - traefik.http.services.bitcoin-testnet-bitcoind-full.loadbalancer.server.port=8545 - ${NO_SSL:-traefik.http.routers.bitcoin-testnet-bitcoind-full.entrypoints=websecure} - ${NO_SSL:-traefik.http.routers.bitcoin-testnet-bitcoind-full.tls.certresolver=myresolver} - ${NO_SSL:-traefik.http.routers.bitcoin-testnet-bitcoind-full.rule=Host(`$DOMAIN`) && (Path(`/bitcoin-testnet`) || Path(`/bitcoin-testnet/`))} - ${NO_SSL:+traefik.http.routers.bitcoin-testnet-bitcoind-full.rule=Path(`/bitcoin-testnet`) || Path(`/bitcoin-testnet/`)} - traefik.http.routers.bitcoin-testnet-bitcoind-full.middlewares=bitcoin-testnet-bitcoind-full-stripprefix, ipallowlist - traefik.http.routers.bitcoin-testnet-bitcoind-full.service=bitcoin-testnet-bitcoind-full - traefik.http.routers.bitcoin-testnet-bitcoind-full-hashblock.service=bitcoin-testnet-bitcoind-full-hashblock - traefik.http.services.bitcoin-testnet-bitcoind-full-hashblock.loadbalancer.server.port=28332 - ${NO_SSL:-traefik.http.routers.bitcoin-testnet-bitcoind-full-hashblock.entrypoints=websecure} - ${NO_SSL:-traefik.http.routers.bitcoin-testnet-bitcoind-full-hashblock.tls.certresolver=myresolver} - ${NO_SSL:-traefik.http.routers.bitcoin-testnet-bitcoind-full-hashblock.rule=Host(`$DOMAIN`) && PathPrefix(`/bitcoin-testnet/hashblock`)} - ${NO_SSL:+traefik.http.routers.bitcoin-testnet-bitcoind-full-hashblock.rule=PathPrefix(`/bitcoin-testnet/hashblock`)} - traefik.http.routers.bitcoin-testnet-bitcoind-full-hashblock.middlewares=bitcoin-testnet-bitcoind-full-stripprefix, ipallowlist - traefik.http.routers.bitcoin-testnet-bitcoind-full-hashtx.service=bitcoin-testnet-bitcoind-full-hashtx - traefik.http.services.bitcoin-testnet-bitcoind-full-hashtx.loadbalancer.server.port=28333 - ${NO_SSL:-traefik.http.routers.bitcoin-testnet-bitcoind-full-hashtx.entrypoints=websecure} - ${NO_SSL:-traefik.http.routers.bitcoin-testnet-bitcoind-full-hashtx.tls.certresolver=myresolver} - ${NO_SSL:-traefik.http.routers.bitcoin-testnet-bitcoind-full-hashtx.rule=Host(`$DOMAIN`) && PathPrefix(`/bitcoin-testnet/hashtx`)} - ${NO_SSL:+traefik.http.routers.bitcoin-testnet-bitcoind-full-hashtx.rule=PathPrefix(`/bitcoin-testnet/hashtx`)} - traefik.http.routers.bitcoin-testnet-bitcoind-full-hashtx.middlewares=bitcoin-testnet-bitcoind-full-stripprefix, ipallowlist - traefik.http.routers.bitcoin-testnet-bitcoind-full-rawblock.service=bitcoin-testnet-bitcoind-full-rawblock - traefik.http.services.bitcoin-testnet-bitcoind-full-rawblock.loadbalancer.server.port=28334 - ${NO_SSL:-traefik.http.routers.bitcoin-testnet-bitcoind-full-rawblock.entrypoints=websecure} - ${NO_SSL:-traefik.http.routers.bitcoin-testnet-bitcoind-full-rawblock.tls.certresolver=myresolver} - ${NO_SSL:-traefik.http.routers.bitcoin-testnet-bitcoind-full-rawblock.rule=Host(`$DOMAIN`) && PathPrefix(`/bitcoin-testnet/rawblock`)} - ${NO_SSL:+traefik.http.routers.bitcoin-testnet-bitcoind-full-rawblock.rule=PathPrefix(`/bitcoin-testnet/rawblock`)} - traefik.http.routers.bitcoin-testnet-bitcoind-full-rawblock.middlewares=bitcoin-testnet-bitcoind-full-stripprefix, ipallowlist - traefik.http.routers.bitcoin-testnet-bitcoind-full-rawtx.service=bitcoin-testnet-bitcoind-full-rawtx - traefik.http.services.bitcoin-testnet-bitcoind-full-rawtx.loadbalancer.server.port=28335 - ${NO_SSL:-traefik.http.routers.bitcoin-testnet-bitcoind-full-rawtx.entrypoints=websecure} - ${NO_SSL:-traefik.http.routers.bitcoin-testnet-bitcoind-full-rawtx.tls.certresolver=myresolver} - ${NO_SSL:-traefik.http.routers.bitcoin-testnet-bitcoind-full-rawtx.rule=Host(`$DOMAIN`) && PathPrefix(`/bitcoin-testnet/rawtx`)} - ${NO_SSL:+traefik.http.routers.bitcoin-testnet-bitcoind-full-rawtx.rule=PathPrefix(`/bitcoin-testnet/rawtx`)} - traefik.http.routers.bitcoin-testnet-bitcoind-full-rawtx.middlewares=bitcoin-testnet-bitcoind-full-stripprefix, ipallowlist bitcoin-testnet-indexer: image: blockstream/esplora expose: - 3000 # HTTP - 50001 # RPC (electrum) environment: - ELECTRS_DAEMON_P2P_ADDR=bitcoin-testnet:13668 - ELECTRS_DAEMON_RPC_ADDR=bitcoin-testnet:8545 - ELECTRS_DB_DIR=/data/electrs - ELECTRS_ELECTRUM_RPC_ADDR=0.0.0.0:50001 - ELECTRS_HTTP_ADDR=0.0.0.0:3000 - ELECTRS_JSONRPC_IMPORT=true - ELECTRS_NETWORK=bitcoin-testnet - ELECTRS_RPC_PASS=password - ELECTRS_RPC_USER=username networks: - chains volumes: - ${BITCOIN_TESTNET_BITCOIND_FULL__ESPLORA_DATA:-bitcoin-testnet-bitcoind-full_esplora}:/data logging: *logging-defaults labels: - traefik.enable=true - traefik.http.routers.bitcoin-testnet-bitcoind-full-esplora.service=bitcoin-testnet-bitcoind-full-esplora - traefik.http.middlewares.bitcoin-testnet-bitcoind-full-esplora-stripprefix.stripprefix.prefixes=/bitcoin-testnet - traefik.http.services.bitcoin-testnet-bitcoind-full-esplora.loadbalancer.server.port=3000 - ${NO_SSL:-traefik.http.routers.bitcoin-testnet-bitcoind-full-esplora.entrypoints=websecure} - ${NO_SSL:-traefik.http.routers.bitcoin-testnet-bitcoind-full-esplora.tls.certresolver=myresolver} - ${NO_SSL:-traefik.http.routers.bitcoin-testnet-bitcoind-full-esplora.rule=Host(`$DOMAIN`) && (PathPrefix(`bitcoin-testnet/address`) || PathPrefix(`bitcoin-testnet/tx`) || PathPrefix(`bitcoin-testnet/block`) || PathPrefix(`bitcoin-testnet/blocks`) || PathPrefix(`bitcoin-testnet/mempool`) || PathPrefix(`bitcoin-testnet/fee-estimates`) || PathPrefix(`bitcoin-testnet/scripthash`) || PathPrefix(`bitcoin-testnet/asset`))} - ${NO_SSL:+traefik.http.routers.bitcoin-testnet-bitcoind-full-esplora.rule=PathPrefix(`bitcoin-testnet/address`) || PathPrefix(`bitcoin-testnet/tx`) || PathPrefix(`bitcoin-testnet/block`) || PathPrefix(`bitcoin-testnet/blocks`) || PathPrefix(`bitcoin-testnet/mempool`) || PathPrefix(`bitcoin-testnet/fee-estimates`) || PathPrefix(`bitcoin-testnet/scripthash`) || PathPrefix(`bitcoin-testnet/asset`))} - traefik.http.routers.bitcoin-testnet-bitcoind-full-esplora.middlewares=bitcoin-testnet-bitcoind-full-esplora-stripprefix, ipallowlist volumes: bitcoin-testnet-bitcoind-full: bitcoin-testnet-bitcoind-full_esplora: x-upstreams: - id: $${ID} labels: provider: $${PROVIDER} connection: bitcoin: rpc: url: $${RPC_URL} basic-auth: username: username password: password zeromq: address: $${RPC_URL}/hashblock chain: bitcoin-testnet ...