Welcome to Boletin.info   Click to listen highlighted text! Welcome to Boletin.info
Tu propio nodo Bitcoin en Raspberry Pi 5 con SSD 1TB: privacidad, verificación y soberanía digital
Instala Bitcoin Core v30.2 en una Raspberry Pi 5 con SSD 1TB y corre tu propio nodo: más privacidad, verificación real y apoyo a la red.

Guía práctica (paso a paso) para instalar Bitcoin Core en una Raspberry Pi 5 con un SSD externo de 1 TB, dejarlo corriendo 24/7 y medir el avance real de la sincronización.


¿Por qué vale la pena correr tu propio nodo?

Correr un nodo completo es pasar de “confiar en lo que dice Internet” a verificar por ti mismo. Cuando consultas balances o transacciones usando servicios externos (exploradores, APIs, nodos ajenos), delegas la verificación y parte de tu privacidad. Un full node valida reglas, bloques y transacciones localmente: no “confía”, comprueba.

Además, un nodo fortalece la red: contribuye a la descentralización y reduce la dependencia de infraestructuras centralizadas. Una Raspberry Pi 5 con SSD es una combinación atractiva: bajo consumo, silenciosa y suficientemente potente para correr Bitcoin Core de forma estable.

Aclaración importante: un nodo no mina ni genera ingresos por sí solo. Su valor está en verificar, aportar robustez y servir como base confiable para tus herramientas.

¿Por qué usamos Bitcoin Core v30.2 (o superior) en esta guía?

Usaremos Bitcoin Core v30.2 o superior por una razón concreta: el proyecto publicó un aviso sobre un bug raro introducido en 30.0 y 30.1 durante la migración de wallets. En ciertas condiciones, si la migración fallaba, podían borrarse archivos dentro del directorio de wallets, con riesgo de pérdida de fondos si no existían respaldos. La corrección se publicó en v30.2 y, por precaución, se retiraron binarios de las versiones afectadas del sitio oficial.

Si tu objetivo es un nodo “puro” (sin usar la wallet interna de Bitcoin Core), puedes deshabilitar wallet y aun así validar la red. Pero incluso en ese caso, usar la versión corregida y actual es una buena práctica de estabilidad y seguridad operacional.


Qué necesitas

  • Raspberry Pi 5 (recomendado 8GB RAM si puedes, pero 4GB también funciona).
  • SSD externo 1TB por USB 3.0 (idealmente con case/enclosure estable).
  • MicroSD para el sistema operativo (o NVMe si tu setup lo permite; aquí usamos MicroSD).
  • Conexión a Internet estable. Ethernet recomendado.
  • Acceso por SSH (por ejemplo PuTTY desde Windows).

Nota sobre red: no necesitas “abrir” el puerto 8333 para sincronizar. El nodo puede descargar la cadena con conexiones salientes. Abrir 8333 ayuda a aceptar conexiones entrantes (útil para la red), pero no es requisito para el IBD (initial block download).


Paso 1 — Sistema operativo y hostname

Instala Raspberry Pi OS 64-bit con Raspberry Pi Imager (o una distro Debian-based equivalente). Al crear la imagen, puedes definir:

  • Usuario/clave
  • Wi-Fi (si aplica)
  • SSH habilitado
  • Hostname (por ejemplo: pi5core)

Si ya está instalado y quieres verificar/cambiar hostname:

hostname
hostnamectl
cat /etc/hostname
grep -nE '^127\.0\.1\.1' /etc/hosts

Para cambiarlo a pi5core:

sudo hostnamectl set-hostname pi5core
echo "pi5core" | sudo tee /etc/hostname >/dev/null

# Ajusta /etc/hosts (importante para evitar “unable to resolve host”)
sudo sed -i 's/^127\.0\.1\.1.*/127.0.1.1\tpi5core/' /etc/hosts

sudo reboot

Paso 2 — Actualiza el sistema (recomendado)

Antes de instalar Bitcoin Core, deja el sistema al día:

sudo apt update
sudo apt -y full-upgrade
sudo apt -y autoremove

Paso 3 — Prepara y monta el SSD (ext4)

⚠️ Advertencia: esto borra datos. Asegúrate de identificar bien el disco externo.

Conecta el SSD y revisa:

