Bitcoin & Docker 17. August 2026 • 8 Min. Lesezeit

Eigener Bitcoin Solo-Mining-Pool: Public-Pool & Pruned Full Node im Docker-Homelab

Wer ESP32-basierte Micro-Miner wie den NMMiner oder NerdMiner betreibt, nutzt diese meist als digitale Solo-Lotterie. Doch statt sich von fremden Pools abhängig zu machen, lässt sich mit Public-Pool und Bitcoin Core (bitcoind) in wenigen Minuten ein vollkommen autonomer, gebührenfreier Solo-Mining-Pool im eigenen Homelab realisieren.

1. Die Speicherplatz-Frage: Pruned Node statt 700 GB NVMe

Eine unbeschnittene Full Node belegt über 600–700 GB Speicherplatz. Für das Generieren von Mining-Jobs (getblocktemplate) reicht jedoch eine Pruned Node vollkommen aus. Mit dem Parameter -prune=5000 validiert der Node die Historie vollständig, löscht alte Blockdaten jedoch automatisch und belegt dauerhaft unter 15 GB Speicherplatz.

2. Docker-Compose Stack (bitcoind, public-pool & public-pool-ui)

Das Setup besteht aus drei Komponenten im Docker-Bridge-Netzwerk: Bitcoin Core, dem Public-Pool Backend (Stratum + REST-API) und dem Angular-Frontend. Über -dbcache=4000 wird der initiale Blockchain-Sync im Arbeitsspeicher massiv beschleunigt:

version: "3.8"

services:
  bitcoind:
    image: kylemanna/bitcoind:latest
    container_name: bitcoind
    restart: unless-stopped
    volumes:
      - /home/docker/bitcoin:/bitcoin/.bitcoin
    ports:
      - "8332:8332"         # RPC-Port für Public-Pool
      - "8333:8333"         # P2P-Port für schnellen Peer-Sync
    environment:
      - RPCUSER=poolrpcuser
      - RPCPASSWORD=EinSicheresPasswort123!
    command:
      - -server=1
      - -rpcuser=poolrpcuser
      - -rpcpassword=EinSicheresPasswort123!
      - -rpcallowip=0.0.0.0/0
      - -rpcbind=0.0.0.0
      - -disablewallet=1
      - -fallbackfee=0.00001
      - -prune=5000
      - -dbcache=4000
      - -maxconnections=20
    network_mode: bridge

  public-pool:
    image: ghcr.io/benjamin-wilson/public-pool:latest
    container_name: public-pool
    restart: unless-stopped
    ports:
      - "21496:21496"       # Stratum-Port für Miner (TCP)
      - "3334:3334"         # Backend REST- & WebSocket-API
    environment:
      - BITCOIN_RPC_URL=http://172.17.0.1:8332
      - BITCOIN_RPC_USER=poolrpcuser
      - BITCOIN_RPC_PASSWORD=EinSicheresPasswort123!
      - BITCOIN_RPC_TIMEOUT=10000
      - API_PORT=3334
      - STRATUM_PORT=21496
      - NETWORK=mainnet
      - POOL_FEE=0
    depends_on:
      - bitcoind
    network_mode: bridge

  public-pool-ui:
    image: ghcr.io/benjamin-wilson/public-pool-ui:latest
    container_name: public-pool-ui
    restart: unless-stopped
    ports:
      - "8080:80"           # Web-Frontend
    environment:
      - API_URL=https://pool.tessmann.dev/api
      - STRATUM_URL=pool.tessmann.dev:21496
    depends_on:
      - public-pool
    network_mode: bridge

3. Nginx Proxy Manager (NPM) Konfiguration

Damit das Web-Dashboard und die Backend-API sauber und ohne Cross-Origin-Probleme unter einer einzigen Domain (pool.tessmann.dev) laufen, konfigurieren wir den Proxy-Host in NPM wie folgt:

Reiter "Details":

  • Domain Names: pool.tessmann.dev
  • Scheme: http
  • Forward Hostname / IP: 192.168.5.215 (Docker-Host-IP)
  • Forward Port: 8080 (Port des Web-Frontends)
  • Websockets Support: Aktivieren (essenziell für Live-Updates der Hashrate)
  • Block Common Exploits: Aktivieren

Reiter "Custom Locations" (API-Routing):

Lege eine Custom Location an, damit Anfragen an /api direkt an das NestJS-Backend auf Port 3334 durchgereicht werden:

  • Location: /api/
  • Scheme: http
  • Forward Hostname / IP: 192.168.5.215
  • Forward Port: 3334

Klicke auf das Zahnrad-Symbol der Location und trage folgende Nginx-Direktiven ein, um falsche Redirects auf externe Domains zu unterbinden:

proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
proxy_redirect off;

Reiter "SSL":

  • SSL-Zertifikat auswählen (Let's Encrypt / Wildcard)
  • Force SSL und HTTP/2 Support aktivieren.

4. Router / Firewall (Stratum TCP-Port 21496)

Das Mining-Protokoll (Stratum) ist reines TCP und kann nicht über den HTTP-Reverse-Proxy geleitet werden. Richte im Router (z. B. Fritz!Box / OPNsense) eine Portweiterleitung ein:

  • Protokoll: TCP
  • Externer Port: 21496Interner Host: 192.168.5.215:21496

5. Miner anbinden

Im Webinterface deines NMMiner oder NerdMiner werden die Verbindungsdaten hinterlegt:

  • Stratum Host: pool.tessmann.dev (oder intern die IP deines Hosts)
  • Port: 21496
  • User: DEINE_BITCOIN_WALLET_ADRESSE.workerName
  • Passwort: x

Sobald die Bitcoin Node synchronisiert ist (verificationprogress = 1.0), generiert die Node gültige Block-Templates. Findet ein angeschlossener Miner einen Block, landet die gesamte Coinbase-Belohnung (3,125 BTC + Transaktionsgebühren) ohne Abzüge direkt auf deiner Wallet.

💡 Support & Consulting: Du benötigst Unterstützung bei der Einrichtung deiner Infrastruktur? 👉 tessmann-digital.de