From 4acf797128136f07e0de797cf12883706cbedd2d Mon Sep 17 00:00:00 2001 From: Bas Nijholt Date: Wed, 7 Jan 2026 12:23:34 +0100 Subject: [PATCH] examples: Update paperless-ngx to use PostgreSQL (#153) Match the real-world setup with Redis + PostgreSQL + App. Remove NFS + PostgreSQL warning since it works fine in practice. --- examples/README.md | 9 +++---- examples/paperless-ngx/.env | 3 ++- examples/paperless-ngx/compose.yaml | 39 +++++++++++++++++++---------- 3 files changed, 32 insertions(+), 19 deletions(-) diff --git a/examples/README.md b/examples/README.md index cea8844..86868d6 100644 --- a/examples/README.md +++ b/examples/README.md @@ -9,7 +9,7 @@ Real-world examples demonstrating compose-farm patterns for multi-host Docker de | [traefik](traefik/) | Infrastructure | Reverse proxy, Let's Encrypt, file-provider | | [mealie](mealie/) | Single container | Traefik labels, resource limits, environment vars | | [uptime-kuma](uptime-kuma/) | Single container | Docker socket, user mapping, custom DNS | -| [paperless-ngx](paperless-ngx/) | Multi-container | Redis + App stack (SQLite) | +| [paperless-ngx](paperless-ngx/) | Multi-container | Redis + PostgreSQL + App stack | | [autokuma](autokuma/) | Multi-host | Demonstrates `all` keyword (runs on every host) | ## Key Patterns @@ -96,15 +96,14 @@ Database-backed apps with multiple services: services: redis: image: redis:7 + db: + image: postgres:16 app: depends_on: - redis + - db ``` -> **NFS + PostgreSQL Warning:** PostgreSQL should NOT run on NFS storage due to -> fsync and file locking issues. Use SQLite (safe for single-writer on NFS) or -> keep PostgreSQL data on local volumes (non-migratable). - ### AutoKuma Labels (Optional) The autokuma example demonstrates compose-farm's **multi-host feature** - running the same stack on all hosts using the `all` keyword. AutoKuma itself is not part of compose-farm; it's just a good example because it needs to run on every host to monitor local Docker containers. diff --git a/examples/paperless-ngx/.env b/examples/paperless-ngx/.env index ed8b224..1ee46f7 100644 --- a/examples/paperless-ngx/.env +++ b/examples/paperless-ngx/.env @@ -1,3 +1,4 @@ # Copy to .env and fill in your values DOMAIN=example.com -PAPERLESS_SECRET_KEY=change-me-to-a-random-string +POSTGRES_PASSWORD=change-me-to-a-secure-password +PAPERLESS_SECRET_KEY=change-me-to-a-long-random-string diff --git a/examples/paperless-ngx/compose.yaml b/examples/paperless-ngx/compose.yaml index a6bae06..2322bde 100644 --- a/examples/paperless-ngx/compose.yaml +++ b/examples/paperless-ngx/compose.yaml @@ -1,44 +1,57 @@ # Paperless-ngx - Document management system # # Demonstrates: -# - HTTPS route: paperless.${DOMAIN} (e.g., paperless.example.com) with Let's Encrypt -# - HTTP route: paperless.local for LAN access without TLS -# - Multi-container stack (Redis + App with SQLite) -# -# NOTE: This example uses SQLite (the default) instead of PostgreSQL. -# PostgreSQL should NOT be used with NFS storage due to fsync/locking issues. -# If you need PostgreSQL, use local volumes for the database. +# - HTTPS route: paperless.${DOMAIN} with Let's Encrypt +# - HTTP route: paperless.local for LAN access +# - Multi-container stack (Redis + PostgreSQL + App) +# - Separate env_file for app-specific settings name: paperless-ngx services: - redis: - image: redis:8 + broker: + image: redis:7 container_name: paperless-redis restart: unless-stopped networks: - mynetwork volumes: - - /mnt/data/paperless/redis:/data + - /mnt/data/paperless/redisdata:/data + + db: + image: postgres:16 + container_name: paperless-db + restart: unless-stopped + networks: + - mynetwork + volumes: + - /mnt/data/paperless/pgdata:/var/lib/postgresql/data + environment: + POSTGRES_DB: paperless + POSTGRES_USER: paperless + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} paperless: image: ghcr.io/paperless-ngx/paperless-ngx:latest container_name: paperless restart: unless-stopped depends_on: - - redis + - db + - broker networks: - mynetwork ports: - "8000:8000" volumes: - # SQLite database stored here (safe on NFS for single-writer) - /mnt/data/paperless/data:/usr/src/paperless/data - /mnt/data/paperless/media:/usr/src/paperless/media - /mnt/data/paperless/export:/usr/src/paperless/export - /mnt/data/paperless/consume:/usr/src/paperless/consume environment: - PAPERLESS_REDIS: redis://redis:6379 + PAPERLESS_REDIS: redis://broker:6379 + PAPERLESS_DBHOST: db PAPERLESS_URL: https://paperless.${DOMAIN} PAPERLESS_SECRET_KEY: ${PAPERLESS_SECRET_KEY} + PAPERLESS_TIME_ZONE: America/Los_Angeles + PAPERLESS_OCR_LANGUAGE: eng USERMAP_UID: 1000 USERMAP_GID: 1000 labels: