From 37a914f162ad512378b768f4a8533db2d8d8b8c8 Mon Sep 17 00:00:00 2001 From: April M <36110273+aimurphy@users.noreply.github.com> Date: Thu, 18 Dec 2025 16:58:23 -0800 Subject: [PATCH] edit install steps while testing --- docs/docs/_partial-setup.mdx | 85 +++---- docs/docs/core-components/ingestion.mdx | 21 +- docs/docs/get-started/docker.mdx | 2 +- docs/docs/get-started/install.mdx | 2 +- docs/docs/get-started/manage-services.mdx | 14 +- docs/docs/get-started/quickstart.mdx | 8 +- docs/docs/get-started/reinstall.mdx | 2 +- docs/docs/get-started/tui.mdx | 9 +- docs/docs/get-started/upgrade.mdx | 4 +- ...OpenRAG_TUI_2025-09-10T13_04_11_757637.svg | 237 ------------------ docs/static/img/openrag_tui_dec_2025.png | Bin 0 -> 21462 bytes 11 files changed, 74 insertions(+), 310 deletions(-) delete mode 100644 docs/static/img/OpenRAG_TUI_2025-09-10T13_04_11_757637.svg create mode 100644 docs/static/img/openrag_tui_dec_2025.png diff --git a/docs/docs/_partial-setup.mdx b/docs/docs/_partial-setup.mdx index 8142844d..9d15d9de 100644 --- a/docs/docs/_partial-setup.mdx +++ b/docs/docs/_partial-setup.mdx @@ -16,31 +16,37 @@ If OpenRAG detects OAuth credentials during setup, it recommends **Advanced Setu -1. In the TUI, click **Basic Setup** or press 1. +1. In the TUI, select **Basic Setup**. -2. Enter administrator passwords for the OpenRAG OpenSearch and Langflow services, or click **Generate Passwords** to generate passwords automatically. +2. Enter administrator passwords for the OpenRAG OpenSearch and Langflow services. - The OpenSearch password is required. + The OpenSearch password is required, and a secure password is automatically generated if you don't provide one manually. The Langflow password is recommended but optional. If the Langflow password is empty, the Langflow server starts without authentication enabled. For more information, see [Langflow settings](/reference/configuration#langflow-settings). -3. Optional: Enter your OpenAI API key, or leave this field empty to provide model provider credentials during the application onboarding process. + You can click **Generate Password** to create a Langflow password and username automatically. - There is no material difference between providing the key now or during the [application onboarding process](#application-onboarding). - If you provide a key now, it can be populated automatically during the application onboarding process if you select the OpenAI model provider, and then enable **Get API key from environment variable**. +3. Optional: Under **API Keys**, enter your model provider credentials, or leave these fields empty if you want to configure model provider credentials during the application onboarding process. + + There is no material difference between providing these values now or during the [application onboarding process](#application-onboarding). + If you provide a credential now, it can be populated automatically during the application onboarding process if you enable the **Get API key from environment variable** option. OpenRAG's core functionality requires access to language and embedding models. By default, OpenRAG uses OpenAI models. If you aren't sure which models or providers to use, you must provide an OpenAI API key to use OpenRAG's default model configuration. - If you want to use a different model provider, you can leave this field empty. -4. Click **Save Configuration**. +4. Optional: Under **Others**, edit the [knowledge base](/knowledge) paths if you don't want to use the default paths: - Your passwords and API key, if provided, are stored in the [OpenRAG `.env` file](/reference/configuration) at `~/.openrag/tui`. + * **Documents Paths**: One or more paths to directories are where OpenRAG looks for documents to ingest. + * **OpenSearch Data PAth**: Specify the path where you want OpenRAG to create your OpenSearch index. + +5. Click **Save Configuration**. + + Your passwords and API keys, if provided, are stored in the [OpenRAG `.env` file](/reference/configuration) at `~/.openrag/tui`. If you modified any credentials that were pulled from an existing `.env` file, those values are updated in the `.env` file. -5. Click **Start All Services** to start the OpenRAG services that run in containers. +6. Click **Start OpenRAG** to start the OpenRAG container services. This process can take some time while OpenRAG pulls and runs the container images. If all services start successfully, the TUI prints a confirmation message: @@ -50,55 +56,60 @@ If OpenRAG detects OAuth credentials during setup, it recommends **Advanced Setu Command completed successfully ``` -6. Under [**Native Services**](/manage-services), click **Start** to start the Docling service. - -7. Launch the OpenRAG application: +8. Launch the OpenRAG application: * From the TUI main menu, click **Open App**. * In your browser, navigate to `localhost:3000`. -8. Continue with the [application onboarding process](#application-onboarding). +9. Continue with the [application onboarding process](#application-onboarding). -1. In the TUI, click **Advanced Setup** or press 2. +1. In the TUI, select ** Advanced Setup**. -2. Enter administrator passwords for the OpenRAG OpenSearch and Langflow services, or click **Generate Passwords** to generate passwords automatically. +2. Enter administrator passwords for the OpenRAG OpenSearch and Langflow services. - The OpenSearch password is required. + The OpenSearch password is required, and a secure password is automatically generated if you don't provide one manually. The Langflow password is recommended but optional. If the Langflow password is empty, the Langflow server starts without authentication enabled. For more information, see [Langflow settings](/reference/configuration#langflow-settings). -3. Optional: Enter your OpenAI API key, or leave this field empty to provide model provider credentials during the application onboarding process. + You can click **Generate Password** to create a Langflow password and username automatically. - There is no material difference between providing the key now or during the [application onboarding process](#application-onboarding). - If you provide a key now, it can be populated automatically during the application onboarding process if you select the OpenAI model provider, and then enable **Get API key from environment variable**. +3. Optional: Under **API Keys**, enter your model provider credentials, or leave the **OpenAI**, **Anthropic**, **Ollama**, and **IBM watsonx.ai** fields empty if you want to configure model provider credentials during the application onboarding process. + + There is no material difference between providing these values now or during the [application onboarding process](#application-onboarding). + If you provide a credential now, it can be populated automatically during the application onboarding process if you enable the **Get API key from environment variable** option. OpenRAG's core functionality requires access to language and embedding models. By default, OpenRAG uses OpenAI models. If you aren't sure which models or providers to use, you must provide an OpenAI API key to use OpenRAG's default model configuration. - If you want to use a different model provider, you can leave this field empty. -4. To upload documents from external storage, such as Google Drive, add the required OAuth credentials for the connectors that you want to use. These settings can be populated automatically if OpenRAG detects these credentials in an [OpenRAG `.env` file](/reference/configuration) at `~/.openrag/tui`. +4. Recommended: To upload documents from external storage, such as Google Drive, add the required OAuth credentials for the connectors that you want to use under **API Keys**. These settings can be populated automatically if OpenRAG detects these credentials in an [OpenRAG `.env` file](/reference/configuration) at `~/.openrag/tui`. - * **Amazon**: Provide your AWS Access Key ID and AWS Secret Access Key with access to your S3 instance. For more information, see the AWS documentation on [Configuring access to AWS applications](https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-applications.html). * **Google**: Provide your Google OAuth Client ID and Google OAuth Client Secret. You can generate these in the [Google Cloud Console](https://console.cloud.google.com/apis/credentials). For more information, see the [Google OAuth client documentation](https://developers.google.com/identity/protocols/oauth2). * **Microsoft**: For the Microsoft OAuth Client ID and Microsoft OAuth Client Secret, provide [Azure application registration credentials for SharePoint and OneDrive](https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/app-registration?view=odsp-graph-online). For more information, see the [Microsoft Graph OAuth client documentation](https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/graph-oauth). + * **Amazon**: Provide your AWS Access Key ID and AWS Secret Access Key with access to your S3 instance. For more information, see the AWS documentation on [Configuring access to AWS applications](https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-applications.html). You can [manage OAuth credentials](/ingestion#oauth-ingestion) later, but it is recommended to configure them during initial set up. -5. The OpenRAG TUI presents redirect URIs for your OAuth app. -These are the URLs your OAuth provider will redirect back to after user sign-in. -Register these redirect values with your OAuth provider as they are presented in the TUI. +5. Register the redirect URIs shown in the TUI in your OAuth provider. +These are the URLs your OAuth provider will use to redirect users back to OpenRAG after they sign in. -6. Click **Save Configuration**. +6. Optional: Under **Others**, you can edit the following settings if needed: + + * **Documents Paths**: Use the default path or provide one or more paths to directories are where OpenRAG looks for documents to ingest in to your [knowledge base](/knowledge). + * **OpenSearch Data Path**: Specify the path where you want OpenRAG to create your OpenSearch index. + * **Langflow Public URL (`LANGFLOW_PUBLIC_URL`)** : Sets the base address to access the Langflow web interface. This is where users interact with flows in a browser. + * **Webhook Base URL (`WEBHOOK_BASE_URL`)**: If applicable, set the base address for your OAuth connector endpoints. If set, the OAuth connector webhook URLs are constructed as `WEBHOOK_BASE_URL/connectors/${provider}/webhook`. + +7. Click **Save Configuration**. Your passwords, API key, and OAuth credentials, if provided, are stored in the [OpenRAG `.env` file](/reference/configuration) at `~/.openrag/tui`. If you modified any credentials that were pulled from an existing `.env` file, those values are updated in the `.env` file. -7. Click **Start All Services** to start the OpenRAG services that run in containers. +8. Click **Start OpenRAG** to start the OpenRAG container services. This process can take some time while OpenRAG pulls and runs the container images. If all services start successfully, the TUI prints a confirmation message: @@ -108,8 +119,6 @@ Register these redirect values with your OAuth provider as they are presented in Command completed successfully ``` -8. Under [**Native Services**](/manage-services), click **Start** to start the Docling service. - 9. Launch the OpenRAG application: * From the TUI main menu, click **Open App**. @@ -117,19 +126,7 @@ Register these redirect values with your OAuth provider as they are presented in 10. If you enabled OAuth connectors, you must sign in to your OAuth provider before being redirected to your OpenRAG instance. -11. If required, you can edit the following additional environment variables. -Only change these variables if your OpenRAG deployment has a non-default network configuration, such as a reverse proxy or custom domain. - - * `LANGFLOW_PUBLIC_URL`: Sets the base address to access the Langflow web interface. This is where users interact with flows in a browser. - * `WEBHOOK_BASE_URL`: Sets the base address for the following OpenRAG OAuth connector endpoints: - * Amazon S3: Not applicable. - * Google Drive: `WEBHOOK_BASE_URL/connectors/google_drive/webhook` - * OneDrive: `WEBHOOK_BASE_URL/connectors/onedrive/webhook` - * SharePoint: `WEBHOOK_BASE_URL/connectors/sharepoint/webhook` - -12. Continue with the [application onboarding process](#application-onboarding). +11. Continue with the [application onboarding process](#application-onboarding). - - - \ No newline at end of file + \ No newline at end of file diff --git a/docs/docs/core-components/ingestion.mdx b/docs/docs/core-components/ingestion.mdx index f584405e..59870d03 100644 --- a/docs/docs/core-components/ingestion.mdx +++ b/docs/docs/core-components/ingestion.mdx @@ -69,20 +69,20 @@ To enable multiple connectors, you must register an app and generate credentials If you use the [Terminal User Interface (TUI)](/tui) to manage your OpenRAG services, enter OAuth credentials in the **Advanced Setup** menu. You can do this during [installation](/install#setup), or you can add the credentials afterwards: -1. If OpenRAG is running, open the TUI's **Status** menu (3), and then click **Stop Services**. +1. If OpenRAG is running, open the TUI's **Status** menu, and then click **Stop Services**. -2. Open the **Advanced Setup** menu (2), and then add the OAuth credentials for the cloud storage providers that you want to use: +2. Open the **Advanced Setup** menu, and then add the OAuth credentials for the cloud storage providers that you want to use under **API Keys**: - * **Amazon**: Provide your AWS Access Key ID and AWS Secret Access Key with access to your S3 instance. For more information, see the AWS documentation on [Configuring access to AWS applications](https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-applications.html). * **Google**: Provide your Google OAuth Client ID and Google OAuth Client Secret. You can generate these in the [Google Cloud Console](https://console.cloud.google.com/apis/credentials). For more information, see the [Google OAuth client documentation](https://developers.google.com/identity/protocols/oauth2). * **Microsoft**: For the Microsoft OAuth Client ID and Microsoft OAuth Client Secret, provide [Azure application registration credentials for SharePoint and OneDrive](https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/app-registration?view=odsp-graph-online). For more information, see the [Microsoft Graph OAuth client documentation](https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/graph-oauth). + * **Amazon**: Provide your AWS Access Key ID and AWS Secret Access Key with access to your S3 instance. For more information, see the AWS documentation on [Configuring access to AWS applications](https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-applications.html). 3. The TUI presents redirect URIs for your OAuth app that you must register with your OAuth provider. These are the URLs your OAuth provider will redirect back to after users authenticate and grant access to their cloud storage. 4. Click **Save Configuration** to add the OAuth credentials to your [OpenRAG `.env` file](/reference/configuration). -5. Click **Start All Services** to restart the OpenRAG containers with OAuth enabled. +5. Click **Start Services** to restart the OpenRAG containers with OAuth enabled. 6. Launch the OpenRAG app. You should be prompted to sign in to your OAuth provider before being redirected to your OpenRAG instance. @@ -100,13 +100,6 @@ You can do this during [initial set up](/docker#setup), or you can add the crede 2. Edit your OpenRAG `.env` file to add the OAuth credentials for the cloud storage providers that you want to use: - * **Amazon**: Provide your AWS Access Key ID and AWS Secret Access Key with access to your S3 instance. For more information, see the AWS documentation on [Configuring access to AWS applications](https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-applications.html). - - ```env - AWS_ACCESS_KEY_ID= - AWS_SECRET_ACCESS_KEY= - ``` - * **Google**: Provide your Google OAuth Client ID and Google OAuth Client Secret. You can generate these in the [Google Cloud Console](https://console.cloud.google.com/apis/credentials). For more information, see the [Google OAuth client documentation](https://developers.google.com/identity/protocols/oauth2). ```env @@ -120,6 +113,12 @@ You can do this during [initial set up](/docker#setup), or you can add the crede MICROSOFT_GRAPH_OAUTH_CLIENT_ID= MICROSOFT_GRAPH_OAUTH_CLIENT_SECRET= ``` + * **Amazon**: Provide your AWS Access Key ID and AWS Secret Access Key with access to your S3 instance. For more information, see the AWS documentation on [Configuring access to AWS applications](https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-applications.html). + + ```env + AWS_ACCESS_KEY_ID= + AWS_SECRET_ACCESS_KEY= + ``` 3. Save the `.env` file. diff --git a/docs/docs/get-started/docker.mdx b/docs/docs/get-started/docker.mdx index 9eca74f1..c2143e09 100644 --- a/docs/docs/get-started/docker.mdx +++ b/docs/docs/get-started/docker.mdx @@ -78,9 +78,9 @@ The following variables are required or recommended: * **OAuth provider credentials**: To upload documents from external storage, such as Google Drive, set the required OAuth credentials for the connectors that you want to use. You can [manage OAuth credentials](/ingestion#oauth-ingestion) later, but it is recommended to configure them during initial set up so you don't have to rebuild the containers. - * **Amazon**: Provide your AWS Access Key ID and AWS Secret Access Key with access to your S3 instance. For more information, see the AWS documentation on [Configuring access to AWS applications](https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-applications.html). * **Google**: Provide your Google OAuth Client ID and Google OAuth Client Secret. You can generate these in the [Google Cloud Console](https://console.cloud.google.com/apis/credentials). For more information, see the [Google OAuth client documentation](https://developers.google.com/identity/protocols/oauth2). * **Microsoft**: For the Microsoft OAuth Client ID and Microsoft OAuth Client Secret, provide [Azure application registration credentials for SharePoint and OneDrive](https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/app-registration?view=odsp-graph-online). For more information, see the [Microsoft Graph OAuth client documentation](https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/graph-oauth). + * **Amazon**: Provide your AWS Access Key ID and AWS Secret Access Key with access to your S3 instance. For more information, see the AWS documentation on [Configuring access to AWS applications](https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-applications.html). For more information and variables, see [OpenRAG environment variables](/reference/configuration). diff --git a/docs/docs/get-started/install.mdx b/docs/docs/get-started/install.mdx index b1091905..e8f23f47 100644 --- a/docs/docs/get-started/install.mdx +++ b/docs/docs/get-started/install.mdx @@ -56,7 +56,7 @@ You might be prompted to install certain dependencies if they aren't already pre The entire process can take a few minutes. Once the environment is ready, the OpenRAG TUI starts. -![OpenRAG TUI Interface](@site/static/img/OpenRAG_TUI_2025-09-10T13_04_11_757637.svg) +![OpenRAG TUI Interface](@site/static/img/openrag_tui_dec_2025.png) Because the installer script uses `uvx`, it creates a cached, ephemeral environment in your local `uv` cache, and your OpenRAG configuration files and data are stored separately from the `uv` cache. Clearing the cache doesn't delete your entire OpenRAG installation, only the temporary TUI environment. diff --git a/docs/docs/get-started/manage-services.mdx b/docs/docs/get-started/manage-services.mdx index d81beaee..0a60fc2d 100644 --- a/docs/docs/get-started/manage-services.mdx +++ b/docs/docs/get-started/manage-services.mdx @@ -24,11 +24,11 @@ For [self-managed deployments](/docker), run Docker or Podman commands to manage -* **TUI Status menu**: In the **Status** menu (3), you can access streaming logs for all OpenRAG services. +* **TUI Status menu**: In the **Status** menu, you can access streaming logs for all OpenRAG services. Select the service you want to view, and then press l. To copy the logs, click **Copy to Clipboard**. -* **TUI Diagnostics menu**: The TUI's **Diagnostics** menu (4) provides health monitoring for your container runtimes and monitoring of your OpenSearch instance. +* **TUI Diagnostics menu**: The TUI's **Diagnostics** menu provides health monitoring for your container runtimes and monitoring of your OpenSearch instance. * **Docling**: See [Stop, start, and inspect native services](#start-native-services). @@ -47,10 +47,10 @@ To copy the logs, click **Copy to Clipboard**. -In the TUI's **Status** menu (3), click **Stop Services** to stop all OpenRAG container-based services. -Then, click **Start All Services** to restart the OpenRAG containers. +In the TUI's **Status** menu, click **Stop Services** to stop all OpenRAG container-based services. +Then, click **Start Services** to restart the OpenRAG containers. -When you click **Start All Services**, the following processes are triggered: +When you click **Start Services**, the following processes are triggered: 1. OpenRAG automatically detects your container runtime, and then checks if your machine has compatible GPU support by checking for `CUDA`, `NVIDIA_SMI`, and Docker/Podman runtime support. This check determines which Docker Compose file OpenRAG uses because there are separate Docker Compose files for GPU and CPU deployments. @@ -75,7 +75,7 @@ A _native service_ in OpenRAG is a service that runs locally on your machine, no -From the TUI's **Status** menu (3), click **Native Services** to do the following: +From the TUI's **Status** menu, click **Native Services** to do the following: * View the service's status, port, and process ID (PID). * Stop, start, and restart native services. @@ -135,7 +135,7 @@ To reset your OpenRAG deployment _and_ delete all OpenRAG data, see [Reinstall O -2. To destroy and recreate your OpenRAG containers, open the TUI's **Status** menu (3), and then click **Factory Reset**. +2. To destroy and recreate your OpenRAG containers, open the TUI's **Status** menu, and then click **Factory Reset**. 3. Repeat the [setup process](/install#setup) to restart the services and launch the OpenRAG app. Your OpenRAG passwords, OAuth credentials (if previously set), and onboarding configuration are restored from the `.env` file. diff --git a/docs/docs/get-started/quickstart.mdx b/docs/docs/get-started/quickstart.mdx index e006bea8..68b82324 100644 --- a/docs/docs/get-started/quickstart.mdx +++ b/docs/docs/get-started/quickstart.mdx @@ -46,15 +46,15 @@ The script installs OpenRAG dependencies, including Docker or Podman, and then i The entire process can take a few minutes. Once the environment is ready, the OpenRAG [Terminal User Interface (TUI)](/tui) starts. - ![OpenRAG TUI Interface](@site/static/img/OpenRAG_TUI_2025-09-10T13_04_11_757637.svg) + ![OpenRAG TUI Interface](@site/static/img/openrag_tui_dec_2025.png) 3. In the TUI, click **Basic Setup**. -4. Click **Generate Passwords** to create administrator passwords for your OpenRAG OpenSearch and Langflow services. +4. For **Langflow Admin Password**, click **Generate Password** to create a Langflow administrator password and username. -5. Leave the **OpenAI API key** field empty. +5. Use the default values for all other fields. -6. Click **Save Configuration**, and then click **Start All Services**. +6. Click **Save Configuration**, and then click **Start OpenRAG**. This process can take some time while OpenRAG pulls and runs the container images. If all services start successfully, the TUI prints a confirmation message: diff --git a/docs/docs/get-started/reinstall.mdx b/docs/docs/get-started/reinstall.mdx index dc4466cb..baa189b3 100644 --- a/docs/docs/get-started/reinstall.mdx +++ b/docs/docs/get-started/reinstall.mdx @@ -21,7 +21,7 @@ Destroyed containers and deleted data are lost and cannot be recovered after run -2. In the TUI's **Status** menu (3), click **Factory Reset** to [reset your OpenRAG containers](/manage-services#reset-containers). +2. In the TUI's **Status** menu, click **Factory Reset** to [reset your OpenRAG containers](/manage-services#reset-containers). diff --git a/docs/docs/get-started/tui.mdx b/docs/docs/get-started/tui.mdx index 619543e3..00e2bc46 100644 --- a/docs/docs/get-started/tui.mdx +++ b/docs/docs/get-started/tui.mdx @@ -5,7 +5,7 @@ slug: /tui The OpenRAG Terminal User Interface (TUI) provides a simplified and guided experience for configuring, managing, and monitoring your OpenRAG deployment directly from the terminal. -![OpenRAG TUI Interface](@site/static/img/OpenRAG_TUI_2025-09-10T13_04_11_757637.svg) +![OpenRAG TUI Interface](@site/static/img/openrag_tui_dec_2025.png) If you install OpenRAG with the [automatic installer script](/install), [`uv`](/install-uv), or [`uvx`](/install-uvx), you use the TUI to manage your OpenRAG deployment. The TUI guides you through the initial setup, automatically manages your OpenRAG `.env` and `docker-compose` files, and provides convenient access to [service management](/manage-services) controls. @@ -18,9 +18,14 @@ If you installed OpenRAG with `uv`, access the TUI with `uv run openrag`. If you installed OpenRAG with the automatic installer script or `uvx`, access the TUI with `uvx openrag`. +## Navigate the TUI + +You can navigate the TUI with your mouse or keyboard. +Keyboard shortcuts for additional menus are printed at the bottom of the TUI screen. + ## Manage services with the TUI -Use the TUI's **Status** menu (3) and **Diagnostics** menu (4) to access controls and information for your OpenRAG services. +Use the TUI's **Status** and **Diagnostics** menus to access controls and information for your OpenRAG services. For more information, see [Manage OpenRAG services](/manage-services). ## Exit the OpenRAG TUI diff --git a/docs/docs/get-started/upgrade.mdx b/docs/docs/get-started/upgrade.mdx index 611c6f6b..a4189cb4 100644 --- a/docs/docs/get-started/upgrade.mdx +++ b/docs/docs/get-started/upgrade.mdx @@ -24,7 +24,7 @@ This is a two-part process because upgrading the OpenRAG Python package updates -2. To check for updates, open the TUI's **Status** menu (3), and then click **Upgrade**. +2. To check for updates, open the TUI's **Status** menu, and then click **Upgrade**. 3. If there is an update, stop all OpenRAG services. In the **Status** menu, click **Stop Services**. @@ -112,7 +112,7 @@ The commands to upgrade the package depend on how you installed OpenRAG. -5. In the OpenRAG TUI, click **Start All Services**, and then wait while the upgraded containers start. +5. In the OpenRAG TUI, click **Start Services**, and then wait while the upgraded containers start. When you start services after upgrading the Python package, OpenRAG runs `docker compose pull` to get the appropriate container images matching the version specified in your OpenRAG `.env` file. Then, it recreates the containers with the new images using `docker compose up -d --force-recreate`. diff --git a/docs/static/img/OpenRAG_TUI_2025-09-10T13_04_11_757637.svg b/docs/static/img/OpenRAG_TUI_2025-09-10T13_04_11_757637.svg deleted file mode 100644 index f50bef7d..00000000 --- a/docs/static/img/OpenRAG_TUI_2025-09-10T13_04_11_757637.svg +++ /dev/null @@ -1,237 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OpenRAG TUI - - - - - - - - - - - - - - - - - - - - - - -██████╗ ██████╗ ███████╗███╗   ██╗██████╗  █████╗  ██████╗  -██╔═══██╗██╔══██╗██╔════╝████╗  ██║██╔══██╗██╔══██╗██╔════╝  -██║   ██║██████╔╝█████╗  ██╔██╗ ██║██████╔╝███████║██║  ███╗ -██║   ██║██╔═══╝ ██╔══╝  ██║╚██╗██║██╔══██╗██╔══██║██║   ██║ -╚██████╔╝██║     ███████╗██║ ╚████║██║  ██║██║  ██║╚██████╔╝ -╚═════╝ ╚═╝     ╚══════╝╚═╝  ╚═══╝╚═╝  ╚═╝╚═╝  ╚═╝╚═════╝ -Terminal User Interface for OpenRAG - -OAuth credentials detected — Advanced Setup recommended - - - - -▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ - Advanced Setup  Monitor Services  -▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ - - - - - - - - - - - - - - q Quit  1 Basic Setup  2 Advanced Setup  3 Monitor Services  4 Diagnostics ^p palette - - - diff --git a/docs/static/img/openrag_tui_dec_2025.png b/docs/static/img/openrag_tui_dec_2025.png new file mode 100644 index 0000000000000000000000000000000000000000..fd3f6f77b1ceaa2675bf2f0025a90c6351c5956a GIT binary patch literal 21462 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,qFA2=4SXte{{w1Lwfs26VP2bll-Hw0v?4V=tX%R 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