{"id":5455,"date":"2026-02-06T12:31:41","date_gmt":"2026-02-06T12:31:41","guid":{"rendered":"https:\/\/ww1.chob.pt\/?p=5455"},"modified":"2026-02-06T12:32:45","modified_gmt":"2026-02-06T12:32:45","slug":"paperless-portainer-stack","status":"publish","type":"post","link":"http:\/\/ww1.chob.pt\/en\/paperless-portainer-stack\/","title":{"rendered":"Paperless Portainer Stack"},"content":{"rendered":"<p class=\"wp-block-paragraph\">Although the <a href=\"https:\/\/github.com\/timothystewart6\/paperless-stack\">timothystewart6\/paperless-stack<\/a> is great for deploying from CLI, it&#8217;s not directly importable into Portainer.<br><br>For users that would rather use this approach, below is the Stack adapted to portainer, in a way that avoids the .env files in each subfolder<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The only changes from the original Repo were the change of the original repo names to be prefixed with <code>paperless-<\/code> , avoiding conflicts with other existing containers with similar names, the centralization of the Environment Variables, and prefixing some ports<br><strong>Remember to change the default passwords<\/strong><br><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Web editor<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n\nservices:\n  # paperless-ngx main service\n  paperless:\n    image: ghcr.io\/paperless-ngx\/paperless-ngx:latest\n    container_name: paperless-ngx\n    restart: unless-stopped\n    #env_file: \n    #  - .\/paperless\/.env\n    depends_on:\n      - paperless-postgres\n      - paperless-redis\n      - paperless-gotenberg\n      - paperless-tika\n    ports:\n      - \"8000:8000\"\n    volumes:\n      - .\/paperless\/data:\/usr\/src\/paperless\/data\n      - .\/paperless\/media:\/usr\/src\/paperless\/media\n      - .\/paperless\/export:\/usr\/src\/paperless\/export\n      - .\/paperless\/consume:\/usr\/src\/paperless\/consume\n  \n  # postgres database for paperless-ngx\n  paperless-postgres:\n    image: postgres:18\n    restart: unless-stopped\n    container_name: paperless-postgres\n    #env_file: \n    #  - .\/postgres\/.env\n    volumes:\n      - .\/postgres\/data:\/var\/lib\/postgresql\n  \n  # redis database for paperless-ngx\n  paperless-redis:\n    image: docker.io\/library\/redis:8\n    container_name: paperless-redis\n    restart: unless-stopped\n    #env_file: \n    #  - .\/redis\/.env\n    volumes:\n      - .\/redis\/data:\/data\n  \n  # gotenberg service that paperless uses for document conversion\n  paperless-gotenberg:\n    image: docker.io\/gotenberg\/gotenberg:8.25\n    container_name: paperless-gotenberg\n   # env_file: \n   #   - .\/gotenberg\/.env\n    restart: unless-stopped\n    command:\n      - \"gotenberg\"\n      - \"--chromium-disable-javascript=true\"\n      - \"--chromium-allow-list=file:\/\/\/tmp\/.*\"\n  \n  # tika service that paperless uses for document text extraction\n  paperless-tika:\n    image: docker.io\/apache\/tika:latest\n    container_name: paperless-tika\n    restart: unless-stopped\n    #env_file: .\/tika\/.env\n  \n\n    # open-webui service for LLM interaction\n  paperless-open-webui:\n    image: ghcr.io\/open-webui\/open-webui:latest\n    container_name: paperless-open-webui\n    restart: unless-stopped\n   # env_file:\n   #   - .\/open-webui\/.env\n    depends_on:\n      - paperless-ollama\n    ports:\n      - \"3001:8080\"\n    volumes:\n      - .\/open-webui\/data:\/app\/backend\/data\n\n  # ollama service for local LLMs\n  paperless-ollama:\n    image: ollama\/ollama:latest\n    container_name: paperless-ollama\n   # env_file:\n   #   - .\/ollama\/.env\n    volumes:\n      - .\/ollama\/data\/:\/root\/.ollama\n      - .\/ollama\/models:\/ollama-models\n    restart: unless-stopped\n    deploy:\n      resources:\n        reservations:\n          devices:\n            - driver: nvidia\n              count: all\n              capabilities: &#91;gpu]\n\n  # paperless-ai service\n  paperless-ai:\n    image: clusterzx\/paperless-ai:latest\n    container_name: paperless-ai\n    restart: unless-stopped\n    depends_on:\n      - paperless-ollama\n      - paperless\n    ports:\n      - \"3000:3000\"\n   # env_file:\n    #  - .\/paperless-ai\/.env\n    volumes:\n      - .\/paperless-ai\/data:\/app\/data\n  \n\n  # paperless-gpt service\n  paperless-gpt:\n    image: icereed\/paperless-gpt:latest\n    container_name: paperless-gpt\n    restart: unless-stopped\n    depends_on:\n      - paperless-ollama\n      - paperless\n    ports:\n      - \"3002:8080\"\n    #env_file:\n     # - .\/paperless-gpt\/.env\n    volumes:\n      - .\/paperless-gpt\/prompts:\/app\/prompts # Mount the prompts directory\n\n\n  # optional but helpful log viewer\n  paperless-dozzle:\n    image: amir20\/dozzle:latest\n    restart: unless-stopped\n    container_name: paperless-dozzle\n    #env_file: \n    #- .\/dozzle\/.env\n    volumes:\n      - \/var\/run\/docker.sock:\/var\/run\/docker.sock\n      - .\/dozzle\/data:\/data\n    ports:\n      - \"8080:8080\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Environment variables<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>TZ=Europe\/London #Some .env files only have this setting, feel free to adjust\n\nPAPERLESS_REDIS=redis:\/\/redis:6379\nPAPERLESS_DBHOST=postgres\nPAPERLESS_DBNAME=paperless #if you change this, be sure to also change it in the postgres .env\nPAPERLESS_DBUSER=paperless # if you change this, be sure to also change it in the postgres .env\nPAPERLESS_DBPASS=paperless  # if you change this, be sure to also change it in the postgres .env (You should change this for production use)\n\nPAPERLESS_TIKA_ENABLED=1\nPAPERLESS_TIKA_GOTENBERG_ENDPOINT=http:\/\/gotenberg:3000\nPAPERLESS_TIKA_ENDPOINT=http:\/\/tika:9998\nPOSTGRES_DB=paperless # if you change this, be sure to also change it in the paperless .env\nPOSTGRES_USER=paperless # if you change this, be sure to also change it in the paperless .env\nPOSTGRES_PASSWORD=paperless # if you change this, be sure to also change it in the paperless .env (You should change this for production use)\n\nPAPERLESS_BASE_URL: \"http:\/\/paperless:8000\"\nPAPERLESS_API_TOKEN: some-token  # change to your paperless API token\nLLM_PROVIDER: \"ollama\"\nLLM_MODEL: \"llama3.2:3b\"\nOLLAMA_HOST: \"http:\/\/ollama:11434\"\nOLLAMA_CONTEXT_LENGTH: \"8192\" # Sets Ollama NumCtx (context window)\nTOKEN_LIMIT: 1000 # Recommended for smaller models\nLLM_LANGUAGE: \"English\" # Optional, default: English\nOCR_PROVIDER: \"llm\" # Default OCR provider\nVISION_LLM_PROVIDER: \"ollama\" # openai, ollama, mistral, or anthropic\nVISION_LLM_MODEL: \"minicpm-v:8b\" # minicpm-v (ollama) or gpt-4o (openai) or claude-sonnet-4-5 (anthropic\/claude)\nAUTO_OCR_TAG: \"paperless-gpt-ocr-auto\"\nAUTO_TAG: \"paperless-gpt-auto\"\nMANUAL_TAG: \"paperless-gpt-manual\"\nPDF_OCR_TAGGING: \"true\"\nPDF_OCR_COMPLETE_TAG: \"paperless-gpt-ocr-complete\"\nPDF_UPLOAD: \"false\"\nLOG_LEVEL: \"DEBUG\"\n\nPAPERLESS_API_URL=http:\/\/paperless:8000\/api\nPAPERLESS_API_TOKEN=some-token # change to your paperless API token\nPAPERLESS_USERNAME=admin # change to your paperless username\nAI_PROVIDER=ollama\nOLLAMA_API_URL=http:\/\/ollama:11434\nOLLAMA_MODEL=llama3.2:3b\nRAG_SERVICE_URL=http:\/\/localhost:8000\nRAG_SERVICE_ENABLED=true\nSCAN_INTERVAL=*\/30 * * * *\nPAPERLESS_URL=http:\/\/paperless:8000\n\nOLLAMA_BASE_URL=http:\/\/ollama:11434\nOLLAMA_KEEP_ALIVE=15m\nNVIDIA_DRIVER_CAPABILITIES=all # comment out if you aren't using NVIDIA GPUs\nNVIDIA_VISIBLE_DEVICES=all # comment out if you aren't using NVIDIA GPUs\nOLLAMA_HOST=0.0.0.0:11434\nOLLAMA_MODELS=ollama-models<\/code><\/pre>","protected":false},"excerpt":{"rendered":"<p>Although the timothystewart6\/paperless-stack is great for deploying from CLI, it&#8217;s not directly importable into Portainer. For users that would rather use this approach, below is the Stack adapted to portainer, in a way that avoids the .env files in each subfolder The only changes from the original Repo were the change of the original repo [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_eb_attr":"","footnotes":""},"categories":[4],"tags":[],"class_list":["post-5455","post","type-post","status-publish","format-standard","hentry","category-code-bits"],"_links":{"self":[{"href":"http:\/\/ww1.chob.pt\/en\/wp-json\/wp\/v2\/posts\/5455","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/ww1.chob.pt\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/ww1.chob.pt\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/ww1.chob.pt\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/ww1.chob.pt\/en\/wp-json\/wp\/v2\/comments?post=5455"}],"version-history":[{"count":1,"href":"http:\/\/ww1.chob.pt\/en\/wp-json\/wp\/v2\/posts\/5455\/revisions"}],"predecessor-version":[{"id":5456,"href":"http:\/\/ww1.chob.pt\/en\/wp-json\/wp\/v2\/posts\/5455\/revisions\/5456"}],"wp:attachment":[{"href":"http:\/\/ww1.chob.pt\/en\/wp-json\/wp\/v2\/media?parent=5455"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/ww1.chob.pt\/en\/wp-json\/wp\/v2\/categories?post=5455"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/ww1.chob.pt\/en\/wp-json\/wp\/v2\/tags?post=5455"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}