version: '3.8' networks: traefik-public: external: true homelab-backend: driver: overlay volumes: paperless_data: paperless_media: paperless_db: paperless_redis: stirling_pdf_data: searxng_data: secrets: paperless_db_password: external: true paperless_secret_key: external: true services: paperless-redis: image: redis:7-alpine volumes: - paperless_redis:/data networks: - homelab-backend healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 30s timeout: 3s retries: 3 deploy: placement: constraints: - node.labels.leader == true resources: limits: memory: 256M cpus: '0.5' reservations: memory: 64M cpus: '0.1' restart_policy: condition: on-failure delay: 5s max_attempts: 3 logging: driver: "json-file" options: max-size: "10m" max-file: "3" paperless-db: image: postgres:15-alpine volumes: - paperless_db:/var/lib/postgresql/data networks: - homelab-backend environment: - POSTGRES_DB=paperless - POSTGRES_USER=paperless - POSTGRES_PASSWORD_FILE=/run/secrets/paperless_db_password secrets: - paperless_db_password healthcheck: test: ["CMD-SHELL", "pg_isready -U paperless"] interval: 30s timeout: 5s retries: 3 deploy: placement: constraints: - node.labels.leader == true resources: limits: memory: 512M cpus: '1.0' reservations: memory: 256M cpus: '0.25' restart_policy: condition: on-failure delay: 5s max_attempts: 3 logging: driver: "json-file" options: max-size: "10m" max-file: "3" paperless: image: ghcr.io/paperless-ngx/paperless-ngx:2.19.3 volumes: - paperless_data:/usr/src/paperless/data - paperless_media:/usr/src/paperless/media environment: - PAPERLESS_REDIS=redis://paperless-redis:6379 - PAPERLESS_DBHOST=paperless-db - PAPERLESS_DBNAME=paperless - PAPERLESS_DBUSER=paperless - PAPERLESS_DBPASS_FILE=/run/secrets/paperless_db_password - PAPERLESS_URL=https://paperless.sj98.duckdns.org - PAPERLESS_SECRET_KEY_FILE=/run/secrets/paperless_secret_key - TZ=America/Chicago secrets: - paperless_db_password - paperless_secret_key depends_on: - paperless-redis - paperless-db networks: - traefik-public - homelab-backend healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/api/"] interval: 30s timeout: 10s retries: 3 start_period: 90s deploy: placement: constraints: - node.labels.leader == true resources: limits: memory: 1536M cpus: '2.0' reservations: memory: 768M cpus: '0.5' restart_policy: condition: on-failure delay: 10s max_attempts: 3 update_config: parallelism: 1 delay: 10s failure_action: rollback labels: - "traefik.enable=true" - "traefik.http.routers.paperless.rule=Host(`paperless.sj98.duckdns.org`)" - "traefik.http.routers.paperless.entrypoints=websecure" - "traefik.http.routers.paperless.tls.certresolver=leresolver" - "traefik.http.services.paperless.loadbalancer.server.port=8000" - "traefik.docker.network=traefik-public" - "tsdproxy.enable=true" - "tsdproxy.name=paperless" logging: driver: "json-file" options: max-size: "10m" max-file: "3" stirling-pdf: image: frooodle/s-pdf:0.18.1 volumes: - stirling_pdf_data:/configs environment: - DOCKER_ENABLE_SECURITY=false - INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false - LANGS=en_US networks: - traefik-public healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/"] interval: 30s timeout: 10s retries: 3 start_period: 30s deploy: placement: constraints: - node.labels.leader == true resources: limits: memory: 1536M cpus: '2.0' reservations: memory: 768M cpus: '0.5' restart_policy: condition: on-failure delay: 5s max_attempts: 3 update_config: parallelism: 1 delay: 10s failure_action: rollback labels: - "traefik.enable=true" - "traefik.http.routers.pdf.rule=Host(`pdf.sj98.duckdns.org`)" - "traefik.http.routers.pdf.entrypoints=websecure" - "traefik.http.routers.pdf.tls.certresolver=leresolver" - "traefik.http.services.pdf.loadbalancer.server.port=8080" - "traefik.docker.network=traefik-public" - "tsdproxy.enable=true" - "tsdproxy.name=pdf" logging: driver: "json-file" options: max-size: "10m" max-file: "3" searxng: image: searxng/searxng:2024.11.20-e9f6095cc volumes: - searxng_data:/etc/searxng environment: - SEARXNG_BASE_URL=https://search.sj98.duckdns.org/ networks: - traefik-public healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/healthz"] interval: 30s timeout: 10s retries: 3 start_period: 30s deploy: placement: constraints: - node.labels.leader == true resources: limits: memory: 1536M cpus: '2.0' reservations: memory: 512M cpus: '0.5' restart_policy: condition: on-failure delay: 5s max_attempts: 3 update_config: parallelism: 1 delay: 10s failure_action: rollback labels: - "traefik.enable=true" - "traefik.http.routers.searxng.rule=Host(`search.sj98.duckdns.org`)" - "traefik.http.routers.searxng.entrypoints=websecure" - "traefik.http.routers.searxng.tls.certresolver=leresolver" - "traefik.http.services.searxng.loadbalancer.server.port=8080" - "traefik.docker.network=traefik-public" - "tsdproxy.enable=true" - "tsdproxy.name=search" logging: driver: "json-file" options: max-size: "10m" max-file: "3"