Publicar la web en kotej.alexandre-vazquez.cloud

Arquitectura de siempre: estatico en el LXC 142 (nginx, puerto 8083) con NPM
delante para el TLS del wildcard, y CNAME kotej -> dyn en Namecheap. No hay
backend porque no hace falta: los ficheros no salen del navegador.

El CNAME se anadio releyendo la zona entera y reenviandola con el registro
nuevo — setHosts reemplaza toda la zona, y perder el MX o el DKIM por no
reenviarlos romperia el correo. Verificado que los 39 registros siguen ahi.

deploy.sh deja el despliegue repetible; borra el destino antes de extraer para
que los assets viejos no se acumulen.

Closes #8

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015hEAYuHRKMYz9sSa9zmbzz
This commit is contained in:
alexandrev-tibco
2026-07-31 20:59:08 +02:00
parent 5d4b339b33
commit 43ab3a6c04
2 changed files with 87 additions and 0 deletions
+42
View File
@@ -0,0 +1,42 @@
# Kotej web
La misma comparación que la app de macOS, pero en el navegador — y **sin subir
nada**. Los ficheros se leen en el propio dispositivo con las APIs del navegador;
no hay backend al que mandarlos.
<https://kotej.alexandre-vazquez.cloud>
## Qué hace igual que el escritorio
- Carpetas, ficheros y archivos (ZIP, JAR, EAR, y ZIPs con cualquier extensión),
navegables como carpetas, incluso anidados
- Comparación binaria, de texto (con tolerancias) y semántica: JSON por
estructura y XML canónico, con los hermanos repetidos tratados como conjunto
- Diff lado a lado con los caracteres exactos que cambian, y distinguiendo
espacios / comentarios / contenido
- Pestañas, filtros, búsqueda, navegación entre diferencias y texto pegado
- Inglés y español, según el idioma del navegador
De un EAR sólo se lee la cola del fichero para listarlo, y las entradas se
descomprimen bajo demanda; comparar dos idénticas no llega a leerlas, porque el
CRC32 del directorio central ya lo resuelve.
## Desarrollo
```sh
npm install
npm run dev # servidor de desarrollo
npm test # tests del motor (los mismos casos que el motor Swift)
npm run build # bundle de producción
```
La prueba de navegador corre contra un build servido:
```sh
npm run build && npx vite preview --port 4173 &
npm run smoke
```
## Despliegue
`./deploy.sh` — build, empaquetado y copia al LXC 142; NPM pone el TLS delante.
Executable
+45
View File
@@ -0,0 +1,45 @@
#!/usr/bin/env bash
# Despliega la web de Kotej en kotej.alexandre-vazquez.cloud.
#
# Arquitectura: estatico puro en el LXC 142 (webserver, 192.168.1.202) servido
# por nginx en el puerto 8083, con NPM (LXC 109) delante para el TLS del
# wildcard. No hay backend: los ficheros se comparan en el navegador y nunca
# se suben, asi que no hay nada mas que servir.
#
# El vhost, el proxy host de NPM y el CNAME ya estan creados; esto solo
# actualiza el contenido.
set -euo pipefail
cd "$(dirname "$0")"
NODO=192.168.1.42 # payens: desde aqui se entra al LXC con pct
LXC=142
DESTINO=/var/www/kotej
SSH_KEY=~/.ssh/pxmanager
echo "==> build"
npm run build
echo "==> empaquetando"
TAR=$(mktemp -t kotej-dist).tgz
tar czf "$TAR" -C dist .
echo "==> subiendo a payens"
scp -q -i "$SSH_KEY" "$TAR" "root@$NODO:/tmp/kotej-dist.tgz"
rm -f "$TAR"
echo "==> desplegando en el LXC $LXC"
ssh -i "$SSH_KEY" "root@$NODO" bash -s <<EOF
set -e
pct push $LXC /tmp/kotej-dist.tgz /tmp/kotej-dist.tgz
# Se limpia primero: si no, los assets viejos (con otro hash) se acumularian
# para siempre.
pct exec $LXC -- sh -c 'rm -rf $DESTINO && mkdir -p $DESTINO \
&& tar xzf /tmp/kotej-dist.tgz -C $DESTINO && rm /tmp/kotej-dist.tgz'
rm -f /tmp/kotej-dist.tgz
EOF
echo "==> comprobando"
curl -fsS -o /dev/null -w " https://kotej.alexandre-vazquez.cloud -> %{http_code}\n" \
https://kotej.alexandre-vazquez.cloud/
echo "listo"