0.8.4 (2026-10-19)¶
Correcciones de seguridad y configuración, y documentación completa en el sitio publicado: además de la instalación y las notas de versión, ahora hay guía de uso, operación self-host, desarrollo y seguridad, en español e inglés, verificadas contra el código. Al escribir esa documentación contra el código aparecieron los fallos que corrige esta versión. Sin funciones nuevas.
⬆️ Notas de actualización¶
- Actualiza pronto: incluye correcciones de seguridad (chat de IA, inicio de sesión con MFA, webhooks de Stripe y renderizado de Mermaid).
- Reconstruye las imágenes (
docker compose up -d --build):start.shcambió y va dentro de la imagen. - Sin migraciones manuales. Se crea sola la colección
mfa_token_attempts(con expiración automática) y los eventos de webhook existentes siguen siendo válidos. - Detrás de un reverse proxy, define
FORWARDED_ALLOW_IPScon la IP o red de tu proxy para que los límites de peticiones y el registro de auditoría vean la IP real del cliente. Ver Producción. No uses*. - No cambies tu
AI_ENCRYPTION_KEYsi ya tienes una: cifra las keys de IA, los secretos de las integraciones y los secretos TOTP. El instalador ahora la genera en instalaciones nuevas y conserva la existente. - Si tu
backend/.envtraeBACKEND_CORS_ORIGINScomo lista JSON, ya funciona; el formato recomendado es separado por comas. - Un webhook de Stripe que falla al procesarse ahora responde 500 (antes 200) para que Stripe lo reintente.
🔒 Seguridad¶
- Chat de IA: cada sesión es solo de su dueño. Seis endpoints de
/chat-sessions/{id}(ver, renombrar, borrar, cambiar modelo, borrar mensaje y cambiar su estado) no pedían sesión ni comprobaban el dueño, y enviar un mensaje no comprobaba que la sesión fuera tuya. Ahora todas las rutas del chat piden sesión y responden 404 ante una sesión ajena o un mensaje de otra sesión. POST /ai/test-providerpide sesión.- Webhooks de Stripe idempotentes de verdad. El manejador usaba el id del objeto en lugar del id del evento y no registraba nada. Ahora cada evento se reclama por su
event.id(índice único): un duplicado no se reaplica, un fallo libera el reclamo para que Stripe reintente, y un reclamo abandonado se retoma a los 10 minutos. Cada reclamo lleva su propio lease: una entrega que perdió el reclamo ya no puede completar ni liberar el del nuevo dueño. - Inicio de sesión con MFA: límite de 5 intentos por token temporal. El contador nunca se incrementaba. Ahora el intento se reserva de forma atómica antes de verificar el código (también con peticiones simultáneas), el token es único por inicio de sesión (
jti) y de un solo uso tras un inicio exitoso y alcanzar el límite queda en el registro de auditoría (login_failed,mfa_max_attempts). - Mermaid en modo
strict. Conloose, las etiquetas HTML de un diagrama no se saneaban mientras Mermaid lo dibujaba, antes de que el SVG llegara a la página (también en enlaces compartidos). Ahora pasan por DOMPurify durante el render. - IP real del cliente detrás de un proxy. Nueva variable
FORWARDED_ALLOW_IPS(por defecto solo localhost):X-Forwarded-Forsolo se acepta de esas direcciones. Antes, detrás de un proxy todos los usuarios compartían la IP del proxy en los límites de peticiones, el bloqueo de cuentas y la auditoría. - Límite de enlaces compartidos con el limitador común, que purga las IPs viejas (antes las guardaba para siempre), y respuesta 429 con
Retry-After.
🔧 Correcciones¶
- CORS: las plantillas traían
BACKEND_CORS_ORIGINScomo lista JSON y el backend lo convertía en orígenes inválidos. Se aceptan ambos formatos. - Modo
external-mongodb: el backend escuchaba en el puerto 8000 mientras el compose publicaba el 5172. - Instalador: genera
AI_ENCRYPTION_KEY, sin la cual fallaban la IA, las integraciones y el TOTP, y conserva la existente también al reinstalar sobre el directorio anterior (la base de datos sobrevive, y con una clave nueva sus secretos ya no se podrían descifrar). - Plantillas de entorno: sin
VERSION=1.0.0(sobrescribía la versión real),SENTRY_DSNvacío (un valor de ejemplo activaba Sentry) yFRONTEND_URLen el puerto 5173.ACCESS_TOKEN_EXPIRE_MINUTESno tiene efecto y se documenta así. - Asistente de instalación: pedía 8 caracteres sin carácter especial; ahora aplica la política real (12, mayúscula, minúscula, dígito y carácter especial). El frontend ya no acepta el acento grave como carácter especial, que el servidor rechazaba.
STRIPE_QUICKSTART.mdy los README de despliegue (Kroki) actualizados.
📚 Documentación¶
- Sitio reorganizado por tipo de lector. Cada idioma tiene ahora cinco secciones agrupadas en la barra lateral: Guía de uso, Self-host, Desarrollo, Seguridad y Notas de versión (agrupadas por versión menor), más Preguntas frecuentes.
- Guía de uso (10 páginas): primeros pasos, editor, Mermaid/PlantUML/D2/DBML con ejemplos y opciones de estilo, pizarrón y boceto → Mermaid, proyectos y carpetas, exportar e importar, compartir, modo presentación, asistente de IA (los cinco proveedores) y cuenta (MFA, códigos de recuperación, Google).
- Self-host (7 páginas): referencia de variables de entorno, producción (proxy, SSL, endurecimiento), integraciones de email/Stripe/Google, planes y límites definidos por el operador, respaldos y actualización, y solución de problemas.
- Desarrollo (9 páginas): arquitectura con diagramas, los 12 módulos del backend, frontend, mapa de la API REST, pruebas, cómo extender (módulos, proveedores de IA, páginas, textos), versionado y cómo contribuir.
- Seguridad (4 páginas): modelo de seguridad, autenticación y sesiones, protecciones y registro de auditoría.
- Inicio corregido. Listaba solo Mermaid y PlantUML, cuatro proveedores de IA y funciones que no existen (anotaciones en presentación, autocompletado, historial de prompts como función de usuario); ahora refleja el producto 0.8.x.
- La guía de instalación incluye Kroki en ambos modos de despliegue y aclara que
AI_ENCRYPTION_KEYes necesaria. - Más extensiones de Material: pestañas de contenido, teclas, listas de tareas, migas de pan y botón «editar esta página».
SECURITY.mdyAGENTS.mdalineados con el código.
🧪 Pruebas¶
- Backend: 479 pruebas, cobertura 65 % (piso 45 %); nuevas pruebas de propiedad de sesiones de chat, idempotencia de webhooks, límite de intentos MFA (incluida concurrencia), IP detrás de proxy, límite de enlaces compartidos y configuración de CORS. Frontend: 25 pruebas de Vitest.