TPTito Pinardo Gutiérrez
← Volver al rack
English
1U · PAPERLESSPaperless-ngx · OCR · sin SSH En producción

Posición 7 de 25 en el rack · En producción

Unidad 1U · Documentos personales

Paperless-ngx · el archivo de casa

137 documentos migrados 1:1

Escaneo un papel y Paperless lo lee con OCR, le pone título, etiquetas y tipo con ayuda de un modelo local, y lo guarda donde lo puedo encontrar buscando. Son documentos de identidad y de propiedad, así que es el contenedor más cerrado del servidor.

Por qué tan cerrado
No es papeleo cualquiera: catastro, empadronamiento, documentos oficiales. Si algo del homelab se filtra, que no sea esto.
Cómo se entra
Desde casa o la VPN, con doble factor en la puerta interna, por un HTTPS propio del contenedor. El servicio en sí solo escucha hacia dentro.
Cómo se administra
No tiene SSH ni usuarios. Ansible entra a través del hipervisor, y el cortafuegos rechaza todo lo demás.
  • 0puertos de SSH y cuentas en el contenedor
  • 137documentos migrados y comprobados uno a uno
  • 3orígenes permitidos por el cortafuegos
  • spa+engOCR en español e inglés

Su código, en abierto Versión pública del repositorio: sin IPs ni secretos.

El archivo por dentro

Aquí viven papeles que no deben salir de casa. Elige un recorrido para ver cuántas puertas hay que pasar para llegar a ellos.

Hermesde visita en la unidad

