feat: cero dependencias externas y caché de peticiones al nodo
Las librerías (React, Babel) venían de unpkg.com y las fuentes de Google. Ninguno veía qué transacciones analizabas, pero ambos recibían tu IP y la hora en cada apertura: sabían que usabas Txoko, cuándo y desde dónde — el metadato que la propia herramienta enseña a proteger. Ahora se sirven desde el nodo, con verificación por hash y versiones fijadas. El dashboard funciona sin internet. Además, caché con TTL y coalescencia en useApi: las transacciones confirmadas son inmutables y se cachean toda la sesión, así que repetir un análisis ya explorado no cuesta ninguna petición al nodo (medido).
This commit is contained in:
Executable
+83
@@ -0,0 +1,83 @@
|
||||
#!/usr/bin/env bash
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
# Txoko — instalar IBM Plex en local (elimina la dependencia de Google Fonts)
|
||||
#
|
||||
# Descarga las fuentes IBM Plex (licencia OFL, libre) y genera el CSS que las
|
||||
# declara. Tras ejecutarlo, el dashboard deja de contactar con
|
||||
# fonts.googleapis.com y fonts.gstatic.com.
|
||||
#
|
||||
# Por qué importa: Google no ve qué transacciones analizas, pero sí recibe tu
|
||||
# IP, la hora y la página desde la que se pide la fuente, cada vez que abres el
|
||||
# dashboard. Para una herramienta de privacidad, sobra.
|
||||
#
|
||||
# Fuente: paquetes npm oficiales de IBM servidos por unpkg — el mismo origen
|
||||
# del que ya se descargan React y Babel durante la instalación.
|
||||
#
|
||||
# Ejecutar EN EL NODO:
|
||||
# chmod +x instalar-fuentes.sh && sudo ./instalar-fuentes.sh
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
set -uo pipefail
|
||||
|
||||
DEST="${1:-/usr/share/nginx/html/vendor/fonts}"
|
||||
MONO="https://unpkg.com/@ibm/plex-mono@1.1.0/fonts/complete/woff2"
|
||||
SANS="https://unpkg.com/@ibm/plex-sans@1.1.0/fonts/complete/woff2"
|
||||
|
||||
echo "→ Instalando fuentes en: $DEST"
|
||||
mkdir -p "$DEST"
|
||||
cd "$DEST" || { echo "✗ No se pudo entrar en $DEST"; exit 1; }
|
||||
|
||||
# Pesos que usa el dashboard: Mono 400/600/700, Sans 400/500/600.
|
||||
# Formato woff2 (el más comprimido, soportado por todo navegador actual).
|
||||
URLS="
|
||||
$MONO/IBMPlexMono-Regular.woff2
|
||||
$MONO/IBMPlexMono-SemiBold.woff2
|
||||
$MONO/IBMPlexMono-Bold.woff2
|
||||
$SANS/IBMPlexSans-Regular.woff2
|
||||
$SANS/IBMPlexSans-Medium.woff2
|
||||
$SANS/IBMPlexSans-SemiBold.woff2
|
||||
"
|
||||
|
||||
fallos=0
|
||||
for url in $URLS; do
|
||||
archivo=$(basename "$url")
|
||||
printf " %-32s" "$archivo"
|
||||
# -w escribe el código HTTP para poder diagnosticar si algo va mal
|
||||
codigo=$(curl -sSL -o "$archivo" -w "%{http_code}" "$url" 2>/dev/null)
|
||||
tam=$(stat -c%s "$archivo" 2>/dev/null || echo 0)
|
||||
if [ "$codigo" = "200" ] && [ "$tam" -gt 10000 ]; then
|
||||
echo "ok ($((tam/1024)) KB)"
|
||||
else
|
||||
echo "FALLÓ (HTTP $codigo, $tam bytes)"
|
||||
fallos=$((fallos+1))
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$fallos" -gt 0 ]; then
|
||||
echo
|
||||
echo "✗ $fallos archivo(s) no se descargaron correctamente."
|
||||
echo " No despliegues el dashboard nuevo todavía — avísame con esta salida."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ── CSS que declara las fuentes ──────────────────────────────────────────────
|
||||
# font-display:swap → el texto se ve desde el primer momento con la fuente de
|
||||
# respaldo y se sustituye al cargar la definitiva. Sin página en blanco.
|
||||
cat > ibm-plex.css <<'CSS'
|
||||
/* IBM Plex — servido desde tu propio nodo. Licencia OFL (IBM).
|
||||
Sustituye a fonts.googleapis.com: ninguna petición sale de tu red. */
|
||||
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:400;font-display:swap;src:url('IBMPlexMono-Regular.woff2') format('woff2')}
|
||||
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:600;font-display:swap;src:url('IBMPlexMono-SemiBold.woff2') format('woff2')}
|
||||
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:700;font-display:swap;src:url('IBMPlexMono-Bold.woff2') format('woff2')}
|
||||
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:400;font-display:swap;src:url('IBMPlexSans-Regular.woff2') format('woff2')}
|
||||
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:500;font-display:swap;src:url('IBMPlexSans-Medium.woff2') format('woff2')}
|
||||
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:600;font-display:swap;src:url('IBMPlexSans-SemiBold.woff2') format('woff2')}
|
||||
CSS
|
||||
|
||||
echo
|
||||
echo "✓ Fuentes instaladas y CSS generado."
|
||||
echo " Total: $(du -sh . | cut -f1)"
|
||||
echo
|
||||
echo " Comprueba que nginx las sirve (debe dar 200):"
|
||||
echo " curl -sk -o /dev/null -w '%{http_code}\\n' https://localhost:4081/vendor/fonts/ibm-plex.css"
|
||||
echo
|
||||
echo " Si da 200, ya puedes desplegar el dashboard.html nuevo."
|
||||
Reference in New Issue
Block a user