From d058fe1db182621659273bfcc4883de38cdba94f Mon Sep 17 00:00:00 2001 From: Claude Agent Date: Thu, 2 Jul 2026 13:51:15 +0000 Subject: [PATCH] Add DigiByte and Dash mainnet bitcoin-family RPC nodes. DigiByte uses a tarball-install digibyted.Dockerfile (v9.26.3); Dash uses dashpay/dashd:23.1.7. Both follow the dogecoind bitcoind pattern for RPC auth, ZMQ, traefik, and x-upstreams wiring. Co-authored-by: Cursor --- compose_registry.json | 28 ++++ dash/dashd/dash-mainnet-dashd-full.yml | 140 +++++++++++++++++ digibyte/digibyted.Dockerfile | 24 +++ .../digibyte-mainnet-digibyted-full.yml | 144 ++++++++++++++++++ 4 files changed, 336 insertions(+) create mode 100644 dash/dashd/dash-mainnet-dashd-full.yml create mode 100644 digibyte/digibyted.Dockerfile create mode 100644 digibyte/digibyted/digibyte-mainnet-digibyted-full.yml diff --git a/compose_registry.json b/compose_registry.json index 6429fbb6..4c734c89 100644 --- a/compose_registry.json +++ b/compose_registry.json @@ -1918,6 +1918,34 @@ "cronos-zkevm-testnet-external-node-pruned_db" ] }, + { + "chain": "mainnet", + "client": "dashd", + "compose_file": "dash/dashd/dash-mainnet-dashd-full", + "features": [], + "network": "dash", + "node": null, + "relay": null, + "stack": null, + "type": "full", + "volumes": [ + "dash-mainnet-dashd-full" + ] + }, + { + "chain": "mainnet", + "client": "digibyted", + "compose_file": "digibyte/digibyted/digibyte-mainnet-digibyted-full", + "features": [], + "network": "digibyte", + "node": null, + "relay": null, + "stack": null, + "type": "full", + "volumes": [ + "digibyte-mainnet-digibyted-full" + ] + }, { "chain": "mainnet", "client": "dogecoind", diff --git a/dash/dashd/dash-mainnet-dashd-full.yml b/dash/dashd/dash-mainnet-dashd-full.yml new file mode 100644 index 00000000..9f3793af --- /dev/null +++ b/dash/dashd/dash-mainnet-dashd-full.yml @@ -0,0 +1,140 @@ +--- +x-logging-defaults: &logging-defaults + driver: json-file + options: + max-size: "10m" + max-file: "3" + +# 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:dash/dashd/dash-mainnet-dashd-full.yml +# +# docker compose up -d +# +# curl -X POST https://${IP}.traefik.me/dash-mainnet \ +# -H "Content-Type: application/json" \ +# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' + +services: + dash-mainnet: + image: ${DASH_DASHD_IMAGE:-dashpay/dashd}:${DASH_MAINNET_DASHD_VERSION:-23.1.7} + 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: + - 11650:11650 + - 11650:11650/udp + expose: + - 8545 + - '28332' # ZMQ hashblock port + - '28333' # ZMQ hashtx port + - '28334' # ZMQ rawblock port + - '28335' # ZMQ rawtx port + entrypoint: [dashd] + command: + - -datadir=/data + - -dbcache=2048 + - -disablewallet=1 + - -externalip=${IP} + - -port=11650 + - -printtoconsole + - -rpcallowip=::/0 + - -rpcauth=username:0b6623bdebb516ced10631668833e42a$$c478b38890678c51b9f013174a20addb317c2046b68c05e0250ff86e31a505f7 + - -rpcbind=0.0.0.0 + - -rpcport=8545 + - -server + - -txindex=1 + - -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: + - ${DASH_MAINNET_DASHD_FULL_DATA:-dash-mainnet-dashd-full}:/data + - /slowdisk:/slowdisk + logging: *logging-defaults + labels: + - prometheus-scrape.enabled=false + - traefik.enable=true + - traefik.http.middlewares.dash-mainnet-dashd-full-stripprefix.stripprefix.prefixes=/dash-mainnet + - traefik.http.services.dash-mainnet-dashd-full.loadbalancer.server.port=8545 + - ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full.entrypoints=websecure} + - ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full.tls.certresolver=myresolver} + - ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full.rule=Host(`$DOMAIN`) && (Path(`/dash-mainnet`) || Path(`/dash-mainnet/`))} + - ${NO_SSL:+traefik.http.routers.dash-mainnet-dashd-full.rule=Path(`/dash-mainnet`) || Path(`/dash-mainnet/`)} + - traefik.http.routers.dash-mainnet-dashd-full.middlewares=dash-mainnet-dashd-full-stripprefix, ipallowlist + - traefik.http.routers.dash-mainnet-dashd-full.service=dash-mainnet-dashd-full + - traefik.http.routers.dash-mainnet-dashd-full-hashblock.service=dash-mainnet-dashd-full-hashblock + - traefik.http.services.dash-mainnet-dashd-full-hashblock.loadbalancer.server.port=28332 + - ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full-hashblock.entrypoints=websecure} + - ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full-hashblock.tls.certresolver=myresolver} + - ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full-hashblock.rule=Host(`$DOMAIN`) && PathPrefix(`/dash-mainnet/hashblock`)} + - ${NO_SSL:+traefik.http.routers.dash-mainnet-dashd-full-hashblock.rule=PathPrefix(`/dash-mainnet/hashblock`)} + - traefik.http.routers.dash-mainnet-dashd-full-hashblock.middlewares=dash-mainnet-dashd-full-stripprefix, ipallowlist + - traefik.http.routers.dash-mainnet-dashd-full-hashtx.service=dash-mainnet-dashd-full-hashtx + - traefik.http.services.dash-mainnet-dashd-full-hashtx.loadbalancer.server.port=28333 + - ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full-hashtx.entrypoints=websecure} + - ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full-hashtx.tls.certresolver=myresolver} + - ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full-hashtx.rule=Host(`$DOMAIN`) && PathPrefix(`/dash-mainnet/hashtx`)} + - ${NO_SSL:+traefik.http.routers.dash-mainnet-dashd-full-hashtx.rule=PathPrefix(`/dash-mainnet/hashtx`)} + - traefik.http.routers.dash-mainnet-dashd-full-hashtx.middlewares=dash-mainnet-dashd-full-stripprefix, ipallowlist + - traefik.http.routers.dash-mainnet-dashd-full-rawblock.service=dash-mainnet-dashd-full-rawblock + - traefik.http.services.dash-mainnet-dashd-full-rawblock.loadbalancer.server.port=28334 + - ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full-rawblock.entrypoints=websecure} + - ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full-rawblock.tls.certresolver=myresolver} + - ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full-rawblock.rule=Host(`$DOMAIN`) && PathPrefix(`/dash-mainnet/rawblock`)} + - ${NO_SSL:+traefik.http.routers.dash-mainnet-dashd-full-rawblock.rule=PathPrefix(`/dash-mainnet/rawblock`)} + - traefik.http.routers.dash-mainnet-dashd-full-rawblock.middlewares=dash-mainnet-dashd-full-stripprefix, ipallowlist + - traefik.http.routers.dash-mainnet-dashd-full-rawtx.service=dash-mainnet-dashd-full-rawtx + - traefik.http.services.dash-mainnet-dashd-full-rawtx.loadbalancer.server.port=28335 + - ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full-rawtx.entrypoints=websecure} + - ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full-rawtx.tls.certresolver=myresolver} + - ${NO_SSL:-traefik.http.routers.dash-mainnet-dashd-full-rawtx.rule=Host(`$DOMAIN`) && PathPrefix(`/dash-mainnet/rawtx`)} + - ${NO_SSL:+traefik.http.routers.dash-mainnet-dashd-full-rawtx.rule=PathPrefix(`/dash-mainnet/rawtx`)} + - traefik.http.routers.dash-mainnet-dashd-full-rawtx.middlewares=dash-mainnet-dashd-full-stripprefix, ipallowlist + +volumes: + dash-mainnet-dashd-full: + +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: dash +... \ No newline at end of file diff --git a/digibyte/digibyted.Dockerfile b/digibyte/digibyted.Dockerfile new file mode 100644 index 00000000..d5dedd68 --- /dev/null +++ b/digibyte/digibyted.Dockerfile @@ -0,0 +1,24 @@ +# digibyted — official release tarball (no Docker image upstream). +ARG VERSION=9.26.3 + +FROM debian:stable-slim + +ARG VERSION +ARG SHA256=51465a7a7409dc9a734e463b8fd95fb9773033753d79504de946ab2a0aa0991c + +RUN apt-get update && apt-get install -y --no-install-recommends \ + ca-certificates \ + curl \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /tmp +RUN curl -fsSL -o digibyte.tar.gz \ + "https://github.com/DigiByte-Core/digibyte/releases/download/v${VERSION}/digibyte-${VERSION}-x86_64-linux-gnu.tar.gz" \ + && echo "${SHA256} digibyte.tar.gz" | sha256sum -c - \ + && tar xzf digibyte.tar.gz \ + && cp "digibyte-${VERSION}/bin/digibyted" "digibyte-${VERSION}/bin/digibyte-cli" /usr/local/bin/ \ + && rm -rf /tmp/* + +EXPOSE 8545 12024 + +ENTRYPOINT ["digibyted"] diff --git a/digibyte/digibyted/digibyte-mainnet-digibyted-full.yml b/digibyte/digibyted/digibyte-mainnet-digibyted-full.yml new file mode 100644 index 00000000..72c59323 --- /dev/null +++ b/digibyte/digibyted/digibyte-mainnet-digibyted-full.yml @@ -0,0 +1,144 @@ +--- +x-logging-defaults: &logging-defaults + driver: json-file + options: + max-size: "10m" + max-file: "3" + +# 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:digibyte/digibyted/digibyte-mainnet-digibyted-full.yml +# +# docker compose up -d +# +# curl -X POST https://${IP}.traefik.me/digibyte-mainnet \ +# -H "Content-Type: application/json" \ +# --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' + +services: + digibyte-mainnet: + build: + context: ./digibyte + dockerfile: digibyted.Dockerfile + args: + VERSION: ${DIGIBYTE_MAINNET_DIGIBYTED_VERSION:-9.26.3} + 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: + - 11254:11254 + - 11254:11254/udp + expose: + - 8545 + - '28332' # ZMQ hashblock port + - '28333' # ZMQ hashtx port + - '28334' # ZMQ rawblock port + - '28335' # ZMQ rawtx port + entrypoint: [digibyted] + command: + - -datadir=/data + - -dbcache=2048 + - -disablewallet=1 + - -externalip=${IP} + - -port=11254 + - -printtoconsole + - -rpcallowip=::/0 + - -rpcauth=username:0b6623bdebb516ced10631668833e42a$$c478b38890678c51b9f013174a20addb317c2046b68c05e0250ff86e31a505f7 + - -rpcbind=0.0.0.0 + - -rpcport=8545 + - -server + - -txindex=1 + - -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: + - ${DIGIBYTE_MAINNET_DIGIBYTED_FULL_DATA:-digibyte-mainnet-digibyted-full}:/data + - /slowdisk:/slowdisk + logging: *logging-defaults + labels: + - prometheus-scrape.enabled=false + - traefik.enable=true + - traefik.http.middlewares.digibyte-mainnet-digibyted-full-stripprefix.stripprefix.prefixes=/digibyte-mainnet + - traefik.http.services.digibyte-mainnet-digibyted-full.loadbalancer.server.port=8545 + - ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full.entrypoints=websecure} + - ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full.tls.certresolver=myresolver} + - ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full.rule=Host(`$DOMAIN`) && (Path(`/digibyte-mainnet`) || Path(`/digibyte-mainnet/`))} + - ${NO_SSL:+traefik.http.routers.digibyte-mainnet-digibyted-full.rule=Path(`/digibyte-mainnet`) || Path(`/digibyte-mainnet/`)} + - traefik.http.routers.digibyte-mainnet-digibyted-full.middlewares=digibyte-mainnet-digibyted-full-stripprefix, ipallowlist + - traefik.http.routers.digibyte-mainnet-digibyted-full.service=digibyte-mainnet-digibyted-full + - traefik.http.routers.digibyte-mainnet-digibyted-full-hashblock.service=digibyte-mainnet-digibyted-full-hashblock + - traefik.http.services.digibyte-mainnet-digibyted-full-hashblock.loadbalancer.server.port=28332 + - ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full-hashblock.entrypoints=websecure} + - ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full-hashblock.tls.certresolver=myresolver} + - ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full-hashblock.rule=Host(`$DOMAIN`) && PathPrefix(`/digibyte-mainnet/hashblock`)} + - ${NO_SSL:+traefik.http.routers.digibyte-mainnet-digibyted-full-hashblock.rule=PathPrefix(`/digibyte-mainnet/hashblock`)} + - traefik.http.routers.digibyte-mainnet-digibyted-full-hashblock.middlewares=digibyte-mainnet-digibyted-full-stripprefix, ipallowlist + - traefik.http.routers.digibyte-mainnet-digibyted-full-hashtx.service=digibyte-mainnet-digibyted-full-hashtx + - traefik.http.services.digibyte-mainnet-digibyted-full-hashtx.loadbalancer.server.port=28333 + - ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full-hashtx.entrypoints=websecure} + - ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full-hashtx.tls.certresolver=myresolver} + - ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full-hashtx.rule=Host(`$DOMAIN`) && PathPrefix(`/digibyte-mainnet/hashtx`)} + - ${NO_SSL:+traefik.http.routers.digibyte-mainnet-digibyted-full-hashtx.rule=PathPrefix(`/digibyte-mainnet/hashtx`)} + - traefik.http.routers.digibyte-mainnet-digibyted-full-hashtx.middlewares=digibyte-mainnet-digibyted-full-stripprefix, ipallowlist + - traefik.http.routers.digibyte-mainnet-digibyted-full-rawblock.service=digibyte-mainnet-digibyted-full-rawblock + - traefik.http.services.digibyte-mainnet-digibyted-full-rawblock.loadbalancer.server.port=28334 + - ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full-rawblock.entrypoints=websecure} + - ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full-rawblock.tls.certresolver=myresolver} + - ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full-rawblock.rule=Host(`$DOMAIN`) && PathPrefix(`/digibyte-mainnet/rawblock`)} + - ${NO_SSL:+traefik.http.routers.digibyte-mainnet-digibyted-full-rawblock.rule=PathPrefix(`/digibyte-mainnet/rawblock`)} + - traefik.http.routers.digibyte-mainnet-digibyted-full-rawblock.middlewares=digibyte-mainnet-digibyted-full-stripprefix, ipallowlist + - traefik.http.routers.digibyte-mainnet-digibyted-full-rawtx.service=digibyte-mainnet-digibyted-full-rawtx + - traefik.http.services.digibyte-mainnet-digibyted-full-rawtx.loadbalancer.server.port=28335 + - ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full-rawtx.entrypoints=websecure} + - ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full-rawtx.tls.certresolver=myresolver} + - ${NO_SSL:-traefik.http.routers.digibyte-mainnet-digibyted-full-rawtx.rule=Host(`$DOMAIN`) && PathPrefix(`/digibyte-mainnet/rawtx`)} + - ${NO_SSL:+traefik.http.routers.digibyte-mainnet-digibyted-full-rawtx.rule=PathPrefix(`/digibyte-mainnet/rawtx`)} + - traefik.http.routers.digibyte-mainnet-digibyted-full-rawtx.middlewares=digibyte-mainnet-digibyted-full-stripprefix, ipallowlist + +volumes: + digibyte-mainnet-digibyted-full: + +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: digibyte +... \ No newline at end of file