El instalador exigía root o `sudo -n` (NOPASSWD), así que una cuenta con sudo
CON contraseña —el caso de los servidores Linux— no podía actualizarse desde el
panel. La contraseña guardada no ayudaba: se usa para autenticar SSH y a sudo
nunca se le entrega, por decisión de diseño contra el antipatrón de AServers
(`echo '{password}' | sudo -S`, que expone el secreto en argv).
En vez de rodear esa decisión, se quita la necesidad de privilegios. El agente
no necesita root para funcionar: su unit corre como el usuario que instala, y
las rutas de data_folder las escribe SQL Server, no él. install.sh solo pedía
privilegios por dos razones circunstanciales — el PREFIX por omisión en /opt y
el unit en /etc/systemd/system.
Modo nuevo `--user-service`: instala bajo el home y registra un unit de systemd
de usuario. Para sobrevivir al cierre de sesión intenta lingering y, si el
destino no lo permite, cae a @reboot en el crontab del usuario más un vigilante
cada 5 min que sustituye al Restart=always. Con eso, al panel le bastan el
usuario y la contraseña que ya tiene registrados.
Además, la sonda de elevación pasa a ser compartida entre instalar y verificar
(antes eran copias paralelas que ya diferían en la etiqueta) y distingue casos
que se reportaban idénticos:
- `requiretty` en el sudoers ya no se confunde con "sin privilegios": el remedio
es el opuesto, porque agregar NOPASSWD no lo arregla.
- Una regla NOPASSWD acotada a otros comandos se reporta como tal, con la lista.
- Verificar informa si la ruta es escribible y si la instalación sin privilegios
es viable en ese servidor, en vez de solo decir que faltan permisos.
Dos bugs encontrados al probarlo, ambos con prueba:
- `pgrep -f <ruta>` hacía match consigo mismo, porque la propia línea de cron
del vigilante contiene esa ruta. Sin el ancla `^`, el vigilante creía que el
agente corría y no lo rearrancaba nunca.
- `expectedStepCount` comparaba solo con 'service', así que la barra de una
instalación en modo usuario habría llegado al 100 % con un paso pendiente.
`resolveLinuxPrivilege` no tenía ninguna prueba; se agregan seis.
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).