Qué es NSTerm
nsterm (NSTerm) es un terminal web multi-sesión en un único binario: el administrador publica aplicaciones (un comando + argumentos + directorio + entorno + tamaño), los usuarios las abren en terminales con pestañas sobre WebSocket (xterm), y cada proceso queda registrado como sesión (app, usuario, PID, inicio, duración, IP, país, navegador, hijos; tabla ordenable por columnas) que se puede supervisar y terminar. Acceso por grupos con cupo de sesiones simultáneas, auditoría y licencia con trial de 30 días.
Los comandos, apps y usuarios de los ejemplos son ficticios.

Casos de uso
1. Publicar la shell corporativa y abrirla en el navegador
Crear la app shell (/bin/bash) y abrirla con pestañas, reconexión y pantalla completa.
nsterm init ./miterm
nsterm start --config ./miterm
nsterm status
Flujo web: login → Administración → Aplicaciones → crear (ID, nombre, comando /bin/bash, args [], directorio, cols/rows, esquema de color, env {"TERM":"xterm-256color"}, expandir al contenedor) → Panel → Abrir → terminal con nueva pestaña (+), reconectar, desconectar y pantalla completa.
2. Dar a un equipo acceso limitado a una app con cupo
El grupo operadores puede usar consola-prod con máximo 2 sesiones simultáneas por usuario.
Flujo web: Usuarios → crear usuario → asignarle el grupo operadores → Grupos → asignar la app al grupo (límite max por usuario) → el usuario solo ve sus apps en el Panel; al superar el cupo ve el aviso de límite de sesiones.
3. Supervisar y terminar sesiones activas
Ver quién ejecuta qué, inspeccionar procesos hijo y terminar una sesión indicando el motivo.
Flujo web: Sesiones (app, usuario, PID, inicio, duración, IP, país, navegador, hijos, ordenable por columnas, actualización en vivo por WebSocket) → Terminar sesión (pide motivo) → queda registrado en auditoría. El Panel muestra el mismo resumen de sesiones activas con abrir/terminar: el botón Abrir de una sesión activa vuelve a esa sesión (el terminal se reconecta al proceso que ya está corriendo, sin abrir una sesión nueva ni consumir otro cupo); si la app está marcada para abrir en pestaña del navegador, el botón trae esa pestaña al frente en vez de abrir otra.
4. Revisar quién hizo qué
Buscar en la auditoría los accesos, altas de apps y terminaciones de sesiones.
Flujo web: Auditoría → buscar/filtrar (hora, usuario, acción, detalle, IP) → actualizar. CLI: comprobar nsterm status y nsterm license para estado y trial.
5. Publicar una aplicación web interna (proxy)
Además de terminales, NSTerm publica apps proxy: expone una URL interna (http/https) a través de NSTerm, heredando login, RBAC por grupos y auditoría. Ideal para consolas internas sin exponerlas directamente.
Flujo web: Administración → Aplicaciones → crear con tipo Proxy URL (target https://intranet:8443/app, WebSocket activado si la app lo usa, reescritura de enlaces) → asignar a grupos como una app normal. Seguridad: solo URLs definidas por el admin (el usuario nunca introduce URLs), allowlist de hosts (proxy.allowedHosts), bloqueo de IPs privadas y de metadatos cloud (blockPrivateIPs, blockMetadataIP), límite de cuerpo y timeout de respuesta.
Interfaz


Plantillas: el terminal con aspecto de aplicación web
Cada aplicación puede llevar una plantilla: cabecera, contenedores laterales y barra de estado escritos en HTML y CSS, con el logo corporativo definido en la configuración del servidor. El resultado es un terminal con aspecto de aplicación web, sin salir de la consola.

- Se administran en Plantillas; al instalar se crean once plantillas de ejemplo (roja, corporativa en tres tonos, verde, ámbar, con paneles laterales, con barra de estado y con botones PF).
- El CSS se aplica aislado (shadow root): no puede romper la interfaz de NSTerm ni el resto de la terminal.
- Marcadores disponibles:
{{app.name}},{{user.name}},{{company.name}},{{company.logo}},{{pf.buttons}}y valores vivos ({{now.time}},{{now.date}},{{session.uptime}},{{session.remaining}}). - Los botones PF1..PF12 que la aplicación declare se dibujan como botones y envían la tecla a la sesión.
Horarios: la aplicación solo está disponible en su franja
Una aplicación puede tener un horario de disponibilidad. Fuera de su franja aparece como Cerrada en el panel y el servidor rechaza la apertura: el acceso a la consola pasa a ser horario de oficina.

- Plantillas de ejemplo: Mañana, Tarde, Noche (cruza medianoche), Fines de semana y Horario laboral (dos ventanas).
- La franja se define por día y ventana, con zona horaria propia.
- Los administradores también quedan sujetos (salvo bloqueo explícito).
Editor de aplicaciones
El editor se organiza en cinco pestañas: General (identidad, tipo, logo y color), Ejecución (comando, argumentos, entorno, timeout, usuario del sistema y campos proxy), Terminal (columnas, filas y topes de geometría), Presentación (emulación HTML, conmutación HTML/Terminal, plantilla de aplicación, plantilla de horario, fichero de diseño, teclas PF y apertura en pestaña) y Apariencia (esquema de color y permiso de cambiar la apariencia).
Además, el administrador puede decidir qué puede hacer el usuario:
- Emulación HTML: la aplicación se muestra como página HTML. Con Permitir conmutar entre HTML y terminal el usuario alterna entre ambas vistas; sin ese permiso, los botones HTML/Terminal no aparecen.
- El usuario puede cambiar la apariencia: si se desmarca, tampoco se ofrecen los botones de apariencia ni de zoom (A- / A+).
Referencia
Comandos CLI
| Comando | Descripción |
|---|---|
nsterm init [dir] | Crea el entorno (config.yaml + db/ + logs, admin/admin123) |
nsterm start [dir] | Arranca el servidor en background |
nsterm stop | Para el servidor |
nsterm status | Si corre, PID y dirección |
nsterm license | Estado de licencia/trial y fingerprint |
| Flags globales | --config <dir> (alias: dir posicional), --port N (override), --debug, --version |
No hay subcomandos de gestión: usuarios, grupos, apps y sesiones se administran desde la web (rutas /api/admin/*).
Configuración principal (config.yaml)
| Clave | Descripción |
|---|---|
server.host / server.port | Escucha (por defecto 0.0.0.0:11030) |
database.path | SQLite (./db/nsterm.db) |
auth.jwtSecret / jwtExpiryMin / cookieName | Sesión (nsterm_session, 480 min) |
license.trialDays | Trial (30) |
logging.dir / maxSizeMB / maxAgeDays / maxBackups / compress | Rotación de logs (./logs, 10 MB, 30 días, 10 copias, comprimido) |
proxy.enabled / allowedHosts / blockPrivateIPs / blockMetadataIP / maxBodyMB / responseTimeoutSec | Apps proxy: activación, hosts permitidos, protecciones SSRF y límites |
branding.companyName / branding.logoUrl | Identidad corporativa que muestran las plantillas ({{company.name}}, {{company.logo}}) |
branding.customLogin | Personaliza la pantalla de login: muestra el logo y el nombre de la compañía en lugar del logo de nsterm |
Áreas de la web
Panel (apps disponibles + sesiones activas) · terminales (pestañas, /terminal/:appId, comprobar límite antes de abrir, WebSocket /api/terminal/:appId/ws) · apps proxy (publicar URLs internas con RBAC, WebSocket y reescritura de enlaces) · sesiones (listado en vivo con IP/país/navegador, ordenable, hijos, terminar con motivo) · administración · usuarios (alta/edición, alias, grupos) · grupos (rol, apps asignadas, cupo max por usuario) · aplicaciones (tipo terminal/proxy, comando, args, directorio, icono/logo, color, columnas/filas, esquema de color, entorno, expandir, activo) · plantillas (aspecto web reutilizable: cabecera, contenedores laterales y barra de estado con HTML/CSS, logo corporativo, botones PF y valores vivos; asignables a las apps de terminal) · horarios (plantillas de disponibilidad: mañana, tarde, noche, fines de semana; la app aparece Cerrada en el panel y el servidor bloquea la apertura fuera de su franja) · auditoría (búsqueda, hora/usuario/acción/detalle/IP/país) · login, recuperación de contraseña, temas e idioma (EN/ES).
Ejemplos comentados
# 1. Entorno nuevo en puerto personalizado
nsterm init /opt/nsterm-prod
nsterm start --config /opt/nsterm-prod --port 11030
nsterm status
nsterm license
# 2. Directorio posicional como alias de --config
nsterm start /opt/nsterm-prod
nsterm stop
# 3. Debug temporal
nsterm start --config ./miterm --debug
# Comprobación previa a abrir un terminal (con cookie de sesión)
curl -b cookie.txt http://localhost:11030/api/terminal/shell/check
# Sesiones activas vía API
curl -b cookie.txt http://localhost:11030/api/sessions
Preguntas frecuentes
¿Con qué entro la primera vez? admin / admin123 (cambiar tras el primer login); el alta posterior de usuarios y grupos es vía web.
¿Cómo limito cuántas sesiones abre cada usuario? En Grupos → asignar app → campo max (0 = ilimitado); al superarlo el terminal muestra el aviso de límite.
¿Se registra por qué se terminó una sesión? Sí: al terminar pide el motivo y queda en la auditoría junto a logins, altas de apps y cambios de grupos.
¿Qué terminal emula? xterm con TERM=xterm-256color recomendado en el env de la app; cols/rows fijos o expandir al contenedor (la fuente se adapta).
¿Puedo publicar una web interna además de terminales? Sí: crea una app de tipo Proxy URL con su target y asígnala a grupos; los usuarios la abren con su sesión (login + RBAC + auditoría) sin acceso directo a la URL interna.