diff --git a/.gitignore b/.gitignore index 75e859e..2a97c50 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,5 @@ PRUEBA-PERITAJE.md HALLAZGOS-PERITAJE.md MEJORAS.md COHERENCIA.md + +GIT.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 499899e..fa94906 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,32 @@ y el versionado sigue [Versionado Semántico](https://semver.org/lang/es/): la aprovechaba. Ahora pasa por `get()`, así que esas transacciones —ya confirmadas, e inmutables— se guardan toda la sesión. +### Documentación +- **Reescrita la guía de instalación.** `SETUP.md` no era una guía: más de la + mitad eran los pasos personales de git y Gitea del autor ("PASO 1 — Crear el + repo en Gitea"), que se han movido a un documento privado. Ahora es una guía + real, con una comprobación tras cada paso para saber si vas bien sin + descubrirlo al final con una pantalla en blanco. +- **Corregida la configuración de nginx documentada, que estaba rota.** El + README indicaba `alias /var/www/txoko/dashboard.html` — un alias a un + ARCHIVO. Desde la 1.11.0, con las librerías en `vendor/` y rutas relativas, + eso hace que el navegador no las encuentre y la página quede en blanco sin + ningún error visible. Debe apuntar al **directorio**. Es el fallo más común + de esta instalación y ahora está avisado en tres sitios, con una comprobación + concreta (`curl` mirando el `content-type`, no solo el código 200) para + descartarlo. +- Los pasos de instalación no mencionaban las librerías del frontend, sin las + cuales la aplicación no arranca. Ya están integradas en el orden correcto. +- Eliminados del repositorio los datos personales del autor: rutas de su + máquina en la documentación y, sobre todo, su nombre de usuario del sistema + y su ruta de instalación dentro de `txoko-metrics.service`, que llevaban ahí + desde el primer commit. El servicio usa ahora marcadores que hay que ajustar + antes de instalarlo. +- README: estructura del repositorio actualizada (faltaban `tests/`, + `instalar-fuentes.sh` y `FIXTURES.md`) y sección de instalación reducida a un + resumen que remite a SETUP.md, para que haya una sola fuente de verdad. +- SETUP.md incluye ahora tabla de problemas frecuentes y cómo actualizar. + --- ## [1.12.0] — 2026-07-27 ### Añadido diff --git a/README.md b/README.md index 5dfd408..65826b6 100644 --- a/README.md +++ b/README.md @@ -151,66 +151,29 @@ Probado sobre Ubuntu Server 24.04 con HP EliteDesk (i5, 32GB RAM, 2TB NVMe). ## Instalación -### 1. Clonar el repositorio +**La guía completa está en [SETUP.md](SETUP.md)** — paso a paso, con una +comprobación después de cada uno para que sepas si vas bien sin tener que +descubrirlo al final. -```bash -git clone https://git.bitcointxoko.org/pikaro/txoko-dashboard.git -cd txoko-dashboard -``` +Resumen de lo que implica: -### 2. Copiar el dashboard +1. Clonar el repositorio. +2. Copiar `dashboard.html` a un **directorio** propio servido por nginx. +3. Descargar las librerías (React, Babel y las fuentes) a `vendor/`, junto al + dashboard, y verificarlas por hash. No están en el repo: son de terceros y + ocupan ~3 MB. +4. Opcionalmente, instalar el monitor del sistema como servicio systemd. +5. Configurar nginx: el dashboard, un proxy a la API de Mempool y otro al + monitor. -```bash -cp dashboard.html /var/www/txoko/dashboard.html -# o donde lo sirvas con nginx -``` +Un aviso que ahorra disgustos: en nginx, el `alias` del dashboard debe apuntar +al **directorio** (con barra final), no al archivo `dashboard.html`. Si apunta +al archivo, el navegador no encuentra `vendor/` y verás una página en blanco +sin ningún error visible. Es el fallo más común, y en SETUP.md hay una +comprobación concreta para descartarlo. -### 3. Copiar el backend de métricas - -```bash -cp system-metrics.js /home/armg/txoko/system-metrics.js -``` - -Editar `system-metrics.js` y añadir tus credenciales RPC de Bitcoin Core -(el archivo del repo usa placeholders). - -### 4. Configurar el servicio systemd - -```bash -sudo cp txoko-metrics.service /etc/systemd/system/ -sudo systemctl daemon-reload -sudo systemctl enable txoko-metrics -sudo systemctl start txoko-metrics -``` - -### 5. Configurar nginx - -Añadir a tu configuración de nginx: - -```nginx -# Dashboard -location /dashboard { - alias /var/www/txoko/dashboard.html; -} - -# API Mempool (ajusta el puerto según tu instalación) -location /api/ { - proxy_pass http://localhost:8999; -} - -# Métricas del sistema -location /system/ { - proxy_pass http://127.0.0.1:4082; -} -``` - -### 6. Abrir en el navegador - -``` -http://TU-IP-TAILSCALE:4080/dashboard -``` - -Introduce la URL de tu Mempool en el modal de configuración y empieza a analizar. +Cuando termines, abre `http://TU-IP:4080/dashboard/` — **con la barra final** —, +pulsa CONFIG e introduce la URL de tu Mempool. --- @@ -218,15 +181,22 @@ Introduce la URL de tu Mempool en el modal de configuración y empieza a analiza ``` txoko-dashboard/ -├── dashboard.html # Frontend completo (HTML + CSS + JS en un solo archivo) -├── system-metrics.js # Backend de métricas del nodo (Node.js) -├── txoko-metrics.service # Servicio systemd -├── README.md -├── SETUP.md +├── dashboard.html # La aplicación entera (HTML + CSS + JS en un archivo) +├── system-metrics.js # Monitor del nodo (Node.js) — opcional +├── txoko-metrics.service # Servicio systemd para el monitor +├── instalar-fuentes.sh # Descarga IBM Plex al nodo y genera su CSS +├── tests/ # Pruebas de la criptografía contra vectores oficiales +├── SETUP.md # Guía de instalación +├── FIXTURES.md # Transacciones reales para probar las heurísticas ├── CHANGELOG.md +├── README.md └── LICENSE ``` +Tras la instalación, junto al `dashboard.html` queda además un directorio +`vendor/` con las librerías y las fuentes. No está en el repositorio: se +descarga y se verifica durante la instalación (ver [SETUP.md](SETUP.md)). + El frontend es un único archivo HTML. Sin bundler, sin npm, sin proceso de build: Babel transpila el JSX en el navegador, así que lo que lees en el archivo es exactamente lo que se ejecuta — no hay una versión compilada que auditar por separado. Las librerías (React, Babel, las fuentes) viven aparte, en `vendor/`, servidas desde tu propio nodo y verificadas por hash durante la instalación. Se dejan fuera del repo a propósito: son código de terceros, y mezclarlas con el tuyo haría más difícil auditar lo que de verdad importa. diff --git a/SETUP.md b/SETUP.md index b25837a..afec371 100644 --- a/SETUP.md +++ b/SETUP.md @@ -1,187 +1,93 @@ -# Cómo subir Txoko a Gitea — paso a paso +# Instalación de Txoko Node Dashboard -Instrucciones exactas. Copiar y pegar en la terminal del Mac. -No hace falta entender git para seguir esto. +Guía completa, de principio a fin. Sigue los pasos en orden y comprueba cada +uno antes de pasar al siguiente: cada comprobación te dice si vas bien, en vez +de dejarte descubrirlo al final con una pantalla en blanco. + +Todo se hace **en el nodo**, salvo donde se indique lo contrario. --- -## PASO 1 — Crear el repo en Gitea (una sola vez) +## Antes de empezar -1. Abre tu instancia de Gitea en el navegador -2. Clic en el **+** (arriba a la derecha) → "New Repository" -3. Rellena: - - **Repository Name:** `txoko-dashboard` - - **Description:** `Suite de auditoría de privacidad Bitcoin para nodos propios` - - **Visibility:** Private (o Public si quieres compartirlo con la comunidad) - - **Initialize repository:** NO marcar (ya traemos nuestros archivos) -4. Clic en "Create Repository" -5. Gitea te muestra una página con instrucciones — copia la URL del repo, - será algo como: `https://gitea.tu-comunidad/tu-usuario/txoko-dashboard.git` +Txoko no habla con la red Bitcoin directamente: se apoya en cosas que ya +tienes montadas. Necesitas: ---- +| Requisito | Para qué | +|---|---| +| **Bitcoin Core** con `txindex=1` | consultar cualquier transacción, no solo las tuyas | +| **Mempool self-hosted** ([mempool/mempool](https://github.com/mempool/mempool)) | la API que Txoko consulta | +| **Fulcrum** ([cculianu/Fulcrum](https://github.com/cculianu/Fulcrum)) | índice de direcciones; Mempool lo usa por debajo | +| **nginx** | sirve el dashboard y hace de proxy hacia lo anterior | +| **Node.js ≥ 18** | solo para el monitor del sistema (paso 4) | -## PASO 2 — Configurar git en el Mac (una sola vez, si no lo tienes) +Si Mempool self-hosted ya te funciona en el navegador, tienes todo lo demás. + +Comprueba que la API responde antes de seguir. Ajusta el puerto al tuyo: ```bash -git config --global user.name "tu nombre" -git config --global user.email "tu@email.com" +curl -s http://127.0.0.1:8999/api/v1/fees/recommended ``` -Comprueba que git está instalado: -```bash -git --version -``` -Si no está: `brew install git` +Debe devolver un JSON con comisiones. Si no responde, arregla eso primero: +Txoko no puede funcionar sin ello. + +> **Nunca expongas estos puertos a internet.** Txoko está pensado para +> accederse por Tailscale, VPN o red local. --- -## PASO 3 — Crear el repo local y primer commit (una sola vez) +## Paso 1 — Descargar los archivos ```bash -# Crear carpeta del proyecto en el Mac -mkdir ~/txoko-dashboard -cd ~/txoko-dashboard - -# Copiar los archivos del repo que te he preparado -# (descarga los archivos de esta conversación y cópialos aquí) - -# Inicializar git -git init -git branch -M main - -# Añadir todos los archivos -git add . - -# Primer commit — el historial empieza aquí -git commit -m "inicio: dashboard de privacidad Bitcoin con análisis on-chain" +git clone https://git.bitcointxoko.org/pikaro/txoko-dashboard.git +cd txoko-dashboard ``` --- -## PASO 4 — Conectar con Gitea y subir (una sola vez) +## Paso 2 — Elegir dónde vivirá el dashboard + +Esta decisión condiciona el resto, así que conviene hacerla a conciencia. + +Necesitas un **directorio** propio para Txoko. No vale colocar el +`dashboard.html` suelto en cualquier sitio: la aplicación carga sus librerías +desde un subdirectorio `vendor/` **junto al propio archivo**, así que ambos +tienen que convivir. ```bash -# Sustituye la URL por la de tu repo de Gitea -git remote add origin https://gitea.tu-comunidad/tu-usuario/txoko-dashboard.git - -# Subir -git push -u origin main +sudo mkdir -p /var/www/txoko +sudo cp dashboard.html /var/www/txoko/ ``` -Gitea te pedirá usuario y contraseña la primera vez. -Si quieres evitar introducirlos cada vez, crea un token en -Gitea → Settings → Applications → "Generate Token" y úsalo como contraseña. +Puedes usar otra ruta; solo recuerda cuál es, porque aparece en los pasos 3 y 5. --- -## PASO 5 — Flujo de trabajo normal (cada vez que yo te dé un archivo nuevo) +## Paso 3 — Instalar las librerías del frontend + +Txoko usa React y Babel, y la tipografía IBM Plex. **Se sirven desde tu propio +nodo, nunca desde un CDN externo.** + +El motivo es de privacidad, no de comodidad: un CDN no vería qué transacciones +analizas, pero sí recibiría tu IP y la hora cada vez que abres el dashboard — +sabría que usas Txoko, cuándo y desde dónde. Justo el metadato que esta +herramienta enseña a proteger. Sirviéndolas en local, *"ninguna consulta sale +de tu red"* es literal, y el dashboard funciona sin conexión a internet. + +No están en el repositorio porque son código de terceros y ocupan unos 3 MB. + +### React y Babel ```bash -cd ~/txoko-dashboard - -# Copiar el archivo actualizado descargado de esta conversación -cp ~/Downloads/txoko-dashboard.html ./dashboard.html - -# Ver qué cambió (opcional pero útil) -git diff dashboard.html - -# Registrar el cambio con un mensaje descriptivo -git add dashboard.html -git commit -m "fix: descripción breve de lo que se arregló" - -# Subir a Gitea -git push - -# Copiar al nodo (igual que antes) -scp dashboard.html armg@100.116.19.86:/home/armg/txoko/dashboard.html -``` - ---- - -## Mensajes de commit — ejemplos - -El mensaje va después de `-m` y describe QUÉ cambiaste. -No tiene que ser perfecto, solo útil para ti en el futuro. - -``` -"fix: timeout en consultas al nodo" -"feat: score por bandas ALTA/MEDIA/BAJA" -"fix: responsive pestaña Mempool en móvil" -"fix: detección Whirlpool con tolerancia 2%" -"feat: fingerprinting wallet completo" -"fix: umbral dust por tipo de salida" -"docs: actualizar README con nuevas funcionalidades" -``` - -Convención (opcional pero ordenada): -- `fix:` — corrige algo que no funcionaba bien -- `feat:` — añade algo nuevo -- `docs:` — solo documentación - ---- - -## Si algo sale mal - -**Subiste algo que no querías:** -```bash -git revert HEAD -git push -``` - -**Quieres volver a una versión anterior:** -```bash -git log --oneline # ver el historial -git checkout HASH_DEL_COMMIT -- dashboard.html # recuperar ese archivo -``` - -**Ver el historial:** -```bash -git log --oneline -``` - ---- - -## Resumen del flujo - -``` -Claude te da dashboard.html - ↓ -cp ~/Downloads/dashboard.html ./dashboard.html - ↓ -git add . && git commit -m "descripción" - ↓ -git push - ↓ -scp dashboard.html armg@100.116.19.86:/home/armg/txoko/ -``` - -Cuatro comandos después de la descarga. Siempre los mismos. - ---- - -## Librerías del frontend (obligatorio) - -El dashboard usa React y Babel. **Se sirven desde tu propio nodo, no desde un -CDN.** El motivo es de privacidad, no de comodidad: un CDN externo no ve qué -transacciones analizas, pero sí ve que usas Txoko, cuándo y desde qué IP -pública — exactamente la clase de metadato que esta herramienta enseña a -proteger. Sirviéndolas en local, *"ninguna consulta sale de tu red"* pasa a ser -literal, y el dashboard funciona sin conexión a internet. - -Estas librerías **no están en el repo** (son de terceros y pesan ~3 MB). Se -descargan una vez, en el nodo: - -```bash -sudo mkdir -p /usr/share/nginx/html/vendor -cd /usr/share/nginx/html/vendor +sudo mkdir -p /var/www/txoko/vendor +cd /var/www/txoko/vendor sudo curl -sSLO https://unpkg.com/react@18.3.1/umd/react.production.min.js sudo curl -sSLO https://unpkg.com/react-dom@18.3.1/umd/react-dom.production.min.js sudo curl -sSL -o babel.min.js https://unpkg.com/@babel/standalone@7.23.10/babel.min.js ``` -### Verifica lo que has descargado - -No te fíes: comprueba que los archivos son los que deben ser. +**Comprueba que has recibido lo que esperabas.** No te fíes: verifícalo. ```bash sha256sum *.js @@ -195,118 +101,218 @@ Debe dar exactamente esto: d949f1c3687aedadcedac85261865f29b17cd273997e7f6b2bfc53b2f9d4c4dd react.production.min.js ``` -Si algún hash no coincide, **no uses esos archivos**: significa que has -recibido algo distinto a lo esperado. +Si alguno no coincide, **para aquí**: has recibido algo distinto de lo esperado. -Las versiones están fijadas a propósito (`18.3.1`, `7.23.10`). Usar un rango -como `react@18` dejaría que el servidor decidiera qué versión te entrega, y -cambiaría con el tiempo sin que te enteres. +Las versiones están fijadas a propósito. Usar un rango como `react@18` dejaría +que el servidor decidiera qué versión te entrega, y cambiaría con el tiempo sin +que te enteres. -### Dónde deben quedar los archivos - -El dashboard las busca en `vendor/` con **ruta relativa**, es decir, en un -subdirectorio junto al propio `dashboard.html`. Así funciona tanto si sirves el -dashboard en la raíz como bajo un prefijo, sin tocar nginx. - -Con la configuración típica de Mempool self-hosted: - -```nginx -location /dashboard { - alias /usr/share/nginx/html/; -} -``` - -…el `dashboard.html` vive en `/usr/share/nginx/html/` y las librerías deben ir -en `/usr/share/nginx/html/vendor/` — que es justo donde las deja el comando de -arriba. - -**Importante:** abre el dashboard **con la barra final** (`.../dashboard/`, no -`.../dashboard`). Sin ella, el navegador resuelve las rutas relativas un nivel -por encima y no encuentra las librerías. - -Para comprobar que nginx las sirve bien, lo que importa no es solo el código -200 sino el tipo de contenido: +### Las fuentes ```bash -curl -sk -o /dev/null -w '%{http_code} %{content_type}\n' \ - https://localhost:4081/dashboard/vendor/react.production.min.js +sudo /ruta/al/repo/instalar-fuentes.sh /var/www/txoko/vendor/fonts ``` -Debe responder `200 application/javascript`. Si devuelve `200 text/html`, -nginx está entregando otra cosa (por ejemplo el index de Mempool) y las rutas -no son las correctas. +El script descarga IBM Plex (licencia libre OFL), comprueba cada archivo y +aborta si algo falla. Son unos 350 KB. --- -## HTTPS para watch-only (opcional) +## Paso 4 — El monitor del sistema (opcional) -La función watch-only (derivar tus direcciones desde el xpub) usa la Web Crypto -API del navegador, que **solo funciona sobre HTTPS**. Si sirves el dashboard por -HTTP, watch-only no estará disponible — el resto de la app funciona igual. Las -etiquetas BIP-329 no necesitan HTTPS. - -Si quieres usar watch-only y tu nodo va por HTTP (por ejemplo, acceso por -Tailscale sin certificado), puedes generar un certificado autofirmado. Es lo que -sigue. Todo se hace en el nodo. - -### 1. Generar el certificado autofirmado - -Sustituye la IP por la de tu nodo (Tailscale, local, etc.): +Alimenta la pestaña NODO: CPU, RAM, disco, estado de Bitcoin Core y logs. Sin +esto el resto de la aplicación funciona igual, solo que esa pestaña queda vacía. ```bash -sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \ - -keyout /etc/ssl/private/txoko.key \ - -out /etc/ssl/certs/txoko.crt \ - -subj "/CN=100.116.19.86" \ - -addext "subjectAltName=IP:100.116.19.86" +mkdir -p ~/txoko +cp system-metrics.js ~/txoko/ ``` -### 2. Configurar nginx para servir HTTPS +Edita `~/txoko/system-metrics.js` y sustituye los dos marcadores por tus +credenciales RPC de Bitcoin Core (las de tu `bitcoin.conf`): -Añade un bloque `server` que escuche en un puerto con SSL (por ejemplo 4081), -apuntando al certificado recién creado e incluyendo la misma configuración que -tu servidor HTTP: +```js +const RPC_USER = "TU_RPC_USER"; +const RPC_PASS = "TU_RPC_PASSWORD"; +``` + +Instala el servicio. Antes revisa el `.service`, porque trae rutas y usuario +que probablemente tengas que ajustar a los tuyos: + +```bash +nano txoko-metrics.service +sudo cp txoko-metrics.service /etc/systemd/system/ +sudo systemctl daemon-reload +sudo systemctl enable --now txoko-metrics +``` + +**Comprueba que arrancó:** + +```bash +systemctl is-active txoko-metrics # debe decir: active +curl -s http://127.0.0.1:4082/system/info | head -c 200 +``` + +> Si `systemctl status` muestra un punto que no es verde pero pone +> `active (running)`, está bien. Lo que importa es el texto. + +--- + +## Paso 5 — Configurar nginx + +Aquí es donde más gente se atasca, así que léelo con calma. + +Añade esto a tu configuración de nginx (si usas Mempool self-hosted, dentro del +mismo bloque `server`): ```nginx -server { - listen 4081 ssl; - listen [::]:4081 ssl; - server_name _; - ssl_certificate /etc/ssl/certs/txoko.crt; - ssl_certificate_key /etc/ssl/private/txoko.key; - ssl_session_timeout 4h; - ssl_protocols TLSv1.3; - ssl_prefer_server_ciphers on; +# Dashboard — OJO: alias a un DIRECTORIO, con barra final +location /dashboard/ { + alias /var/www/txoko/; + index dashboard.html; + try_files $uri $uri/ /dashboard/dashboard.html; +} - # Incluye aquí tu misma config (location /dashboard, /api/, etc.) - # Si ya tienes esos location en un snippet, basta con incluirlo: - # include /etc/nginx/snippets/tu-config.conf; +# API de Mempool — ajusta el puerto al de tu instalación +location /api/ { + proxy_pass http://127.0.0.1:8999; +} + +# Monitor del sistema (solo si hiciste el paso 4) +location /system/ { + proxy_pass http://127.0.0.1:4082; } ``` -Si el bloque `location /dashboard` ya viene de un snippet que incluyes, **no lo -dupliques** dentro del server SSL: nginx dará error `duplicate location`. +**El detalle que rompe la instalación:** el `alias` tiene que apuntar al +**directorio**, con barra final, no al archivo `dashboard.html`. Si apunta al +archivo, el navegador no encontrará `vendor/` y verás una **página en blanco** +sin ningún mensaje de error. Es el fallo más común de esta instalación. -Comprueba y recarga: +Recarga nginx: ```bash sudo nginx -t && sudo systemctl reload nginx ``` -### 3. Confiar el certificado la primera vez +--- -Abre `https://TU-IP:4081/dashboard/` en el navegador. Como el certificado es -autofirmado, el navegador avisará de que la conexión no es privada. Es esperado -—lo creaste tú— y es seguro en tu propia red: +## Paso 6 — Comprobar que funciona -- **Safari:** clic en "visitar este sitio web" (abajo del aviso) y confirma -- **Chrome/Brave:** "Configuración avanzada" → "Acceder a TU-IP (no seguro)" +Antes de abrir el navegador, verifica desde el propio nodo. Ajusta el puerto: -A partir de ahí el navegador recuerda la excepción y la Web Crypto API queda -disponible, así que watch-only funcionará. +```bash +# El dashboard llega +curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:4080/dashboard/ -> Nota: un certificado autofirmado es perfectamente válido para uso personal en -> tu propia red. El aviso del navegador existe porque no hay una autoridad -> certificadora de por medio, no porque la conexión sea insegura — el tráfico va -> cifrado igual. +# Y las librerías TAMBIÉN — esto es lo que suele fallar +curl -s -o /dev/null -w '%{http_code} %{content_type}\n' \ + http://127.0.0.1:4080/dashboard/vendor/react.production.min.js +``` +La segunda debe responder **`200 application/javascript`**. + +Si devuelve `200 text/html` la instalación **no** está bien: nginx te está +sirviendo otra cosa (normalmente el index de Mempool) en lugar del archivo. +Revisa el `alias` del paso 5. Fíjate en que aquí no basta con mirar el código +200 — hay que mirar el tipo de contenido. + +Ahora sí, abre en el navegador: + +``` +http://TU-IP:4080/dashboard/ +``` + +**Con la barra final.** Sin ella, el navegador busca las librerías un nivel por +encima y no las encuentra. + +Pulsa **CONFIG** e introduce la URL de tu Mempool (por ejemplo +`http://TU-IP:4080`). Dale a PROBAR: si dice "Conexión exitosa", ya está. + +### Si ves una página en blanco + +Abre la consola del navegador (F12). Si aparece `SyntaxError: Unexpected +token '<'`, es exactamente el problema del `alias` del paso 5: nginx está +devolviendo HTML donde debería devolver JavaScript. + +--- + +## HTTPS — necesario para el watch-only (opcional) + +La función watch-only (derivar tus direcciones desde el xpub) usa la Web Crypto +API del navegador, que **solo funciona sobre HTTPS**. Por HTTP el resto de la +aplicación funciona igual; solo esa función queda deshabilitada. Las etiquetas +BIP-329 no necesitan HTTPS. + +Si accedes por Tailscale o red local no tendrás un certificado válido, así que +toca generar uno autofirmado. + +### 1. Generar el certificado + +Sustituye la IP por la de tu nodo: + +```bash +sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \ + -keyout /etc/ssl/private/txoko.key \ + -out /etc/ssl/certs/txoko.crt \ + -subj "/CN=100.64.0.5" \ + -addext "subjectAltName=IP:100.64.0.5" +``` + +El `subjectAltName` no es opcional: sin él los navegadores modernos rechazan el +certificado aunque el `CN` sea correcto. + +### 2. Servirlo en nginx + +Duplica tu bloque `server` en otro puerto (4081 en este ejemplo) añadiendo: + +```nginx +listen 4081 ssl; +ssl_certificate /etc/ssl/certs/txoko.crt; +ssl_certificate_key /etc/ssl/private/txoko.key; +``` + +Los `location` son los mismos del paso 5. Recarga con `sudo nginx -t && +sudo systemctl reload nginx`. + +### 3. Aceptar el certificado la primera vez + +Al entrar en `https://TU-IP:4081/dashboard/` el navegador avisará de que el +certificado no es de confianza. Es lo esperado: lo has firmado tú. Acepta la +excepción una vez. + +Que sea autofirmado no lo hace menos seguro **para este uso**: cifra igual, y +como el certificado lo has generado tú en tu propia máquina, nadie externo +puede suplantarlo. Lo que no tienes es el respaldo de una autoridad +certificadora, que aquí no aporta nada porque el servidor y el cliente son +tuyos. + +--- + +## Actualizar a una versión nueva + +```bash +git pull +sudo cp dashboard.html /var/www/txoko/ +``` + +Y recarga el navegador con **Ctrl+Shift+R** (o Cmd+Shift+R en Mac) para saltarte +la caché. + +Las librerías de `vendor/` no hace falta volver a descargarlas salvo que el +CHANGELOG diga lo contrario. Si además cambia `system-metrics.js`, cópialo de +nuevo (conservando tus credenciales) y reinicia con +`sudo systemctl restart txoko-metrics`. + +--- + +## Problemas frecuentes + +| Síntoma | Causa habitual | +|---|---| +| Página en blanco, consola con `Unexpected token '<'` | El `alias` de nginx apunta al archivo y no al directorio (paso 5) | +| Página en blanco al entrar sin barra final | Entra en `/dashboard/`, con barra | +| Aparece "DEMO · SIN NODO" | Falta configurar la URL del Mempool en CONFIG | +| La pestaña NODO está vacía | El servicio `txoko-metrics` no corre, o falta el `location /system/` | +| Watch-only no aparece | Estás entrando por HTTP; requiere HTTPS | +| La app dice que el nodo no responde | Comprueba la API con el `curl` de "Antes de empezar" | diff --git a/txoko-metrics.service b/txoko-metrics.service index 836ada7..f81af07 100644 --- a/txoko-metrics.service +++ b/txoko-metrics.service @@ -4,8 +4,15 @@ After=network.target bitcoind.service [Service] Type=simple -User=armg -ExecStart=/usr/bin/node /home/armg/txoko/system-metrics.js + +# ── AJUSTA ESTAS DOS LÍNEAS ANTES DE INSTALARLO ────────────────────────── +# User: el usuario con el que corre tu nodo (el mismo que ejecuta bitcoind +# suele ser buena elección). No lo dejes en root. +# ExecStart: la ruta donde hayas copiado system-metrics.js. +User=TU_USUARIO +ExecStart=/usr/bin/node /home/TU_USUARIO/txoko/system-metrics.js +# ───────────────────────────────────────────────────────────────────────── + Restart=on-failure RestartSec=5 StandardOutput=journal