lsblk -o NAME,SIZE,MODEL,SERIAL,FSTYPE,MOUNTPOINTS
lsblk -f

Supongamos que el SSD aparece como /dev/sda. Si tiene particiones viejas, puedes recrear una sola partición ext4:

# 1) Crear una tabla de particiones GPT y una partición única
sudo parted -s /dev/sda mklabel gpt
sudo parted -s /dev/sda mkpart primary ext4 0% 100%

# 2) Formatear (esto crea /dev/sda1 normalmente)
sudo mkfs.ext4 -L BTC1TB /dev/sda1

Crea el punto de montaje y monta:

sudo mkdir -p /mnt/btc
sudo mount /dev/sda1 /mnt/btc

Haz el montaje persistente con /etc/fstab usando UUID:

sudo blkid /dev/sda1

Verás algo como UUID="xxxx-....". Agrega una línea al final de /etc/fstab:

sudo nano /etc/fstab

Línea sugerida (usa TU UUID real):

UUID=TU_UUID_AQUI  /mnt/btc  ext4  defaults,noatime  0  2

Prueba que monta bien:

sudo umount /mnt/btc
sudo mount -a
findmnt /mnt/btc

Paso 4 — Crea el usuario del servicio (bitcoin)

sudo adduser --system --group --home /home/bitcoin bitcoin

Crea el directorio de datos dentro del SSD:

sudo mkdir -p /mnt/btc/bitcoin
sudo chown -R bitcoin:bitcoin /mnt/btc/bitcoin
sudo chmod 750 /mnt/btc/bitcoin

Paso 5 — Descarga e instala Bitcoin Core (ARM64 / aarch64)

Trabajaremos en /tmp:

cd /tmp

Descarga el tarball oficial y el archivo de checksums (ajusta la versión si en el futuro cambia):

wget https://bitcoincore.org/bin/bitcoin-core-30.2/bitcoin-30.2-aarch64-linux-gnu.tar.gz
wget https://bitcoincore.org/bin/bitcoin-core-30.2/SHA256SUMS

Verifica el SHA256 (mínimo recomendado):

sha256sum bitcoin-30.2-aarch64-linux-gnu.tar.gz
grep 'bitcoin-30.2-aarch64-linux-gnu.tar.gz' SHA256SUMS

Los valores deben coincidir. (Opcional avanzado: verificación PGP de firmas; no lo cubro aquí para mantenerlo simple).

Instala en /opt y crea symlinks:

