Punto de entrada único a todas las herramientas del equipo de sistemas. Landing page con tarjetas de acceso a cada app, integrada con Entra ID Application Proxy y el shell compartido de sisapps-ui.
En lugar de tener una URL externa por app, el hub actúa como landing central. El usuario accede a una sola URL y desde ahí navega al resto.
El hub tiene su propio App Proxy público. Las demás apps pueden tener o no el suyo propio. Si el equipo está siempre en red interna, solo el hub necesita proxy externo. Cada app sigue funcionando de forma independiente accedida directamente por su URL interna.
El hub lee el header X-MS-CLIENT-PRINCIPAL-NAME inyectado por el App Proxy.
No tiene tabla de usuarios propia — solo identifica al usuario para mostrar nombre e iniciales en la navbar.
Con sso.auto_admin: true cualquier usuario autenticado ve el hub completo.
Misma interfaz que el resto de apps (sidebar, navbar, tema). El contenido es una rejilla de tarjetas, una por app.
Las tarjetas se generan automáticamente desde el registro de sisapps-ui y muestran stats en vivo
desde el endpoint /api/hub-stats de cada app. Si la app no responde, muestra “—”.
La rejilla está centrada verticalmente en la pantalla, sin título/hero encima.
Añadir una app nueva al registro la hace aparecer aquí sin tocar el hub.
{# index.html — hereda shell_base.html del paquete sisapps-ui #} {% extends "sisapps/shell_base.html" %} {% block content %} <div class="hub-wrap"> {# centrado vertical en pantalla #} <div class="hub-grid"> {% set app = sisapps_registry | selectattr('id','equalto','sisalerts') | first %} {% set s = app_stats.get('sisalerts') %} <a href="{{ app.url }}" class="hub-card" data-app="sisalerts"> <div class="hub-card-icon">{{ app.icon_svg | safe }}</div> <div class="hub-card-name">{{ app.name }}</div> {# hub-stats: abiertas / hoy / última alerta #} </a> {# idem para security-monitor y hypervmonitor con sus stats propias #} </div> </div> {% endblock %}
sisapps_registry viene del context_processor de sisapps-ui.
app_stats es inyectado por el view de Flask (fetch desde /api/hub-stats de cada app).
Los iconos usan app.icon_svg | safe del registro centralizado.
Las URLs ya incluyen la resolución de prioridad (override → shared file → localhost).
sisapps-hub/ ├── run_webapp.py # Entry point: Flask + Waitress ├── deploy.ps1 # git pull + pip install sisapps-ui + restart WinSW ├── sisapps-hub-service.xml # WinSW service definition ├── config/ │ └── app-config.json # SSO, auto_admin, puerto └── webapp/ ├── app.py # Flask factory + init_shell() ├── auth.py # SSO middleware (sin DB de usuarios) └── templates/ └── index.html # Landing: extiende shell_base.html, rejilla de apps
init_shell(app, app_id='sisapps-hub', app_name='SisApps', app_icon='🏠', nav_links=[], # sin nav propio admin_links=[], # sin admin )
El hub no tiene nav ni admin propio. Solo muestra la rejilla de apps y la sidebar.
{
"port": 8080,
"sso": {
"auto_admin": true
}
}
Sin lista de admins explícita; todos los usuarios SSO tienen acceso completo.
| Param | Valor |
|---|---|
| Servicio | sisapps-hub-service |
| Puerto | 8080 |
| Ejecutable | python run_webapp.py |
| Cuenta | Administrator (necesita Python en PATH) |
| Ruta prod. | C:\apps\jmfernandez\sisapps-hub |
# 1. Actualizar repo git -C C:\apps\jmfernandez pull # 2. Actualizar shell compartido pip install -e C:\apps\jmfernandez\sisapps-ui # 3. Reiniciar servicio .\sisapps-hub-service.exe restart
Para que las tarjetas del hub apunten a las URLs del App Proxy (no a localhost), hay que crear
C:\apps\jmfernandez\sisapps-urls.json en el servidor de producción.
Este fichero está en .gitignore (contiene URLs de entorno específicas).
{
"sisapps-hub": "https://[url-app-proxy-hub]",
"sisalerts": "https://[url-app-proxy-sisalerts]",
"security-monitor": "https://[url-app-proxy-secmon]",
"hypervmonitor": "https://[url-app-proxy-hyperv]"
}
Sin este fichero las tarjetas apuntan a localhost:puerto (válido en red interna).
Ver sisapps-urls.example.json en la raíz del repo como plantilla.