👑 Panel admin¶
HIX expone un conjunto de endpoints de administración bajo el prefijo
/hix-* que permiten consultar el estado del servidor, recargar rutas,
limpiar caches, activar/desactivar trazas y detener el servidor de forma
ordenada. Todos están protegidos por una sesión de admin con cookie
firmada (hix_admin).
El panel se autoconfigura al primer arranque: si no hay credenciales,
redirige a /hix-setup para que crees el usuario/contraseña inicial.
¿Cuándo lo necesitas?¶
- Para monitorizar el servidor en producción (
/hix-status). - Para recargar rutas desde
routes/*.jsonsin reiniciar. - Para limpiar el cache de vistas tras un deploy.
- Para parar HIX desde un script remoto sin acceso TTY.
- Para activar trazas puntuales por módulo y diagnosticar un problema.
Setup en hix.json¶
Sección admin¶
enabled = false desactiva el panel y las rutas /hix-*.
user / password vacíos activan /hix-setup. La vida de la sesión admin
la controla session.lifetime (minutos).
Con user y password vacíos, cualquier petición a un endpoint admin
redirige a /hix-setup para crear las credenciales. Una vez creadas,
HIX las escribe en hix.json con oCfg:Generate().
Comportamiento según env¶
app.env |
Auth requerida |
|---|---|
dev |
No - acceso libre |
prod |
Sí - cookie hix_admin |
En dev los endpoints están abiertos para iterar rápido. En prod
exigen login.
Endpoints disponibles¶
Todos están definidos en src/hix_router.prg y dependen de
HIX_AdminCheck(oReq).
Operación¶
| Ruta | Método | Descripción |
|---|---|---|
/hix-ping |
GET | Healthcheck público (no requiere auth) |
/hix-status |
GET | JSON con todas las métricas |
/hix-monitor |
GET | Página HTML con dashboard interactivo |
/hix-index |
GET | Página HTML con el listado de rutas registradas |
/hix-stop |
GET | Detiene el servidor de forma ordenada |
/hix-cache-clear |
GET | Limpia el cache de vistas (RAM + disco) |
/hix-trace |
GET/POST | Lista o ajusta trazas por módulo |
Rutas dinámicas¶
| Ruta | Método | Descripción |
|---|---|---|
/hix-routes/list |
GET | Lista rutas registradas (sin las internas hix.*) |
/hix-routes/listall |
GET | Lista TODAS las rutas, incluidas las del sistema |
/hix-routes/add |
POST | Añade una ruta nueva (body JSON) |
/hix-routes/delete |
POST | Elimina una ruta (body JSON {name: "..."}) |
/hix-routes/reload |
GET | Recarga rutas desde routes/*.json |
Benchmark¶
| Ruta | Método | Descripción |
|---|---|---|
/hix-bench-start |
GET | Resetea métricas y arranca ventana de medición |
/hix-bench-stop |
GET | Devuelve JSON con métricas acumuladas en la ventana |
Autenticación¶
| Ruta | Método | Descripción |
|---|---|---|
/hix-login |
GET/POST | Página y submit de login admin |
/hix-logout |
GET | Borra la cookie hix_admin |
/hix-setup |
GET/POST | Página de creación inicial de credenciales |
🔒 Si
admin.enabled = false, ninguna de estas rutas se registra y cualquier petición a/hix-*devuelve 404.
Sesión y cookie¶
Cuando el login es correcto, HIX firma la cookie con HMAC simulado:
En cada petición admin, HIX_AdminCheck(oReq):
- Lee la cookie
hix_admin. - Verifica la firma con
cAdminSecret. - Comprueba que
now - timestamp < session.lifetime * 60(silifetime > 0). - Si falla, redirige a
/hix-login?next=<ruta_actual>.
La cookie es HttpOnly; SameSite=Lax; Path=/ y se renueva en cada login.
Flujo de primer arranque¶
1. Arrancas HIX por primera vez (admin user/password vacíos)
│
▼
2. Accedes a /hix-status
│
▼
3. HIX redirige a /hix-setup
│
▼
4. Rellenas user + password (mínimo 6 chars)
│
▼
5. HIX guarda user/MD5(password)/secret en hix.json
│
▼
6. Redirige a /hix-login
│
▼
7. Te logas → cookie hix_admin firmada → acceso libre
💡 El
secretse genera conMD5( timestamp + user + password )la primera vez. Si quieres invalidar todas las sesiones admin, basta con vaciarsecretenhix.json- HIX generará uno nuevo en el siguiente setup/login.
Ejemplo: consumir /hix-status desde monitorización¶
# 1. Login y guarda la cookie
curl -c hix.jar -X POST https://miservidor.com/hix-login \
-d 'user=admin&password=secreto'
# 2. Consume status
curl -b hix.jar https://miservidor.com/hix-status
Salida:
Para integración con Prometheus, basta envolverlo en un exporter trivial que haga GET cada 30 s.
Trazas dinámicas con /hix-trace¶
GET /hix-trace devuelve el hash de trazas activas por módulo:
POST /hix-trace con body JSON ajusta una traza concreta:
Útil para diagnosticar un problema en producción sin tocar hix.json.
Cuando termines, vuelve a desactivar la traza para no inflar el log.
📚 Más detalle en logger - trace por módulo.
Deshabilitar el panel¶
En entornos muy restrictivos puedes apagar el panel entero:
Esto no registra los endpoints admin (/hix-status, /hix-monitor,
/hix-stop, /hix-login, /hix-routes/*, etc.). Las peticiones a esas
URLs devolverán 404.
ℹ️
/hix-pingy/hix-slowsiempre se registran (son health-check públicos y no dependen deadmin.enabled).⚠️ Si lo apagas, perderás
/hix-statusy los demás endpoints. Para monitorizar tendrás que exponer tu propio endpoint que consumaHIX_MetricsJson()con tu auth.
Errores típicos¶
| Síntoma | Causa | Fix |
|---|---|---|
/hix-status redirige a /hix-setup |
admin.user / password vacíos |
Completar setup desde /hix-setup |
Tras login, redirige otra vez a /hix-login |
secret distinto del que firmó la cookie |
Borra cookie del navegador, vuelve a logarte |
| Cookie expira muy rápido | session.lifetime muy bajo |
Subir el valor (minutos, 0 = indefinido) |
/hix-routes/add devuelve 401 |
Falta cookie admin o expiró | Login en /hix-login primero |
| No quiero login en dev | Estás en env = "prod" |
Cambiar app.env = "dev" |
Buenas prácticas¶
app.env = "prod"siempre en servidores expuestos a internet. Con"dev"cualquiera puede tirar el servidor con/hix-stop.- Cambia
secretperiódicamente vaciándolo enhix.jsonpara forzar rotación de cookies. - Si tu HIX está detrás de Apache/Nginx, limita el
acceso a
/hix-*por IP en el reverse proxy como capa extra. - No expongas
/hix-stopni/hix-cache-clearen internet abierto - protégelos con firewall si es posible. - Para CI/CD, usa una cuenta admin dedicada distinta de la del operador humano; rota su password al rotar el equipo.