sudo tar -xzf bitcoin-30.2-aarch64-linux-gnu.tar.gz -C /opt
sudo ln -sf /opt/bitcoin-30.2/bin/* /usr/local/bin/

bitcoind --version

Paso 6 — Configura bitcoin.conf

Crea el directorio de config y el archivo:

sudo mkdir -p /etc/bitcoin
sudo nano /etc/bitcoin/bitcoin.conf

Configuración recomendada para Raspberry Pi (nodo sin wallet, datos en SSD):

# === Ubicación de datos (SSD) ===
datadir=/mnt/btc/bitcoin

# === Nodo ===
server=1
listen=1

# Si NO quieres usar la wallet interna (recomendado si tu objetivo es solo nodo):
disablewallet=1

# === Rendimiento Pi-friendly ===
dbcache=600
maxconnections=40

Protege permisos:

sudo chown -R root:bitcoin /etc/bitcoin
sudo chmod 750 /etc/bitcoin
sudo chmod 640 /etc/bitcoin/bitcoin.conf

Paso 7 — Servicio systemd (arranque automático)

Crea el servicio:

sudo tee /etc/systemd/system/bitcoind.service >/dev/null <<'EOF'
[Unit]
Description=Bitcoin Core Daemon
After=network-online.target
Wants=network-online.target
RequiresMountsFor=/mnt/btc

[Service]
User=bitcoin
Group=bitcoin
Type=simple
ExecStart=/usr/local/bin/bitcoind -conf=/etc/bitcoin/bitcoin.conf
ExecStop=/usr/local/bin/bitcoin-cli -conf=/etc/bitcoin/bitcoin.conf stop
Restart=on-failure
RestartSec=10
TimeoutStopSec=60
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=true
ReadWritePaths=/mnt/btc/bitcoin
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF

Habilita y arranca:

sudo systemctl daemon-reload
sudo systemctl enable --now bitcoind
sudo systemctl status bitcoind --no-pager

Paso 8 — Cómo ver el avance (porcentaje real)

El comando principal:

sudo -u bitcoin bitcoin-cli -conf=/etc/bitcoin/bitcoin.conf getblockchaininfo

Para ver solo lo importante (bloques, headers y progreso):

sudo -u bitcoin bitcoin-cli -conf=/etc/bitcoin/bitcoin.conf getblockchaininfo \
| grep -E '"blocks"|"headers"|"verificationprogress"'

Cómo interpretarlo:

  • headers: cabeceras descargadas. Esto suele avanzar rápido.
  • blocks: bloques realmente descargados/validados. Esto toma más.
  • verificationprogress: un número entre 0 y 1. Para porcentaje, multiplica por 100.

Ejemplo: si verificationprogress es 0.0096, eso es aproximadamente 0.96%.

Un comando práctico para refrescar cada 60 segundos:

watch -n 60 'sudo -u bitcoin bitcoin-cli -conf=/etc/bitcoin/bitcoin.conf getblockchaininfo \
| egrep "\"blocks\"|\"headers\"|\"verificationprogress\"|\"size_on_disk\"|\"initialblockdownload\""'

Y para ver conexiones de red:

sudo -u bitcoin bitcoin-cli -conf=/etc/bitcoin/bitcoin.conf getnetworkinfo \
| egrep "\"connections\"|\"networkactive\""

¿Cuánto tarda la sincronización inicial?

Depende principalmente de: velocidad/estabilidad de Internet, rendimiento del SSD, y CPU. Puede ir desde varios días hasta semanas en hardware modesto o redes lentas. Lo normal es que al inicio veas headers muy arriba y blocks bastante atrás: eso es esperable.

Consejo: revisa progreso cada pocas horas al inicio (por ejemplo cada 3–6 horas) para confirmar que suben blocks y verificationprogress.


¿Ethernet (wired) acelera la sincronización?

Generalmente sí: Ethernet suele dar menor latencia, menos pérdidas y más estabilidad que Wi-Fi. Eso se traduce en descargas más constantes y menos “microcortes” que ralentizan el IBD. Si puedes, deja el Pi por cable, especialmente durante la sincronización inicial.


¿Qué pasa si se va la luz? (y cómo apagar bien)

Si se va la luz, el proceso simplemente se interrumpe. Al volver, el nodo retomará desde donde iba. En general, con ext4 y un SSD decente, lo normal es que no se corrompa, aunque cortes bruscos repetidos pueden provocar que la base de datos necesite recuperación/reindex (poco común, pero posible).

Apagado recomendado:

# Detener el servicio de Bitcoin Core
sudo systemctl stop bitcoind

# Apagar el sistema
sudo shutdown -h now

Para encender: simplemente energiza el Pi; el servicio arrancará solo (porque quedó “enabled”).

Para confirmar tras reinicio:

sudo systemctl status bitcoind --no-pager
sudo -u bitcoin bitcoin-cli -conf=/etc/bitcoin/bitcoin.conf getblockchaininfo \
| egrep "\"blocks\"|\"headers\"|\"verificationprogress\""

Seguridad mínima recomendada

  • No expongas RPC a Internet. En esta guía no abrimos RPC.
  • El puerto “público” del nodo es 8333/TCP (P2P). Eso solo es necesario si quieres aceptar conexiones entrantes.
  • Evita abrir puertos “por probar”. Mantén el Pi actualizado.

Apéndice A — Comandos de diagnóstico rápido

# ¿El SSD está montado?
findmnt /mnt/btc

# Estado del servicio
sudo systemctl status bitcoind --no-pager

# Últimos logs del servicio
sudo journalctl -u bitcoind -n 80 --no-pager

# Progreso resumido
sudo -u bitcoin bitcoin-cli -conf=/etc/bitcoin/bitcoin.conf getblockchaininfo \
| egrep "\"blocks\"|\"headers\"|\"verificationprogress\"|\"size_on_disk\"|\"initialblockdownload\""

Apéndice B — Dominio/subdominio y Cloudflare (puerto 8333) sin confusiones

Primero lo esencial: NO necesitas exponer 8333 para sincronizar. El nodo puede descargar la cadena con conexiones salientes. Abrir 8333 es para que otros nodos te conecten a ti (conexiones entrantes), lo cual ayuda a la red y mejora tu “conectividad” como nodo.

Sobre Cloudflare: el “nube naranja” (proxy) está pensado para HTTP/HTTPS en puertos específicos. 8333 no está en la lista de puertos proxy soportados en el plan normal, así que no puedes “proxyear” el P2P de Bitcoin con la nube naranja estándar.

Entonces, ¿qué sí puedes hacer cuando estés en tu oficina (donde sí controlas el router)?

  1. Configura un port forward 8333/TCP del router hacia la IP local de tu Pi.
  2. En Cloudflare, crea un registro DNS (A/AAAA) para tu subdominio apuntando a tu IP pública.
  3. Deja el registro en modo DNS only (nube gris) para 8333. (La nube naranja no aplica para este puerto).
  4. En el firewall/router: abre únicamente 8333/TCP. Mantén todo lo demás cerrado.

Importante: si tu IP pública es dinámica, necesitarás DDNS (o una actualización automática vía API) para mantener el registro DNS apuntando bien.

Apéndice C — Monitoreo del avance (snapshots comparables)

Si eres como yo, no te basta con “ya está sincronizando”: vas a querer ver el avance, con hora exacta, y poder comparar “antes vs después” sin adivinar. Para eso, te dejo un enfoque muy práctico: tomar snapshots del estado del nodo y guardarlos en un log dentro del SSD. Así, cada lectura queda registrada con timestamp y luego puedes medir progreso real.

Recomendación de rutina (simple y efectiva):

  • Primera hora: toma un snapshot al iniciar y otro a la hora (para confirmar que está sano y avanzando).
  • Luego toma uno a las 4 horas (para tener una primera “métrica real”).
  • Después, basta con 1 snapshot al día (o cuando te pique la curiosidad).

C.1 — Comando rápido para tomar un snapshot (sin instalar nada extra)

Este comando crea una carpeta en el SSD y agrega una entrada a un log con:

  • hora (ISO),
  • uptime,
  • estado de bitcoind,
  • peers (conexiones),
  • avance (blocks, headers, verificationprogress, size_on_disk, IBD).

Copia y pega tal cual:

sudo mkdir -p /mnt/btc/monitor

sudo bash -c '{
  echo "===== SNAPSHOT $(date -Is) ====="
  echo "--- uptime ---"
  uptime
  echo "--- bitcoind ---"
  systemctl is-active bitcoind
  systemctl show -p ActiveEnterTimestamp,ActiveEnterTimestampMonotonic bitcoind
  echo "--- peers ---"
  sudo -u bitcoin bitcoin-cli -conf=/etc/bitcoin/bitcoin.conf getnetworkinfo | egrep "\"connections\"|\"networkactive\""
  echo "--- chain ---"
  sudo -u bitcoin bitcoin-cli -conf=/etc/bitcoin/bitcoin.conf getblockchaininfo | egrep "\"blocks\"|\"headers\"|\"verificationprogress\"|\"initialblockdownload\"|\"size_on_disk\""
  echo
} >> /mnt/btc/monitor/bitcoin_sync.log'

Ver el final del log:

tail -n 40 /mnt/btc/monitor/bitcoin_sync.log

C.2 — Snapshot “pro” como comando reutilizable: btc-snap

Esto te deja un comando que puedes ejecutar cuando quieras con un simple btc-snap.

Instalar btc-snap

Copia y pega:

sudo tee /usr/local/bin/btc-snap >/dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

LOGDIR="/mnt/btc/monitor"
LOGFILE="$LOGDIR/bitcoin_sync.log"

sudo mkdir -p "$LOGDIR"

{
  echo "===== SNAPSHOT $(date -Is) ====="
  echo "--- uptime ---"
  uptime
  echo "--- bitcoind ---"
  systemctl is-active bitcoind || true
  systemctl show -p ActiveEnterTimestamp,ActiveEnterTimestampMonotonic bitcoind || true
  echo "--- peers ---"
  sudo -u bitcoin bitcoin-cli -conf=/etc/bitcoin/bitcoin.conf getnetworkinfo \
    | egrep "\"connections\"|\"networkactive\"" || true
  echo "--- chain ---"
  sudo -u bitcoin bitcoin-cli -conf=/etc/bitcoin/bitcoin.conf getblockchaininfo \
    | egrep "\"blocks\"|\"headers\"|\"verificationprogress\"|\"initialblockdownload\"|\"size_on_disk\"" || true
  echo
} | sudo tee -a "$LOGFILE" >/dev/null

# deja el log legible
sudo chmod 664 "$LOGFILE" || true
EOF

sudo chmod +x /usr/local/bin/btc-snap

Usarlo

btc-snap
tail -n 40 /mnt/btc/monitor/bitcoin_sync.log

C.3 — Comparación automática entre el último snapshot y el anterior: btc-diff

Esto es lo que te da “sensación de avance real”: calcula tiempo transcurrido, bloques por hora, crecimiento de disco, etc.

Instalar btc-diff

Copia y pega:

sudo tee /usr/local/bin/btc-diff >/dev/null <<'EOF'
#!/usr/bin/env python3
import re, sys
from datetime import datetime

log="/mnt/btc/monitor/bitcoin_sync.log"
txt=open(log,'r',encoding='utf-8',errors='ignore').read()
parts=[p for p in txt.split("===== SNAPSHOT ") if p.strip()]
if len(parts)<2:
    print("Necesitas al menos 2 snapshots en", log); sys.exit(1)

def parse(part):
    first=part.splitlines()[0].split(" =====")[0].strip()
    ts=datetime.fromisoformat(first)
    blocks=int(re.search(r'"blocks":\s*(\d+)', part).group(1))
    vp=float(re.search(r'"verificationprogress":\s*([0-9.]+)', part).group(1))
    size=int(re.search(r'"size_on_disk":\s*(\d+)', part).group(1))
    con=int(re.search(r'"connections":\s*(\d+)', part).group(1))
    ibd=re.search(r'"initialblockdownload":\s*(true|false)', part).group(1)
    headers_m=re.search(r'"headers":\s*(\d+)', part)
    headers=int(headers_m.group(1)) if headers_m else None
    return ts, blocks, vp, size, con, ibd, headers

a=parse(parts[-2]); b=parse(parts[-1])
dt=(b[0]-a[0]).total_seconds()
dblocks=b[1]-a[1]; dvp=b[2]-a[2]; dsize=b[3]-a[3]

print(f"From {a[0].isoformat()} to {b[0].isoformat()}  (Δt={dt:.0f}s)")
print(f"blocks: {a[1]} -> {b[1]} (Δ={dblocks}, {dblocks/dt:.2f} blk/s, {dblocks/dt*3600:.0f} blk/h)")
print(f"verificationprogress: {a[2]:.6f} -> {b[2]:.6f} (Δ={dvp*100:.4f} points, ~{dvp/dt*3600*100:.2f} points/h)")
print(f"size_on_disk: {a[3]} -> {b[3]} (Δ={dsize/1024/1024:.1f} MiB)")
print(f"connections: {b[4]}")
if b[6] is not None:
    print(f"headers: {b[6]} (gap headers-blocks={b[6]-b[1]})")
print(f"IBD: {b[5]}")
EOF

sudo chmod +x /usr/local/bin/btc-diff

Usarlo (la rutina ideal)

  1. Tomas snapshot:
btc-snap
  1. Comparas contra el anterior:
btc-diff

C.4 — Mini-guía de interpretación rápida

  • connections: mientras tengas >0 (ideal 8–20), estás conectado y descargando.
  • blocks: lo realmente importante: bloques validados completos.
  • headers: normalmente va por delante; el gap va bajando.
  • verificationprogress: un aproximado del % validado (x100).
  • initialblockdownload=true: aún estás en sincronización inicial.
    Cuando pase a false, ya estás prácticamente listo para operar “normal”.

“No te obsesiones con el minuto a minuto: toma métricas cada hora al inicio, luego cada 4–6 horas, y después una vez al día. El avance no es lineal, pero con snapshots comparables siempre sabrás si vas bien.”


Fuentes oficiales (para el lector curioso)

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Click to listen highlighted text!