Pulsa una pieza o elige un recorrido. Si vienes de una habilidad, ya están encendidas las piezas donde la uso.

      Abro un documento
      1. Mi portátil — Desde casa abro el archivo.
      2. Caddy — La puerta interna comprueba que vengo de la red de casa.
      3. Authelia — Authelia me pide contraseña y código.
      4. Caddy — Con la sesión, Caddy sigue.
      5. Cortafuegos del contenedor — El cortafuegos del contenedor solo deja pasar a Caddy.
      6. nginx en el contenedor — nginx termina el TLS dentro del contenedor.
      7. Paperless solo en localhost — Y pasa la petición a Paperless, que solo escucha hacia dentro.
      8. Paperless-ngx — La aplicación recibe la petición.
      9. Login de Paperless — Su propio login, la última llave.
      10. Mi portátil — Veo el documento.
      Entra un papel nuevo
      1. Mi portátil — Subo un escaneo.
      2. Paperless-ngx — Paperless lo recibe.
      3. Redis — La tarea entra en la cola.
      4. OCR y clasificación — El OCR saca el texto, en español e inglés.
      5. Modelo local (Ollama) — El modelo local propone título, etiquetas y tipo.
      6. OCR y clasificación — El flujo automático aplica la clasificación.
      7. PostgreSQL — Todo queda indexado en PostgreSQL.
      8. Paperless-ngx — Y lo encuentro buscando cualquier palabra que contenga.
      Ansible lo administra
      1. Secretos cifrados — Ansible coge las credenciales del vault cifrado.
      2. Ansible a través del hipervisor — Se conecta al hipervisor, no al contenedor.
      3. Hipervisor — Y ejecuta las tareas dentro con «pct exec».
      4. Sin SSH — El contenedor no tiene SSH: no hay otra entrada.
      5. Paperless-ngx — Paperless queda actualizado y configurado.
      La migración a código
      1. Terraform — Terraform crea el contenedor nuevo, sin cuentas.
      2. Volcado de la base — En el viejo, volcado de la base y archivo de los ficheros, sin abrir nada.
      3. Hipervisor — Se mueven a través del hipervisor.
      4. Volcado de la base — Se restauran en una base limpia.
      5. PostgreSQL — Comprobado: 137 documentos y el mismo tamaño en los dos.
      6. Paperless-ngx — La aplicación responde por la misma puerta, con la misma IP.
      7. Zabbix — Monitorización registrada de nuevo.
      8. Wazuh — Y seguridad, con un agente nuevo.
      9. El contenedor antiguo — El viejo, parado pero no borrado.
      Alguien de la red lo intenta
      1. Mi portátil — Un dispositivo de la red intenta conectar al contenedor.
      2. Cortafuegos del contenedor — El cortafuegos rechaza todo lo que no sea la puerta interna o la monitorización.
      3. Mi portátil — Lo intenta contra la aplicación directamente.
      4. Paperless solo en localhost — Solo escucha en localhost: no hay nada al otro lado.
      1. Mi portátil

        Desde casa o con la VPN.

      2. Caddy

        Solo acepta la red de casa y valida el certificado del contenedor antes de pasarle nada.

      3. Authelia

        Inicio de sesión con doble factor antes de llegar a Paperless.

        • Linux / SSH hardening
      4. Mi PC con GPU

        Donde corre el modelo de lenguaje local.

      5. Modelo local (Ollama)

        Un modelo de visión y otro de embeddings. El PC solo acepta conexiones de este contenedor a ese puerto.

        • LLM locales (Ollama, Qdrant, RAG)
      6. Hipervisor

        La única forma de entrar al contenedor: «pct exec» desde el propio Proxmox.

        • Proxmox VE
      7. Cortafuegos del contenedor

        Política de entrada: rechazar. Solo pasan la puerta interna y la monitorización al HTTPS, y el ping.

        • Proxmox VE
        • Linux / SSH hardening
      8. nginx en el contenedor

        Termina el TLS dentro del propio contenedor: ni siquiera dentro de casa viajan los documentos sin cifrar.

        • Linux / SSH hardening
      9. Paperless solo en localhost

        La aplicación escucha únicamente hacia dentro del contenedor. Desde la red no se puede llegar a ella sin pasar por nginx.

        • Docker
        • Linux / SSH hardening
      10. Login de Paperless

        Detrás de todo, su propio usuario. Una llave más.

        • Linux / SSH hardening
      11. Paperless-ngx

        La aplicación oficial, en Docker. Clasifica, busca y guarda.

        • Docker
      12. OCR y clasificación

        Lee el texto de cada escaneo y propone título, etiquetas y tipo con el modelo local. Un flujo automático lo aplica al entrar.

        • Docker
      13. PostgreSQL

        Metadatos, etiquetas y el índice de búsqueda.

        • Docker
        • PostgreSQL
      14. Redis

        La cola de tareas: el OCR de cada documento se hace en segundo plano.

        • Docker
        • Redis
      15. Terraform

        Crea el contenedor sin ninguna cuenta de usuario: el único del repositorio así.

        • Terraform
      16. Ansible a través del hipervisor

        Un plugin de conexión que habla con el hipervisor y ejecuta dentro del contenedor. Nunca hay SSH al contenedor.

        • Ansible
        • Proxmox VE
      17. Sin SSH

        Ni servicio, ni claves, ni regla en el cortafuegos. No hay nada que atacar por ahí.

        • Linux / SSH hardening
      18. Secretos cifrados

        Las credenciales viven cifradas en el vault de Ansible, nunca en la documentación.

        • Ansible
      19. Zabbix

        Comprueba que el HTTPS responde. Es uno de los tres orígenes permitidos.

        • Zabbix
      20. Wazuh

        Vigila los cambios en la configuración del stack.

        • Wazuh
      21. Volcado de la base

        La migración se hizo con un volcado de la base y un archivo de los ficheros, sin abrir ningún documento.

        • PostgreSQL
      22. El contenedor antiguo

        Parado, no destruido: red de seguridad mientras no haya copias periódicas.

      Lo que uso de mi árbol

      Pulsa una habilidad: se encienden en el mapa las piezas donde la uso y te cuento para qué.

      Terraform
      Crea el contenedor sin ninguna cuenta de usuario.
      Ansible
      Despliega el stack a través del hipervisor y guarda las credenciales en el vault.
      Proxmox VE
      El cortafuegos del contenedor y la administración con «pct exec» desde el hipervisor.
      LXC
      Contenedor sin privilegios con anidamiento para poder correr Docker.
      Docker
      Paperless, su base de datos y su cola, publicados solo hacia dentro.
      Zabbix
      Comprueba que el HTTPS del contenedor responde.
      Wazuh
      Vigila los cambios en la configuración.
      Linux / SSH hardening
      Rechazo por defecto, sin SSH, TLS dentro del contenedor, doble factor delante y login propio detrás.
      PostgreSQL
      La base de Paperless, migrada con un volcado sin abrir documentos.
      Redis
      La cola donde esperan los OCR.
      LLM locales (Ollama, Qdrant, RAG)
      Un modelo local propone título, etiquetas y tipo: los documentos no salen de casa.

      Bitácora de incidencias

      Averías reales. Lee el síntoma, elige la causa que creas y mira cómo se arregló.

      1. #1

        Un SSH que no debía estar

        17-09-2026 · auditoría

        El diseño decía «sin SSH». Antes de migrar, revisé el contenedor tal y como estaba.

        ¿Qué crees que pasaba?

        Ver la solución
        Causa
        En algún momento se añadió acceso por SSH para arreglar algo y nunca se quitó, ni se reflejó en la documentación. El diseño y la realidad se habían separado.
        Solución
        El contenedor nuevo nace de Terraform sin ninguna cuenta y Ansible lo administra a través del hipervisor: ya no hay SSH que alguien pueda volver a abrir por comodidad.
        Lección
        La documentación dice lo que quería hacer; el sistema, lo que hay. Antes de fiarse del diseño, comprobar el estado real.
      2. #2

        Ansible no podía escribir el cortafuegos

        17-09-2026 · migración

        El fichero del cortafuegos del contenedor no se podía escribir desde Ansible: «Operation not permitted», ni con la copia normal ni con la directa.

        ¿Qué crees que pasaba?

        Ver la solución
        Causa
        La configuración del cortafuegos está en el sistema de ficheros especial de Proxmox. Ansible escribe en un temporal y lo renombra, y ese sistema no lo permite.
        Solución
        Una tarea que compara el contenido y, solo si cambia, lo escribe con una redirección normal. Sigue siendo idempotente.
        Lección
        Las herramientas suponen un sistema de ficheros normal. Cuando no lo es, se respeta lo que la herramienta garantiza (idempotencia) aunque haya que hacerlo de otra manera.

      Cómo se construyó

      1. 09-09-2026

        Despliegue

        • Paperless con OCR en español, detrás de la puerta interna.
        • IA local para clasificar, con el modelo en mi PC.
      2. 17-09-2026

        Migración a código

        • Contenedor nuevo con Terraform, sin cuentas, y Ansible a través del hipervisor.
        • Cortafuegos con política de rechazo y tres orígenes permitidos.
        • Datos migrados sin abrir ningún documento y comprobados uno a uno.

      Decisiones (y por qué)

      • Cómo se administra

        Sin SSH, a través del hipervisor

        Quien llega al hipervisor ya lo tiene todo; abrir además SSH en el contenedor solo añade una puerta.

      • Dónde se cifra

        Dentro del propio contenedor

        La puerta interna ya cifra, pero el tramo hasta el contenedor también pasa por la red. Con nginx dentro, los documentos nunca viajan en claro.

      • El contenedor viejo

        Parado, no destruido

        Sin copias periódicas todavía, el original es la vuelta atrás. Se borra cuando haya copia de verdad.

      Lo que aprendí

      • Lo más sensible se diseña desde el «no»: qué no tiene que poder pasar.
      • Comprobar el estado real antes de migrar: apareció un SSH que no estaba en ningún papel.

      Lo siguiente

      • Copias periódicas cifradas fuera del servidor; después, borrar el contenedor viejo.
      • Activar el segundo factor propio de Paperless.

      ¿Hablamos?

      Puedo contar cualquiera de estas decisiones en detalle en una entrevista.

      Descargar CV Contactar ← Volver al rack

      Reconstrucción a partir de mi documentación. Ningún documento se abrió para hacer esto ni aparece aquí.