La bitacora del run 26 tenia la respuesta: la sonda decia que install.ps1 NO
EXISTE y el paso siguiente, "Ejecutar instalador", salia en verde. Comprobado con
PowerShell real por que:
& 'C:\no-existe.ps1' -Service; exit $LASTEXITCODE -> exit 0
$LASTEXITCODE no se fija nunca (no corrio ningun comando nativo), asi que
`exit $null` da 0. El panel leia 0 y asentaba el paso como exitoso. NADA se
instalaba, y por eso seguia viva la 1.1.0: el agente viejo nunca se detuvo porque
el instalador nunca se ejecuto. Esa evidencia falsa mando el diagnostico a otra
parte durante varios runs.
- El script emite un CENTINELA `CRAS-FIN|<codigo>` y el panel lo EXIGE. Sin el, el
instalador no termino, de lo que de el codigo de salida. Un fallo no es una
respuesta — la misma leccion que la sonda, ahora en la invocacion.
Validado con PowerShell real: instalador normal -> CRAS-FIN|0; instalador que
sale 75 -> CRAS-FIN|75 (la traduccion a "restauracion en curso" sigue viva);
instalador inexistente -> CRAS-ERROR| y codigo 90 en vez de un 0 silencioso.
- "El instalador no esta" pasa a ser un hecho aparte de "no pude leerlo", y aborta
con 502. Antes se colapsaba en `desconocido`, el run continuaba sabiendolo ya,
gastaba el intento entero y acababa culpando al agente de no escribir su sello.
- Se asienta el CONTENIDO del staging tras extraer. Sin eso no se distinguia "el
instalador no esta", "esta en otra ruta" y "esta pero no se puede leer", que son
tres arreglos distintos.
Y dos cambios en el endurecimiento del token, cada uno defendible por si solo:
- Se restringe SOLO panel.env, no la carpeta. La restriccion de la carpeta era un
extra —su motivo declarado, que el archivo heredara una ACL permisiva al
crearse, ya lo cubre la ACE del propio archivo— y a cambio dejaba la carpeta con
ACE NO heredables, de modo que lo creado dentro despues podia quedar sin
permisos utilizables. Ahi se extrae el artefacto: era candidato serio a explicar
por que el instalador "no existia".
- Por SID y no por nombre de grupo. En un Windows en espanol
`BUILTIN\Administrators` no resuelve y el icacls falla entero; comprobado.
S-1-5-32-544 y S-1-5-18 valen en cualquier idioma.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Panel de Gestión de Bases de Datos (SvelteKit Migration)
Este proyecto es una migración moderna del panel de control legacy TransmitirAS, reconstruido utilizando SvelteKit 2.0 y Svelte 5 (Runes).
Características
- Tech Stack: SvelteKit, TypeScript, Node.js (MSSQL), Bootstrap 5.
- Server-Side Rendering (SSR): Todos los datos se cargan en el servidor para una carga inicial rápida y SEO/Performance óptimo.
- Base de Datos: Conexión a múltiples instancias SQL Server (Local, Remota, Azure).
- Diseño: Interfaz "Glassmorphism" portada fielmente del original.
Requisitos Previos
- Node.js: v18 o superior.
- SQL Server: Acceso a las instancias de base de datos definidas en
.env.
docker build \
-t dev.aduanasoft.com:8443/databases_a24c/frontend:latest \
-f ./Dockerfile \
./
Subirlas a harbor
docker login dev.aduanasoft.com:8443
docker push dev.aduanasoft.com:8443/databases_a24c/frontend:latest
Configuración
-
Instalar dependencias:
npm install -
Variables de Entorno: El archivo
.envya ha sido configurado con las credenciales migradas. Asegúrese de que la máquina donde se ejecuta esto tenga acceso de red a las IPs:- 192.168.1.200 (Primaria)
- 104.192.7.202 (Secundaria)
- aduanasoft.database.windows.net (Azure)
-
Ejecutar en Desarrollo:
npm run devAbrir http://localhost:5173 en el navegador.
-
Construir para Producción:
npm run build npm run preview
Estructura del Proyecto
src/lib/server/db.ts: Lógica de conexión a base de datos (Pools).src/routes/+page.server.ts: Controlador principal. Realiza todas las consultas SQL y lectura de archivos antes de renderizar.src/routes/+page.svelte: Vista principal. Gestiona la navegación por pestañas y tablas.src/lib/components/: Componentes reutilizables (Navbar,Sidebar).src/app.css: Estilos globales y tema Glass.
Integración CloudRestoreAS
- Endpoints servicio-a-servicio bajo
/api/restore/(tokenCLOUDRESTORE_API_TOKENen.env). - Servidores de Restauración (
/servidores-restauracion): admin de Alfa/Omega/Gamma y carpeta de entrada reportada por CloudRestoreAS (solo lectura). - Contrato y prueba local: ver
INTEGRACION_PANEL.mden el repo CloudRecoveryAS (mismo token enCLOUDRESTORE_API_TOKENy en la config PANEL de CloudRestoreAS).
Versiones CRAS (/versiones-cras) — instalación y actualización remota
Distribución de los binarios del agente. Los artefactos se publican en el registro de
paquetes genéricos de Gitea desde el build local del repo CloudRecoveryAS
(build-all.sh --publish); el panel los descubre leyendo esa API y los despliega por SSH.
build local (WSL) → Gitea: ADUANASOFT/generic/cloudrestoreas/<version>
↓ (el panel lee la API y guarda metadatos + sha256)
a24c.cras_releases → caché en CRAS_RELEASES_DIR
↓ (SFTP + exec)
servidor de restauración
Flujo de operación:
- Sincronizar con Gitea — registra las versiones publicadas en
a24c.cras_releases. Nunca activa nada por su cuenta: publicar no debe equivaler a desplegar. - Activar — marca la versión que se instalará, una por plataforma+arquitectura (índice único parcial en la BD, para que Windows y Linux tengan cada una la suya).
- Precargar (opcional) — descarga y verifica el artefacto antes de instalar, para separar el tiempo de descarga del de instalación.
- Instalar / Actualizar por servidor — sube el paquete por SFTP, verifica el sha256 en
el destino, corre el instalador que viene dentro del paquete y siembra
config/.envcon la URL, el token y la instancia: el servidor queda operativo sin configuración manual.
Detalles que importan:
- Los binarios no se guardan en Postgres (pesan ~270 MB); la BD solo tiene metadatos.
- El servidor destino no descarga nada de internet: el binario es autocontenido.
- El token del panel viaja al destino en un archivo
0600por SFTP, nunca como argumento de un comando (sería visible enpsy en el historial del servidor). - Se exige root o
sudo -nen Linux (y cuenta administradora en Windows), validado antes de transferir el artefacto. No se le pasa la contraseña asudo. - El progreso se persiste paso a paso en
a24c.cras_install_runs.steps; la UI lo consulta por polling en/versiones-cras/install-runs. - No hay subida de archivos por el navegador a propósito: la fuente de verdad es Gitea.
Variables nuevas en .env: GITEA_BASE_URL, GITEA_OWNER, GITEA_TOKEN
(scope read:package), CRAS_PACKAGE_NAME, CRAS_RELEASES_DIR,
CRAS_CACHE_KEEP_VERSIONS, PANEL_PUBLIC_URL. Ver .env.example.
Esquema: migración e2f3a4b5c6d7 en el repo a24c (autoritativa), replicada en
database/schema.sql y en el fallback ensureCrasSchema() de cras-releases.ts.
Notas de Migración
- DataTables: Se inicializan en el cliente dentro de
onMountpara mantener la compatibilidad con las tablas interactivas originales. - Sistema de Archivos: La lectura de backups busca en
BACKUP_PATHen el servidor donde corre Node.js (independiente de la carpeta que vigila CloudRestoreAS).