Paperless-ngx en Proxmox LXC: arma un archivo de documentos autoalojado que funciona en 2026
Self-hosting

Paperless-ngx en Proxmox LXC: arma un archivo de documentos autoalojado que funciona en 2026

Ricardo Gil
12 de octubre de 2026
9 min de lectura

Traducido del original en inglés. Read this article in English →

#Paperless-ngx #Proxmox #Self-Hosting #Home Lab

Si tienes una montaña de PDFs, facturas escaneadas, pólizas de seguro y documentos de impuestos en una jerarquía de carpetas aleatoria en tu NAS (o peor, en Google Drive), Paperless-ngx es la solución. Es un sistema de gestión documental open source que recibe los documentos, les aplica OCR y hace que todo el archivo se pueda buscar por texto completo. Lo tengo corriendo en un LXC de Proxmox en mi homelab, y es de esos servicios que volvería a montar de inmediato si mi homelab se quemara.

Esta guía cubre la instalación completa en 2026: contenedor LXC, stack de Docker Compose, almacenamiento con bind mount, integración con escáner y algunos ajustes de nivel producción que la documentación oficial pasa por alto.

¿Qué es Paperless-ngx y por qué autoalojarlo?

Paperless-ngx es un fork de Paperless y Paperless-ng con mantenimiento activo y realmente listo para producción. Dejas un PDF en la carpeta de consumo (desde un escáner de red, el correo o la app móvil) y en pocos minutos tiene OCR, etiquetas, un remitente asignado y se puede buscar por texto completo.

La función estrella es el etiquetado automático asistido: lo vas entrenando con el tiempo y empieza a clasificar documentos solo. Después de unos cientos de documentos, el clasificador es lo bastante preciso como para que rara vez tengas que tocar a mano los documentos nuevos.

Correr Paperless-ngx en tu homelab con Proxmox en lugar de un servicio en la nube significa cero costos por documento, que tus documentos nunca salen de tu red y que tu archivo sobrevive a que cualquier SaaS cierre.

Requisitos previos

Antes de empezar, necesitas:

  • Proxmox VE 8.x o 9.x (mira mi guía de actualización a Proxmox VE 9, en inglés, si todavía no actualizaste)
  • Al menos 2 vCPU y 2 GB de RAM para el LXC; 4 GB recomendados para un OCR rápido
  • Un lugar de almacenamiento para el archivo de documentos (NAS, pool ZFS o un SSD dedicado)
  • Opcional pero recomendado: un escáner de documentos en red

Paso 1: ¿cómo creo el contenedor LXC en Proxmox?

Descarga la plantilla LXC de Ubuntu 22.04 si todavía no la tienes:

bash
pveam update
pveam download local ubuntu-22.04-standard_22.04-1_amd64.tar.zst

Crea el contenedor. Con 2 vCPU y 3 GB de RAM vas bien: el OCR exige mucha CPU cuando procesa por primera vez una pila de documentos atrasados:

bash
pct create 110 local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst \
  --hostname paperless \
  --memory 3072 \
  --cores 2 \
  --net0 name=eth0,bridge=vmbr0,ip=dhcp \
  --storage local-lvm \
  --rootfs local-lvm:8 \
  --unprivileged 1 \
  --features nesting=1

El flag nesting=1 es necesario para que Docker funcione dentro de un contenedor LXC sin privilegios. Inícialo y obtén la IP:

bash
pct start 110
pct exec 110 -- ip addr show eth0 | grep "inet "

Asigna una IP fija desde tu router o con una reserva DHCP en OPNsense. Elige algo fácil de recordar; 192.168.x.110 funciona bien.

Paso 2: instala Docker dentro del LXC

bash
pct exec 110 -- bash -c "apt-get update && apt-get install -y ca-certificates curl gnupg"
pct exec 110 -- bash -c "install -m 0755 -d /etc/apt/keyrings && \
  curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg && \
  chmod a+r /etc/apt/keyrings/docker.gpg"
pct exec 110 -- bash -c 'echo \
  "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" > /etc/apt/sources.list.d/docker.list'
pct exec 110 -- bash -c "apt-get update && apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin"

Verifica que funcione:

bash
pct exec 110 -- docker run --rm hello-world

Paso 3: ¿cómo configuro el almacenamiento del archivo de documentos?

No guardes tu archivo de documentos dentro del rootfs del LXC: ponlo en un volumen de almacenamiento como corresponde. Un dataset ZFS en el nodo principal de Proxmox es una buena opción.

En el host de Proxmox, crea el dataset y las carpetas:

bash
zfs create rpool/paperless
mkdir -p /rpool/paperless/{data,media,export,consume}
chown -R 1000:1000 /rpool/paperless

Móntalas en el LXC agregando esto a /etc/pve/lxc/110.conf:

code
mp0: /rpool/paperless,mp=/paperless

Reinicia el contenedor:

bash
pct restart 110

Dentro del LXC, verifica el montaje:

bash
pct exec 110 -- ls /paperless
# should show: consume  data  export  media

