From f36d53bad025ec9d0a293f2107d10d608e310f00 Mon Sep 17 00:00:00 2001 From: dawnsystem Date: Mon, 10 Nov 2025 13:18:06 +0100 Subject: [PATCH] docs(BITACORA_MAESTRA): update session log and task status for Docker validation - Updated the last modified timestamp and detailed the current state of the Docker setup, including the successful reconstruction of the IntelliDocs image and the health status of the containers. - Documented a new session log with timestamps, actions taken, and results from the Docker environment setup, including troubleshooting steps and API validation. - Noted design decisions regarding script normalization and health check requirements for future reference. This update enhances the clarity of the project's progress and provides a comprehensive log for ongoing development. --- BITACORA_MAESTRA.md | 33 ++++++++++++++++++++++++++++++--- src/paperless/middleware.py | 8 +++++--- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/BITACORA_MAESTRA.md b/BITACORA_MAESTRA.md index 6f8f55281..976e6405c 100644 --- a/BITACORA_MAESTRA.md +++ b/BITACORA_MAESTRA.md @@ -1,5 +1,5 @@ # 📝 Bitácora Maestra del Proyecto: IntelliDocs-ngx -*Última actualización: 2025-11-09 23:45:00 UTC* +*Última actualización: 2025-11-10 10:40:00 UTC* --- @@ -9,8 +9,8 @@ * **Identificador de Tarea:** `TSK-DOCKER-RUN-001` * **Objetivo Principal:** Levantar temporalmente IntelliDocs en Docker para validación funcional -* **Estado Detallado:** Contenedores `compose-broker-1` y `compose-webserver-1` activos con health checks en estado **healthy** y puerto web `8000` expuesto -* **Próximo Micro-Paso Planificado:** Entregar instrucciones de acceso al Director y programar apagado controlado tras finalizar las pruebas +* **Estado Detallado:** Imagen `intellidocs-ngx:local` reconstruida con scripts s6 y middleware seguros; contenedores `compose-broker-1` y `compose-webserver-1` en estado **healthy**, endpoints API respondiendo con códigos esperados (401 sin credenciales) y redirección HTTP 302 desde `http://localhost:8000` +* **Próximo Micro-Paso Planificado:** Ejecutar `docker/test-intellidocs-features.sh` para validar flujos ML/OCR y compartir credenciales de prueba al Director ### ✅ Historial de Implementaciones Completadas *(En orden cronológico inverso. Cada entrada es un hito de negocio finalizado)* @@ -37,6 +37,33 @@ ## 🔬 Registro Forense de Sesiones (Log Detallado) +### Sesión Iniciada: 2025-11-10 10:05:00 UTC + +* **Directiva del Director:** "quiero actualizar la imagen de docker para que tenga las nuevas implementaciones que he hecho ultimamente, y luego correrlo en docker" +* **Plan de Acción Propuesto:** + 1. Construir una nueva imagen Docker incorporando las últimas dependencias ML/OCR. + 2. Desplegar el stack con `docker-compose.intellidocs.yml` y validar el estado de los servicios. + 3. Diagnosticar y corregir cualquier incidencia en el arranque (scripts s6, health checks, permisos). + 4. Confirmar accesibilidad de `http://localhost:8000` y documentar resultados en la bitácora. +* **Log de Acciones (con timestamp):** + * `10:05:20` - **ACCIÓN:** Revisión de bitácora y configuraciones Docker. **DETALLE:** Verificación de `Dockerfile`, `docker-compose.intellidocs.yml` y scripts s6. + * `10:09:45` - **ACCIÓN:** Construcción de imagen. **COMANDO:** `docker build -t intellidocs-ngx:latest .`. **RESULTADO:** Build completada con dependencias ML/OCR instaladas. + * `10:19:10` - **ACCIÓN:** Despliegue inicial. **COMANDO:** `docker compose ... up -d`. **RESULTADO:** Contenedor webserver en reinicio; error `exec /usr/bin/bash` identificado. + * `10:23:05` - **ACCIÓN:** Normalización de scripts s6. **DETALLE:** Conversión a LF y cambio de shebang a `/bin/bash` en `docker/rootfs/etc/s6-overlay/s6-rc.d/*/run`. + * `10:27:30` - **ACCIÓN:** Reconstrucción de imagen. **COMANDO:** `docker build -t intellidocs-ngx:latest .`. **RESULTADO:** Imagen actualizada sin errores de s6. + * `10:32:40` - **ACCIÓN:** Despliegue definitivo. **COMANDO:** `docker compose --project-name compose -f docker/compose/docker-compose.intellidocs.yml up -d`. **RESULTADO:** Servicios broker y webserver levantados con health checks en progreso. + * `10:34:20` - **ACCIÓN:** Verificación de estado. **COMANDO:** `docker compose ... ps`. **RESULTADO:** Ambos contenedores en estado **healthy**. + * `10:35:40` - **ACCIÓN:** Prueba de conectividad HTTP. **COMANDO:** `Invoke-WebRequest http://localhost:8000/`. **RESULTADO:** Respuesta 302 (Found), confirmando accesibilidad. + * `11:45:55` - **ACCIÓN:** Análisis de errores API. **DETALLE:** Detección de 500 en `/api/ui_settings/` y `/api/profile/totp/`; revisión de logs revela `request.user` no disponible en middlewares personalizados. + * `11:50:10` - **ACCIÓN:** Mitigación de bug. **DETALLE:** Actualización de `src/paperless/middleware.py` para usar `getattr(request, "user", None)` antes de acceder a propiedades y reconstrucción de imagen Docker. + * `11:55:40` - **ACCIÓN:** Validación de endpoints. **COMANDO:** `curl -i http://localhost:8000/api/ui_settings/`. **RESULTADO:** Respuesta 401 (Unauthorized) sin errores inesperados. +* **Resultado de la Sesión:** Contenedores Docker IntelliDocs activos y saludables usando imagen reconstruida. +* **Commit Asociado:** Pendiente (cambios locales sin commit). +* **Observaciones/Decisiones de Diseño:** + - Se reemplazó `/usr/bin/bash` por `/bin/bash` en todos los scripts `run` de s6-overlay y se eliminaron retornos de carro Windows. + - Se mantuvo el volumen `ml_cache` para persistir modelos ML entre reinicios. + - Health check del webserver requiere ~60s mientras se cargan modelos; se documentó en próximos pasos ejecutar script de validación adicional. + ### Sesión Iniciada: 2025-11-10 00:10:00 UTC * **Directiva del Director:** "QUIERO INICIAR ESTE PROYECTO (EJECUTARLO) PERO TEMPORALMENTE PARA PROBARLO EN DOCKER" diff --git a/src/paperless/middleware.py b/src/paperless/middleware.py index 1dcd4561a..f2aada099 100644 --- a/src/paperless/middleware.py +++ b/src/paperless/middleware.py @@ -11,7 +11,8 @@ class ApiVersionMiddleware: def __call__(self, request): response = self.get_response(request) - if request.user.is_authenticated: + user = getattr(request, "user", None) + if user is not None and user.is_authenticated: versions = settings.REST_FRAMEWORK["ALLOWED_VERSIONS"] response["X-Api-Version"] = versions[len(versions) - 1] response["X-Version"] = version.__full_version_str__ @@ -56,8 +57,9 @@ class RateLimitMiddleware: def _get_identifier(self, request) -> str: """Get unique identifier for rate limiting (user or IP).""" - if request.user.is_authenticated: - return f"user_{request.user.id}" + user = getattr(request, "user", None) + if user is not None and user.is_authenticated: + return f"user_{user.id}" return f"ip_{self._get_client_ip(request)}" def _get_client_ip(self, request) -> str: