La pregunta "son la misma ruta?" estaba resuelta tres veces con tres criterios: normalizeWindowsPath recortaba comillas multiples, probeWindowsAgentProcess una sola, y cras-verify ninguna. Coincidian en los casos reales, pero este modulo ya lleva escrito lo que cuesta esa duplicacion — probeLinuxElevation e inspectLinux tuvieron copias paralelas y las dos pantallas acabaron diciendo cosas distintas del mismo servidor. Ahora es sameWindowsPath() + windowsAgentExe(), usadas en los tres sitios. Lo que NO se hace, y queda documentado en el codigo: comparar por prefijo. C:\Aduanasoft\CloudRestoreAS es prefijo de cadena de C:\Aduanasoft\CloudRestoreAS-win, y esa combinacion existe en produccion. Pruebas del par peligroso en las dos direcciones. Comprobado que MUERDEN: sustituyendo la igualdad por startsWith, falla la comparacion a nivel de carpeta. Las de rutas completas de .exe no fallan, y eso tambien es informacion — son estructuralmente inmunes porque el caracter que difiere llega antes del final, asi que el riesgo vive solo en la comparacion de directorios. Y el formulario dice a que carpeta va a instalar. Antes la ruta solo aparecia dentro del aviso de "instalar limpio", que se pinta unicamente si el panel ya conoce la version instalada: en un servidor con ruta personalizada y version desconocida el operador no la veia hasta que el run fallaba. Se distingue "ruta registrada" de "por omision" — no si la capturo el agente o una persona, porque ambas viven en la misma columna y el panel no puede saberlo. 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).