Si vas a guardar los documentos en un disco de NAS en lugar de un pool ZFS local, el Seagate IronWolf de 4 TB y el WD Red Plus de 4 TB están pensados para cargas de NAS y son mucho más confiables que los discos de escritorio bajo escritura continua. Si buscas algo más económico, un SSD Samsung 870 EVO de 2 TB como disco del archivo te da una excelente velocidad de lectura aleatoria al buscar.

Paso 4: configura el stack de Docker Compose

Dentro del LXC, crea /opt/paperless/docker-compose.yml:

bash
mkdir -p /opt/paperless
cat > /opt/paperless/docker-compose.yml << 'EOF'
version: "3.4"

services:
  broker:
    image: docker.io/library/redis:7
    restart: unless-stopped
    volumes:
      - redisdata:/data

  db:
    image: docker.io/library/postgres:16
    restart: unless-stopped
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: paperless
      POSTGRES_USER: paperless
      POSTGRES_PASSWORD: changeme_strong_password

  webserver:
    image: ghcr.io/paperless-ngx/paperless-ngx:latest
    restart: unless-stopped
    depends_on:
      - db
      - broker
    ports:
      - "8000:8000"
    volumes:
      - /paperless/data:/usr/src/paperless/data
      - /paperless/media:/usr/src/paperless/media
      - /paperless/export:/usr/src/paperless/export
      - /paperless/consume:/usr/src/paperless/consume
    environment:
      PAPERLESS_REDIS: redis://broker:6379
      PAPERLESS_DBHOST: db
      PAPERLESS_DBUSER: paperless
      PAPERLESS_DBPASS: changeme_strong_password
      PAPERLESS_OCR_LANGUAGE: eng
      PAPERLESS_SECRET_KEY: changeme_generate_with_openssl_rand_-hex_32
      PAPERLESS_TIME_ZONE: America/New_York
      PAPERLESS_URL: http://192.168.1.110:8000
      PAPERLESS_OCR_THREADS: 2
      PAPERLESS_CONSUMER_POLLING: 60
      PAPERLESS_TASK_WORKERS: 2
      PAPERLESS_THREADS_PER_WORKER: 1

volumes:
  pgdata:
  redisdata:
EOF

Ajusta PAPERLESS_OCR_LANGUAGE según tus documentos: usa eng+spa para inglés + español.

Genera una clave secreta real:

bash
pct exec 110 -- bash -c "docker run --rm -it ghcr.io/paperless-ngx/paperless-ngx:latest python3 -c 'import secrets; print(secrets.token_hex(32))'"

Levanta el stack:

bash
pct exec 110 -- bash -c "cd /opt/paperless && docker compose up -d"

Crea el usuario administrador:

bash
pct exec 110 -- bash -c "cd /opt/paperless && docker compose exec webserver python3 manage.py createsuperuser"

Entra a http://192.168.1.110:8000 en tu navegador y deberías ver la interfaz de Paperless-ngx.

Paso 5: ¿cómo integro un escáner?

Escáneres de red

Si tienes un escáner con red, apúntalo directamente a la carpeta de consumo o exponla por Samba:

bash
pct exec 110 -- bash -c "apt-get install -y samba"
cat >> /etc/samba/smb.conf << 'EOF'

[paperless-consume]
   path = /paperless/consume
   browseable = yes
   read only = no
   guest ok = no
   valid users = paperless
EOF
pct exec 110 -- bash -c "smbpasswd -a paperless && systemctl restart smbd"

En cuanto a escáneres, el Fujitsu ScanSnap iX1600 es el estándar de oro para escanear documentos en una oficina en casa: dúplex, 40 ppm y su app puede enviar directamente a una carpeta por WiFi. El Canon imageFORMULA R40 es una buena opción de gama media si no quieres gastar más de $400. Para un uso más ligero, el Epson WorkForce ES-400 II maneja sin problemas el volumen típico de una oficina en casa.

Escaneo desde el móvil

Instala la app móvil oficial de Paperless-ngx (iOS/Android) o Paperless Mobile. Apúntala a la URL de tu Paperless-ngx con tus credenciales: puedes tomarle una foto a un recibo y tenerlo procesado y etiquetado en menos de dos minutos.

Para acceso remoto sin abrir puertos, poner Cloudflare Tunnels delante de Paperless-ngx es lo más limpio: cero puertos expuestos y el plan gratis maneja el tráfico sin problema.

Paso 6: ¿cómo funciona el entrenamiento de la clasificación automática?

El clasificador de Paperless-ngx necesita documentos para entrenar. Ve a Admin → Machine Learning → Run trainer cuando tengas más de 50 documentos cargados. Después de unos 200 documentos con remitentes y etiquetas bien asignados, la asignación automática se vuelve realmente útil.

La taxonomía de etiquetas importa. Mantenla plana y amplia en lugar de profunda y específica: tax, insurance, medical, utilities, bank, receipts. Las jerarquías profundas confunden al clasificador.

Paso 7: agrega HTTPS con Traefik

No corras Paperless-ngx sobre HTTP en producción, ni siquiera en tu red local. Si ya usas Traefik en Proxmox LXC, agrega enrutamiento por etiquetas al archivo compose:

yaml
labels:
  - "traefik.enable=true"
  - "traefik.http.routers.paperless.rule=Host(`paperless.yourdomain.internal`)"
  - "traefik.http.routers.paperless.tls=true"
  - "traefik.http.routers.paperless.tls.certresolver=letsencrypt"
  - "traefik.http.services.paperless.loadbalancer.server.port=8000"

Actualiza PAPERLESS_URL en tu archivo compose con el hostname HTTPS y reinicia.

Estrategia de respaldos

Tu archivo de documentos es irremplazable. Paperless-ngx trae un comando de exportación integrado:

bash
docker compose exec webserver document_exporter /paperless/export

Agrégalo a un cron dentro del LXC y sincroniza la carpeta de exportación a un SSD externo o a un bucket S3 fuera de casa con rclone. Una buena rutina es exportar cada noche y sincronizar a un Samsung T7 Shield de 2 TB conectado a otra máquina.

Para la carpeta de medios (los archivos de los documentos), usa Proxmox Backup Server o replicación de snapshots de ZFS. La carpeta de medios más un volcado de PostgreSQL es tu set completo de recuperación:

bash
docker compose exec db pg_dump -U paperless paperless > /paperless/export/paperless-db-$(date +%Y%m%d).sql

¿Qué hardware necesita Paperless-ngx?

En reposo, el stack de Paperless-ngx usa aproximadamente 180 MB de RAM. Durante la ingesta masiva con OCR de un PDF de varias páginas sube a 600-800 MB y satura un núcleo de CPU. Con 3 GB asignados y PAPERLESS_OCR_THREADS: 2, los lotes grandes terminan sin quedarse sin memoria.

Cualquier equipo que corra Proxmox con soltura maneja Paperless-ngx como un LXC más entre muchos. Un Beelink GTi13 Ultra, un Intel NUC 12 Pro usado o un Dell OptiPlex 7090 reacondicionado tienen margen de sobra para correr Paperless junto a Immich, Jellyfin y otros servicios.

Si quieres correr todo el stack más la clasificación automática sin que nada se frene, agrega un segundo NVMe para el pool ZFS: el WD Black SN850X de 2 TB es una buena opción por su E/S aleatoria rápida en la carpeta de medios.

Advertencias y detalles

Los paquetes de idioma de OCR pesan. Cada idioma adicional de Tesseract suma ~30-100 MB a la imagen del contenedor. Instala solo los que necesitas.

Conversión a PDF/A. Por defecto, Paperless-ngx convierte los documentos a PDF/A para archivarlos a largo plazo. Es el comportamiento correcto, pero puede cambiar bastante el tamaño de los archivos: una factura escaneada de 2 MB puede convertirse en un PDF/A de 4 MB. Planifica el almacenamiento en consecuencia.

Reindexar la búsqueda toma tiempo. Después de actualizar de versión, Paperless a menudo necesita reconstruir el índice de búsqueda de texto completo. En un archivo grande (más de 5.000 documentos), esto puede tardar 20-30 minutos. No reinicies el contenedor a mitad del proceso.

Detalle de red en LXC. Si el contenedor del servidor web no puede resolver broker o db por hostname, puede que la red de Docker dentro del LXC sin privilegios tenga un problema de DNS. Agregar --dns 1.1.1.1 a la configuración de red del compose suele resolverlo.

Consejo para cargar documentos atrasados. Si vas a cargar más de 1.000 documentos atrasados, hazlo de a 100. Soltar mil PDFs de golpe genera una cola de tareas que puede hacer que Redis consuma memoria de forma inesperada.

Veredicto

Paperless-ngx en Proxmox LXC es uno de los servicios autoalojados más útiles desde el primer día. La instalación toma menos de una hora y, una vez que el clasificador automático aprende de tus documentos, realmente se encarga de la mayor parte de la organización. La combinación de búsqueda con OCR, etiquetado automático y seguimiento de remitentes convierte una carpeta de escaneos caóticos en un archivo que de verdad puedes consultar.

El único punto débil en 2026: escanear desde el móvil todavía tiene un poco más de fricción que el flujo de escanear a una carpeta de Google Drive. Las apps móviles mejoraron, pero todavía no es perfecto. Aun así, todo lo demás de este stack, incluida la ausencia de costos por documento o dependencias de la nube, lo compensa de sobra.

Si ya usas Proxmox y quieres un LXC más que te devuelva valor todos los días, es este.

Aviso: este artículo contiene enlaces de afiliado. Si compras a través de ellos, puedo ganar una pequeña comisión sin costo extra para ti.

¿Quieres algo así para tu negocio?

Instalo infraestructura privada y autoalojada en Proxmox: IA, automatización y herramientas internas en hardware que es tuyo, documentado y entregado. Ver el stack de IA privada →

¿No sabes qué necesitas? Agenda una llamada gratis.

📬Newsletter semanal

Recibe lo mejor de homelab e IA

Sin spam. Un correo por semana. Te das de baja cuando quieras.

Comparte este artículo