Self-Hosted Bitcoin Explorer für alle Bitcoin Core Nodebetreiber (by janoside ThX!)
Dies ist ein selbstgehosteter Explorer für die Bitcoin-Blockchain, der durch RPC-Aufrufe auf unseren eigenen Bitcoin Node gesteuert wird. Er ist einfach zu betreiben und kann mit anderen Tools (wie Electrum-Servern) verbunden werden, um einen vollwertigen Explorer zu erhalten.
Mit dem BTC RPC Explorer können wir nicht nur die Blockchain, sondern auch alle funktionalen Möglichkeiten unseres Node erkunden.
Features
- Dashboard mit Netzwerkübersicht
- Anzeige von Details zu Blöcken, Transaktionen und Adressen
- Analysetools zur Anzeige von Statistiken über Blöcke, Transaktionen und Miner-Aktivitäten
- JSON REST API
- Raw JSON-Inhalt von bitcoind, der zur Erstellung der meisten Seiten verwendet wird
- Suche nach Transaktions-ID, Block-Hash/Höhe und Adresse
- Optionaler Transaktionsverlauf für Adressen durch Abfrage von Electrum- & Index Servern wie z. B. Electrs, ElectrumX oder Fulcrum. (Optional und abschaltbar im PrivacyMode auch via blockchain.com, blockchair.com oder blockcypher.com)
- Mempool-Zusammenfassung mit Aufschlüsselung von Gebühren, Größe und Alter
- RPC-Befehlsbrowser und Terminal
Was wird auf dem System benötigt...?!
- Die Installation hier bezieht sich auf Debian / Ubuntu Systeme mit einer laufenden Btc-Core und Fulcrum Instanz.
- Wir benötigen Node.JS v18.x (Installation erledigen wir hier step-by-step)
- Nginx (engine X) als SSL reverse proxy (Installation erledigen wir hier auch step-by-step)
- Einen neuen Nicht-Root $USER
- In der Bitcoin-Core Konfig (bitcoin.conf) muss txindex=1 gesetzt sein
Vorbereitung der Installation
sudo apt update && sudo apt upgrade
sudo apt install git curl gnupg2 ca-certificates lsb-release debian-archive-keyring
Import der Nginx - Repo und Signing Keys
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
Wir checken den Inhalt des Download auf den korrekten GPG Schlüssel
gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
Die Ausgabe sollte so aussehen... checkt die Richtigkeit des Schlüssel anhand des Fingerprint, Datum ect.!
pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14] 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 uid nginx signing key <[email protected]>
Stimmt etwas nicht, löscht den Key und checkt das alles korrekt abläuft!
Wir setzen das Apt Repo zu Nginx Stable und pinnen unser Repo über das (veraltete) debian / ubuntu main Repo
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
https://nginx.org/packages/debian `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
| sudo tee /etc/apt/preferences.d/99nginx
Installation Nginx last stable...
sudo apt update
sudo apt install nginx
Check der installierten Version...
apt policy nginx
>nginx:
Installiert: 1.24.0-1~bookworm
Installationskandidat: 1.24.0-1~bookworm
Done...!
Konfiguration Nginx als Reverse Proxy
Wir erstellen uns ein Open-SSL Self-Signed Zertifikat
sudo openssl req -x509 -nodes -newkey rsa:4096 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt -subj "/CN=localhost" -days 3650
Damit Nginx als reiner Reverse-proxy und nicht als Webserver fungiert erstellen wir ein Backup der orig. Konfig und setzen eine eigene Konfigurationsdatei.
sudo mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup
sudo nano /etc/nginx/nginx.conf
Kopiert die kommenden Zeilen komplett in die neue, leere nginx.conf:
user www-data;
worker_processes 1;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
}
stream {
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 4h;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
include /etc/nginx/streams-enabled/*.conf;
}
Strg+x, Enter zum speichern.
Wir erstellen ein Verzeichnis für zukünftige Zugriffe auf unseren Nginx Reverse-proxy.
sudo mkdir /etc/nginx/streams-enabled
Selbsttest der angelegten Konfig und Pfade mit:
sudo nginx -t
> nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
> nginx: configuration file /etc/nginx/nginx.conf test is successful
Done...!
Achtung bei dem Fehler: "unknown directive stream", benötigen wir das Paket "libnginx-mod-stream" (Das Stream-Modul unterstützt Loadbalancing & Proxying auf TCP-Servern).
sudo apt install libnginx-mod-stream
Installation Node.js Version 18.x
Wir fügen das Nodesource Repo und die Signing-Keys von Node.js in unsere Apt Liste ein.
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - &&\
sudo apt install -y nodejs
Check der installierten Node Version...
node -v
> v18.x.x
Done...!
Jetzt können wir eine Konfigdatei für Nginx anlegen um unsere BTC-RPC-Explorer Anfragen über den verschlüsselten HTTPS Reverse Proxy zu leiten.
Dazu legen wir eine kleine .conf Datei in unserem /etc/nginx/streams-enabled Verzeichnis an:
sudo nano /etc/nginx/streams-enabled/btcrpcexplorer-reverse-proxy.conf
Kopiert alle Zeilen in die leere Datei...
upstream btcrpcexplorer {
server 127.0.0.1:3002;
}
server {
listen 4000 ssl;
proxy_pass btcrpcexplorer;
}
Check der Nginx Konfig...
sudo nginx -t
> nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
> nginx: configuration file /etc/nginx/nginx.conf test is successful
Restart des Nginx Service...
sudo systemctl restart nginx
Done...!
Falls eine Firewall konfiguriert ist, geben wir den TCP Port 4000 frei. Im Beispiel UFW:
sudo ufw allow 4000/tcp
sudo ufw status
> To Action From
> -- ------ ----
> 4000/tcp ALLOW IN Anywhere (kann angepasst werden)
Installation des BTC RPC Explorer
Wir legen einen neuen $USER auf unserem Node an. Dieser User wird ohne "sudo" Rechte und ohne Passwort erstellt. Unter diesem User wird unser BTC-Explorer laufen. Das bringt einen Sicherheitsvorteil falls der Prozess kompromitiert werden sollte. Da der User keine Rechte am laufenden System besitzt, kann nicht ohne weiteres großer Schaden angerichtet werden.
Dieser Schritt ist optional und kann wenn gewünscht übersprungen werden.
Anlegen des $USER und hinzufügen zur Usergroup "Group unter der auch Bitcoin Core läuft".
sudo adduser --disabled-password --gecos "" btcrpcexplorer
Hinzufügen des neuen User zur Gruppe des BitcoinCore Users.
sudo usermod -aG name-der-gruppe btcrpcexplorer
Falls ihr unsicher seid, welcher Group der BtcCore User zugeordnet ist, könnt ihr euch eine Liste im Terminal ausgeben lassen...
groups
> "user-name" cdrom floppy sudo audio dip video plugdev users netdev
Oder ihr lasst euch das bitcoind.service File anzeigen mit:
sudo nano /etc/systemd/system/bitcoind.service
Hier findet ihr unter dem Punkt Directory creation and permissions den User=euren-btc-user und Group=eure-btc-user-group.
Wir wechseln die Terminalsitzung zum neuen User mit...
sudo su btcrpcexplorer
... und setzen in unserem Terminal eine temporäre Umgebungsvariable "Version" für die Installation...
VERSION=3.4.0
... anschließend laden wir den original Source Code vom Explorer direkt bei Github runter und installieren diesen:
git clone --branch v$VERSION https://github.com/janoside/btc-rpc-explorer.git
cd ~/btc-rpc-explorer
npm install
Check ob die installierte Version passt:
cd ~/btc-rpc-explorer
npm version
> Ausgabe der ersten Zeilen...
> {
'btc-rpc-explorer': '3.4.0',
npm: '10.2.3',
node: '18.19.0',
Done...!
Konfiguration des Explorers für den RPC Zugriff auf unseren BTC Node
Weiterhin angemeldet als User "btcrpcexplorer" kopieren wir uns das Sample-File .env-sample im Verzeichnis ~/btc-rpc-explorer
cp .env-sample .env
nano .env
Hier setzen wir unsere Settings zur Kommunikation mit Btc-Core und dem Indexer (ElectrumX/Fulcrum ect.). Entfernt die # um die betreffenden Zeilen zu aktivieren!
BTCEXP_BITCOIND_HOST=127.0.0.1
BTCEXP_BITCOIND_PORT=8332
BTCEXP_BITCOIND_COOKIE=/home/euer-btccore-user/.bitcoin/.cookie
Um Adressbestände abzufragen brauchen wir unseren Electrum-/Fulcrum Server. Alternativ kann ein externer Dienst genutzt werden, was ich aus Privacytechnischen Gründen NICHT empfehlen möchte. Wir setzen hier die lokale Adresse unseres Fulcrum Server:
BTCEXP_ADDRESS_API=electrum
BTCEXP_ELECTRUM_SERVERS=tcp://127.0.0.1:50002
Weiter unten haben wir die Möglichkeit uns für den "Normalen" Mode(externe Abfragen wie Exchange / Fiat Rates) oder den "Privacy" Mode (keinerlei externe Abfragen) des Explorers zu entscheiden.
Privacy Mode:
BTCEXP_PRIVACY_MODE=true
BTCEXP_NO_RATES=true
Normaler Mode (gibt mehr Infos aus):
BTCEXP_PRIVACY_MODE=false
BTCEXP_NO_RATES=false
Optional können wir ein Passwort für die BTC-Explorer Website setzen (der username spielt keine Rolle und kann nach Lust und Laune vergeben werden):
BTCEXP_BASIC_AUTH_PASSWORD=mein-superstarkes-passwort
Desweiteren kann man sich zwischen einem Light - & Darktheme entscheiden (default ist Dark):
BTCEXP_UI_THEME=light
Installiert ihr den Explorer auf einem Low-end oder Ein-Platinen Board wie Raspi ect., kann der Timeoutwert zum Bitcoin-Core erhöht werden.
BTCEXP_BITCOIND_RPC_TIMEOUT=10000 #default=5000
Strg+X, Enter zum speichern...
Done...!
Anlegen eines Service-File für den Autostart nach Boot/Reboot unseres BTC Node
Wir beenden unsere Terminalsession des btcrpcexplorer Users mit "exit" und legen den Systemd Service mit unserem Sudo User an.
sudo nano /etc/systemd/system/btcrpcexplorer.service
[Unit]
Description=BTC RPC Explorer
After=bitcoind.service fulcrum.service ##oder eurem "indexer.service"
PartOf=bitcoind.service
[Service]
WorkingDirectory=/home/btcrpcexplorer/btc-rpc-explorer
ExecStart=/usr/bin/npm start
User=btcrpcexplorer
Restart=always
RestartSec=30
[Install]
WantedBy=multi-user.target
Service zum Autostart auf enabled setzen und Reload des Systemd Daemon.
sudo systemctl enable btcrpcexplorer.service
sudo systemctl daemon-reload
sudo systemctl start btcrpcexplorer.service
Check ob der Service läuft:
sudo systemctl status btcrpcexplorer.service
Ausgabe sollte so aussehen...
Nun könnt ihr im Browser auf eurem PC die Explorer Website öffnen...
Gebt hierzu die Adresse / IP eures Node inklusive https:// und dem Port 4000 ein. Beispiel:
https://192.169.0.100:4000 oder https://mein-local-node:4000
Ihr solltet nun eine Warnung wegen des self-signed SSL Zertifikat von Nginx bekommen... diese einfach akzeptieren und eure Seite anzeigen.
Optionaler externer Zugriff aus dem Internet via Onion-Service
Wir gehen in diesem Guide davon aus, dass Tor bereits funktionsfähig installiert und als Service fest am Node eingebunden ist... falls das, warum auch immer, nicht der Fall sein sollte hat Mike ein Videoguide dazu auf seinem Kanal ;)
Wir erstellen uns für den Remotezugriff einen Onion-Service, der direkt und ohne weitere Einstellungen am Router / Firewall, mit unserem BTC-RPC-Explorer kommuniziert.
sudo nano /etc/tor/torrc
Am Ende der Konfig fügen wir unseren Service ein...
# Hidden Service BTC-RPC-Explorer
HiddenServiceDir /var/lib/tor/hidden_service_btcrpcexplorer/
HiddenServiceVersion 3
HiddenServicePort 80 127.0.0.1:3002
Danach müssen wir den Tor Service restarten...
sudo systemctl restart tor
... und können nun unsere Onion-URL abfragen:
sudo cat /var/lib/tor/hidden_service_btcrpcexplorer/hostname
Ausgabe:
> unseresupergeheimeOnionAdresse.onion
Mit dieser Onion-URL können wir nun weltweit über den Tor Browser auf unseren Explorer zugreifen.
Viel Spass damit. Ist ein nettes Spielzeug... cheers ;)
Monero Beer:
88qWZmAZ6AjGvnqNfBseVUHuXn7jppJ13j2aTe4Tp4qjKN7J5DKCZw9C8dhR7msN9BKfTKgMaJo18Tj9hPL9PUbw6CixQas
Onchain / LN Beer: https://coinos.io/FuSsY
Informationsquellen waren...
Github.com
Raspibolt.org (ThX für die informative Seite!)
Nginx.org
Digitalocean.com
... and many more ...