From 4f595957638b5c2f8c88fb420592c5906290fa58 Mon Sep 17 00:00:00 2001 From: zznate Date: Sun, 12 Oct 2025 18:09:42 +0000 Subject: [PATCH] deploy: 44f3f7085882ba1f61c44717813e387f680c4334 --- 404.html | 2 +- agents/index.html | 2 +- ...fe7ac.f0feb7d8.js => 21afe7ac.e09a4f35.js} | 2 +- assets/js/749371cc.c67142db.js | 1 + assets/js/749371cc.cc93e3ef.js | 1 - ...c3c0c.295b1c55.js => ca2c3c0c.7eb785b4.js} | 2 +- ...n.51333837.js => runtime~main.c8893f6b.js} | 2 +- get-started/docker/index.html | 26 ++++++++++++++++--- get-started/tui/index.html | 6 ++--- index.html | 2 +- ingestion/index.html | 8 +++--- install/index.html | 2 +- knowledge/index.html | 2 +- quickstart/index.html | 2 +- reference/configuration/index.html | 2 +- support/troubleshoot/index.html | 2 +- 16 files changed, 41 insertions(+), 23 deletions(-) rename assets/js/{21afe7ac.f0feb7d8.js => 21afe7ac.e09a4f35.js} (98%) create mode 100644 assets/js/749371cc.c67142db.js delete mode 100644 assets/js/749371cc.cc93e3ef.js rename assets/js/{ca2c3c0c.295b1c55.js => ca2c3c0c.7eb785b4.js} (98%) rename assets/js/{runtime~main.51333837.js => runtime~main.c8893f6b.js} (89%) diff --git a/404.html b/404.html index 8e84ad28..b20b9e2f 100644 --- a/404.html +++ b/404.html @@ -4,7 +4,7 @@ OpenRAG - + diff --git a/agents/index.html b/agents/index.html index 535e640b..c814c52c 100644 --- a/agents/index.html +++ b/agents/index.html @@ -4,7 +4,7 @@ Langflow Agents | OpenRAG - + diff --git a/assets/js/21afe7ac.f0feb7d8.js b/assets/js/21afe7ac.e09a4f35.js similarity index 98% rename from assets/js/21afe7ac.f0feb7d8.js rename to assets/js/21afe7ac.e09a4f35.js index 23d68fea..8c21f34f 100644 --- a/assets/js/21afe7ac.f0feb7d8.js +++ b/assets/js/21afe7ac.e09a4f35.js @@ -1 +1 @@ -"use strict";(self.webpackChunkopenrag_docs=self.webpackChunkopenrag_docs||[]).push([[961],{5689:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/OpenRAG_TUI_2025-09-10T13_04_11_757637-9441c53ba39162a88ac6c11cbeaed0e0.svg"},6239:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"get-started/tui","title":"Terminal User Interface (TUI) commands","description":"The OpenRAG Terminal User Interface (TUI) allows you to set up, configure, and monitor your OpenRAG deployment directly from the terminal, on any operating system.","source":"@site/docs/get-started/tui.mdx","sourceDirName":"get-started","slug":"/get-started/tui","permalink":"/get-started/tui","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/get-started/tui.mdx","tags":[],"version":"current","frontMatter":{"title":"Terminal User Interface (TUI) commands","slug":"/get-started/tui"},"sidebar":"tutorialSidebar","previous":{"title":"Quickstart","permalink":"/quickstart"},"next":{"title":"Langflow Agents","permalink":"/agents"}}');var r=t(4848),i=t(8453);const o={title:"Terminal User Interface (TUI) commands",slug:"/get-started/tui"},a=void 0,c={},d=[{value:"Start the TUI",id:"start-the-tui",level:2},{value:"Navigation",id:"navigation",level:2},{value:"Container management",id:"container-management",level:2},{value:"Start container services",id:"start-container-services",level:3},{value:"Start native services",id:"start-native-services",level:3},{value:"Status",id:"status",level:3},{value:"Diagnostics",id:"diagnostics",level:2}];function l(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"The OpenRAG Terminal User Interface (TUI) allows you to set up, configure, and monitor your OpenRAG deployment directly from the terminal, on any operating system."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"OpenRAG TUI Interface",src:t(5689).A+"",width:"1995",height:"1099"})}),"\n",(0,r.jsxs)(n.p,{children:["Instead of starting OpenRAG using Docker commands and manually editing values in the ",(0,r.jsx)(n.code,{children:".env"})," file, the TUI walks you through the setup. It prompts for variables where required, creates a ",(0,r.jsx)(n.code,{children:".env"})," file for you, and then starts OpenRAG."]}),"\n",(0,r.jsx)(n.p,{children:"Once OpenRAG is running, use the TUI to monitor your application, control your containers, and retrieve logs."}),"\n",(0,r.jsx)(n.h2,{id:"start-the-tui",children:"Start the TUI"}),"\n",(0,r.jsx)(n.p,{children:"To start the TUI, run the following commands from the directory where you installed OpenRAG."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"uv sync\nuv run openrag\n"})}),"\n",(0,r.jsxs)(n.p,{children:["The TUI Welcome Screen offers basic and advanced setup options.\nFor more information on setup values during installation, see ",(0,r.jsx)(n.a,{href:"/install",children:"Install OpenRAG"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"navigation",children:"Navigation"}),"\n",(0,r.jsx)(n.p,{children:"The TUI accepts mouse input or keyboard commands."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)("kbd",{children:"Arrow keys"}),": move between options"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)("kbd",{children:"Tab"}),"/",(0,r.jsx)("kbd",{children:"Shift+Tab"}),": switch fields and buttons"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)("kbd",{children:"Enter"}),": select/confirm"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)("kbd",{children:"Escape"}),": back"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)("kbd",{children:"Q"}),": quit"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)("kbd",{children:"Number keys (1-4)"}),": quick access to main screens"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"container-management",children:"Container management"}),"\n",(0,r.jsx)(n.p,{children:"The TUI can deploy, manage, and upgrade your OpenRAG containers."}),"\n",(0,r.jsx)(n.h3,{id:"start-container-services",children:"Start container services"}),"\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Start Container Services"})," to start the OpenRAG containers.\nThe TUI automatically detects your container runtime, and then checks if your machine has compatible GPU support by checking for ",(0,r.jsx)(n.code,{children:"CUDA"}),", ",(0,r.jsx)(n.code,{children:"NVIDIA_SMI"}),", and Docker/Podman runtime support. This check determines which Docker Compose file OpenRAG uses.\nThe TUI then pulls the images and deploys the containers with the following command."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker compose up -d\n"})}),"\n",(0,r.jsxs)(n.p,{children:["If images are missing, the TUI runs ",(0,r.jsx)(n.code,{children:"docker compose pull"}),", then runs ",(0,r.jsx)(n.code,{children:"docker compose up -d"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"start-native-services",children:"Start native services"}),"\n",(0,r.jsxs)(n.p,{children:['A "native" service in OpenRAG refers to a service run natively on your machine, and not within a container.\nThe ',(0,r.jsx)(n.code,{children:"docling-serve"})," process is a native service in OpenRAG, because it's a document processing service that is run on your local machine, and controlled separately from the containers."]}),"\n",(0,r.jsxs)(n.p,{children:["To start or stop ",(0,r.jsx)(n.code,{children:"docling-serve"})," or any other native services, in the TUI main menu, click ",(0,r.jsx)(n.strong,{children:"Start Native Services"})," or ",(0,r.jsx)(n.strong,{children:"Stop Native Services"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["To view the status, port, or PID of a native service, in the TUI main menu, click ",(0,r.jsx)(n.a,{href:"#status",children:"Status"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"status",children:"Status"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Status"})," menu displays information on your container deployment.\nHere you can check container health, find your service ports, view logs, and upgrade your containers."]}),"\n",(0,r.jsxs)(n.p,{children:["To view streaming logs, select the container you want to view, and press ",(0,r.jsx)("kbd",{children:"l"}),".\nTo copy your logs, click ",(0,r.jsx)(n.strong,{children:"Copy to Clipboard"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["To ",(0,r.jsx)(n.strong,{children:"upgrade"})," your containers, click ",(0,r.jsx)(n.strong,{children:"Upgrade"}),".\n",(0,r.jsx)(n.strong,{children:"Upgrade"})," runs ",(0,r.jsx)(n.code,{children:"docker compose pull"})," and then ",(0,r.jsx)(n.code,{children:"docker compose up -d --force-recreate"}),".\nThe first command pulls the latest images of OpenRAG.\nThe second command recreates the containers with your data persisted."]}),"\n",(0,r.jsxs)(n.p,{children:["To ",(0,r.jsx)(n.strong,{children:"reset"})," your containers, click ",(0,r.jsx)(n.strong,{children:"Reset"}),".\nReset gives you a completely fresh start.\nReset deletes all of your data, including OpenSearch data, uploaded documents, and authentication.\n",(0,r.jsx)(n.strong,{children:"Reset"})," runs two commands.\nIt first stops and removes all containers, volumes, and local images."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"docker compose down --volumes --remove-orphans --rmi local\n"})}),"\n",(0,r.jsxs)(n.p,{children:["When the first command is complete, OpenRAG removes any additional Docker objects with ",(0,r.jsx)(n.code,{children:"prune"}),"."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"docker system prune -f\n"})}),"\n",(0,r.jsx)(n.h2,{id:"diagnostics",children:"Diagnostics"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Diagnostics"})," menu provides health monitoring for your container runtimes and monitoring of your OpenSearch security."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var s=t(6540);const r={},i=s.createContext(r);function o(e){const n=s.useContext(i);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkopenrag_docs=self.webpackChunkopenrag_docs||[]).push([[961],{5689:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/OpenRAG_TUI_2025-09-10T13_04_11_757637-9441c53ba39162a88ac6c11cbeaed0e0.svg"},6239:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"get-started/tui","title":"Terminal User Interface (TUI) commands","description":"The OpenRAG Terminal User Interface (TUI) allows you to set up, configure, and monitor your OpenRAG deployment directly from the terminal, on any operating system.","source":"@site/docs/get-started/tui.mdx","sourceDirName":"get-started","slug":"/get-started/tui","permalink":"/get-started/tui","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/get-started/tui.mdx","tags":[],"version":"current","frontMatter":{"title":"Terminal User Interface (TUI) commands","slug":"/get-started/tui"},"sidebar":"tutorialSidebar","previous":{"title":"Quickstart","permalink":"/quickstart"},"next":{"title":"Langflow Agents","permalink":"/agents"}}');var r=t(4848),i=t(8453);const o={title:"Terminal User Interface (TUI) commands",slug:"/get-started/tui"},a=void 0,c={},d=[{value:"Start the TUI",id:"start-the-tui",level:2},{value:"Navigation",id:"navigation",level:2},{value:"Container management",id:"container-management",level:2},{value:"Start container services",id:"start-container-services",level:3},{value:"Start native services",id:"start-native-services",level:3},{value:"Status",id:"status",level:3},{value:"Diagnostics",id:"diagnostics",level:2}];function l(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"The OpenRAG Terminal User Interface (TUI) allows you to set up, configure, and monitor your OpenRAG deployment directly from the terminal, on any operating system."}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"OpenRAG TUI Interface",src:t(5689).A+"",width:"1995",height:"1099"})}),"\n",(0,r.jsxs)(n.p,{children:["Instead of starting OpenRAG using Docker commands and manually editing values in the ",(0,r.jsx)(n.code,{children:".env"})," file, the TUI walks you through the setup. It prompts for variables where required, creates a ",(0,r.jsx)(n.code,{children:".env"})," file for you, and then starts OpenRAG."]}),"\n",(0,r.jsx)(n.p,{children:"Once OpenRAG is running, use the TUI to monitor your application, control your containers, and retrieve logs."}),"\n",(0,r.jsx)(n.h2,{id:"start-the-tui",children:"Start the TUI"}),"\n",(0,r.jsx)(n.p,{children:"To start the TUI, run the following commands from the directory where you installed OpenRAG."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"uv sync\nuv run openrag\n"})}),"\n",(0,r.jsxs)(n.p,{children:["The TUI Welcome Screen offers basic and advanced setup options.\nFor more information on setup values during installation, see ",(0,r.jsx)(n.a,{href:"/install",children:"Install OpenRAG"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"navigation",children:"Navigation"}),"\n",(0,r.jsx)(n.p,{children:"The TUI accepts mouse input or keyboard commands."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)("kbd",{children:"Arrow keys"}),": move between options"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)("kbd",{children:"Tab"}),"/",(0,r.jsx)("kbd",{children:"Shift+Tab"}),": switch fields and buttons"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)("kbd",{children:"Enter"}),": select/confirm"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)("kbd",{children:"Escape"}),": back"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)("kbd",{children:"Q"}),": quit"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)("kbd",{children:"Number keys (1-4)"}),": quick access to main screens"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"container-management",children:"Container management"}),"\n",(0,r.jsx)(n.p,{children:"The TUI can deploy, manage, and upgrade your OpenRAG containers."}),"\n",(0,r.jsx)(n.h3,{id:"start-container-services",children:"Start container services"}),"\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Start Container Services"})," to start the OpenRAG containers.\nThe TUI automatically detects your container runtime, and then checks if your machine has compatible GPU support by checking for ",(0,r.jsx)(n.code,{children:"CUDA"}),", ",(0,r.jsx)(n.code,{children:"NVIDIA_SMI"}),", and Docker/Podman runtime support. This check determines which Docker Compose file OpenRAG uses.\nThe TUI then pulls the images and deploys the containers with the following command."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"docker compose up -d\n"})}),"\n",(0,r.jsxs)(n.p,{children:["If images are missing, the TUI runs ",(0,r.jsx)(n.code,{children:"docker compose pull"}),", then runs ",(0,r.jsx)(n.code,{children:"docker compose up -d"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"start-native-services",children:"Start native services"}),"\n",(0,r.jsxs)(n.p,{children:['A "native" service in OpenRAG refers to a service run natively on your machine, and not within a container.\nThe ',(0,r.jsx)(n.code,{children:"docling serve"})," process is a native service in OpenRAG, because it's a document processing service that is run on your local machine, and controlled separately from the containers."]}),"\n",(0,r.jsxs)(n.p,{children:["To start or stop ",(0,r.jsx)(n.code,{children:"docling serve"})," or any other native services, in the TUI main menu, click ",(0,r.jsx)(n.strong,{children:"Start Native Services"})," or ",(0,r.jsx)(n.strong,{children:"Stop Native Services"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["To view the status, port, or PID of a native service, in the TUI main menu, click ",(0,r.jsx)(n.a,{href:"#status",children:"Status"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"status",children:"Status"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Status"})," menu displays information on your container deployment.\nHere you can check container health, find your service ports, view logs, and upgrade your containers."]}),"\n",(0,r.jsxs)(n.p,{children:["To view streaming logs, select the container you want to view, and press ",(0,r.jsx)("kbd",{children:"l"}),".\nTo copy your logs, click ",(0,r.jsx)(n.strong,{children:"Copy to Clipboard"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["To ",(0,r.jsx)(n.strong,{children:"upgrade"})," your containers, click ",(0,r.jsx)(n.strong,{children:"Upgrade"}),".\n",(0,r.jsx)(n.strong,{children:"Upgrade"})," runs ",(0,r.jsx)(n.code,{children:"docker compose pull"})," and then ",(0,r.jsx)(n.code,{children:"docker compose up -d --force-recreate"}),".\nThe first command pulls the latest images of OpenRAG.\nThe second command recreates the containers with your data persisted."]}),"\n",(0,r.jsxs)(n.p,{children:["To ",(0,r.jsx)(n.strong,{children:"reset"})," your containers, click ",(0,r.jsx)(n.strong,{children:"Reset"}),".\nReset gives you a completely fresh start.\nReset deletes all of your data, including OpenSearch data, uploaded documents, and authentication.\n",(0,r.jsx)(n.strong,{children:"Reset"})," runs two commands.\nIt first stops and removes all containers, volumes, and local images."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"docker compose down --volumes --remove-orphans --rmi local\n"})}),"\n",(0,r.jsxs)(n.p,{children:["When the first command is complete, OpenRAG removes any additional Docker objects with ",(0,r.jsx)(n.code,{children:"prune"}),"."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"docker system prune -f\n"})}),"\n",(0,r.jsx)(n.h2,{id:"diagnostics",children:"Diagnostics"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Diagnostics"})," menu provides health monitoring for your container runtimes and monitoring of your OpenSearch security."]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var s=t(6540);const r={},i=s.createContext(r);function o(e){const n=s.useContext(i);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/749371cc.c67142db.js b/assets/js/749371cc.c67142db.js new file mode 100644 index 00000000..98cb976f --- /dev/null +++ b/assets/js/749371cc.c67142db.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkopenrag_docs=self.webpackChunkopenrag_docs||[]).push([[272],{887:(e,n,r)=>{r.d(n,{Ay:()=>c,RM:()=>a});var s=r(4848),t=r(8453),o=r(1470),l=r(9365);const a=[{value:"Application onboarding",id:"application-onboarding",level:2}];function i(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"application-onboarding",children:"Application onboarding"}),"\n",(0,s.jsxs)(n.p,{children:["The first time you start OpenRAG, whether using the TUI or a ",(0,s.jsx)(n.code,{children:".env"})," file, you must complete application onboarding."]}),"\n",(0,s.jsxs)(n.p,{children:["Most values from onboarding can be changed later in the OpenRAG ",(0,s.jsx)(n.strong,{children:"Settings"})," page, but there are important restrictions."]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.strong,{children:"language model provider"})," and ",(0,s.jsx)(n.strong,{children:"embeddings model provider"})," can only be selected at onboarding, and you must use the same provider for your language model and embedding model.\nTo change your provider selection later, you must completely reinstall OpenRAG."]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.strong,{children:"language model"})," can be changed later in ",(0,s.jsx)(n.strong,{children:"Settings"}),", but the ",(0,s.jsx)(n.strong,{children:"embeddings model"})," cannot be changed later."]}),"\n",(0,s.jsxs)(o.A,{groupId:"Provider",children:[(0,s.jsx)(l.A,{value:"OpenAI",label:"OpenAI",default:!0,children:(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Enable ",(0,s.jsx)(n.strong,{children:"Get API key from environment variable"})," to automatically enter your key from the TUI-generated ",(0,s.jsx)(n.code,{children:".env"})," file."]}),"\n",(0,s.jsxs)(n.li,{children:["Under ",(0,s.jsx)(n.strong,{children:"Advanced settings"}),", select your ",(0,s.jsx)(n.strong,{children:"Embedding Model"})," and ",(0,s.jsx)(n.strong,{children:"Language Model"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["To load 2 sample PDFs, enable ",(0,s.jsx)(n.strong,{children:"Sample dataset"}),".\nThis is recommended, but not required."]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Continue with the ",(0,s.jsx)(n.a,{href:"/quickstart",children:"Quickstart"}),"."]}),"\n"]})}),(0,s.jsx)(l.A,{value:"IBM watsonx.ai",label:"IBM watsonx.ai",children:(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Complete the fields for ",(0,s.jsx)(n.strong,{children:"watsonx.ai API Endpoint"}),", ",(0,s.jsx)(n.strong,{children:"IBM API key"}),", and ",(0,s.jsx)(n.strong,{children:"IBM Project ID"}),".\nThese values are found in your IBM watsonx deployment."]}),"\n",(0,s.jsxs)(n.li,{children:["Under ",(0,s.jsx)(n.strong,{children:"Advanced settings"}),", select your ",(0,s.jsx)(n.strong,{children:"Embedding Model"})," and ",(0,s.jsx)(n.strong,{children:"Language Model"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["To load 2 sample PDFs, enable ",(0,s.jsx)(n.strong,{children:"Sample dataset"}),".\nThis is recommended, but not required."]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Continue with the ",(0,s.jsx)(n.a,{href:"/quickstart",children:"Quickstart"}),"."]}),"\n"]})}),(0,s.jsxs)(l.A,{value:"Ollama",label:"Ollama",children:[(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["Ollama is not included with OpenRAG. To install Ollama, see the ",(0,s.jsx)(n.a,{href:"https://docs.ollama.com/",children:"Ollama documentation"}),"."]})}),(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Enter your Ollama server's base URL address.\nThe default Ollama server address is ",(0,s.jsx)(n.code,{children:"http://localhost:11434"}),".\nOpenRAG automatically transforms ",(0,s.jsx)(n.code,{children:"localhost"})," to access services outside of the container, and sends a test connection to your Ollama server to confirm connectivity."]}),"\n",(0,s.jsxs)(n.li,{children:["Select the ",(0,s.jsx)(n.strong,{children:"Embedding Model"})," and ",(0,s.jsx)(n.strong,{children:"Language Model"})," your Ollama server is running.\nOpenRAG retrieves the available models from your Ollama server."]}),"\n",(0,s.jsxs)(n.li,{children:["To load 2 sample PDFs, enable ",(0,s.jsx)(n.strong,{children:"Sample dataset"}),".\nThis is recommended, but not required."]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Continue with the ",(0,s.jsx)(n.a,{href:"/quickstart",children:"Quickstart"}),"."]}),"\n"]})]})]})]})}function c(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(i,{...e})}):i(e)}},1470:(e,n,r)=>{r.d(n,{A:()=>k});var s=r(6540),t=r(4164),o=r(3104),l=r(6347),a=r(205),i=r(7485),c=r(1682),d=r(679);function h(e){return s.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,s.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function u(e){const{values:n,children:r}=e;return(0,s.useMemo)(()=>{const e=n??function(e){return h(e).map(({props:{value:e,label:n,attributes:r,default:s}})=>({value:e,label:n,attributes:r,default:s}))}(r);return function(e){const n=(0,c.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,r])}function p({value:e,tabValues:n}){return n.some(n=>n.value===e)}function m({queryString:e=!1,groupId:n}){const r=(0,l.W6)(),t=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,i.aZ)(t),(0,s.useCallback)(e=>{if(!t)return;const n=new URLSearchParams(r.location.search);n.set(t,e),r.replace({...r.location,search:n.toString()})},[t,r])]}function x(e){const{defaultValue:n,queryString:r=!1,groupId:t}=e,o=u(e),[l,i]=(0,s.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!p({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:o})),[c,h]=m({queryString:r,groupId:t}),[x,j]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,t]=(0,d.Dv)(n);return[r,(0,s.useCallback)(e=>{n&&t.set(e)},[n,t])]}({groupId:t}),g=(()=>{const e=c??x;return p({value:e,tabValues:o})?e:null})();(0,a.A)(()=>{g&&i(g)},[g]);return{selectedValue:l,selectValue:(0,s.useCallback)(e=>{if(!p({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),h(e),j(e)},[h,j,o]),tabValues:o}}var j=r(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var f=r(4848);function b({className:e,block:n,selectedValue:r,selectValue:s,tabValues:l}){const a=[],{blockElementScrollPositionUntilNextRender:i}=(0,o.a_)(),c=e=>{const n=e.currentTarget,t=a.indexOf(n),o=l[t].value;o!==r&&(i(n),s(o))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const r=a.indexOf(e.currentTarget)+1;n=a[r]??a[0];break}case"ArrowLeft":{const r=a.indexOf(e.currentTarget)-1;n=a[r]??a[a.length-1];break}}n?.focus()};return(0,f.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":n},e),children:l.map(({value:e,label:n,attributes:s})=>(0,f.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{a.push(e)},onKeyDown:d,onClick:c,...s,className:(0,t.A)("tabs__item",g.tabItem,s?.className,{"tabs__item--active":r===e}),children:n??e},e))})}function v({lazy:e,children:n,selectedValue:r}){const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=o.find(e=>e.props.value===r);return e?(0,s.cloneElement)(e,{className:(0,t.A)("margin-top--md",e.props.className)}):null}return(0,f.jsx)("div",{className:"margin-top--md",children:o.map((e,n)=>(0,s.cloneElement)(e,{key:n,hidden:e.props.value!==r}))})}function y(e){const n=x(e);return(0,f.jsxs)("div",{className:(0,t.A)("tabs-container",g.tabList),children:[(0,f.jsx)(b,{...n,...e}),(0,f.jsx)(v,{...n,...e})]})}function k(e){const n=(0,j.A)();return(0,f.jsx)(y,{...e,children:h(e.children)},String(n))}},5788:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"get-started/docker","title":"Deploy with Docker","description":"There are two different Docker Compose files.","source":"@site/docs/get-started/docker.mdx","sourceDirName":"get-started","slug":"/get-started/docker","permalink":"/get-started/docker","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/get-started/docker.mdx","tags":[],"version":"current","frontMatter":{"title":"Deploy with Docker","slug":"/get-started/docker"},"sidebar":"tutorialSidebar","previous":{"title":"Install OpenRAG","permalink":"/install"},"next":{"title":"Quickstart","permalink":"/quickstart"}}');var t=r(4848),o=r(8453),l=r(887);const a={title:"Deploy with Docker",slug:"/get-started/docker"},i=void 0,c={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Deploy OpenRAG with Docker Compose",id:"deploy-openrag-with-docker-compose",level:2},...l.RM,{value:"Container management commands",id:"container-management-commands",level:2},{value:"Upgrade containers",id:"upgrade-containers",level:3},{value:"Rebuild containers (destructive)",id:"rebuild-containers-destructive",level:3},{value:"Remove all containers and data (destructive)",id:"remove-all-containers-and-data-destructive",level:3}];function h(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"There are two different Docker Compose files.\nThey deploy the same applications and containers, but to different environments."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/blob/main/docker-compose.yml",children:(0,t.jsx)(n.code,{children:"docker-compose.yml"})})," is an OpenRAG deployment with GPU support for accelerated AI processing."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/blob/main/docker-compose-cpu.yml",children:(0,t.jsx)(n.code,{children:"docker-compose-cpu.yml"})})," is a CPU-only version of OpenRAG for systems without GPU support. Use this Docker compose file for environments where GPU drivers aren't available."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["Both Docker deployments depend on ",(0,t.jsx)(n.code,{children:"docling serve"})," to be running on port ",(0,t.jsx)(n.code,{children:"5001"})," on the host machine. This enables ",(0,t.jsx)(n.a,{href:"https://opensource.apple.com/projects/mlx/",children:"Mac MLX"})," support for document processing. Installing OpenRAG with the TUI starts ",(0,t.jsx)(n.code,{children:"docling serve"})," automatically, but for a Docker deployment you must manually start the ",(0,t.jsx)(n.code,{children:"docling serve"})," process."]}),"\n",(0,t.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://www.python.org/downloads/release/python-3100/",children:"Python Version 3.10 to 3.13"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://docs.astral.sh/uv/getting-started/installation/",children:"uv"})}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://podman.io/docs/installation",children:"Podman"})," (recommended) or ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/get-docker/",children:"Docker"})," installed"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://docs.docker.com/compose/install/",children:"Docker Compose"})," installed. If you're using Podman, use ",(0,t.jsx)(n.a,{href:"https://docs.podman.io/en/latest/markdown/podman-compose.1.html",children:"podman-compose"})," or alias Docker compose commands to Podman commands."]}),"\n",(0,t.jsxs)(n.li,{children:["Create an ",(0,t.jsx)(n.a,{href:"https://platform.openai.com/api-keys",children:"OpenAI API key"}),". This key is ",(0,t.jsx)(n.strong,{children:"required"})," to start OpenRAG, but you can choose a different model provider during ",(0,t.jsx)(n.a,{href:"#application-onboarding",children:"Application Onboarding"}),"."]}),"\n",(0,t.jsx)(n.li,{children:"Optional: GPU support requires an NVIDIA GPU with CUDA support and compatible NVIDIA drivers installed on the OpenRAG host machine. If you don't have GPU capabilities, OpenRAG provides an alternate CPU-only deployment."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"deploy-openrag-with-docker-compose",children:"Deploy OpenRAG with Docker Compose"}),"\n",(0,t.jsx)(n.p,{children:"To install OpenRAG with Docker Compose, do the following:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Clone the OpenRAG repository."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/langflow-ai/openrag.git\ncd openrag\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Install dependencies."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv sync\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Copy the example ",(0,t.jsx)(n.code,{children:".env"})," file included in the repository root.\nThe example file includes all environment variables with comments to guide you in finding and setting their values."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cp .env.example .env\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Alternatively, create a new ",(0,t.jsx)(n.code,{children:".env"})," file in the repository root."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"touch .env\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Set environment variables. The Docker Compose files will be populated with values from your ",(0,t.jsx)(n.code,{children:".env"}),".\nThe following values are ",(0,t.jsx)(n.strong,{children:"required"})," to be set:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"OPENSEARCH_PASSWORD=your_secure_password\nOPENAI_API_KEY=your_openai_api_key\nLANGFLOW_SUPERUSER=admin\nLANGFLOW_SUPERUSER_PASSWORD=your_langflow_password\nLANGFLOW_SECRET_KEY=your_secret_key\n"})}),"\n",(0,t.jsxs)(n.p,{children:["For more information on configuring OpenRAG with environment variables, see ",(0,t.jsx)(n.a,{href:"/reference/configuration",children:"Environment variables"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Start ",(0,t.jsx)(n.code,{children:"docling serve"})," on the host machine.\nBoth Docker deployments depend on ",(0,t.jsx)(n.code,{children:"docling serve"})," to be running on port ",(0,t.jsx)(n.code,{children:"5001"})," on the host machine. This enables ",(0,t.jsx)(n.a,{href:"https://opensource.apple.com/projects/mlx/",children:"Mac MLX"})," support for document processing."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv run python scripts/docling_ctl.py start --port 5001\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Confirm ",(0,t.jsx)(n.code,{children:"docling serve"})," is running."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"uv run python scripts/docling_ctl.py status\n"})}),"\n",(0,t.jsx)(n.p,{children:"Successful result:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"Status: running\nEndpoint: http://127.0.0.1:5001\nDocs: http://127.0.0.1:5001/docs\nPID: 27746\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Deploy OpenRAG with Docker Compose based on your deployment type."}),"\n",(0,t.jsx)(n.p,{children:"For GPU-enabled systems, run the following commands:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker compose build\ndocker compose up -d\n"})}),"\n",(0,t.jsx)(n.p,{children:"For environments without GPU support, run:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker compose -f docker-compose-cpu.yml up -d\n"})}),"\n",(0,t.jsx)(n.p,{children:"The OpenRAG Docker Compose file starts five containers:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Container Name"}),(0,t.jsx)(n.th,{children:"Default Address"}),(0,t.jsx)(n.th,{children:"Purpose"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"OpenRAG Backend"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"http://localhost:8000",children:"http://localhost:8000"})}),(0,t.jsx)(n.td,{children:"FastAPI server and core functionality."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"OpenRAG Frontend"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"http://localhost:3000",children:"http://localhost:3000"})}),(0,t.jsx)(n.td,{children:"React web interface for users."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Langflow"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"http://localhost:7860",children:"http://localhost:7860"})}),(0,t.jsx)(n.td,{children:"AI workflow engine and flow management."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"OpenSearch"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"http://localhost:9200",children:"http://localhost:9200"})}),(0,t.jsx)(n.td,{children:"Vector database for document storage."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"OpenSearch Dashboards"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"http://localhost:5601",children:"http://localhost:5601"})}),(0,t.jsx)(n.td,{children:"Database administration interface."})]})]})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Verify installation by confirming all services are running."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker compose ps\n"})}),"\n",(0,t.jsx)(n.p,{children:"You can now access the application at:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Frontend"}),": ",(0,t.jsx)(n.a,{href:"http://localhost:3000",children:"http://localhost:3000"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Backend API"}),": ",(0,t.jsx)(n.a,{href:"http://localhost:8000",children:"http://localhost:8000"})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Langflow"}),": ",(0,t.jsx)(n.a,{href:"http://localhost:7860",children:"http://localhost:7860"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Continue with ",(0,t.jsx)(n.a,{href:"#application-onboarding",children:"Application Onboarding"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["To stop ",(0,t.jsx)(n.code,{children:"docling serve"})," when you're done with your OpenRAG deployment, run:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv run python scripts/docling_ctl.py stop\n"})}),"\n",(0,t.jsx)(l.Ay,{}),"\n",(0,t.jsx)(n.h2,{id:"container-management-commands",children:"Container management commands"}),"\n",(0,t.jsxs)(n.p,{children:["Manage your OpenRAG containers with the following commands.\nThese commands are also available in the TUI's ",(0,t.jsx)(n.a,{href:"/get-started/tui#status",children:"Status menu"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"upgrade-containers",children:"Upgrade containers"}),"\n",(0,t.jsx)(n.p,{children:"Upgrade your containers to the latest version while preserving your data."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker compose pull\ndocker compose up -d --force-recreate\n"})}),"\n",(0,t.jsx)(n.h3,{id:"rebuild-containers-destructive",children:"Rebuild containers (destructive)"}),"\n",(0,t.jsxs)(n.p,{children:["Reset state by rebuilding all of your containers.\nYour OpenSearch and Langflow databases will be lost.\nDocuments stored in the ",(0,t.jsx)(n.code,{children:"./documents"})," directory will persist, since the directory is mounted as a volume in the OpenRAG backend container."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker compose up --build --force-recreate --remove-orphans\n"})}),"\n",(0,t.jsx)(n.h3,{id:"remove-all-containers-and-data-destructive",children:"Remove all containers and data (destructive)"}),"\n",(0,t.jsx)(n.p,{children:"Completely remove your OpenRAG installation and delete all data.\nThis deletes all of your data, including OpenSearch data, uploaded documents, and authentication."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"docker compose down --volumes --remove-orphans --rmi local\ndocker system prune -f\n"})})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>l,x:()=>a});var s=r(6540);const t={},o=s.createContext(t);function l(e){const n=s.useContext(o);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),s.createElement(o.Provider,{value:n},e.children)}},9365:(e,n,r)=>{r.d(n,{A:()=>l});r(6540);var s=r(4164);const t={tabItem:"tabItem_Ymn6"};var o=r(4848);function l({children:e,hidden:n,className:r}){return(0,o.jsx)("div",{role:"tabpanel",className:(0,s.A)(t.tabItem,r),hidden:n,children:e})}}}]); \ No newline at end of file diff --git a/assets/js/749371cc.cc93e3ef.js b/assets/js/749371cc.cc93e3ef.js deleted file mode 100644 index 3c4ad298..00000000 --- a/assets/js/749371cc.cc93e3ef.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkopenrag_docs=self.webpackChunkopenrag_docs||[]).push([[272],{887:(e,n,r)=>{r.d(n,{Ay:()=>c,RM:()=>l});var t=r(4848),s=r(8453),o=r(1470),a=r(9365);const l=[{value:"Application onboarding",id:"application-onboarding",level:2}];function i(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:"application-onboarding",children:"Application onboarding"}),"\n",(0,t.jsxs)(n.p,{children:["The first time you start OpenRAG, whether using the TUI or a ",(0,t.jsx)(n.code,{children:".env"})," file, you must complete application onboarding."]}),"\n",(0,t.jsxs)(n.p,{children:["Most values from onboarding can be changed later in the OpenRAG ",(0,t.jsx)(n.strong,{children:"Settings"})," page, but there are important restrictions."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.strong,{children:"language model provider"})," and ",(0,t.jsx)(n.strong,{children:"embeddings model provider"})," can only be selected at onboarding, and you must use the same provider for your language model and embedding model.\nTo change your provider selection later, you must completely reinstall OpenRAG."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.strong,{children:"language model"})," can be changed later in ",(0,t.jsx)(n.strong,{children:"Settings"}),", but the ",(0,t.jsx)(n.strong,{children:"embeddings model"})," cannot be changed later."]}),"\n",(0,t.jsxs)(o.A,{groupId:"Provider",children:[(0,t.jsx)(a.A,{value:"OpenAI",label:"OpenAI",default:!0,children:(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Enable ",(0,t.jsx)(n.strong,{children:"Get API key from environment variable"})," to automatically enter your key from the TUI-generated ",(0,t.jsx)(n.code,{children:".env"})," file."]}),"\n",(0,t.jsxs)(n.li,{children:["Under ",(0,t.jsx)(n.strong,{children:"Advanced settings"}),", select your ",(0,t.jsx)(n.strong,{children:"Embedding Model"})," and ",(0,t.jsx)(n.strong,{children:"Language Model"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["To load 2 sample PDFs, enable ",(0,t.jsx)(n.strong,{children:"Sample dataset"}),".\nThis is recommended, but not required."]}),"\n",(0,t.jsxs)(n.li,{children:["Click ",(0,t.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Continue with the ",(0,t.jsx)(n.a,{href:"/quickstart",children:"Quickstart"}),"."]}),"\n"]})}),(0,t.jsx)(a.A,{value:"IBM watsonx.ai",label:"IBM watsonx.ai",children:(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Complete the fields for ",(0,t.jsx)(n.strong,{children:"watsonx.ai API Endpoint"}),", ",(0,t.jsx)(n.strong,{children:"IBM API key"}),", and ",(0,t.jsx)(n.strong,{children:"IBM Project ID"}),".\nThese values are found in your IBM watsonx deployment."]}),"\n",(0,t.jsxs)(n.li,{children:["Under ",(0,t.jsx)(n.strong,{children:"Advanced settings"}),", select your ",(0,t.jsx)(n.strong,{children:"Embedding Model"})," and ",(0,t.jsx)(n.strong,{children:"Language Model"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["To load 2 sample PDFs, enable ",(0,t.jsx)(n.strong,{children:"Sample dataset"}),".\nThis is recommended, but not required."]}),"\n",(0,t.jsxs)(n.li,{children:["Click ",(0,t.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Continue with the ",(0,t.jsx)(n.a,{href:"/quickstart",children:"Quickstart"}),"."]}),"\n"]})}),(0,t.jsxs)(a.A,{value:"Ollama",label:"Ollama",children:[(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["Ollama is not included with OpenRAG. To install Ollama, see the ",(0,t.jsx)(n.a,{href:"https://docs.ollama.com/",children:"Ollama documentation"}),"."]})}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Enter your Ollama server's base URL address.\nThe default Ollama server address is ",(0,t.jsx)(n.code,{children:"http://localhost:11434"}),".\nOpenRAG automatically transforms ",(0,t.jsx)(n.code,{children:"localhost"})," to access services outside of the container, and sends a test connection to your Ollama server to confirm connectivity."]}),"\n",(0,t.jsxs)(n.li,{children:["Select the ",(0,t.jsx)(n.strong,{children:"Embedding Model"})," and ",(0,t.jsx)(n.strong,{children:"Language Model"})," your Ollama server is running.\nOpenRAG retrieves the available models from your Ollama server."]}),"\n",(0,t.jsxs)(n.li,{children:["To load 2 sample PDFs, enable ",(0,t.jsx)(n.strong,{children:"Sample dataset"}),".\nThis is recommended, but not required."]}),"\n",(0,t.jsxs)(n.li,{children:["Click ",(0,t.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Continue with the ",(0,t.jsx)(n.a,{href:"/quickstart",children:"Quickstart"}),"."]}),"\n"]})]})]})]})}function c(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(i,{...e})}):i(e)}},1470:(e,n,r)=>{r.d(n,{A:()=>k});var t=r(6540),s=r(4164),o=r(3104),a=r(6347),l=r(205),i=r(7485),c=r(1682),d=r(679);function h(e){return t.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function u(e){const{values:n,children:r}=e;return(0,t.useMemo)(()=>{const e=n??function(e){return h(e).map(({props:{value:e,label:n,attributes:r,default:t}})=>({value:e,label:n,attributes:r,default:t}))}(r);return function(e){const n=(0,c.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,r])}function p({value:e,tabValues:n}){return n.some(n=>n.value===e)}function m({queryString:e=!1,groupId:n}){const r=(0,a.W6)(),s=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,i.aZ)(s),(0,t.useCallback)(e=>{if(!s)return;const n=new URLSearchParams(r.location.search);n.set(s,e),r.replace({...r.location,search:n.toString()})},[s,r])]}function x(e){const{defaultValue:n,queryString:r=!1,groupId:s}=e,o=u(e),[a,i]=(0,t.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!p({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:o})),[c,h]=m({queryString:r,groupId:s}),[x,j]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,s]=(0,d.Dv)(n);return[r,(0,t.useCallback)(e=>{n&&s.set(e)},[n,s])]}({groupId:s}),g=(()=>{const e=c??x;return p({value:e,tabValues:o})?e:null})();(0,l.A)(()=>{g&&i(g)},[g]);return{selectedValue:a,selectValue:(0,t.useCallback)(e=>{if(!p({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),h(e),j(e)},[h,j,o]),tabValues:o}}var j=r(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var f=r(4848);function b({className:e,block:n,selectedValue:r,selectValue:t,tabValues:a}){const l=[],{blockElementScrollPositionUntilNextRender:i}=(0,o.a_)(),c=e=>{const n=e.currentTarget,s=l.indexOf(n),o=a[s].value;o!==r&&(i(n),t(o))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const r=l.indexOf(e.currentTarget)+1;n=l[r]??l[0];break}case"ArrowLeft":{const r=l.indexOf(e.currentTarget)-1;n=l[r]??l[l.length-1];break}}n?.focus()};return(0,f.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":n},e),children:a.map(({value:e,label:n,attributes:t})=>(0,f.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{l.push(e)},onKeyDown:d,onClick:c,...t,className:(0,s.A)("tabs__item",g.tabItem,t?.className,{"tabs__item--active":r===e}),children:n??e},e))})}function v({lazy:e,children:n,selectedValue:r}){const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=o.find(e=>e.props.value===r);return e?(0,t.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,f.jsx)("div",{className:"margin-top--md",children:o.map((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==r}))})}function y(e){const n=x(e);return(0,f.jsxs)("div",{className:(0,s.A)("tabs-container",g.tabList),children:[(0,f.jsx)(b,{...n,...e}),(0,f.jsx)(v,{...n,...e})]})}function k(e){const n=(0,j.A)();return(0,f.jsx)(y,{...e,children:h(e.children)},String(n))}},5788:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>l,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"get-started/docker","title":"Deploy with Docker","description":"There are two different Docker Compose files.","source":"@site/docs/get-started/docker.mdx","sourceDirName":"get-started","slug":"/get-started/docker","permalink":"/get-started/docker","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/get-started/docker.mdx","tags":[],"version":"current","frontMatter":{"title":"Deploy with Docker","slug":"/get-started/docker"},"sidebar":"tutorialSidebar","previous":{"title":"Install OpenRAG","permalink":"/install"},"next":{"title":"Quickstart","permalink":"/quickstart"}}');var s=r(4848),o=r(8453),a=r(887);const l={title:"Deploy with Docker",slug:"/get-started/docker"},i=void 0,c={},d=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Deploy OpenRAG with Docker Compose",id:"deploy-openrag-with-docker-compose",level:2},...a.RM,{value:"Container management commands",id:"container-management-commands",level:2},{value:"Upgrade containers",id:"upgrade-containers",level:3},{value:"Rebuild containers (destructive)",id:"rebuild-containers-destructive",level:3},{value:"Remove all containers and data (destructive)",id:"remove-all-containers-and-data-destructive",level:3}];function h(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"There are two different Docker Compose files.\nThey deploy the same applications and containers, but to different environments."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/blob/main/docker-compose.yml",children:(0,s.jsx)(n.code,{children:"docker-compose.yml"})})," is an OpenRAG deployment with GPU support for accelerated AI processing."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/blob/main/docker-compose-cpu.yml",children:(0,s.jsx)(n.code,{children:"docker-compose-cpu.yml"})})," is a CPU-only version of OpenRAG for systems without GPU support. Use this Docker compose file for environments where GPU drivers aren't available."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://www.python.org/downloads/release/python-3100/",children:"Python Version 3.10 to 3.13"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"https://docs.astral.sh/uv/getting-started/installation/",children:"uv"})}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://podman.io/docs/installation",children:"Podman"})," (recommended) or ",(0,s.jsx)(n.a,{href:"https://docs.docker.com/get-docker/",children:"Docker"})," installed"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"https://docs.docker.com/compose/install/",children:"Docker Compose"})," installed. If you're using Podman, use ",(0,s.jsx)(n.a,{href:"https://docs.podman.io/en/latest/markdown/podman-compose.1.html",children:"podman-compose"})," or alias Docker compose commands to Podman commands."]}),"\n",(0,s.jsxs)(n.li,{children:["Create an ",(0,s.jsx)(n.a,{href:"https://platform.openai.com/api-keys",children:"OpenAI API key"}),". This key is ",(0,s.jsx)(n.strong,{children:"required"})," to start OpenRAG, but you can choose a different model provider during ",(0,s.jsx)(n.a,{href:"#application-onboarding",children:"Application Onboarding"}),"."]}),"\n",(0,s.jsx)(n.li,{children:"Optional: GPU support requires an NVIDIA GPU with CUDA support and compatible NVIDIA drivers installed on the OpenRAG host machine. If you don't have GPU capabilities, OpenRAG provides an alternate CPU-only deployment."}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"deploy-openrag-with-docker-compose",children:"Deploy OpenRAG with Docker Compose"}),"\n",(0,s.jsx)(n.p,{children:"To install OpenRAG with Docker Compose, do the following:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Clone the OpenRAG repository."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/langflow-ai/openrag.git\ncd openrag\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Copy the example ",(0,s.jsx)(n.code,{children:".env"})," file included in the repository root.\nThe example file includes all environment variables with comments to guide you in finding and setting their values."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"cp .env.example .env\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Alternatively, create a new ",(0,s.jsx)(n.code,{children:".env"})," file in the repository root."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"touch .env\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Set environment variables. The Docker Compose files will be populated with values from your ",(0,s.jsx)(n.code,{children:".env"}),".\nThe following values are ",(0,s.jsx)(n.strong,{children:"required"})," to be set:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"OPENSEARCH_PASSWORD=your_secure_password\nOPENAI_API_KEY=your_openai_api_key\nLANGFLOW_SUPERUSER=admin\nLANGFLOW_SUPERUSER_PASSWORD=your_langflow_password\nLANGFLOW_SECRET_KEY=your_secret_key\n"})}),"\n",(0,s.jsxs)(n.p,{children:["For more information on configuring OpenRAG with environment variables, see ",(0,s.jsx)(n.a,{href:"/reference/configuration",children:"Environment variables"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Deploy OpenRAG with Docker Compose based on your deployment type."}),"\n",(0,s.jsx)(n.p,{children:"For GPU-enabled systems, run the following command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker compose up -d\n"})}),"\n",(0,s.jsx)(n.p,{children:"For CPU-only systems, run the following command:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker compose -f docker-compose-cpu.yml up -d\n"})}),"\n",(0,s.jsx)(n.p,{children:"The OpenRAG Docker Compose file starts five containers:"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Container Name"}),(0,s.jsx)(n.th,{children:"Default Address"}),(0,s.jsx)(n.th,{children:"Purpose"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"OpenRAG Backend"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"http://localhost:8000",children:"http://localhost:8000"})}),(0,s.jsx)(n.td,{children:"FastAPI server and core functionality."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"OpenRAG Frontend"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"http://localhost:3000",children:"http://localhost:3000"})}),(0,s.jsx)(n.td,{children:"React web interface for users."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Langflow"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"http://localhost:7860",children:"http://localhost:7860"})}),(0,s.jsx)(n.td,{children:"AI workflow engine and flow management."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"OpenSearch"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"http://localhost:9200",children:"http://localhost:9200"})}),(0,s.jsx)(n.td,{children:"Vector database for document storage."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"OpenSearch Dashboards"}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.a,{href:"http://localhost:5601",children:"http://localhost:5601"})}),(0,s.jsx)(n.td,{children:"Database administration interface."})]})]})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Verify installation by confirming all services are running."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker compose ps\n"})}),"\n",(0,s.jsx)(n.p,{children:"You can now access the application at:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Frontend"}),": ",(0,s.jsx)(n.a,{href:"http://localhost:3000",children:"http://localhost:3000"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Backend API"}),": ",(0,s.jsx)(n.a,{href:"http://localhost:8000",children:"http://localhost:8000"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Langflow"}),": ",(0,s.jsx)(n.a,{href:"http://localhost:7860",children:"http://localhost:7860"})]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Continue with ",(0,s.jsx)(n.a,{href:"#application-onboarding",children:"Application Onboarding"}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(a.Ay,{}),"\n",(0,s.jsx)(n.h2,{id:"container-management-commands",children:"Container management commands"}),"\n",(0,s.jsxs)(n.p,{children:["Manage your OpenRAG containers with the following commands.\nThese commands are also available in the TUI's ",(0,s.jsx)(n.a,{href:"/get-started/tui#status",children:"Status menu"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"upgrade-containers",children:"Upgrade containers"}),"\n",(0,s.jsx)(n.p,{children:"Upgrade your containers to the latest version while preserving your data."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker compose pull\ndocker compose up -d --force-recreate\n"})}),"\n",(0,s.jsx)(n.h3,{id:"rebuild-containers-destructive",children:"Rebuild containers (destructive)"}),"\n",(0,s.jsxs)(n.p,{children:["Reset state by rebuilding all of your containers.\nYour OpenSearch and Langflow databases will be lost.\nDocuments stored in the ",(0,s.jsx)(n.code,{children:"./documents"})," directory will persist, since the directory is mounted as a volume in the OpenRAG backend container."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker compose up --build --force-recreate --remove-orphans\n"})}),"\n",(0,s.jsx)(n.h3,{id:"remove-all-containers-and-data-destructive",children:"Remove all containers and data (destructive)"}),"\n",(0,s.jsx)(n.p,{children:"Completely remove your OpenRAG installation and delete all data.\nThis deletes all of your data, including OpenSearch data, uploaded documents, and authentication."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker compose down --volumes --remove-orphans --rmi local\ndocker system prune -f\n"})})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>a,x:()=>l});var t=r(6540);const s={},o=t.createContext(s);function a(e){const n=t.useContext(o);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),t.createElement(o.Provider,{value:n},e.children)}},9365:(e,n,r)=>{r.d(n,{A:()=>a});r(6540);var t=r(4164);const s={tabItem:"tabItem_Ymn6"};var o=r(4848);function a({children:e,hidden:n,className:r}){return(0,o.jsx)("div",{role:"tabpanel",className:(0,t.A)(s.tabItem,r),hidden:n,children:e})}}}]); \ No newline at end of file diff --git a/assets/js/ca2c3c0c.295b1c55.js b/assets/js/ca2c3c0c.7eb785b4.js similarity index 98% rename from assets/js/ca2c3c0c.295b1c55.js rename to assets/js/ca2c3c0c.7eb785b4.js index bf77dcc8..cbed58f7 100644 --- a/assets/js/ca2c3c0c.295b1c55.js +++ b/assets/js/ca2c3c0c.7eb785b4.js @@ -1 +1 @@ -"use strict";(self.webpackChunkopenrag_docs=self.webpackChunkopenrag_docs||[]).push([[919],{3782:(e,n,s)=>{s.d(n,{Ay:()=>l,RM:()=>r});var o=s(4848),t=s(8453),i=s(9179);const r=[];function c(e){const n={a:"a",p:"p",strong:"strong",...(0,t.R)(),...e.components};return(0,o.jsxs)(n.p,{children:["All flows included with OpenRAG are designed to be modular, performant, and provider-agnostic.\nTo modify a flow, click ",(0,o.jsx)(i.A,{name:"Settings2","aria-hidden":"true"})," ",(0,o.jsx)(n.strong,{children:"Settings"}),", and click ",(0,o.jsx)(n.strong,{children:"Edit in Langflow"}),".\nOpenRAG's visual editor is based on the ",(0,o.jsx)(n.a,{href:"https://docs.langflow.org/concepts-overview",children:"Langflow visual editor"}),", so you can edit your flows to match your specific use case."]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},7125:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>g,frontMatter:()=>c,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"core-components/ingestion","title":"Docling Ingestion","description":"OpenRAG uses Docling for its document ingestion pipeline.","source":"@site/docs/core-components/ingestion.mdx","sourceDirName":"core-components","slug":"/ingestion","permalink":"/ingestion","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/core-components/ingestion.mdx","tags":[],"version":"current","frontMatter":{"title":"Docling Ingestion","slug":"/ingestion"},"sidebar":"tutorialSidebar","previous":{"title":"OpenSearch Knowledge","permalink":"/knowledge"},"next":{"title":"Environment variables","permalink":"/reference/configuration"}}');var t=s(4848),i=s(8453),r=(s(9179),s(1470),s(9365),s(3782));const c={title:"Docling Ingestion",slug:"/ingestion"},l=void 0,a={},d=[{value:"Docling ingestion settings",id:"docling-ingestion-settings",level:2},{value:"Use OpenRAG default ingestion instead of Docling serve",id:"use-openrag-default-ingestion-instead-of-docling-serve",level:2},{value:"Knowledge ingestion flows",id:"knowledge-ingestion-flows",level:2},...r.RM,{value:"OpenSearch URL Ingestion flow",id:"url-flow",level:3}];function h(e){const n={a:"a",br:"br",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["OpenRAG uses ",(0,t.jsx)(n.a,{href:"https://docling-project.github.io/docling/",children:"Docling"})," for its document ingestion pipeline.\nMore specifically, OpenRAG uses ",(0,t.jsx)(n.a,{href:"https://github.com/docling-project/docling-serve",children:"Docling Serve"}),", which starts a ",(0,t.jsx)(n.code,{children:"docling-serve"})," process on your local machine and runs Docling ingestion through an API service."]}),"\n",(0,t.jsxs)(n.p,{children:["Docling ingests documents from your local machine or OAuth connectors, splits them into chunks, and stores them as separate, structured documents in the OpenSearch ",(0,t.jsx)(n.code,{children:"documents"})," index."]}),"\n",(0,t.jsx)(n.p,{children:"OpenRAG chose Docling for its support for a wide variety of file formats, high performance, and advanced understanding of tables and images."}),"\n",(0,t.jsx)(n.h2,{id:"docling-ingestion-settings",children:"Docling ingestion settings"}),"\n",(0,t.jsx)(n.p,{children:"These settings configure the Docling ingestion parameters."}),"\n",(0,t.jsxs)(n.p,{children:["OpenRAG will warn you if ",(0,t.jsx)(n.code,{children:"docling-serve"})," is not running.\nTo start or stop ",(0,t.jsx)(n.code,{children:"docling-serve"})," or any other native services, in the TUI main menu, click ",(0,t.jsx)(n.strong,{children:"Start Native Services"})," or ",(0,t.jsx)(n.strong,{children:"Stop Native Services"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Embedding model"})," determines which AI model is used to create vector embeddings. The default is ",(0,t.jsx)(n.code,{children:"text-embedding-3-small"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Chunk size"})," determines how large each text chunk is in number of characters.\nLarger chunks yield more context per chunk, but may include irrelevant information. Smaller chunks yield more precise semantic search, but may lack context.\nThe default value of ",(0,t.jsx)(n.code,{children:"1000"})," characters provides a good starting point that balances these considerations."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Chunk overlap"})," controls the number of characters that overlap over chunk boundaries.\nUse larger overlap values for documents where context is most important, and use smaller overlap values for simpler documents, or when optimization is most important.\nThe default value of 200 characters of overlap with a chunk size of 1000 (20% overlap) is suitable for general use cases. Decrease the overlap to 10% for a more efficient pipeline, or increase to 40% for more complex documents."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"OCR"})," enables or disabled OCR processing when extracting text from images and scanned documents.\nOCR is disabled by default. This setting is best suited for processing text-based documents as quickly as possible with Docling's ",(0,t.jsx)(n.a,{href:"https://docling-project.github.io/docling/reference/document_converter/",children:(0,t.jsx)(n.code,{children:"DocumentConverter"})}),". Images are ignored and not processed."]}),"\n",(0,t.jsx)(n.p,{children:"Enable OCR when you are processing documents containing images with text that requires extraction, or for scanned documents. Enabling OCR can slow ingestion performance."}),"\n",(0,t.jsxs)(n.p,{children:["If OpenRAG detects that the local machine is running on macOS, OpenRAG uses the ",(0,t.jsx)(n.a,{href:"https://www.piwheels.org/project/ocrmac/",children:"ocrmac"})," OCR engine. Other platforms use ",(0,t.jsx)(n.a,{href:"https://www.jaided.ai/easyocr/",children:"easyocr"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Picture descriptions"})," adds image descriptions generated by the ",(0,t.jsx)(n.a,{href:"https://huggingface.co/HuggingFaceTB/SmolVLM-Instruct",children:"SmolVLM-256M-Instruct"})," model to OCR processing. Enabling picture descriptions can slow ingestion performance."]}),"\n",(0,t.jsx)(n.h2,{id:"use-openrag-default-ingestion-instead-of-docling-serve",children:"Use OpenRAG default ingestion instead of Docling serve"}),"\n",(0,t.jsxs)(n.p,{children:["If you want to use OpenRAG's built-in pipeline instead of Docling serve, set ",(0,t.jsx)(n.code,{children:"DISABLE_INGEST_WITH_LANGFLOW=true"})," in ",(0,t.jsx)(n.a,{href:"/reference/configuration#document-processing",children:"Environment variables"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"The built-in pipeline still uses the Docling processor, but uses it directly without the Docling Serve API."}),"\n",(0,t.jsxs)(n.p,{children:["For more information, see ",(0,t.jsxs)(n.a,{href:"https://github.com/langflow-ai/openrag/blob/main/src/models/processors.py#L58",children:[(0,t.jsx)(n.code,{children:"processors.py"})," in the OpenRAG repository"]}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"knowledge-ingestion-flows",children:"Knowledge ingestion flows"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://docs.langflow.org/concepts-overview",children:"Flows"})," in Langflow are functional representations of application workflows, with multiple ",(0,t.jsx)(n.a,{href:"https://docs.langflow.org/concepts-components",children:"component"})," nodes connected as single steps in a workflow."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.strong,{children:"OpenSearch Ingestion"})," flow is the default knowledge ingestion flow in OpenRAG: when you ",(0,t.jsx)(n.strong,{children:"Add Knowledge"})," in OpenRAG, you run the OpenSearch Ingestion flow in the background. The flow ingests documents using ",(0,t.jsx)(n.strong,{children:"Docling Serve"})," to import and process documents."]}),"\n",(0,t.jsx)(n.p,{children:"This flow contains ten components connected together to process and store documents in your knowledge base."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["The ",(0,t.jsxs)(n.a,{href:"https://docs.langflow.org/bundles-docling",children:[(0,t.jsx)(n.strong,{children:"Docling Serve"})," component"]})," processes input documents by connecting to your instance of Docling Serve."]}),"\n",(0,t.jsxs)(n.li,{children:["The ",(0,t.jsxs)(n.a,{href:"https://docs.langflow.org/components-docling",children:[(0,t.jsx)(n.strong,{children:"Export DoclingDocument"})," component"]})," exports the processed DoclingDocument to markdown format with image export mode set to placeholder. This conversion makes the structured document data into a standardized format for further processing."]}),"\n",(0,t.jsxs)(n.li,{children:["Three ",(0,t.jsxs)(n.a,{href:"https://docs.langflow.org/components-processing#dataframe-operations",children:[(0,t.jsx)(n.strong,{children:"DataFrame Operations"})," components"]})," sequentially add metadata columns to the document data of ",(0,t.jsx)(n.code,{children:"filename"}),", ",(0,t.jsx)(n.code,{children:"file_size"}),", and ",(0,t.jsx)(n.code,{children:"mimetype"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["The ",(0,t.jsxs)(n.a,{href:"https://docs.langflow.org/components-processing#split-text",children:[(0,t.jsx)(n.strong,{children:"Split Text"})," component"]})," splits the processed text into chunks with a chunk size of 1000 characters and an overlap of 200 characters."]}),"\n",(0,t.jsxs)(n.li,{children:["Four ",(0,t.jsx)(n.strong,{children:"Secret Input"})," components provide secure access to configuration variables: ",(0,t.jsx)(n.code,{children:"CONNECTOR_TYPE"}),", ",(0,t.jsx)(n.code,{children:"OWNER"}),", ",(0,t.jsx)(n.code,{children:"OWNER_EMAIL"}),", and ",(0,t.jsx)(n.code,{children:"OWNER_NAME"}),". These are runtime variables populated from OAuth login."]}),"\n",(0,t.jsxs)(n.li,{children:["The ",(0,t.jsx)(n.strong,{children:"Create Data"})," component combines the secret inputs into a structured data object that will be associated with the document embeddings."]}),"\n",(0,t.jsxs)(n.li,{children:["The ",(0,t.jsxs)(n.a,{href:"https://docs.langflow.org/components-embedding-models",children:[(0,t.jsx)(n.strong,{children:"Embedding Model"})," component"]})," generates vector embeddings using OpenAI's ",(0,t.jsx)(n.code,{children:"text-embedding-3-small"})," model. The embedding model is selected at [Application onboarding] and cannot be changed."]}),"\n",(0,t.jsxs)(n.li,{children:["The ",(0,t.jsxs)(n.a,{href:"https://docs.langflow.org/bundles-elastic#opensearch",children:[(0,t.jsx)(n.strong,{children:"OpenSearch"})," component"]})," stores the processed documents and their embeddings in the ",(0,t.jsx)(n.code,{children:"documents"})," index at ",(0,t.jsx)(n.code,{children:"https://opensearch:9200"}),". By default, the component is authenticated with a JWT token, but you can also select ",(0,t.jsx)(n.code,{children:"basic"})," auth mode, and enter your OpenSearch admin username and password."]}),"\n"]}),"\n",(0,t.jsx)(r.Ay,{}),"\n",(0,t.jsx)(n.h3,{id:"url-flow",children:"OpenSearch URL Ingestion flow"}),"\n",(0,t.jsxs)(n.p,{children:["An additional knowledge ingestion flow is included in OpenRAG, where it is used as an MCP tool by the ",(0,t.jsx)(n.a,{href:"/agents#flow",children:(0,t.jsx)(n.strong,{children:"Open Search Agent flow"})}),".\nThe agent calls this component to fetch web content, and the results are ingested into OpenSearch."]}),"\n",(0,t.jsxs)(n.p,{children:["For more on using MCP clients in Langflow, see ",(0,t.jsx)(n.a,{href:"https://docs.langflow.org/mcp-client",children:"MCP clients"}),".",(0,t.jsx)(n.br,{}),"\n","To connect additional MCP servers to the MCP client, see ",(0,t.jsx)(n.a,{href:"https://docs.langflow.org/mcp-tutorial",children:"Connect to MCP servers from your application"}),"."]})]})}function g(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},9179:(e,n,s)=>{s.d(n,{A:()=>i});s(6540);var o=s(4827),t=s(4848);function i({name:e,...n}){const s=o[e];return s?(0,t.jsx)(s,{...n}):null}}}]); \ No newline at end of file +"use strict";(self.webpackChunkopenrag_docs=self.webpackChunkopenrag_docs||[]).push([[919],{3782:(e,n,s)=>{s.d(n,{Ay:()=>l,RM:()=>r});var o=s(4848),t=s(8453),i=s(9179);const r=[];function c(e){const n={a:"a",p:"p",strong:"strong",...(0,t.R)(),...e.components};return(0,o.jsxs)(n.p,{children:["All flows included with OpenRAG are designed to be modular, performant, and provider-agnostic.\nTo modify a flow, click ",(0,o.jsx)(i.A,{name:"Settings2","aria-hidden":"true"})," ",(0,o.jsx)(n.strong,{children:"Settings"}),", and click ",(0,o.jsx)(n.strong,{children:"Edit in Langflow"}),".\nOpenRAG's visual editor is based on the ",(0,o.jsx)(n.a,{href:"https://docs.langflow.org/concepts-overview",children:"Langflow visual editor"}),", so you can edit your flows to match your specific use case."]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},7125:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>g,frontMatter:()=>c,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"core-components/ingestion","title":"Docling Ingestion","description":"OpenRAG uses Docling for its document ingestion pipeline.","source":"@site/docs/core-components/ingestion.mdx","sourceDirName":"core-components","slug":"/ingestion","permalink":"/ingestion","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/core-components/ingestion.mdx","tags":[],"version":"current","frontMatter":{"title":"Docling Ingestion","slug":"/ingestion"},"sidebar":"tutorialSidebar","previous":{"title":"OpenSearch Knowledge","permalink":"/knowledge"},"next":{"title":"Environment variables","permalink":"/reference/configuration"}}');var t=s(4848),i=s(8453),r=(s(9179),s(1470),s(9365),s(3782));const c={title:"Docling Ingestion",slug:"/ingestion"},l=void 0,a={},d=[{value:"Docling ingestion settings",id:"docling-ingestion-settings",level:2},{value:"Use OpenRAG default ingestion instead of Docling serve",id:"use-openrag-default-ingestion-instead-of-docling-serve",level:2},{value:"Knowledge ingestion flows",id:"knowledge-ingestion-flows",level:2},...r.RM,{value:"OpenSearch URL Ingestion flow",id:"url-flow",level:3}];function h(e){const n={a:"a",br:"br",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["OpenRAG uses ",(0,t.jsx)(n.a,{href:"https://docling-project.github.io/docling/",children:"Docling"})," for its document ingestion pipeline.\nMore specifically, OpenRAG uses ",(0,t.jsx)(n.a,{href:"https://github.com/docling-project/docling-serve",children:"Docling Serve"}),", which starts a ",(0,t.jsx)(n.code,{children:"docling serve"})," process on your local machine and runs Docling ingestion through an API service."]}),"\n",(0,t.jsxs)(n.p,{children:["Docling ingests documents from your local machine or OAuth connectors, splits them into chunks, and stores them as separate, structured documents in the OpenSearch ",(0,t.jsx)(n.code,{children:"documents"})," index."]}),"\n",(0,t.jsx)(n.p,{children:"OpenRAG chose Docling for its support for a wide variety of file formats, high performance, and advanced understanding of tables and images."}),"\n",(0,t.jsx)(n.h2,{id:"docling-ingestion-settings",children:"Docling ingestion settings"}),"\n",(0,t.jsx)(n.p,{children:"These settings configure the Docling ingestion parameters."}),"\n",(0,t.jsxs)(n.p,{children:["OpenRAG will warn you if ",(0,t.jsx)(n.code,{children:"docling serve"})," is not running.\nTo start or stop ",(0,t.jsx)(n.code,{children:"docling serve"})," or any other native services, in the TUI main menu, click ",(0,t.jsx)(n.strong,{children:"Start Native Services"})," or ",(0,t.jsx)(n.strong,{children:"Stop Native Services"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Embedding model"})," determines which AI model is used to create vector embeddings. The default is ",(0,t.jsx)(n.code,{children:"text-embedding-3-small"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Chunk size"})," determines how large each text chunk is in number of characters.\nLarger chunks yield more context per chunk, but may include irrelevant information. Smaller chunks yield more precise semantic search, but may lack context.\nThe default value of ",(0,t.jsx)(n.code,{children:"1000"})," characters provides a good starting point that balances these considerations."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Chunk overlap"})," controls the number of characters that overlap over chunk boundaries.\nUse larger overlap values for documents where context is most important, and use smaller overlap values for simpler documents, or when optimization is most important.\nThe default value of 200 characters of overlap with a chunk size of 1000 (20% overlap) is suitable for general use cases. Decrease the overlap to 10% for a more efficient pipeline, or increase to 40% for more complex documents."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"OCR"})," enables or disabled OCR processing when extracting text from images and scanned documents.\nOCR is disabled by default. This setting is best suited for processing text-based documents as quickly as possible with Docling's ",(0,t.jsx)(n.a,{href:"https://docling-project.github.io/docling/reference/document_converter/",children:(0,t.jsx)(n.code,{children:"DocumentConverter"})}),". Images are ignored and not processed."]}),"\n",(0,t.jsx)(n.p,{children:"Enable OCR when you are processing documents containing images with text that requires extraction, or for scanned documents. Enabling OCR can slow ingestion performance."}),"\n",(0,t.jsxs)(n.p,{children:["If OpenRAG detects that the local machine is running on macOS, OpenRAG uses the ",(0,t.jsx)(n.a,{href:"https://www.piwheels.org/project/ocrmac/",children:"ocrmac"})," OCR engine. Other platforms use ",(0,t.jsx)(n.a,{href:"https://www.jaided.ai/easyocr/",children:"easyocr"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Picture descriptions"})," adds image descriptions generated by the ",(0,t.jsx)(n.a,{href:"https://huggingface.co/HuggingFaceTB/SmolVLM-Instruct",children:"SmolVLM-256M-Instruct"})," model to OCR processing. Enabling picture descriptions can slow ingestion performance."]}),"\n",(0,t.jsx)(n.h2,{id:"use-openrag-default-ingestion-instead-of-docling-serve",children:"Use OpenRAG default ingestion instead of Docling serve"}),"\n",(0,t.jsxs)(n.p,{children:["If you want to use OpenRAG's built-in pipeline instead of Docling serve, set ",(0,t.jsx)(n.code,{children:"DISABLE_INGEST_WITH_LANGFLOW=true"})," in ",(0,t.jsx)(n.a,{href:"/reference/configuration#document-processing",children:"Environment variables"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"The built-in pipeline still uses the Docling processor, but uses it directly without the Docling Serve API."}),"\n",(0,t.jsxs)(n.p,{children:["For more information, see ",(0,t.jsxs)(n.a,{href:"https://github.com/langflow-ai/openrag/blob/main/src/models/processors.py#L58",children:[(0,t.jsx)(n.code,{children:"processors.py"})," in the OpenRAG repository"]}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"knowledge-ingestion-flows",children:"Knowledge ingestion flows"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://docs.langflow.org/concepts-overview",children:"Flows"})," in Langflow are functional representations of application workflows, with multiple ",(0,t.jsx)(n.a,{href:"https://docs.langflow.org/concepts-components",children:"component"})," nodes connected as single steps in a workflow."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.strong,{children:"OpenSearch Ingestion"})," flow is the default knowledge ingestion flow in OpenRAG: when you ",(0,t.jsx)(n.strong,{children:"Add Knowledge"})," in OpenRAG, you run the OpenSearch Ingestion flow in the background. The flow ingests documents using ",(0,t.jsx)(n.strong,{children:"Docling Serve"})," to import and process documents."]}),"\n",(0,t.jsx)(n.p,{children:"This flow contains ten components connected together to process and store documents in your knowledge base."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["The ",(0,t.jsxs)(n.a,{href:"https://docs.langflow.org/bundles-docling",children:[(0,t.jsx)(n.strong,{children:"Docling Serve"})," component"]})," processes input documents by connecting to your instance of Docling Serve."]}),"\n",(0,t.jsxs)(n.li,{children:["The ",(0,t.jsxs)(n.a,{href:"https://docs.langflow.org/components-docling",children:[(0,t.jsx)(n.strong,{children:"Export DoclingDocument"})," component"]})," exports the processed DoclingDocument to markdown format with image export mode set to placeholder. This conversion makes the structured document data into a standardized format for further processing."]}),"\n",(0,t.jsxs)(n.li,{children:["Three ",(0,t.jsxs)(n.a,{href:"https://docs.langflow.org/components-processing#dataframe-operations",children:[(0,t.jsx)(n.strong,{children:"DataFrame Operations"})," components"]})," sequentially add metadata columns to the document data of ",(0,t.jsx)(n.code,{children:"filename"}),", ",(0,t.jsx)(n.code,{children:"file_size"}),", and ",(0,t.jsx)(n.code,{children:"mimetype"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["The ",(0,t.jsxs)(n.a,{href:"https://docs.langflow.org/components-processing#split-text",children:[(0,t.jsx)(n.strong,{children:"Split Text"})," component"]})," splits the processed text into chunks with a chunk size of 1000 characters and an overlap of 200 characters."]}),"\n",(0,t.jsxs)(n.li,{children:["Four ",(0,t.jsx)(n.strong,{children:"Secret Input"})," components provide secure access to configuration variables: ",(0,t.jsx)(n.code,{children:"CONNECTOR_TYPE"}),", ",(0,t.jsx)(n.code,{children:"OWNER"}),", ",(0,t.jsx)(n.code,{children:"OWNER_EMAIL"}),", and ",(0,t.jsx)(n.code,{children:"OWNER_NAME"}),". These are runtime variables populated from OAuth login."]}),"\n",(0,t.jsxs)(n.li,{children:["The ",(0,t.jsx)(n.strong,{children:"Create Data"})," component combines the secret inputs into a structured data object that will be associated with the document embeddings."]}),"\n",(0,t.jsxs)(n.li,{children:["The ",(0,t.jsxs)(n.a,{href:"https://docs.langflow.org/components-embedding-models",children:[(0,t.jsx)(n.strong,{children:"Embedding Model"})," component"]})," generates vector embeddings using OpenAI's ",(0,t.jsx)(n.code,{children:"text-embedding-3-small"})," model. The embedding model is selected at [Application onboarding] and cannot be changed."]}),"\n",(0,t.jsxs)(n.li,{children:["The ",(0,t.jsxs)(n.a,{href:"https://docs.langflow.org/bundles-elastic#opensearch",children:[(0,t.jsx)(n.strong,{children:"OpenSearch"})," component"]})," stores the processed documents and their embeddings in the ",(0,t.jsx)(n.code,{children:"documents"})," index at ",(0,t.jsx)(n.code,{children:"https://opensearch:9200"}),". By default, the component is authenticated with a JWT token, but you can also select ",(0,t.jsx)(n.code,{children:"basic"})," auth mode, and enter your OpenSearch admin username and password."]}),"\n"]}),"\n",(0,t.jsx)(r.Ay,{}),"\n",(0,t.jsx)(n.h3,{id:"url-flow",children:"OpenSearch URL Ingestion flow"}),"\n",(0,t.jsxs)(n.p,{children:["An additional knowledge ingestion flow is included in OpenRAG, where it is used as an MCP tool by the ",(0,t.jsx)(n.a,{href:"/agents#flow",children:(0,t.jsx)(n.strong,{children:"Open Search Agent flow"})}),".\nThe agent calls this component to fetch web content, and the results are ingested into OpenSearch."]}),"\n",(0,t.jsxs)(n.p,{children:["For more on using MCP clients in Langflow, see ",(0,t.jsx)(n.a,{href:"https://docs.langflow.org/mcp-client",children:"MCP clients"}),".",(0,t.jsx)(n.br,{}),"\n","To connect additional MCP servers to the MCP client, see ",(0,t.jsx)(n.a,{href:"https://docs.langflow.org/mcp-tutorial",children:"Connect to MCP servers from your application"}),"."]})]})}function g(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},9179:(e,n,s)=>{s.d(n,{A:()=>i});s(6540);var o=s(4827),t=s(4848);function i({name:e,...n}){const s=o[e];return s?(0,t.jsx)(s,{...n}):null}}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.51333837.js b/assets/js/runtime~main.c8893f6b.js similarity index 89% rename from assets/js/runtime~main.51333837.js rename to assets/js/runtime~main.c8893f6b.js index 7e51cd55..ae3fc5c1 100644 --- a/assets/js/runtime~main.51333837.js +++ b/assets/js/runtime~main.c8893f6b.js @@ -1 +1 @@ -(()=>{"use strict";var e,t,r,a,o,n={},f={};function c(e){var t=f[e];if(void 0!==t)return t.exports;var r=f[e]={id:e,loaded:!1,exports:{}};return n[e].call(r.exports,r,r.exports,c),r.loaded=!0,r.exports}c.m=n,c.c=f,e=[],c.O=(t,r,a,o)=>{if(!r){var n=1/0;for(u=0;u=o)&&Object.keys(c.O).every(e=>c.O[e](r[i]))?r.splice(i--,1):(f=!1,o0&&e[u-1][2]>o;u--)e[u]=e[u-1];e[u]=[r,a,o]},c.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return c.d(t,{a:t}),t},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,c.t=function(e,a){if(1&a&&(e=this(e)),8&a)return e;if("object"==typeof e&&e){if(4&a&&e.__esModule)return e;if(16&a&&"function"==typeof e.then)return e}var o=Object.create(null);c.r(o);var n={};t=t||[null,r({}),r([]),r(r)];for(var f=2&a&&e;("object"==typeof f||"function"==typeof f)&&!~t.indexOf(f);f=r(f))Object.getOwnPropertyNames(f).forEach(t=>n[t]=()=>e[t]);return n.default=()=>e,c.d(o,n),o},c.d=(e,t)=>{for(var r in t)c.o(t,r)&&!c.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},c.f={},c.e=e=>Promise.all(Object.keys(c.f).reduce((t,r)=>(c.f[r](e,t),t),[])),c.u=e=>"assets/js/"+({26:"c8078f0a",48:"a94703ab",98:"a7bd4aaa",172:"e633a5ea",272:"749371cc",401:"17896441",532:"33362219",567:"22dd74f7",571:"0ba6a408",647:"5e95c892",668:"eb5b356a",717:"af920ffe",742:"aba21aa0",750:"d0314b07",919:"ca2c3c0c",961:"21afe7ac"}[e]||e)+"."+{26:"95121b15",48:"37079d87",98:"5b195d0f",172:"cbe02eaa",237:"4f1a14e7",272:"cc93e3ef",401:"3584c216",532:"d86f431d",567:"5a552cfa",571:"21d91e2f",647:"a118483c",668:"516bb081",717:"36fc9a9a",742:"ff196c6d",750:"81b2f228",758:"382c453d",919:"295b1c55",961:"f0feb7d8"}[e]+".js",c.miniCssF=e=>{},c.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),c.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a={},o="openrag-docs:",c.l=(e,t,r,n)=>{if(a[e])a[e].push(t);else{var f,i;if(void 0!==r)for(var d=document.getElementsByTagName("script"),u=0;u{f.onerror=f.onload=null,clearTimeout(b);var o=a[e];if(delete a[e],f.parentNode&&f.parentNode.removeChild(f),o&&o.forEach(e=>e(r)),t)return t(r)},b=setTimeout(s.bind(null,void 0,{type:"timeout",target:f}),12e4);f.onerror=s.bind(null,f.onerror),f.onload=s.bind(null,f.onload),i&&document.head.appendChild(f)}},c.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},c.p="/",c.gca=function(e){return e={17896441:"401",33362219:"532",c8078f0a:"26",a94703ab:"48",a7bd4aaa:"98",e633a5ea:"172","749371cc":"272","22dd74f7":"567","0ba6a408":"571","5e95c892":"647",eb5b356a:"668",af920ffe:"717",aba21aa0:"742",d0314b07:"750",ca2c3c0c:"919","21afe7ac":"961"}[e]||e,c.p+c.u(e)},(()=>{var e={354:0,869:0};c.f.j=(t,r)=>{var a=c.o(e,t)?e[t]:void 0;if(0!==a)if(a)r.push(a[2]);else if(/^(354|869)$/.test(t))e[t]=0;else{var o=new Promise((r,o)=>a=e[t]=[r,o]);r.push(a[2]=o);var n=c.p+c.u(t),f=new Error;c.l(n,r=>{if(c.o(e,t)&&(0!==(a=e[t])&&(e[t]=void 0),a)){var o=r&&("load"===r.type?"missing":r.type),n=r&&r.target&&r.target.src;f.message="Loading chunk "+t+" failed.\n("+o+": "+n+")",f.name="ChunkLoadError",f.type=o,f.request=n,a[1](f)}},"chunk-"+t,t)}},c.O.j=t=>0===e[t];var t=(t,r)=>{var a,o,n=r[0],f=r[1],i=r[2],d=0;if(n.some(t=>0!==e[t])){for(a in f)c.o(f,a)&&(c.m[a]=f[a]);if(i)var u=i(c)}for(t&&t(r);d{"use strict";var e,t,r,a,o,n={},f={};function c(e){var t=f[e];if(void 0!==t)return t.exports;var r=f[e]={id:e,loaded:!1,exports:{}};return n[e].call(r.exports,r,r.exports,c),r.loaded=!0,r.exports}c.m=n,c.c=f,e=[],c.O=(t,r,a,o)=>{if(!r){var n=1/0;for(u=0;u=o)&&Object.keys(c.O).every(e=>c.O[e](r[i]))?r.splice(i--,1):(f=!1,o0&&e[u-1][2]>o;u--)e[u]=e[u-1];e[u]=[r,a,o]},c.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return c.d(t,{a:t}),t},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,c.t=function(e,a){if(1&a&&(e=this(e)),8&a)return e;if("object"==typeof e&&e){if(4&a&&e.__esModule)return e;if(16&a&&"function"==typeof e.then)return e}var o=Object.create(null);c.r(o);var n={};t=t||[null,r({}),r([]),r(r)];for(var f=2&a&&e;("object"==typeof f||"function"==typeof f)&&!~t.indexOf(f);f=r(f))Object.getOwnPropertyNames(f).forEach(t=>n[t]=()=>e[t]);return n.default=()=>e,c.d(o,n),o},c.d=(e,t)=>{for(var r in t)c.o(t,r)&&!c.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},c.f={},c.e=e=>Promise.all(Object.keys(c.f).reduce((t,r)=>(c.f[r](e,t),t),[])),c.u=e=>"assets/js/"+({26:"c8078f0a",48:"a94703ab",98:"a7bd4aaa",172:"e633a5ea",272:"749371cc",401:"17896441",532:"33362219",567:"22dd74f7",571:"0ba6a408",647:"5e95c892",668:"eb5b356a",717:"af920ffe",742:"aba21aa0",750:"d0314b07",919:"ca2c3c0c",961:"21afe7ac"}[e]||e)+"."+{26:"95121b15",48:"37079d87",98:"5b195d0f",172:"cbe02eaa",237:"4f1a14e7",272:"c67142db",401:"3584c216",532:"d86f431d",567:"5a552cfa",571:"21d91e2f",647:"a118483c",668:"516bb081",717:"36fc9a9a",742:"ff196c6d",750:"81b2f228",758:"382c453d",919:"7eb785b4",961:"e09a4f35"}[e]+".js",c.miniCssF=e=>{},c.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),c.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a={},o="openrag-docs:",c.l=(e,t,r,n)=>{if(a[e])a[e].push(t);else{var f,i;if(void 0!==r)for(var d=document.getElementsByTagName("script"),u=0;u{f.onerror=f.onload=null,clearTimeout(s);var o=a[e];if(delete a[e],f.parentNode&&f.parentNode.removeChild(f),o&&o.forEach(e=>e(r)),t)return t(r)},s=setTimeout(b.bind(null,void 0,{type:"timeout",target:f}),12e4);f.onerror=b.bind(null,f.onerror),f.onload=b.bind(null,f.onload),i&&document.head.appendChild(f)}},c.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},c.p="/",c.gca=function(e){return e={17896441:"401",33362219:"532",c8078f0a:"26",a94703ab:"48",a7bd4aaa:"98",e633a5ea:"172","749371cc":"272","22dd74f7":"567","0ba6a408":"571","5e95c892":"647",eb5b356a:"668",af920ffe:"717",aba21aa0:"742",d0314b07:"750",ca2c3c0c:"919","21afe7ac":"961"}[e]||e,c.p+c.u(e)},(()=>{var e={354:0,869:0};c.f.j=(t,r)=>{var a=c.o(e,t)?e[t]:void 0;if(0!==a)if(a)r.push(a[2]);else if(/^(354|869)$/.test(t))e[t]=0;else{var o=new Promise((r,o)=>a=e[t]=[r,o]);r.push(a[2]=o);var n=c.p+c.u(t),f=new Error;c.l(n,r=>{if(c.o(e,t)&&(0!==(a=e[t])&&(e[t]=void 0),a)){var o=r&&("load"===r.type?"missing":r.type),n=r&&r.target&&r.target.src;f.message="Loading chunk "+t+" failed.\n("+o+": "+n+")",f.name="ChunkLoadError",f.type=o,f.request=n,a[1](f)}},"chunk-"+t,t)}},c.O.j=t=>0===e[t];var t=(t,r)=>{var a,o,n=r[0],f=r[1],i=r[2],d=0;if(n.some(t=>0!==e[t])){for(a in f)c.o(f,a)&&(c.m[a]=f[a]);if(i)var u=i(c)}for(t&&t(r);d Deploy with Docker | OpenRAG - + @@ -21,6 +21,7 @@ They deploy the same applications and containers, but to different environments.

docker-compose-cpu.yml is a CPU-only version of OpenRAG for systems without GPU support. Use this Docker compose file for environments where GPU drivers aren't available.

+

Both Docker deployments depend on docling serve to be running on port 5001 on the host machine. This enables Mac MLX support for document processing. Installing OpenRAG with the TUI starts docling serve automatically, but for a Docker deployment you must manually start the docling serve process.

Prerequisites

  • Python Version 3.10 to 3.13
  • @@ -38,6 +39,10 @@ They deploy the same applications and containers, but to different environments.
    git clone https://github.com/langflow-ai/openrag.git
    cd openrag
  • +

    Install dependencies.

    +
    uv sync
    +
  • +
  • Copy the example .env file included in the repository root. The example file includes all environment variables with comments to guide you in finding and setting their values.

    cp .env.example .env
    @@ -51,10 +56,21 @@ The following values are required to be set:

    For more information on configuring OpenRAG with environment variables, see Environment variables.

  • +

    Start docling serve on the host machine. +Both Docker deployments depend on docling serve to be running on port 5001 on the host machine. This enables Mac MLX support for document processing.

    +
    uv run python scripts/docling_ctl.py start --port 5001
    +
  • +
  • +

    Confirm docling serve is running.

    +
    uv run python scripts/docling_ctl.py status
    +

    Successful result:

    +
    Status: running
    Endpoint: http://127.0.0.1:5001
    Docs: http://127.0.0.1:5001/docs
    PID: 27746
    +
  • +
  • Deploy OpenRAG with Docker Compose based on your deployment type.

    -

    For GPU-enabled systems, run the following command:

    -
    docker compose up -d
    -

    For CPU-only systems, run the following command:

    +

    For GPU-enabled systems, run the following commands:

    +
    docker compose build
    docker compose up -d
    +

    For environments without GPU support, run:

    docker compose -f docker-compose-cpu.yml up -d

    The OpenRAG Docker Compose file starts five containers:

    Container NameDefault AddressPurpose
    OpenRAG Backendhttp://localhost:8000FastAPI server and core functionality.
    OpenRAG Frontendhttp://localhost:3000React web interface for users.
    Langflowhttp://localhost:7860AI workflow engine and flow management.
    OpenSearchhttp://localhost:9200Vector database for document storage.
    OpenSearch Dashboardshttp://localhost:5601Database administration interface.
    @@ -73,6 +89,8 @@ The following values are required to be set:

    Continue with Application Onboarding.

  • +

    To stop docling serve when you're done with your OpenRAG deployment, run:

    +
    uv run python scripts/docling_ctl.py stop

    Application onboarding

    The first time you start OpenRAG, whether using the TUI or a .env file, you must complete application onboarding.

    Most values from onboarding can be changed later in the OpenRAG Settings page, but there are important restrictions.

    diff --git a/get-started/tui/index.html b/get-started/tui/index.html index 953f3d4c..6ccb65cf 100644 --- a/get-started/tui/index.html +++ b/get-started/tui/index.html @@ -4,7 +4,7 @@ Terminal User Interface (TUI) commands | OpenRAG - + @@ -40,8 +40,8 @@ The TUI then pulls the images and deploys the containers with the following comm

    If images are missing, the TUI runs docker compose pull, then runs docker compose up -d.

    Start native services

    A "native" service in OpenRAG refers to a service run natively on your machine, and not within a container. -The docling-serve process is a native service in OpenRAG, because it's a document processing service that is run on your local machine, and controlled separately from the containers.

    -

    To start or stop docling-serve or any other native services, in the TUI main menu, click Start Native Services or Stop Native Services.

    +The docling serve process is a native service in OpenRAG, because it's a document processing service that is run on your local machine, and controlled separately from the containers.

    +

    To start or stop docling serve or any other native services, in the TUI main menu, click Start Native Services or Stop Native Services.

    To view the status, port, or PID of a native service, in the TUI main menu, click Status.

    Status

    The Status menu displays information on your container deployment. diff --git a/index.html b/index.html index 21788b77..8ca83b66 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,7 @@ What is OpenRAG? | OpenRAG - + diff --git a/ingestion/index.html b/ingestion/index.html index 98a4a7cd..1ed661f5 100644 --- a/ingestion/index.html +++ b/ingestion/index.html @@ -4,7 +4,7 @@ Docling Ingestion | OpenRAG - + @@ -12,13 +12,13 @@

    Docling Ingestion

    OpenRAG uses Docling for its document ingestion pipeline. -More specifically, OpenRAG uses Docling Serve, which starts a docling-serve process on your local machine and runs Docling ingestion through an API service.

    +More specifically, OpenRAG uses Docling Serve, which starts a docling serve process on your local machine and runs Docling ingestion through an API service.

    Docling ingests documents from your local machine or OAuth connectors, splits them into chunks, and stores them as separate, structured documents in the OpenSearch documents index.

    OpenRAG chose Docling for its support for a wide variety of file formats, high performance, and advanced understanding of tables and images.

    Docling ingestion settings

    These settings configure the Docling ingestion parameters.

    -

    OpenRAG will warn you if docling-serve is not running. -To start or stop docling-serve or any other native services, in the TUI main menu, click Start Native Services or Stop Native Services.

    +

    OpenRAG will warn you if docling serve is not running. +To start or stop docling serve or any other native services, in the TUI main menu, click Start Native Services or Stop Native Services.

    Embedding model determines which AI model is used to create vector embeddings. The default is text-embedding-3-small.

    Chunk size determines how large each text chunk is in number of characters. Larger chunks yield more context per chunk, but may include irrelevant information. Smaller chunks yield more precise semantic search, but may lack context. diff --git a/install/index.html b/install/index.html index 1bc33b61..29bbe62f 100644 --- a/install/index.html +++ b/install/index.html @@ -4,7 +4,7 @@ Install OpenRAG | OpenRAG - + diff --git a/knowledge/index.html b/knowledge/index.html index 1db2862b..a5cc4d2d 100644 --- a/knowledge/index.html +++ b/knowledge/index.html @@ -4,7 +4,7 @@ OpenSearch Knowledge | OpenRAG - + diff --git a/quickstart/index.html b/quickstart/index.html index 5b96840f..c71b4470 100644 --- a/quickstart/index.html +++ b/quickstart/index.html @@ -4,7 +4,7 @@ Quickstart | OpenRAG - + diff --git a/reference/configuration/index.html b/reference/configuration/index.html index 61c53b79..ea92cb17 100644 --- a/reference/configuration/index.html +++ b/reference/configuration/index.html @@ -4,7 +4,7 @@ Environment variables | OpenRAG - + diff --git a/support/troubleshoot/index.html b/support/troubleshoot/index.html index 9f033b27..f2743bc0 100644 --- a/support/troubleshoot/index.html +++ b/support/troubleshoot/index.html @@ -4,7 +4,7 @@ Troubleshoot | OpenRAG - +