From e661da4d42f6ecc60812be0c7d61eb2477373bc7 Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Thu, 13 Mar 2025 13:47:19 -0400 Subject: [PATCH 01/39] uncommented deploy section --- secondaryNavbar.js | 4 ++-- yarn.lock | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/secondaryNavbar.js b/secondaryNavbar.js index 8eaebc6a..5b58af66 100644 --- a/secondaryNavbar.js +++ b/secondaryNavbar.js @@ -42,7 +42,7 @@ const secondaryNavbarItems = { }, ], }, - /* + deploy: { title: "Deploy", icon: "fa fa-database", @@ -53,7 +53,7 @@ const secondaryNavbarItems = { { label: "AWS", link: "/docs/deploy/aws", sidebar: "deployAwsSidebar" }, ], }, - */ + agents: { title: "Agents", icon: "fa fa-robot", diff --git a/yarn.lock b/yarn.lock index 6915f50c..5533dba0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1857,6 +1857,21 @@ react-helmet-async "npm:@slorber/react-helmet-async@*" react-loadable "npm:@docusaurus/react-loadable@6.0.0" +"@docusaurus/plugin-client-redirects@^3.7.0": + version "3.7.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.7.0.tgz#b5cf92529768c457c01ad350bfc50862c6149463" + integrity sha512-6B4XAtE5ZVKOyhPgpgMkb7LwCkN+Hgd4vOnlbwR8nCdTQhLjz8MHbGlwwvZ/cay2SPNRX5KssqKAlcHVZP2m8g== + dependencies: + "@docusaurus/core" "3.7.0" + "@docusaurus/logger" "3.7.0" + "@docusaurus/utils" "3.7.0" + "@docusaurus/utils-common" "3.7.0" + "@docusaurus/utils-validation" "3.7.0" + eta "^2.2.0" + fs-extra "^11.1.1" + lodash "^4.17.21" + tslib "^2.6.0" + "@docusaurus/plugin-content-blog@3.7.0": version "3.7.0" resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.7.0.tgz#7bd69de87a1f3adb652e1473ef5b7ccc9468f47e" From cbd6d79008211ffd17dec638e9e30b6744c04959 Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Sat, 15 Mar 2025 23:50:59 -0400 Subject: [PATCH 02/39] added k8s poc doc, prod readiness doc, added k8s landing page, and commented out aws section --- docs/deploy/index.mdx | 56 +++-------- docs/deploy/k8s/_category_.json | 4 + docs/deploy/k8s/index.mdx | 21 +++++ docs/deploy/k8s/k8s-poc.md | 119 ++++++++++++++++++++++++ docs/deploy/k8s/production-readiness.md | 65 +++++++++++++ secondaryNavbar.js | 3 +- sidebars.js | 8 +- 7 files changed, 233 insertions(+), 43 deletions(-) create mode 100644 docs/deploy/k8s/_category_.json create mode 100644 docs/deploy/k8s/index.mdx create mode 100644 docs/deploy/k8s/k8s-poc.md create mode 100644 docs/deploy/k8s/production-readiness.md diff --git a/docs/deploy/index.mdx b/docs/deploy/index.mdx index 37231681..35f4a93b 100644 --- a/docs/deploy/index.mdx +++ b/docs/deploy/index.mdx @@ -1,52 +1,26 @@ --- -title: Deployment overview +title: Deployment Overview description: Deployment overview page sidebar_position: 0 --- -# Tacetve a gemit quisquam praestat meruisse gradientis +# Deploying to Weaviate +Weaviate offers multiple deployment options to satisfy your specific use case in production. +Use this page to help you find all that you need to successfully deploy and optimize Weaviate in your environment. +In this section of the docs, you will find common deployment topics, including Kubernetes, cloud providers, and best practices, along with detailed tutorials and how-to guides. -## Nec sum vagatur nupta tantus +Weaviate is designed for: -Lorem markdownum pugnando ventoque et ducta et et adurat locus inde cervos -refeci Phaethon clivum linguaque Salmacis geras coeperat mollia. Leucothoen Ceyx -est viret nostraque; meum utque latens -quae, patrios plebe inpositum: torvum. **Stipite fluminaque videri**; ictu -duabus sua *condita monstrum*. Imo undis: aut niveo sidoniae; placato sorores -at, quae perque. *Candore dolore*, et secum rastra ceratis et sollicitat vincula -matri mei alios in rigore murmur foedataque, cum. +- **Scalability** – Handle billions of vector data points efficiently. +- **High-Performance Search** – Power AI applications with real-time vector retrieval. +- **Flexible Integrations** – Connect with various machine learning models and data sources. +- **Cloud & On-Prem Deployment** – Deploy on Weaviate Cloud, Kubernetes, or managed cloud services. -Et solvit ex comitante super luctus. Unda posse perque venitque quod algae -lymphis postquam optime. +## Deployment Options -## Flammis levi harena illi membra caudam +Choose the best deployment method based on your needs: -Ipse inducitur stridore Aiacem intonsum! Est arma, hausitque *tu* litora -aetasque, at fuit Aegea vides. Non laborum longi fortisque *putes bracchia* -umbras te fingit enim manum! +- **Serverless Cloud** - The easiest deployment setup to test out your Weaviate use case. +- **Enterprise Cloud -** Deploy on dedicated resources in a secure, highly available environment. +- **Bring Your Own Cloud (BYOC)** – Have a fully managed deployment within your own cloud environment. -Ingentia sive Idaeo serpere, dives inpia. Oculos in aras ergo bracchiaque vera, -omnis solutus vellet: et. Est et putat nec obvia unda -totidem amisit *coniurataeque sic arabat* mea. Caune -quodque **addita** truncis quid latebra: incubat pallorque turribus et ignarus -signum pectore quicquid Abantiades locus. **Ante** aliqua Aiacis deferre, ferunt -hunc omnia, et hic Aconteus nec. - -Odit festas dixit et quas fidissima, *est umbrae matrona* palude. Ait et quod -pectora circa. - -## Elegit sim ulla poteramus stridente cessit auras - -Tanta *Elinque*. Mea quae cultum Palameden Aglauros si sacra miserere quam ego, -**e scires** imo sonitusque tumidarum fremit quae ictu? Tum est sub vate vasto, -Galanthida in potui huc et temptat Cenaeo praeterque septem caede. - -> Suo ipse cubitique et vento in onerosa adunco, non. **In paelice Quirites** -> sunt stant sinebat superstes differt non per potentia illiusque nostris -> Hecateidos? Tempore haud imagine facta ora, uni quam fatorum. - -Altis animalibus pampinus venit mirabilis busto: tamen hunc, **salutant** -Stheneleia vultibus pectore. Evocat posuere anxia. - -Aper est; in tuum medius, responderat tamen: magis vix! Amor regno tamen tuli -remige facitote **reverentia**: loqui vade pignora. diff --git a/docs/deploy/k8s/_category_.json b/docs/deploy/k8s/_category_.json new file mode 100644 index 00000000..78521841 --- /dev/null +++ b/docs/deploy/k8s/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "k8s", + "position": 1 +} \ No newline at end of file diff --git a/docs/deploy/k8s/index.mdx b/docs/deploy/k8s/index.mdx new file mode 100644 index 00000000..e0c2676b --- /dev/null +++ b/docs/deploy/k8s/index.mdx @@ -0,0 +1,21 @@ +# Kubernetes and Weaviate + +Weaviate leverages Kubernetes for scalable, resilient, and production-grade deployments. + +## Deployment Options + +Weaviate can use Kubernetes in a variety of deployments: + +### Enterprise Cloud + +- Amazon EKS (Elastic Kubernetes Service) +- Google Kubernetes Engine (GKE) +- Azure Kubernetes Service (AKS) + +### Bring Your Own Cloud + +- Amazon EKS (Elastic Kubernetes Service) +- Google Kubernetes Engine (GKE) +- Azure Kubernetes Service (AKS) + +This section provides guides, best practices, and tutorials for making the best of your Kubernetes deployments. \ No newline at end of file diff --git a/docs/deploy/k8s/k8s-poc.md b/docs/deploy/k8s/k8s-poc.md new file mode 100644 index 00000000..f9fe383c --- /dev/null +++ b/docs/deploy/k8s/k8s-poc.md @@ -0,0 +1,119 @@ +# Building with Weaviate: Getting to Production + +## Introduction + +You are a developer who has already deployed Weaviate on a test cluster and want to take things a step further by deploying and testing Weaviate on a self-managed K8s (Kubernetes) cluster. This guide shows how to validate Weaviate’s capabilities in your enterprise environment. + +At the end of this guide, expect to have: + +- A configured Helm-based deployment and networking setup +- Basic scaling, persistent storage, and resource management +- TLS, RBAC, and security best practices implements +- Monitoring, logging, and backup strategies enabled + +## Prerequisites + +Before beginning, ensure that you have the following: + +### Technical Knowledge + +- Basic Kubernetes and containerization conceptual knowledge +- Basic experience with Helm and `kubectl` + +:::note + +Check out the Academy course [“Run Weaviate on Kubernetes”](https://weaviate.io/developers/academy/deployment/k8s) if you need assistance. + +::: + +### Required Tools + +- A running Kubernetes cluster with Weaviate installed +- `kubectl` installed +- Helm installed + +### Step 1: Configure your Helm Chart + +- Use the official [Weaviate Helm chart](https://github.com/weaviate/weaviate-helm) for your installation. +- Customize the values to fit your enterprise requirements (e.g., resource allocation, storage settings). +- Deploy the chart and verify pod health. + +### Step 2: Network Security + +- Configure an ingress controller to securely expose Weaviate. +- Enable TLS with a certificate manager and enforce TLS encryption for all client-server communication. +- Assign a domain name for external access. +- Implement RBAC to restrict user access. + +```yaml +authorization: + rbac: + enabled: true + # root_users: + # - admin_user1 + # - admin_user2 + admin_list: + enabled: true + # users: + # - admin_user1 + # - admin_user2 + # - api-key-user-admin + # read_only_users: + # - readonly_user1 + # - readonly_user2 + # - api-key-user-readOnly +``` + +### Step 3: Scaling + +- Implement horizontal scaling to ensure high availability. + +```yaml +replicaCount: 3 +``` + +- Define CPU/memory limits and requests to optimize pod efficiency. + +```yaml +resources: + requests: + cpu: "500m" + memory: "1Gi" + limits: + cpu: "2" + memory: "4Gi" +``` + +### Step 4: Monitoring and Logging + +- Use Prometheus and Grafana to collect and analyze performance metrics. + +```yaml +serviceMonitor: + enabled: true + interval: 30s + scrapeTimeout: 10s +``` + +- Implement alerting for issue resolution. + +### Step 5: Upgrades and Backups + +- Use the rolling update strategy used by Helm to minimize downtime. + +```yaml +updateStrategy: + type: RollingUpdate + rollingUpdate: + maxSurge: 1 + maxUnavailable: 0 +``` + +- Test new Weaviate versions before deploying into production. +- Implement disaster recovery procedures to ensure that data is restored quickly. + +### Conclusion + +Voila! You now have a deployment that is *somewhat* ready for production. Your next step will be to complete the self-assessment and identify any gaps. + +### Next Steps: [Production Readiness Self-Assessment](./production-readiness.md) \ No newline at end of file diff --git a/docs/deploy/k8s/production-readiness.md b/docs/deploy/k8s/production-readiness.md new file mode 100644 index 00000000..34bc8687 --- /dev/null +++ b/docs/deploy/k8s/production-readiness.md @@ -0,0 +1,65 @@ +# Kubernetes Production Readiness Self-Assessment + +Think you’re ready for production? Ensuring that your Weaviate cluster is production-ready requires careful planning, configuration, and ongoing maintenance. Ensuring that you have a stable, reliable deployment requires you to think of your *ending* at the *beginning.* This guide provides you with introspective questions to assess readiness and identify any potential gaps before moving your workloads into production. + +### High Availability and Resilience + +- [ ] Are your clusters deployed across multiple availability zones (AZs) or regions to prevent downtime? +- [ ] Are replicas deployed across multiple nodes for redundancy? +- [ ] Is your control plane highly available? +- [ ] Is your application fault-tolerant *without* your control plane? +- [ ] Are the worker nodes distributed across multiple zones to mitigate failures? +- [ ] Are there automatic node repair or self-healing mechanisms in place? +- [ ] Have failover scenarios been tested to validate resilience? +- [ ] Are you utilizing Weaviate’s backup capabilities for disaster recovery? + - [ ] How often are these mechanisms tested? + - [ ] Has the ability to recover from a node failure or database corruption been tested? +- [ ] Are rolling updates performed to avoid downtime? +- [ ] Are canary deployments implemented to safely test new releases? +- [ ] Do you have development or test environments to safely test changes? + +### Resource Management + +- [ ] Have you considered your data’s consumption pattern(s)? + - [ ] Has your memory allocation been right-sized to match workload demand? + - [ ] Has your storage/compute allocation also been right-sized to match workload demand? + - [ ] Is there a process to delete old or unused objects? +- [ ] Have multiple replicas been configured to balance read-heavy workloads? +- [ ] Has the proper storage class been selected for your needs? + - [ ] Does your storage class support volume expansion so that you can support growth over time? +- [ ] Is the data within your cluster properly backed up, including the persistent storage? + +### Security + +- [ ] Are the components of your cluster communicating via SSL/TLS and trusted certificates? +- [ ] Is the *“principle of least privilege”* being followed? +- [ ] Are your container security defaults set properly? +- [ ] Is access to your cluster strictly limited? +- [ ] Has RBAC been implemented to restrict access? +- [ ] Have network policies been implemented to limit pod-to-pod communication? +- [ ] Are secrets secured with K8s Secrets or a vault solution? +- [ ] Do you have a process for when secrets are exposed, when access is lost to a key or certificate, and when secrets need to be rotated? + +### Monitoring and Observability + +- [ ] Is logging implemented? + - [ ] Are the collected logs stored centrally? +- [ ] Is metric collection enabled using Prometheus (or Alloy, DataDog, or another monitoring platform)? +- [ ] Are health and performance metrics being visualized in Grafana? +- [ ] Are alerts configured for events? + +Evaluate these key areas to build a highly available, resilient, and efficient deployment that will scale to meet your business needs. By ensuring that these self-assessment questions have been addressed, you can proactively identify potential risks and maximize the reliability of your deployment. + +:::tip +If you *do* identify gaps within your deployment, be sure to reach out to your SE (sales engineer) who can help steer you on the path to production success! +::: + +#### Additional Resources + +- [Replication](/docs/weaviate/configuration/replication.md) +- [Horizontal Scaling](/docs/weaviate/concepts/cluster.md) +- [Storage](/docs/weaviate/concepts/storage.md) +- [RBAC](/docs/weaviate/configuration/rbac/index.mdx) +- [Backups](/docs/weaviate/configuration/backups.md) +- [Persistence](/docs/weaviate/configuration/persistence.md) +- [Monitoring](/docs/weaviate/configuration/monitoring.md) diff --git a/secondaryNavbar.js b/secondaryNavbar.js index 5b58af66..a6d9a073 100644 --- a/secondaryNavbar.js +++ b/secondaryNavbar.js @@ -50,7 +50,8 @@ const secondaryNavbarItems = { link: "/docs/deploy", links: [ { label: "Get Started", link: "/docs/deploy", sidebar: "deploySidebar" }, - { label: "AWS", link: "/docs/deploy/aws", sidebar: "deployAwsSidebar" }, + { label: "Kubernetes", link: "/docs/deploy/k8s", sidebar: "deployK8sSidebar" }, + /*{ label: "AWS", link: "/docs/deploy/aws", sidebar: "deployAwsSidebar" },*/ ], }, diff --git a/sidebars.js b/sidebars.js index 72b1fecd..f3fcfebf 100644 --- a/sidebars.js +++ b/sidebars.js @@ -397,11 +397,17 @@ const sidebars = { "weaviate/more-resources/example-datasets", ], deploySidebar: ["deploy/index"], - deployAwsSidebar: [ + /*deployAwsSidebar: [ { type: "autogenerated", dirName: "deploy/aws", }, + ],*/ + deployK8sSidebar: [ + { + type: "autogenerated", + dirName:"deploy/k8s", + }, ], agentsSidebar: [ { From 72873cb39c7ba08e3e12b877b6e1c75fd2390653 Mon Sep 17 00:00:00 2001 From: Sebastian Witalec Date: Mon, 17 Mar 2025 11:10:17 +0100 Subject: [PATCH 03/39] Add Danielle to the slack updates --- _build_scripts/slack-find-author.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/_build_scripts/slack-find-author.sh b/_build_scripts/slack-find-author.sh index b910d619..af037601 100644 --- a/_build_scripts/slack-find-author.sh +++ b/_build_scripts/slack-find-author.sh @@ -10,6 +10,7 @@ git_slack_map=( ["Charlie Harr"]="<@U044XTHRVFA>" ["Connor Shorten"]="<@U03FRH53SUT>" ["Daniel Madalitso Phiri"]="<@U060UJ41YBC>" + ["DanielleWashington"]="<@U088SBVDCET>" ["Dirk Kulawiak"]="<@U03MWHK4KV3>" ["Duda Nogueira"]="<@U05K3K9M82F>" ["dyma solovei"]="<@U07NGR323JR>" From 8ee5f9aaa8301b0bbe14f605c1083df172b5ea96 Mon Sep 17 00:00:00 2001 From: DanielleWashington <101582095+DanielleWashington@users.noreply.github.com> Date: Mon, 17 Mar 2025 11:01:13 -0400 Subject: [PATCH 04/39] fixed link issue --- docs/agents/transformation/tutorial-enrich-dataset.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/agents/transformation/tutorial-enrich-dataset.mdx b/docs/agents/transformation/tutorial-enrich-dataset.mdx index 43b46daf..f457fa6a 100644 --- a/docs/agents/transformation/tutorial-enrich-dataset.mdx +++ b/docs/agents/transformation/tutorial-enrich-dataset.mdx @@ -72,7 +72,7 @@ Now, let's get started by setting up a Weaviate Cloud instance that we will use 1. Take note of the `REST Endpoint` and `Admin` API key to connect to your cluster. (for more info, check out the [quickstart](/docs/cloud/quickstart#22-connect-to-your-weaviate-cloud-instance)) :::tip -In this tutorial, we are using the [Weaviate Embeddings](../../weaviate/model-providers/weaviate) service as the vectorizer, so you do not have to provide any extra keys for external embedding providers. Weaviate Embeddings uses the `Snowflake/snowflake-arctic-embed-l-v2.0` as the default embedding model.

+In this tutorial, we are using the [Weaviate Embeddings](../../weaviate/model-providers/weaviate/index.md) service as the vectorizer, so you do not have to provide any extra keys for external embedding providers. Weaviate Embeddings uses the `Snowflake/snowflake-arctic-embed-l-v2.0` as the default embedding model.

If you want to use another vectorizer, check out the list of supported [model providers](../../weaviate/model-providers/index.md). ::: From 1b623c76b4a5dd5042fceef821d7990037c57974 Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Mon, 17 Mar 2025 13:26:59 -0400 Subject: [PATCH 05/39] updated per Sebastian's review and feedback --- docs/deploy/k8s/k8s-poc.md | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/docs/deploy/k8s/k8s-poc.md b/docs/deploy/k8s/k8s-poc.md index f9fe383c..befce92f 100644 --- a/docs/deploy/k8s/k8s-poc.md +++ b/docs/deploy/k8s/k8s-poc.md @@ -43,7 +43,7 @@ Check out the Academy course [“Run Weaviate on Kubernetes”](https://weaviat - Configure an ingress controller to securely expose Weaviate. - Enable TLS with a certificate manager and enforce TLS encryption for all client-server communication. - Assign a domain name for external access. -- Implement RBAC to restrict user access. +- Implement RBAC to restrict user access: ```yaml authorization: @@ -52,6 +52,13 @@ authorization: # root_users: # - admin_user1 # - admin_user2 +``` + +[Configuring RBAC](/docs/weaviate/configuration/rbac/configuration.md) + +- **Optional**: Implement admin lists (if not using RBAC): + +```yaml admin_list: enabled: true # users: @@ -63,16 +70,20 @@ authorization: # - readonly_user2 # - api-key-user-readOnly ``` +::: tip +Using an admin list will allow you to define your admin or read-only user/API-key pairs across all Weaviate resources. Whereas RBAC allows you more granular permissions by defining roles and assigning them to users either via API keys or OIDC. +::: +[Admin List Configuration](/docs/weaviate/configuration/authorization.md#admin-list-kubernetes) ### Step 3: Scaling -- Implement horizontal scaling to ensure high availability. +- Implement horizontal scaling to ensure high availability: ```yaml replicaCount: 3 ``` -- Define CPU/memory limits and requests to optimize pod efficiency. +- Define CPU/memory limits and requests to optimize pod efficiency: ```yaml resources: @@ -86,7 +97,7 @@ resources: ### Step 4: Monitoring and Logging -- Use Prometheus and Grafana to collect and analyze performance metrics. +- Use Prometheus and Grafana to collect and analyze performance metrics: ```yaml serviceMonitor: @@ -99,7 +110,7 @@ serviceMonitor: ### Step 5: Upgrades and Backups -- Use the rolling update strategy used by Helm to minimize downtime. +- Use the rolling update strategy used by Helm to minimize downtime: ```yaml updateStrategy: From 5994c6d9fa21e678774aa2e9a560b27fe6c2d454 Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Mon, 17 Mar 2025 21:16:14 -0400 Subject: [PATCH 06/39] updated per JP's review and feedback --- docs/deploy/index.mdx | 16 +++++++++++----- docs/deploy/k8s/k8s-poc.md | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/docs/deploy/index.mdx b/docs/deploy/index.mdx index 35f4a93b..49fd5fac 100644 --- a/docs/deploy/index.mdx +++ b/docs/deploy/index.mdx @@ -5,10 +5,16 @@ sidebar_position: 0 --- # Deploying to Weaviate + +:::info[Section under construction!] + +This is a new section being created, please bear with us as we add in new content! + +::: + Weaviate offers multiple deployment options to satisfy your specific use case in production. -Use this page to help you find all that you need to successfully deploy and optimize Weaviate in your environment. -In this section of the docs, you will find common deployment topics, including Kubernetes, cloud providers, and best practices, along with detailed tutorials and how-to guides. +This section hosts common deployment topics, including Kubernetes, cloud providers, and best practices, along with detailed tutorials and how-to guides. Weaviate is designed for: - **Scalability** – Handle billions of vector data points efficiently. @@ -20,7 +26,7 @@ Weaviate is designed for: Choose the best deployment method based on your needs: -- **Serverless Cloud** - The easiest deployment setup to test out your Weaviate use case. -- **Enterprise Cloud -** Deploy on dedicated resources in a secure, highly available environment. -- **Bring Your Own Cloud (BYOC)** – Have a fully managed deployment within your own cloud environment. +- [**Serverless Cloud** ](https://weaviate.io/deployment/serverless)- The easiest deployment setup to test out your Weaviate use case. +- [**Enterprise Cloud -**](https://weaviate.io/deployment/enterprise-cloud) Deploy on dedicated resources in a secure, highly available environment. +- [**Bring Your Own Cloud (BYOC)**](https://weaviate.io/deployment/byoc) – Have a fully managed deployment within your own cloud environment. diff --git a/docs/deploy/k8s/k8s-poc.md b/docs/deploy/k8s/k8s-poc.md index befce92f..79ceb337 100644 --- a/docs/deploy/k8s/k8s-poc.md +++ b/docs/deploy/k8s/k8s-poc.md @@ -70,7 +70,7 @@ authorization: # - readonly_user2 # - api-key-user-readOnly ``` -::: tip +:::tip Using an admin list will allow you to define your admin or read-only user/API-key pairs across all Weaviate resources. Whereas RBAC allows you more granular permissions by defining roles and assigning them to users either via API keys or OIDC. ::: From d809573a66f86d9a5b29b9d5a666c2307a9b2356 Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Tue, 18 Mar 2025 12:24:00 -0400 Subject: [PATCH 07/39] updating with edits --- docs/deploy/k8s/k8s-poc.md | 69 ++++++++++++++++--------- docs/deploy/k8s/production-readiness.md | 12 +---- 2 files changed, 47 insertions(+), 34 deletions(-) diff --git a/docs/deploy/k8s/k8s-poc.md b/docs/deploy/k8s/k8s-poc.md index 79ceb337..986e5dd4 100644 --- a/docs/deploy/k8s/k8s-poc.md +++ b/docs/deploy/k8s/k8s-poc.md @@ -2,7 +2,7 @@ ## Introduction -You are a developer who has already deployed Weaviate on a test cluster and want to take things a step further by deploying and testing Weaviate on a self-managed K8s (Kubernetes) cluster. This guide shows how to validate Weaviate’s capabilities in your enterprise environment. +Are you ready to deploy and test Weaviate on a self-managed K8s (Kubernetes) cluster? This guide shows how to validate Weaviate’s capabilities in your enterprise environment. At the end of this guide, expect to have: @@ -22,7 +22,7 @@ Before beginning, ensure that you have the following: :::note -Check out the Academy course [“Run Weaviate on Kubernetes”](https://weaviate.io/developers/academy/deployment/k8s) if you need assistance. +Check out the Academy course [“Run Weaviate on Kubernetes”](https://weaviate.io/developers/academy/deployment/k8s) if you need assistance. ::: @@ -34,7 +34,13 @@ Check out the Academy course [“Run Weaviate on Kubernetes”](https://weaviat ### Step 1: Configure your Helm Chart -- Use the official [Weaviate Helm chart](https://github.com/weaviate/weaviate-helm) for your installation. +- Use the official [Weaviate Helm chart](https://github.com/weaviate/weaviate-helm) for your installation: + +``` + helm repo add weaviate https://weaviate.github.io/weaviate-helm + helm install my-weaviate weaviate/weaviate +``` + - Customize the values to fit your enterprise requirements (e.g., resource allocation, storage settings). - Deploy the chart and verify pod health. @@ -43,33 +49,38 @@ Check out the Academy course [“Run Weaviate on Kubernetes”](https://weaviat - Configure an ingress controller to securely expose Weaviate. - Enable TLS with a certificate manager and enforce TLS encryption for all client-server communication. - Assign a domain name for external access. -- Implement RBAC to restrict user access: +- Implement RBAC or admin lists to restrict user access. + +
+ An example of RBAC enabled on your Helm chart ```yaml -authorization: + authorization: rbac: enabled: true - # root_users: - # - admin_user1 - # - admin_user2 + root_users: + - admin_user1 + - admin_user2 ``` +
-[Configuring RBAC](/docs/weaviate/configuration/rbac/configuration.md) - -- **Optional**: Implement admin lists (if not using RBAC): +
+ An example of admin lists implemented on your Helm chart (if not using RBAC) ```yaml admin_list: enabled: true - # users: - # - admin_user1 - # - admin_user2 - # - api-key-user-admin - # read_only_users: - # - readonly_user1 - # - readonly_user2 - # - api-key-user-readOnly + users: + - admin_user1 + - admin_user2 + - api-key-user-admin + read_only_users: + - readonly_user1 + - readonly_user2 + - api-key-user-readOnly ``` +
+ :::tip Using an admin list will allow you to define your admin or read-only user/API-key pairs across all Weaviate resources. Whereas RBAC allows you more granular permissions by defining roles and assigning them to users either via API keys or OIDC. ::: @@ -83,7 +94,10 @@ Using an admin list will allow you to define your admin or read-only user/API-ke replicaCount: 3 ``` -- Define CPU/memory limits and requests to optimize pod efficiency: +- Define CPU/memory limits and requests to optimize pod efficiency. + +
+ An example of defining CPU and memory limits and cores ```yaml resources: @@ -94,10 +108,15 @@ resources: cpu: "2" memory: "4Gi" ``` +
### Step 4: Monitoring and Logging -- Use Prometheus and Grafana to collect and analyze performance metrics: +- Use Prometheus and Grafana to collect and analyze performance metrics. +- Implement alerting for issue resolution. + +
+ An example of enabling service monitoring ```yaml serviceMonitor: @@ -105,12 +124,15 @@ serviceMonitor: interval: 30s scrapeTimeout: 10s ``` +
-- Implement alerting for issue resolution. ### Step 5: Upgrades and Backups -- Use the rolling update strategy used by Helm to minimize downtime: +- Use the rolling update strategy used by Helm to minimize downtime. + +
+ An example of configuring the rolling update strategy. ```yaml updateStrategy: @@ -119,6 +141,7 @@ updateStrategy: maxSurge: 1 maxUnavailable: 0 ``` +
- Test new Weaviate versions before deploying into production. - Implement disaster recovery procedures to ensure that data is restored quickly. diff --git a/docs/deploy/k8s/production-readiness.md b/docs/deploy/k8s/production-readiness.md index 34bc8687..00ec8366 100644 --- a/docs/deploy/k8s/production-readiness.md +++ b/docs/deploy/k8s/production-readiness.md @@ -35,7 +35,7 @@ Think you’re ready for production? Ensuring that your Weaviate cluster is prod - [ ] Is the *“principle of least privilege”* being followed? - [ ] Are your container security defaults set properly? - [ ] Is access to your cluster strictly limited? -- [ ] Has RBAC been implemented to restrict access? +- [ ] Has [RBAC](/docs/weaviate/configuration/rbac/index.mdx) been implemented to restrict access? - [ ] Have network policies been implemented to limit pod-to-pod communication? - [ ] Are secrets secured with K8s Secrets or a vault solution? - [ ] Do you have a process for when secrets are exposed, when access is lost to a key or certificate, and when secrets need to be rotated? @@ -53,13 +53,3 @@ Evaluate these key areas to build a highly available, resilient, and efficient d :::tip If you *do* identify gaps within your deployment, be sure to reach out to your SE (sales engineer) who can help steer you on the path to production success! ::: - -#### Additional Resources - -- [Replication](/docs/weaviate/configuration/replication.md) -- [Horizontal Scaling](/docs/weaviate/concepts/cluster.md) -- [Storage](/docs/weaviate/concepts/storage.md) -- [RBAC](/docs/weaviate/configuration/rbac/index.mdx) -- [Backups](/docs/weaviate/configuration/backups.md) -- [Persistence](/docs/weaviate/configuration/persistence.md) -- [Monitoring](/docs/weaviate/configuration/monitoring.md) From 6e32f70295a89fd39ef6c88f9b2f85a0f58580f7 Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Tue, 18 Mar 2025 12:50:00 -0400 Subject: [PATCH 08/39] adding front matter to change sidebar label --- docs/deploy/k8s/production-readiness.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/deploy/k8s/production-readiness.md b/docs/deploy/k8s/production-readiness.md index 00ec8366..3a85e978 100644 --- a/docs/deploy/k8s/production-readiness.md +++ b/docs/deploy/k8s/production-readiness.md @@ -1,3 +1,7 @@ +--- +sidebar_label: Production Readiness Self-Assessment +--- + # Kubernetes Production Readiness Self-Assessment Think you’re ready for production? Ensuring that your Weaviate cluster is production-ready requires careful planning, configuration, and ongoing maintenance. Ensuring that you have a stable, reliable deployment requires you to think of your *ending* at the *beginning.* This guide provides you with introspective questions to assess readiness and identify any potential gaps before moving your workloads into production. From 8ca1f81a36156e69dd048f07742e7084a43baf0c Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Tue, 18 Mar 2025 13:00:52 -0400 Subject: [PATCH 09/39] updating with edits --- docs/deploy/index.mdx | 2 +- docs/deploy/k8s/k8s-poc.md | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/docs/deploy/index.mdx b/docs/deploy/index.mdx index 49fd5fac..19a5c3b3 100644 --- a/docs/deploy/index.mdx +++ b/docs/deploy/index.mdx @@ -4,7 +4,7 @@ description: Deployment overview page sidebar_position: 0 --- -# Deploying to Weaviate +# Deploying Weaviate :::info[Section under construction!] diff --git a/docs/deploy/k8s/k8s-poc.md b/docs/deploy/k8s/k8s-poc.md index 986e5dd4..fabb9cfd 100644 --- a/docs/deploy/k8s/k8s-poc.md +++ b/docs/deploy/k8s/k8s-poc.md @@ -11,11 +11,11 @@ At the end of this guide, expect to have: - TLS, RBAC, and security best practices implements - Monitoring, logging, and backup strategies enabled -## Prerequisites +### Prerequisites Before beginning, ensure that you have the following: -### Technical Knowledge +#### Technical Knowledge - Basic Kubernetes and containerization conceptual knowledge - Basic experience with Helm and `kubectl` @@ -26,13 +26,13 @@ Check out the Academy course [“Run Weaviate on Kubernetes”](https://weaviate ::: -### Required Tools +#### Required Tools - A running Kubernetes cluster with Weaviate installed - `kubectl` installed - Helm installed -### Step 1: Configure your Helm Chart +## Step 1: Configure your Helm Chart - Use the official [Weaviate Helm chart](https://github.com/weaviate/weaviate-helm) for your installation: @@ -44,7 +44,7 @@ Check out the Academy course [“Run Weaviate on Kubernetes”](https://weaviate - Customize the values to fit your enterprise requirements (e.g., resource allocation, storage settings). - Deploy the chart and verify pod health. -### Step 2: Network Security +## Step 2: Network Security - Configure an ingress controller to securely expose Weaviate. - Enable TLS with a certificate manager and enforce TLS encryption for all client-server communication. @@ -79,14 +79,15 @@ Check out the Academy course [“Run Weaviate on Kubernetes”](https://weaviate - readonly_user2 - api-key-user-readOnly ``` +[Admin List Configuration](/docs/weaviate/configuration/authorization.md#admin-list-kubernetes) + :::tip Using an admin list will allow you to define your admin or read-only user/API-key pairs across all Weaviate resources. Whereas RBAC allows you more granular permissions by defining roles and assigning them to users either via API keys or OIDC. ::: -[Admin List Configuration](/docs/weaviate/configuration/authorization.md#admin-list-kubernetes) -### Step 3: Scaling +## Step 3: Scaling - Implement horizontal scaling to ensure high availability: @@ -110,7 +111,7 @@ resources: ``` -### Step 4: Monitoring and Logging +## Step 4: Monitoring and Logging - Use Prometheus and Grafana to collect and analyze performance metrics. - Implement alerting for issue resolution. @@ -127,7 +128,7 @@ serviceMonitor: -### Step 5: Upgrades and Backups +## Step 5: Upgrades and Backups - Use the rolling update strategy used by Helm to minimize downtime. From 60d478713e2627bc1bc38fc4e7d55dd739f571a5 Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Tue, 18 Mar 2025 19:33:49 -0400 Subject: [PATCH 10/39] removed unsupported byoc integrations --- docs/deploy/k8s/index.mdx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/deploy/k8s/index.mdx b/docs/deploy/k8s/index.mdx index e0c2676b..902aec50 100644 --- a/docs/deploy/k8s/index.mdx +++ b/docs/deploy/k8s/index.mdx @@ -1,6 +1,7 @@ # Kubernetes and Weaviate Weaviate leverages Kubernetes for scalable, resilient, and production-grade deployments. +This section provides guides, best practices, and tutorials for making the best of your Kubernetes deployments. ## Deployment Options @@ -15,7 +16,4 @@ Weaviate can use Kubernetes in a variety of deployments: ### Bring Your Own Cloud - Amazon EKS (Elastic Kubernetes Service) -- Google Kubernetes Engine (GKE) -- Azure Kubernetes Service (AKS) -This section provides guides, best practices, and tutorials for making the best of your Kubernetes deployments. \ No newline at end of file From 7471adf89a196b7fd1618852a33aff43225ed125 Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Wed, 19 Mar 2025 23:12:19 -0400 Subject: [PATCH 11/39] added additional questions --- docs/deploy/k8s/index.mdx | 2 +- docs/deploy/k8s/production-readiness.md | 37 +++++++++++++++++++++---- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/docs/deploy/k8s/index.mdx b/docs/deploy/k8s/index.mdx index 902aec50..cc99159f 100644 --- a/docs/deploy/k8s/index.mdx +++ b/docs/deploy/k8s/index.mdx @@ -5,7 +5,7 @@ This section provides guides, best practices, and tutorials for making the best ## Deployment Options -Weaviate can use Kubernetes in a variety of deployments: +Weaviate can use Kubernetes in a variety of deployments for your enterprise environment: ### Enterprise Cloud diff --git a/docs/deploy/k8s/production-readiness.md b/docs/deploy/k8s/production-readiness.md index 3a85e978..fab9e81a 100644 --- a/docs/deploy/k8s/production-readiness.md +++ b/docs/deploy/k8s/production-readiness.md @@ -9,29 +9,56 @@ Think you’re ready for production? Ensuring that your Weaviate cluster is prod ### High Availability and Resilience - [ ] Are your clusters deployed across multiple availability zones (AZs) or regions to prevent downtime? +- [ ] Are you running Weaviate in a highly available setup with a 3-node minimum? +- [ ] Have you configured your schema to use a replication factor of 3 to ensure copies of data are available during node outage? - [ ] Are replicas deployed across multiple nodes for redundancy? - [ ] Is your control plane highly available? - [ ] Is your application fault-tolerant *without* your control plane? -- [ ] Are the worker nodes distributed across multiple zones to mitigate failures? - [ ] Are there automatic node repair or self-healing mechanisms in place? - [ ] Have failover scenarios been tested to validate resilience? - [ ] Are you utilizing Weaviate’s backup capabilities for disaster recovery? - [ ] How often are these mechanisms tested? - [ ] Has the ability to recover from a node failure or database corruption been tested? +- [ ] Have you thought about the retention period of backups? + - [ ] How do you clean up any out-of-date backups? - [ ] Are rolling updates performed to avoid downtime? - [ ] Are canary deployments implemented to safely test new releases? - [ ] Do you have development or test environments to safely test changes? +### Data Ingestion and Query Performance + +- [ ] Is there a strategy for handling heavy ingestion loads? +- [ ] Has the percentage of resources for indexing vs querying applications been specified? +- [ ] Is there a defined strategy for data deduplication and cleanup before ingestion? +- [ ] How frequently is data added, updated, or deleted? + - [ ] Is data updated in place or mostly append-only + - [ ] How often do deletion operations trigger garbage collection? +- [ ] Have you implemented a scheduling strategy for large ingestion jobs? +- [ ] Have you tested query performance under load? + - [ ] Is query performance monitored using Prometheus or Grafana? +- [ ] Have replica shards been deployed for load balancing and failover support? + + ### Resource Management - [ ] Have you considered your data’s consumption pattern(s)? - [ ] Has your memory allocation been right-sized to match workload demand? - [ ] Has your storage/compute allocation also been right-sized to match workload demand? - [ ] Is there a process to delete old or unused objects? -- [ ] Have multiple replicas been configured to balance read-heavy workloads? -- [ ] Has the proper storage class been selected for your needs? - - [ ] Does your storage class support volume expansion so that you can support growth over time? -- [ ] Is the data within your cluster properly backed up, including the persistent storage? +- [ ] Have multiple replicas been configured to balance read-heavy workloads? +- [ ] Has the proper storage class been selected for your needs? + - [ ] Does your storage class support volume expansion so that you can support growth over time? +- [ ] Is the data within your cluster properly backed up, including the persistent storage? +- [ ] Is the sharding strategy aligned with the size and access patterns of the dataset? +- [ ] Is `GOMEMLIMIT` properly configured for memory management? + - [ ] Is `GOMEMLIMIT` set based on available system memory to prevent excessive garbage collection pauses? +- [ ] Have you considered vector quantization techniques to reduce memory requirements? + +### Tenant State Management + +- [ ] Are you implementing multi-tenancy? + - [ ] Are there limits or quotas per tenant to avoid noisy neighbor issues? +- [ ] Is there a strategy for offloading inactive tenant data? ### Security From ee628de48fa68e62452c1a7a2a2a9ce8ca71274d Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Fri, 21 Mar 2025 21:41:20 -0400 Subject: [PATCH 12/39] production section added and k8s prod docs moved --- .../{k8s => production/Kubernetes}/index.mdx | 4 +- .../{k8s => production/Kubernetes}/k8s-poc.md | 0 .../Kubernetes}/production-readiness.md | 0 docs/deploy/production/index.mdx | 37 +++++++++++++++++++ secondaryNavbar.js | 1 + sidebars.js | 11 +++++- 6 files changed, 49 insertions(+), 4 deletions(-) rename docs/deploy/{k8s => production/Kubernetes}/index.mdx (86%) rename docs/deploy/{k8s => production/Kubernetes}/k8s-poc.md (100%) rename docs/deploy/{k8s => production/Kubernetes}/production-readiness.md (100%) create mode 100644 docs/deploy/production/index.mdx diff --git a/docs/deploy/k8s/index.mdx b/docs/deploy/production/Kubernetes/index.mdx similarity index 86% rename from docs/deploy/k8s/index.mdx rename to docs/deploy/production/Kubernetes/index.mdx index cc99159f..971bf23f 100644 --- a/docs/deploy/k8s/index.mdx +++ b/docs/deploy/production/Kubernetes/index.mdx @@ -1,7 +1,7 @@ -# Kubernetes and Weaviate +# Kubernetes Weaviate leverages Kubernetes for scalable, resilient, and production-grade deployments. -This section provides guides, best practices, and tutorials for making the best of your Kubernetes deployments. +This section provides guides, best practices, and tutorials for making the best of your Kubernetes deployments in production. ## Deployment Options diff --git a/docs/deploy/k8s/k8s-poc.md b/docs/deploy/production/Kubernetes/k8s-poc.md similarity index 100% rename from docs/deploy/k8s/k8s-poc.md rename to docs/deploy/production/Kubernetes/k8s-poc.md diff --git a/docs/deploy/k8s/production-readiness.md b/docs/deploy/production/Kubernetes/production-readiness.md similarity index 100% rename from docs/deploy/k8s/production-readiness.md rename to docs/deploy/production/Kubernetes/production-readiness.md diff --git a/docs/deploy/production/index.mdx b/docs/deploy/production/index.mdx new file mode 100644 index 00000000..1c61ce9b --- /dev/null +++ b/docs/deploy/production/index.mdx @@ -0,0 +1,37 @@ +--- + +sidebar_label: "Overview" +sidebar_position: 0 + +--- + +# Production Environments + +Deploying Weaviate in a production environment requires careful planning to ensure stability, security, and performance. +Unlike development or testing environments, a production instance must be resilient, scalable, and optimized for real-world workloads. + +## Key Aspects of a Production Environments + +- **Scalability and Performance** + - Production workloads demand high availability and low latency. + - Auto-scaling strategies and resource monitoring must be in place. +- **Data Resilience and Backups** + - Data must be safeguarded against corruption and loss. + - Disaster recover strategies and automated backups must be implemented. +- **Security and Compliance** + - Data at rest and in transit should be encrypted. + - liance best practices must be followed. +- **Monitoring and Observability** + - Logs and metrics must be collected for troubleshooting and optimization. + - Monitoring tools should be used to track performance. + - Alerting mechanisms must be set up to detect any anaomolies or failures. +- **Networking and Access Control** + - Privileges should be limited using RBAC (role-based access control). + - Load balancing should be configured. + +### Weaviate Production Environments +Weaviate has different options for deploying in a production environment using: + +- **Serverless Cloud**: A Serverless Cloud instance is a robust cluster designed for production use. +- **Enterprise Cloud**: Enterprise Cloud is a fully-managed deployment of dedicated resources within a secure, highly available environment. +- **Bring Your Own Cloud (BYOC)**: Using your own cloud environment, you are able to have a fully managed deployed. \ No newline at end of file diff --git a/secondaryNavbar.js b/secondaryNavbar.js index 85ee39cc..f86a9f6f 100644 --- a/secondaryNavbar.js +++ b/secondaryNavbar.js @@ -51,6 +51,7 @@ const secondaryNavbarItems = { links: [ { label: "Get Started", link: "/docs/deploy", sidebar: "deploySidebar" }, { label: "Kubernetes", link: "/docs/deploy/k8s", sidebar: "deployK8sSidebar" }, + { label: "Production", link: "/docs/deploy/production", sidebar: "deployProductionSidebar"}, /*{ label: "AWS", link: "/docs/deploy/aws", sidebar: "deployAwsSidebar" },*/ ], }, diff --git a/sidebars.js b/sidebars.js index 94c34a05..18aa2cda 100644 --- a/sidebars.js +++ b/sidebars.js @@ -415,10 +415,17 @@ const sidebars = { dirName: "deploy/aws", }, ],*/ - deployK8sSidebar: [ + /*deployK8sSidebar: [ { type: "autogenerated", - dirName:"deploy/k8s", + dirName: "deploy/k8s", + }, + ],*/ + deployProductionSidebar: [ + { + type: "autogenerated", + dirName: "deploy/production", + }, ], agentsSidebar: [ From a02e7573809379db1ef9800a139871e028fe5f3e Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Fri, 21 Mar 2025 21:47:12 -0400 Subject: [PATCH 13/39] hiding k8s on secondary navbar --- secondaryNavbar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/secondaryNavbar.js b/secondaryNavbar.js index f86a9f6f..5e45cc42 100644 --- a/secondaryNavbar.js +++ b/secondaryNavbar.js @@ -50,7 +50,7 @@ const secondaryNavbarItems = { link: "/docs/deploy", links: [ { label: "Get Started", link: "/docs/deploy", sidebar: "deploySidebar" }, - { label: "Kubernetes", link: "/docs/deploy/k8s", sidebar: "deployK8sSidebar" }, + /*{ label: "Kubernetes", link: "/docs/deploy/k8s", sidebar: "deployK8sSidebar" },*/ { label: "Production", link: "/docs/deploy/production", sidebar: "deployProductionSidebar"}, /*{ label: "AWS", link: "/docs/deploy/aws", sidebar: "deployAwsSidebar" },*/ ], From 57db8e0269dd033ab84e153669522816b0f253c2 Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Sat, 22 Mar 2025 21:53:27 -0400 Subject: [PATCH 14/39] migrating docker and k8s installation guides, adding cards to deployment landing page --- docs/deploy/aws/_category_.json | 4 - docs/deploy/aws/index.mdx | 52 --- docs/deploy/index.mdx | 74 ++- .../docker-installation.md | 438 ++++++++++++++++++ .../installation-guides/k8s-installation.md | 254 ++++++++++ docs/deploy/k8s/_category_.json | 4 - docs/deploy/production/Kubernetes/index.mdx | 6 + secondaryNavbar.js | 2 +- sidebars.js | 17 +- 9 files changed, 785 insertions(+), 66 deletions(-) delete mode 100644 docs/deploy/aws/_category_.json delete mode 100644 docs/deploy/aws/index.mdx create mode 100644 docs/deploy/installation-guides/docker-installation.md create mode 100644 docs/deploy/installation-guides/k8s-installation.md delete mode 100644 docs/deploy/k8s/_category_.json diff --git a/docs/deploy/aws/_category_.json b/docs/deploy/aws/_category_.json deleted file mode 100644 index 13cc9bd6..00000000 --- a/docs/deploy/aws/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "AWS", - "position": 1 -} \ No newline at end of file diff --git a/docs/deploy/aws/index.mdx b/docs/deploy/aws/index.mdx deleted file mode 100644 index 713a3823..00000000 --- a/docs/deploy/aws/index.mdx +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: AWS and Weaviate -description: AWS docs -sidebar_position: 0 ---- - -# Tacetve a gemit quisquam praestat meruisse gradientis - -## Nec sum vagatur nupta tantus - -Lorem markdownum pugnando ventoque et ducta et et adurat locus inde cervos -refeci Phaethon clivum linguaque Salmacis geras coeperat mollia. Leucothoen Ceyx -est viret nostraque; meum utque latens -quae, patrios plebe inpositum: torvum. **Stipite fluminaque videri**; ictu -duabus sua *condita monstrum*. Imo undis: aut niveo sidoniae; placato sorores -at, quae perque. *Candore dolore*, et secum rastra ceratis et sollicitat vincula -matri mei alios in rigore murmur foedataque, cum. - -Et solvit ex comitante super luctus. Unda posse perque venitque quod algae -lymphis postquam optime. - -## Flammis levi harena illi membra caudam - -Ipse inducitur stridore Aiacem intonsum! Est arma, hausitque *tu* litora -aetasque, at fuit Aegea vides. Non laborum longi fortisque *putes bracchia* -umbras te fingit enim manum! - -Ingentia sive Idaeo serpere, dives inpia. Oculos in aras ergo bracchiaque vera, -omnis solutus vellet: et. Est et putat nec obvia unda -totidem amisit *coniurataeque sic arabat* mea. Caune -quodque **addita** truncis quid latebra: incubat pallorque turribus et ignarus -signum pectore quicquid Abantiades locus. **Ante** aliqua Aiacis deferre, ferunt -hunc omnia, et hic Aconteus nec. - -Odit festas dixit et quas fidissima, *est umbrae matrona* palude. Ait et quod -pectora circa. - -## Elegit sim ulla poteramus stridente cessit auras - -Tanta *Elinque*. Mea quae cultum Palameden Aglauros si sacra miserere quam ego, -**e scires** imo sonitusque tumidarum fremit quae ictu? Tum est sub vate vasto, -Galanthida in potui huc et temptat Cenaeo praeterque septem caede. - -> Suo ipse cubitique et vento in onerosa adunco, non. **In paelice Quirites** -> sunt stant sinebat superstes differt non per potentia illiusque nostris -> Hecateidos? Tempore haud imagine facta ora, uni quam fatorum. - -Altis animalibus pampinus venit mirabilis busto: tamen hunc, **salutant** -Stheneleia vultibus pectore. Evocat posuere anxia. - -Aper est; in tuum medius, responderat tamen: magis vix! Amor regno tamen tuli -remige facitote **reverentia**: loqui vade pignora. diff --git a/docs/deploy/index.mdx b/docs/deploy/index.mdx index 19a5c3b3..d88d5afc 100644 --- a/docs/deploy/index.mdx +++ b/docs/deploy/index.mdx @@ -1,9 +1,13 @@ --- -title: Deployment Overview +title: Overview description: Deployment overview page sidebar_position: 0 --- +import CardsSection from "/src/components/CardsSection"; +import DeploymentCards from "/src/components/DeploymentCards"; +import styles from "/src/components/CardsSection/styles.module.scss"; + # Deploying Weaviate :::info[Section under construction!] @@ -26,7 +30,69 @@ Weaviate is designed for: Choose the best deployment method based on your needs: -- [**Serverless Cloud** ](https://weaviate.io/deployment/serverless)- The easiest deployment setup to test out your Weaviate use case. -- [**Enterprise Cloud -**](https://weaviate.io/deployment/enterprise-cloud) Deploy on dedicated resources in a secure, highly available environment. -- [**Bring Your Own Cloud (BYOC)**](https://weaviate.io/deployment/byoc) – Have a fully managed deployment within your own cloud environment. +export const deploymentCardsData = [ + { + tabs: [ + { label: "Evaluation", active: true }, + { label: "Deployment", active: true }, + { label: "Production", active: true }, + ], + header: "Weaviate Cloud", + bgImage: "/img/site/hex-weaviate.svg", + bgImageLight: "/img/site/hex-weaviate-light.svg", + listItems: [ + "From evaluation (sandbox) to production", + "Serverless (infrastructure managed by Weaviate)", + "(Optional) Data replication (high-availability)", + "(Optional) Zero-downtime updates", + ], + button: { + text: "Set up a WCD instance", + link: "/docs/cloud/manage-clusters/create", + }, + }, + { + tabs: [ + { label: "Evaluation", active: true }, + { label: "Deployment", active: true }, + { label: "Production", active: false }, + ], + header: "Docker", + bgImage: "/img/site/docker-doc-icon.svg", + bgImageLight: "/img/site/docker-doc-icon-light.svg", + listItems: [ + "For local evaluation & development", + "Local inference containers", + "Multi-modal models", + "Customizable configurations", + ], + button: { + text: "Deploy Weaviate with Docker", + link: "/docs/deploy/installation-guides/docker-installation", + }, + }, + { + tabs: [ + { label: "Evaluation", active: false }, + { label: "Deployment", active: true }, + { label: "Production", active: true }, + ], + header: "Kubernetes", + bgImage: "/img/site/kubernetes-doc-icon.svg", + bgImageLight: "/img/site/kubernetes-doc-icon-light.svg", + listItems: [ + "From development to production", + "Local inference containers", + "Multi-modal models", + "Customizable configurations", + "Self-deploy or Marketplace deployment", + "(Optional) Zero-downtime updates", + ], + button: { + text: "Deploy Weaviate with Kubernetes", + link: "/docs/deploy/installation-guides/k8s-installation", + }, + }, +]; + \ No newline at end of file diff --git a/docs/deploy/installation-guides/docker-installation.md b/docs/deploy/installation-guides/docker-installation.md new file mode 100644 index 00000000..7191ec9f --- /dev/null +++ b/docs/deploy/installation-guides/docker-installation.md @@ -0,0 +1,438 @@ +--- +title: Docker +image: og/docs/installation.jpg +# tags: ['installation', 'Docker'] +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Weaviate supports deployment with Docker. + +You can [run Weaviate with default settings from a command line](#run-weaviate-with-default-settings), or [customize your configuration](#customize-your-weaviate-configuration) by creating your own `docker-compose.yml` file. + +## Run Weaviate with default settings + +:::info Added in v1.24.1 + +::: + +To run Weaviate with Docker using default settings, run this command from from your shell: + +```bash +docker run -p 8080:8080 -p 50051:50051 cr.weaviate.io/semitechnologies/weaviate:||site.weaviate_version|| +``` + +The command sets the following default [environment variables](#environment-variables) in the container: + +- `PERSISTENCE_DATA_PATH` defaults to `./data` +- `AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED` defaults to `true`. +- `QUERY_DEFAULTS_LIMIT` defaults to `10`. + +## Customize your Weaviate configuration + +You can customize your Weaviate configuration by creating a `docker-compose.yml` file. Start from our [sample Docker Compose file](#sample-docker-compose-file), or use the interactive [Configurator](#configurator) to generate a `docker-compose.yml` file. + +## Sample Docker Compose file + +This starter Docker Compose file allows: +* Use of any [API-based model provider integrations](../model-providers/index.md) (e.g. `OpenAI`, `Cohere`, `Google`, and `Anthropic`). + * This includes the relevant embedding model, generative, and reranker [integrations](../model-providers/index.md). +* Searching pre-vectorized data (without a vectorizer). +* Mounts a persistent volume called `weaviate_data` to `/var/lib/weaviate` in the container to store data. + +### Download and run + + + + +Save the code below as `docker-compose.yml` to download and run Weaviate with anonymous access enabled: + +```yaml +--- +services: + weaviate: + command: + - --host + - 0.0.0.0 + - --port + - '8080' + - --scheme + - http + image: cr.weaviate.io/semitechnologies/weaviate:||site.weaviate_version|| + ports: + - 8080:8080 + - 50051:50051 + volumes: + - weaviate_data:/var/lib/weaviate + restart: on-failure:0 + environment: + QUERY_DEFAULTS_LIMIT: 25 + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' + PERSISTENCE_DATA_PATH: '/var/lib/weaviate' + ENABLE_API_BASED_MODULES: 'true' + CLUSTER_HOSTNAME: 'node1' +volumes: + weaviate_data: +... +``` + +:::caution +Anonymous access is strongly discouraged except for development or evaluation purposes. +::: + + + + +Save the code below as `docker-compose.yml` to download and run Weaviate with authentication (non-anonymous access) and authorization enabled: + +```yaml +--- +services: + weaviate: + command: + - --host + - 0.0.0.0 + - --port + - '8080' + - --scheme + - http + image: cr.weaviate.io/semitechnologies/weaviate:||site.weaviate_version|| + ports: + - 8080:8080 + - 50051:50051 + volumes: + - weaviate_data:/var/lib/weaviate + restart: on-failure:0 + environment: + QUERY_DEFAULTS_LIMIT: 25 + PERSISTENCE_DATA_PATH: '/var/lib/weaviate' + ENABLE_API_BASED_MODULES: 'true' + CLUSTER_HOSTNAME: 'node1' + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'false' + AUTHENTICATION_APIKEY_ENABLED: 'true' + AUTHENTICATION_APIKEY_ALLOWED_KEYS: 'user-a-key,user-b-key' + AUTHENTICATION_APIKEY_USERS: 'user-a,user-b' + AUTHORIZATION_ENABLE_RBAC: 'true' + AUTHORIZATION_RBAC_ROOT_USERS: 'user-a' +volumes: + weaviate_data: +... +``` + +This setup enables API-key based [authentication](/docs/weaviate/configuration/authentication.md) and role-based access control [authorization](/docs/weaviate/configuration/authorization.md). + +It defines the users `user-a` and `user-b` and corresponding keys `user-a-key` and `user-b-key` which serve as authentication credentials for connecting to your Weaviate instance. + +The user `user-a` is granted admin access rights using the **Role-based access control (RBAC)** method. A custom role can be assigned to the user `user-b` by following the [authorization and RBAC guide](/docs/weaviate/configuration/authorization.md). + + + + +Edit the `docker-compose.yml` file to suit your needs. You can add or remove [environment variables](#environment-variables), change the port mappings, or add additional [model provider integrations](/docs/weaviate/model-providers/index.md), such as [Ollama](/docs/weaviate/model-providers/ollama/index.md), or [Hugging Face Transformers](/docs/weaviate/model-providers/transformers/index.md). + +To start your Weaviate instance, run this command from your shell: + +```bash +docker compose up -d +``` + +## Configurator + +The Configurator can generate a `docker-compose.yml` file for you. Use the Configurator to select specific Weaviate modules, including vectorizers that run locally (i.e. `text2vec-transformers`, or `multi2vec-clip`) + +import DocsConfigGen from '@site/src/components/DockerConfigGen'; + + + +## Environment variables + +You can use environment variables to control your Weaviate setup, authentication and authorization, module settings, and data storage settings. + +:::info List of environment variables +A comprehensive of list environment variables [can be found on this page](/docs/weaviate/config-refs/env-vars.md). +::: + +## Example configurations + +Here are some examples of how to configure `docker-compose.yml`. + +### Persistent volume + +We recommended setting a persistent volume to avoid data loss as well as to improve reading and writing speeds. + +Make sure to run `docker compose down` when shutting down. This writes all the files from memory to disk. + +**With named volume** +```yaml +services: + weaviate: + volumes: + - weaviate_data:/var/lib/weaviate + # etc + +volumes: + weaviate_data: +``` + +After running a `docker compose up -d`, Docker will create a named volume `weaviate_data` and mount it to the `PERSISTENCE_DATA_PATH` inside the container. + +**With host binding** +```yaml +services: + weaviate: + volumes: + - /var/weaviate:/var/lib/weaviate + # etc +``` + +After running a `docker compose up -d`, Docker will mount `/var/weaviate` on the host to the `PERSISTENCE_DATA_PATH` inside the container. + +### Weaviate without any modules + +An example Docker Compose setup for Weaviate without any modules can be found below. In this case, no model inference is performed at either import or search time. You will need to provide your own vectors (e.g. from an outside ML model) at import and search time: + +```yaml +services: + weaviate: + image: cr.weaviate.io/semitechnologies/weaviate:||site.weaviate_version|| + ports: + - 8080:8080 + - 50051:50051 + restart: on-failure:0 + environment: + QUERY_DEFAULTS_LIMIT: 25 + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' + PERSISTENCE_DATA_PATH: '/var/lib/weaviate' + CLUSTER_HOSTNAME: 'node1' +``` + +### Weaviate with the `text2vec-transformers` module + +An example Docker Compose file with the transformers model [`sentence-transformers/multi-qa-MiniLM-L6-cos-v1`](https://huggingface.co/sentence-transformers/multi-qa-MiniLM-L6-cos-v1) is: + +```yaml +services: + weaviate: + image: cr.weaviate.io/semitechnologies/weaviate:||site.weaviate_version|| + restart: on-failure:0 + ports: + - 8080:8080 + - 50051:50051 + environment: + QUERY_DEFAULTS_LIMIT: 20 + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' + PERSISTENCE_DATA_PATH: "./data" + DEFAULT_VECTORIZER_MODULE: text2vec-transformers + ENABLE_MODULES: text2vec-transformers + TRANSFORMERS_INFERENCE_API: http://t2v-transformers:8080 + CLUSTER_HOSTNAME: 'node1' + t2v-transformers: + image: cr.weaviate.io/semitechnologies/transformers-inference:sentence-transformers-multi-qa-MiniLM-L6-cos-v1 + environment: + ENABLE_CUDA: 0 # set to 1 to enable + # NVIDIA_VISIBLE_DEVICES: all # enable if running with CUDA +``` + +Note that transformer models are neural networks built to run on GPUs. Running Weaviate with the `text2vec-transformers` module and without GPU is possible, but it will be slower. Enable CUDA with `ENABLE_CUDA=1` if you have a GPU available. + +For more information on how to set up the environment with the +`text2vec-transformers` integration, see [this +page](/docs/weaviate/model-providers/transformers/embeddings.md). + +The `text2vec-transformers` module requires at least Weaviate version `v1.2.0`. + +### Unreleased versions + +import RunUnreleasedImages from '/_includes/configuration/run-unreleased.mdx' + + + +## Multi-node configuration + +To configure Weaviate to use multiple host nodes, follow these steps: + +- Configure one node as a "founding" member +- Set the `CLUSTER_JOIN` variable for the other nodes in the cluster. +- Set the `CLUSTER_GOSSIP_BIND_PORT` for each node. +- Set the `CLUSTER_DATA_BIND_PORT` for each node. +- Set the `RAFT_JOIN` each node. +- Set the `RAFT_BOOTSTRAP_EXPECT` for each node with the number of voters. +- Optionally, set the hostname for each node using `CLUSTER_HOSTNAME`. + +(Read more about [horizontal replication in Weaviate](/docs/weaviate/concepts/cluster.md).) + +So, the Docker Compose file includes environment variables for the "founding" member that look like this: + +```yaml + weaviate-node-1: # Founding member service name + ... # truncated for brevity + environment: + CLUSTER_HOSTNAME: 'node1' + CLUSTER_GOSSIP_BIND_PORT: '7100' + CLUSTER_DATA_BIND_PORT: '7101' + RAFT_JOIN: 'node1,node2,node3' + RAFT_BOOTSTRAP_EXPECT: 3 +``` + +And the other members' configurations may look like this: + +```yaml + weaviate-node-2: + ... # truncated for brevity + environment: + CLUSTER_HOSTNAME: 'node2' + CLUSTER_GOSSIP_BIND_PORT: '7102' + CLUSTER_DATA_BIND_PORT: '7103' + CLUSTER_JOIN: 'weaviate-node-1:7100' # This must be the service name of the "founding" member node. + RAFT_JOIN: 'node1,node2,node3' + RAFT_BOOTSTRAP_EXPECT: 3 +``` + +Below is an example configuration for a 3-node setup. You may be able to test [replication](/docs/weaviate/configuration/replication.md) examples locally using this configuration. + + +
+ Docker Compose file for a replication setup with 3 nodes + +```yaml +services: + weaviate-node-1: + init: true + command: + - --host + - 0.0.0.0 + - --port + - '8080' + - --scheme + - http + image: cr.weaviate.io/semitechnologies/weaviate:||site.weaviate_version|| + ports: + - 8080:8080 + - 6060:6060 + - 50051:50051 + restart: on-failure:0 + volumes: + - ./data-node-1:/var/lib/weaviate + environment: + LOG_LEVEL: 'debug' + QUERY_DEFAULTS_LIMIT: 25 + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' + PERSISTENCE_DATA_PATH: '/var/lib/weaviate' + ENABLE_API_BASED_MODULES: 'true' + CLUSTER_HOSTNAME: 'node1' + CLUSTER_GOSSIP_BIND_PORT: '7100' + CLUSTER_DATA_BIND_PORT: '7101' + RAFT_JOIN: 'node1,node2,node3' + RAFT_BOOTSTRAP_EXPECT: 3 + + weaviate-node-2: + init: true + command: + - --host + - 0.0.0.0 + - --port + - '8080' + - --scheme + - http + image: cr.weaviate.io/semitechnologies/weaviate:||site.weaviate_version|| + ports: + - 8081:8080 + - 6061:6060 + - 50052:50051 + restart: on-failure:0 + volumes: + - ./data-node-2:/var/lib/weaviate + environment: + LOG_LEVEL: 'debug' + QUERY_DEFAULTS_LIMIT: 25 + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' + PERSISTENCE_DATA_PATH: '/var/lib/weaviate' + ENABLE_API_BASED_MODULES: 'true' + CLUSTER_HOSTNAME: 'node2' + CLUSTER_GOSSIP_BIND_PORT: '7102' + CLUSTER_DATA_BIND_PORT: '7103' + CLUSTER_JOIN: 'weaviate-node-1:7100' + RAFT_JOIN: 'node1,node2,node3' + RAFT_BOOTSTRAP_EXPECT: 3 + + weaviate-node-3: + init: true + command: + - --host + - 0.0.0.0 + - --port + - '8080' + - --scheme + - http + image: cr.weaviate.io/semitechnologies/weaviate:||site.weaviate_version|| + ports: + - 8082:8080 + - 6062:6060 + - 50053:50051 + restart: on-failure:0 + volumes: + - ./data-node-3:/var/lib/weaviate + environment: + LOG_LEVEL: 'debug' + QUERY_DEFAULTS_LIMIT: 25 + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' + PERSISTENCE_DATA_PATH: '/var/lib/weaviate' + ENABLE_API_BASED_MODULES: 'true' + CLUSTER_HOSTNAME: 'node3' + CLUSTER_GOSSIP_BIND_PORT: '7104' + CLUSTER_DATA_BIND_PORT: '7105' + CLUSTER_JOIN: 'weaviate-node-1:7100' + RAFT_JOIN: 'node1,node2,node3' + RAFT_BOOTSTRAP_EXPECT: 3 +``` + +
+ +:::note Port number conventions +It is a Weaviate convention to set the `CLUSTER_DATA_BIND_PORT` to 1 higher than `CLUSTER_GOSSIP_BIND_PORT`. +::: + + +## Shell attachment options + +The output of `docker compose up` is quite verbose as it attaches to the logs of all containers. + +You can attach the logs only to Weaviate itself, for example, by running the following command instead of `docker compose up`: + +```bash +# Run Docker Compose +docker compose up -d && docker compose logs -f weaviate +``` + +Alternatively you can run docker compose entirely detached with `docker compose up -d` _and_ then poll `{bindaddress}:{port}/v1/meta` until you receive a status `200 OK`. + + + +## Troubleshooting + +### Set `CLUSTER_HOSTNAME` if it may change over time + +In some systems, the cluster hostname may change over time. This is known to create issues with a single-node Weaviate deployment. To avoid this, set the `CLUSTER_HOSTNAME` environment variable in the `values.yaml` file to the cluster hostname. + +```yaml +--- +services: + weaviate: + # ... + environment: + CLUSTER_HOSTNAME: 'node1' +... +``` + +## Related pages + +- If you are new to Docker, see [Docker Introduction for Weaviate Users](https://weaviate.io/blog/docker-and-containers-with-weaviate). + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/docs/deploy/installation-guides/k8s-installation.md b/docs/deploy/installation-guides/k8s-installation.md new file mode 100644 index 00000000..c9b43685 --- /dev/null +++ b/docs/deploy/installation-guides/k8s-installation.md @@ -0,0 +1,254 @@ +--- +title: Kubernetes +sidebar_position: 3 +image: og/docs/installation.jpg +# tags: ['installation', 'Kubernetes'] +--- + +:::tip End-to-end guide +For a tutorial on how to use [minikube](https://minikube.sigs.k8s.io/docs/) to deploy Weaviate on Kubernetes, see the Weaviate Academy course, [Weaviate on Kubernetes](../../academy/deployment/k8s/index.md). +::: + +## Requirements + +* A recent Kubernetes Cluster (at least version 1.23). If you are in a development environment, consider using the kubernetes cluster that is built into Docker desktop. For more information, see the [Docker documentation](https://docs.docker.com/desktop/kubernetes/). +* The cluster needs to be able to provision `PersistentVolumes` using Kubernetes' `PersistentVolumeClaims`. +* A file system that can be mounted read-write by a single node to allow Kubernetes' `ReadWriteOnce` access mode. +* Helm version v3 or higher. The current Helm chart is version `||site.helm_version||`. + +## Weaviate Helm chart + +:::note Important: Set the correct Weaviate version +As a best practice, explicitly set the Weaviate version in the Helm chart.

+ +Set the version in your `values.yaml` file or [overwrite the default value](#deploy-install-the-helm-chart) during deployment. +::: + +To install the Weaviate chart on your Kubernetes cluster, follow these steps: + +### Verify tool setup and cluster access + +```bash +# Check if helm is installed +helm version +# Make sure `kubectl` is configured correctly and you can access the cluster. +# For example, try listing the pods in the currently configured namespace. +kubectl get pods +``` + +### Get the Helm Chart + +Add the Weaviate helm repo that contains the Weaviate helm chart. + +```bash +helm repo add weaviate https://weaviate.github.io/weaviate-helm +helm repo update +``` + +Get the default `values.yaml` configuration file from the Weaviate helm chart: +```bash +helm show values weaviate/weaviate > values.yaml +``` + +### Modify values.yaml + +To customize the Helm chart for your environment, edit the [`values.yaml`](https://github.com/weaviate/weaviate-helm/blob/master/weaviate/values.yaml) +file. The default `yaml` file is extensively documented to help you configure your system. + +#### Replication + +The default configuration defines one Weaviate replica cluster. + +#### Local models + +Local models, such as `text2vec-transformers`, `qna-transformers`, and `img2vec-neural` are disabled by default. To enable a model, set the model's +`enabled` flag to `true`. + +#### Resource limits + +Starting in Helm chart version 17.0.1, constraints on module resources are commented out to improve performance. To constrain resources for specific modules, add the constraints in your `values.yaml` file. + +#### gRPC service configuration + +Starting in Helm chart version 17.0.0, the gRPC service is enabled by default. If you use an older Helm chart, edit your `values.yaml` file to enable gRPC. + +Check that the `enabled` field is set to `true` and the `type` field to `LoadBalancer`. These settings allow you to access the [gRPC API](https://weaviate.io/blog/grpc-performance-improvements) from outside the Kubernetes cluster. + +```yaml +grpcService: + enabled: true # ⬅️ Make sure this is set to true + name: weaviate-grpc + ports: + - name: grpc + protocol: TCP + port: 50051 + type: LoadBalancer # ⬅️ Set this to LoadBalancer (from NodePort) +``` + +#### Authentication and authorization + +An example configuration for authentication is shown below. + +```yaml +authentication: + apikey: + enabled: true + allowed_keys: + - readonly-key + - secr3tk3y + users: + - readonly@example.com + - admin@example.com + anonymous_access: + enabled: false + oidc: + enabled: true + issuer: https://auth.wcs.api.weaviate.io/auth/realms/SeMI + username_claim: email + groups_claim: groups + client_id: wcs +authorization: + admin_list: + enabled: true + users: + - someuser@weaviate.io + - admin@example.com + readonly_users: + - readonly@example.com +``` + +In this example, the key `readonly-key` will authenticate a user as the `readonly@example.com` identity, and `secr3tk3y` will authenticate a user as `admin@example.com`. + +OIDC authentication is also enabled, with WCD as the token issuer/identity provider. Thus, users with WCD accounts could be authenticated. This configuration sets `someuser@weaviate.io` as an admin user, so if `someuser@weaviate.io` were to authenticate, they will be given full (read and write) privileges. + +For further, general documentation on authentication and authorization configuration, see: +- [Authentication](../configuration/authentication.md) +- [Authorization](../configuration/authorization.md) + +#### Run as non-root user + +By default, weaviate runs as the root user. To run as a non-privileged user, edit the settings in the `containerSecurityContext` section. + +The `init` container always runs as root to configure the node. Once the system is started, it run a non-privileged user if you have one configured. + +### Deploy (install the Helm chart) + +You can deploy the helm charts as follows: + +```bash +# Create a Weaviate namespace +kubectl create namespace weaviate + +# Deploy +helm upgrade --install \ + "weaviate" \ + weaviate/weaviate \ + --namespace "weaviate" \ + --values ./values.yaml +``` + +The above assumes that you have permissions to create a new namespace. If you +have only namespace-level permissions, you can skip creating a new +namespace and adjust the namespace argument on `helm upgrade` according to the +name of your pre-configured namespace. + +Optionally, you can provide the `--create-namespace` parameter which will create the namespace if not present. + +### Updating the installation after the initial deployment + +The above command (`helm upgrade...`) is idempotent. In other words, you can run it multiple times after adjusting your desired configuration without causing any unintended changes or side effects. + +### Upgrading to `1.25` or higher from pre-`1.25` + +:::caution Important +::: + +To upgrade to `1.25` or higher from a pre-`1.25` version, you must delete the deployed `StatefulSet`, update the helm chart to version `17.0.0` or higher, and re-deploy Weaviate. + +See the [1.25 migration guide for Kubernetes](../more-resources/migration/weaviate-1-25.md) for more details. + +## Additional Configuration Help + +- [Cannot list resource "configmaps" in API group when deploying Weaviate k8s setup on GCP](https://stackoverflow.com/questions/58501558/cannot-list-resource-configmaps-in-api-group-when-deploying-weaviate-k8s-setup) +- [Error: UPGRADE FAILED: configmaps is forbidden](https://stackoverflow.com/questions/58501558/cannot-list-resource-configmaps-in-api-group-when-deploying-weaviate-k8s-setup) + +### Using EFS with Weaviate + +In some circumstances, you may wish, or need, to use EFS (Amazon Elastic File System) with Weaviate. And we note in the case of AWS Fargate, you must create the [PV (persistent volume)](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) manually, as the PVC will NOT create a PV for you. + +To use EFS with Weaviate, you need to: + +- Create an EFS file system. +- Create an EFS access point for every Weaviate replica. + - All of the Access Points must have a different root-directory so that Pods do not share the data, otherwise it will fail. +- Create EFS mount targets for each subnet of the VPC where Weaviate is deployed. +- Create StorageClass in Kubernetes using EFS. +- Create Weaviate Volumes, where each volume has a different AccessPoint for VolumeHandle(as mentioned above). +- Deploy Weaviate. + +This code is an example of a PV for `weaviate-0` Pod: + +```yaml +apiVersion: v1 +kind: PersistentVolume +metadata: + name: weaviate-0 +spec: + capacity: + storage: 8Gi + volumeMode: Filesystem + accessModes: + - ReadWriteOnce + persistentVolumeReclaimPolicy: Delete + storageClassName: "efs-sc" + csi: + driver: efs.csi.aws.com + volumeHandle: :: + claimRef: + namespace: + name: weaviate-data-weaviate-0 +``` + +For more, general information on running EFS with Fargate, we recommend reading [this AWS blog](https://aws.amazon.com/blogs/containers/running-stateful-workloads-with-amazon-eks-on-aws-fargate-using-amazon-efs/). + +### Using Azure file CSI with Weaviate +The provisioner `file.csi.azure.com` is **not supported** and will lead to file corruptions. Instead, make sure the storage class defined in values.yaml is from provisioner `disk.csi.azure.com`, for example: + +```yaml +storage: + size: 32Gi + storageClassName: managed +``` + +you can get the list of available storage classes in your cluster with: + +``` +kubectl get storageclasses +``` + +## Troubleshooting + +- If you see `No private IP address found, and explicit IP not provided`, set the pod subnet to be in an valid ip address range of the following: + + ``` + 10.0.0.0/8 + 100.64.0.0/10 + 172.16.0.0/12 + 192.168.0.0/16 + 198.19.0.0/16 + ``` + +### Set `CLUSTER_HOSTNAME` if it may change over time + +In some systems, the cluster hostname may change over time. This is known to create issues with a single-node Weaviate deployment. To avoid this, set the `CLUSTER_HOSTNAME` environment variable in the `values.yaml` file to the cluster hostname. + +```yaml +env: + - CLUSTER_HOSTNAME: "node-1" +``` + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/docs/deploy/k8s/_category_.json b/docs/deploy/k8s/_category_.json deleted file mode 100644 index 78521841..00000000 --- a/docs/deploy/k8s/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "k8s", - "position": 1 -} \ No newline at end of file diff --git a/docs/deploy/production/Kubernetes/index.mdx b/docs/deploy/production/Kubernetes/index.mdx index 971bf23f..8c887185 100644 --- a/docs/deploy/production/Kubernetes/index.mdx +++ b/docs/deploy/production/Kubernetes/index.mdx @@ -1,3 +1,9 @@ +--- + +sidebar_label: "Kubernetes in Production" + +--- + # Kubernetes Weaviate leverages Kubernetes for scalable, resilient, and production-grade deployments. diff --git a/secondaryNavbar.js b/secondaryNavbar.js index 5e45cc42..4f7ecb14 100644 --- a/secondaryNavbar.js +++ b/secondaryNavbar.js @@ -51,7 +51,7 @@ const secondaryNavbarItems = { links: [ { label: "Get Started", link: "/docs/deploy", sidebar: "deploySidebar" }, /*{ label: "Kubernetes", link: "/docs/deploy/k8s", sidebar: "deployK8sSidebar" },*/ - { label: "Production", link: "/docs/deploy/production", sidebar: "deployProductionSidebar"}, + { label: "Production Environments", link: "/docs/deploy/production", sidebar: "deployProductionSidebar"}, /*{ label: "AWS", link: "/docs/deploy/aws", sidebar: "deployAwsSidebar" },*/ ], }, diff --git a/sidebars.js b/sidebars.js index 18aa2cda..5edbd50a 100644 --- a/sidebars.js +++ b/sidebars.js @@ -408,7 +408,22 @@ const sidebars = { "weaviate/more-resources/glossary", "weaviate/more-resources/example-datasets", ], - deploySidebar: ["deploy/index"], + deploySidebar: [ + { + type: "doc", + id: "deploy/index", // document ID + label: "Overview", // sidebar label + }, + { + type: "category", + label: "Installation Guides", + collapsible: true, + collapsed: true, + items: [ + "deploy/installation-guides/k8s-installation", + "deploy/installation-guides/docker-installation", + ], + },], /*deployAwsSidebar: [ { type: "autogenerated", From 19ed67dfe59134a0a6932064d249c143ae240ef3 Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Mon, 24 Mar 2025 10:20:23 -0400 Subject: [PATCH 15/39] migrating aws and gcp installation guides --- .../installation-guides/aws-installation.md | 165 ++++++++++++++++++ .../installation-guides/gcp-installation.md | 145 +++++++++++++++ sidebars.js | 5 +- 3 files changed, 314 insertions(+), 1 deletion(-) create mode 100644 docs/deploy/installation-guides/aws-installation.md create mode 100644 docs/deploy/installation-guides/gcp-installation.md diff --git a/docs/deploy/installation-guides/aws-installation.md b/docs/deploy/installation-guides/aws-installation.md new file mode 100644 index 00000000..6d88d782 --- /dev/null +++ b/docs/deploy/installation-guides/aws-installation.md @@ -0,0 +1,165 @@ +--- +title: AWS Marketplace +description: Install Weaviate through the AWS Marketplace for quick cloud deployment. +image: og/docs/installation.jpg +# tags: ['installation', 'AWS Marketplace'] +--- + +import ReactPlayer from 'react-player/lazy' + + + +You can use [AWS Marketplace](https://aws.amazon.com/marketplace) to directly launch a Weaviate cluster. + +We use an [AWS CloudFormation template](https://aws.amazon.com/cloudformation/) for delivery. + +:::info Prerequisites +- An AWS account with sufficient credit / payment method. +- (Recommended) Familiarity with AWS and the AWS console. +::: + +
+ + What resources are used & installed? + + +This will set up the following resources: +- EKS Cluster with a Single Node Group + - In the default VPC or a fresh VPC with CIDR 10.0.0.0/16 +- Load Balancer Controller for EKS +- aws-ebs-csi-driver for EKS +- The latest selected version of Weaviate (e.g. `1.20.3` if you select `1.20`) + - This will be installed using our official Helm chart + +
+ +## Installation instructions + +### Video + +If you prefer a video, you can watch the following walkthrough. This video is recorded in September 2023, some details may have changed since then. + + +
+ +### AWS Marketplace + +1. Go to Weaviate's [AWS Marketplace listing](https://aws.amazon.com/marketplace/pp/prodview-cicacyv63r43i) +1. Subscribe to the product in AWS Marketplace by following the instructions on the page. At the time of writing (August 2023), the steps are to: + 1. Click Continue to Subscribe, then go to the next page + 1. Click Continue to Configuration, then go to the next page + 1. Select the fulfillment option & software version from the list. Then click Continue to Launch. +1. Launch the software using a CloudFormation template (select the one for your preferred availability zone in the table below): + +| Region | CloudFormation template link (per Availability Zone) | +| --- | --- | +| AP | [ap-northeast-1](https://ap-northeast-1.console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json); [ap-northeast-2](https://ap-northeast-2.console.aws.amazon.com/cloudformation/home?region=ap-northeast-2#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json); [ap-northeast-3](https://ap-northeast-3.console.aws.amazon.com/cloudformation/home?region=ap-northeast-3#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json); [ap-south-1](https://ap-south-1.console.aws.amazon.com/cloudformation/home?region=ap-south-1#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json); [ap-southeast-1](https://ap-southeast-1.console.aws.amazon.com/cloudformation/home?region=ap-southeast-1#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json); [ap-southeast-2](https://ap-southeast-2.console.aws.amazon.com/cloudformation/home?region=ap-southeast-2#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json) | +| CA | [ca-central-1](https://ca-central-1.console.aws.amazon.com/cloudformation/home?region=ca-central-1#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json) | +| EU | [eu-central-1](https://eu-central-1.console.aws.amazon.com/cloudformation/home?region=eu-central-1#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json); [eu-north-1](https://eu-north-1.console.aws.amazon.com/cloudformation/home?region=eu-north-1#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json); [eu-west-1](https://eu-west-1.console.aws.amazon.com/cloudformation/home?region=eu-west-1#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json); [eu-west-2](https://eu-west-2.console.aws.amazon.com/cloudformation/home?region=eu-west-2#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json); [eu-west-3](https://eu-west-3.console.aws.amazon.com/cloudformation/home?region=eu-west-3#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json) | +| SA | [sa-east-1](https://sa-east-1.console.aws.amazon.com/cloudformation/home?region=sa-east-1#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json) | +| US | [us-east-1](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json); [us-east-2](https://us-east-2.console.aws.amazon.com/cloudformation/home?region=us-east-2#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json); [us-west-1](https://us-west-1.console.aws.amazon.com/cloudformation/home?region=us-west-1#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json); [us-west-2](https://us-west-2.console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json) | + +### Configuration & Cluster creation + +:::info Before you get started +#### Some settings may not be changed after launch + +Not all settings may be changed after launch. For example, these settings are currently not changeable after launch: +- weaviatePVCSize +- albDriver +- ebsDriver +- vpcUseDefault + +#### Some settings may lead to recreation of the cluster + +- Changes to the instance type will lead to recreation of the node pool. + +#### Suggested configurations + +- The default values should be suitable for a majority of cases. +- `weaviatePVCSize`: For production environments, at least 500GB per StatefulSet pod is recommended. (Smaller disks may be sufficient for dev environments.) +- `weaviateAuthType`: We recommend not running Weaviate with anonymous access. We suggest setting it to `apikey` and setting a key, for example by executing `pwgen -A -s 32` to generate a random string. +::: + +Once you open the CloudFormation template, you should see a set of options similar to below. + +Here, you can: + +1. Set the `stack name` for identifying the stack in AWS (required). +1. Set Weaviate/AWS parameters, such as: + - number of nodes + - instance types + - Weaviate authentication parameters. +1. Confirm required resources & proceed to Create stack. + - This template may require additional resources and capabilities. + +After clicking Create stack, the creation process may take a while, such as around 30 minutes. + +You can check the status of individual resources in the `Events` tab. Once the stack has been created, the status for the stack will change to `✅ CREATE_COMPLETE`. + +## Accessing the cluster + +Once the stack has been created, you can access the cluster using [`kubectl`](https://kubernetes.io/docs/tasks/tools/), and Weaviate itself using the load balancer. + +### Interaction using `kubectl` + +You can run the following command which will update or create a kubeconfig file for the Weaviate cluster: + +``` +aws eks update-kubeconfig --name [cluster-name] --region [aws-region]--role-arn arn:aws:iam::[AccountID]:role/[StackName]-MastersRole[XX] +``` + +:::tip How to find the kubectl command +The exact command can be found in the CloudFormation stack, in the `Outputs` tab, under the `EKSClusterConfigCommand` output. +::: + +Once that's set up, you can run `kubectl` commands as usual. For example + +- `kubectl get pods -n weaviate` to list all pods in the `weaviate` namespace. +- `kubectl get svc --all-namespaces` to list all services in all namespaces. + +### Finding the Weaviate URL + +Once the stack has been created, you can access Weaviate via the load balancer URL. + +You can find the Weaviate endpoint URL by any of: +- Going to the `Services` section of AWS, under `EC2` > `Load Balancers`. Find the load balancer, and look for the `DNS name` column. +- Running `kubectl get svc -n weaviate` and looking for the `EXTERNAL-IP` of the `weaviate` service. + +The load balancer URL (e.g. `a520f010285b8475eb4b86095cabf265-854109584.eu-north-1.elb.amazonaws.com`) will be the Weaviate URL (e.g. `http://a520f010285b8475eb4b86095cabf265-854109584.eu-north-1.elb.amazonaws.com`). + +## Deleting the cluster + +You can delete the cluster by deleting the CloudFormation stack. + +Caution. This action deletes your data from Weaviate. If you want to keep your data, back it up or export the data before you delete the cluster. + +### Some resources many require manual deletion + +:::caution +Verify that all unused resources are deleted. You continue to incur costs for undeleted resources. +::: + +There may be some AWS resources that are not deleted automatically when the CloudFormation stack is deleted. For example, EBS volumes, and Key Management Service (KMS) keys may not be deleted from time to time. + +You must delete these manually. + +#### Tips + +- If your CloudFormation stack indicates "DELETE_FAILED", you may be able to re-initiate deletion of these resources. +- Review the `Resources` tab of the CloudFormation stack to find resources that may not have been deleted. +- Key Management Service (KMS) keys may be deleted by going to the KMS console, and deleting the keys manually. You may need to schedule deletion of the keys. + + +## Billing + +You will be charged for Weaviate and associated resources directly by AWS. + +This will, for example, include the EC2 instances, EBS volumes, and any other resources used by the cluster. + + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/docs/deploy/installation-guides/gcp-installation.md b/docs/deploy/installation-guides/gcp-installation.md new file mode 100644 index 00000000..477c4cda --- /dev/null +++ b/docs/deploy/installation-guides/gcp-installation.md @@ -0,0 +1,145 @@ +--- +title: Google Cloud Marketplace +description: Set up Weaviate using Google Cloud Marketplace for simplified deployment. +image: og/docs/installation.jpg +tags: ['installation', 'Google Cloud Marketplace'] +--- + +You can use [Google Cloud Marketplace](https://console.cloud.google.com/marketplace) to directly launch a Weaviate cluster. + +:::info Prerequisites +- A Google Cloud account with sufficient credit / payment method. +- (Recommended) Familiarity with Google Cloud and the Google Cloud console. +::: + +## Installation instructions + +Broadly, the steps are as follows: + +1. Go to Weaviate's Google Cloud Marketplace listing page and click Configure. +1. Configure and deploy Weaviate by following the on-screen instructions. + + + +We go through these steps in detail below. + +### Configuration options + +:::info Before you get started + + + +#### Suggested configurations + +- The default values for settings such as `Global Query limit`, `Modules` and `Storage Size` should be suitable for a majority of cases. +- `Storage size`: For production environments, at least 500GB per pod is recommended. (Smaller disks may be sufficient for dev environments.) + + +::: + +Once you are at the deployment page, you should see a set of options. + +You will need to: +1. Select a GKE cluster to deploy Weaviate to. + 1. Optionally, you can create a new cluster and then specify it. +1. Set the `namespace` (for dividing cluster resources) and a unique `app instance name` for identifying the application. +1. Set the app instance name. +1. Set the service account for billing. +1. Set Weaviate parameters, such as `Replicas of Weaviate Instances`, `Global Query Limit`, `Enable Modules` and `Storage Size`. + +1. If you agree, accept the terms of service and click Deploy. + +Once you have done so, Weaviate will be deployed to the selected cluster. This should take a few minutes. + +## Accessing the cluster + +Once the application has been created, you can access the cluster through the load balancer. + +You can interact with the cluster using [`kubectl`](https://kubernetes.io/docs/tasks/tools/), or through the Weaviate API. We show examples below. + +### Interaction using `kubectl` + +You can run the following command which will update or create a kubeconfig file for the Weaviate cluster: + +``` +gcloud container clusters get-credentials [YOUR_CLUSTER_NAME] --zone [YOUR_GC_ZONE] --project [YOUR_GC_PROJECT] +``` + +:::tip How to find the kubectl command +The exact command can be found in the Kubernetes Engine page, by clicking on the vertical ellipsis ( ) for your cluster, and clicking Connect. +::: + +Once that's set up, you can run `kubectl` commands as usual. For example +- `kubectl get pods -n default` to list all pods in the `default` namespace (or whatever namespace you specified). +- `kubectl get svc --all-namespaces` to list all services in all namespaces. + +
+ Example output + +An example output of `kubectl get svc --all-namespaces` is: + +```bash +NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +application-system application-controller-manager-service ClusterIP 10.24.8.231 443/TCP 11m +default kubernetes ClusterIP 10.24.0.1 443/TCP 11m +default weaviate LoadBalancer 10.24.13.245 34.173.96.14 80:30664/TCP 8m38s +default weaviate-headless ClusterIP None 80/TCP 8m38s +gmp-system alertmanager ClusterIP None 9093/TCP 10m +gmp-system gmp-operator ClusterIP 10.24.12.8 8443/TCP,443/TCP 10m +kalm-system kalm-controller-manager-service ClusterIP 10.24.7.189 443/TCP 11m +kube-system default-http-backend NodePort 10.24.12.61 80:32508/TCP 10m +kube-system kube-dns ClusterIP 10.24.0.10 53/UDP,53/TCP 11m +kube-system metrics-server ClusterIP 10.24.13.204 443/TCP +``` + +Here, the externally accessible Weaviate IP is `34.173.96.14`. + +
+ +### Finding the Weaviate URL + +Once the application has been created, you can access Weaviate via the load balancer URL. + +You can find the Weaviate endpoint URL by any of: +- Going to the `Kubernetes Engine` section of Google Cloud, under `Service & Ingress`. Find the load balancer, and look for the `Endpoints` column. +- Running `kubectl get svc -n [YOUR_NAMESPACE_NAME]` and looking for the `EXTERNAL-IP` of the `weaviate` service. +The load balancer URL (e.g. `34.38.6.240`) will be the Weaviate URL (e.g. `http://34.38.6.240`). + +## Removing Weaviate and the cluster + +:::caution +Verify that all unused resources are deleted. You continue to incur costs for any remaining resources. +::: + +### Removing Weaviate + +To remove Weaviate and the associated services, go to the `Applications` section of `Kubernetes Engine` in Google Cloud, and delete the Weaviate deployment. + +Review the `Services & Ingress` section as well as the `Storage` section to ensure that all associated services and storage are removed. You may need to delete any remaining resources manually. + +### Removing the cluster + +If you no longer require the cluster (e.g. if you created a new cluster for Weaviate), you can delete the cluster by going to the `Applications` section of `Kubernetes Engine` in Google Cloud. Delete the cluster by selecting it from the list, clicking DELETE, and following the prompts. + +## Billing + +You will be charged for Weaviate and associated resources directly by Google Cloud. + +This will, for example, include the compute instances, volumes, and any other resources used by the cluster. + + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/sidebars.js b/sidebars.js index 5edbd50a..72dd6141 100644 --- a/sidebars.js +++ b/sidebars.js @@ -422,8 +422,11 @@ const sidebars = { items: [ "deploy/installation-guides/k8s-installation", "deploy/installation-guides/docker-installation", + "deploy/installation-guides/gcp-installation", + "deploy/installation-guides/aws-installation", ], - },], + }, + ], /*deployAwsSidebar: [ { type: "autogenerated", From a72c8e0bbfd4494a9a65218e412f07147ed7fb70 Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Mon, 24 Mar 2025 10:38:30 -0400 Subject: [PATCH 16/39] adding config guides --- docs/deploy/config-guides/authentication.md | 482 ++++++++++++++++++++ docs/deploy/config-guides/modules.md | 152 ++++++ sidebars.js | 12 + 3 files changed, 646 insertions(+) create mode 100644 docs/deploy/config-guides/authentication.md create mode 100644 docs/deploy/config-guides/modules.md diff --git a/docs/deploy/config-guides/authentication.md b/docs/deploy/config-guides/authentication.md new file mode 100644 index 00000000..bb479d5f --- /dev/null +++ b/docs/deploy/config-guides/authentication.md @@ -0,0 +1,482 @@ +--- +title: Authentication +image: og/docs/configuration.jpg +# tags: ['authentication'] +--- + +:::info Authentication and authorization +Authentication and authorization are closely related concepts, and sometimes abbreviated as `AuthN` and `AuthZ`. Authentication (`AuthN`) is the process of verifying the identity of a user, while authorization (`AuthZ`) is the process of determining what permissions the user has. +::: + +Weaviate controls access through user authentication via API keys or OpenID Connect (OIDC), with an option for anonymous access. Users can then be assigned different [authorization](./authorization.md) levels, as shown in the diagram below. + +```mermaid +flowchart LR + %% Define main nodes + Request["Client
Request"] + AuthCheck{"AuthN
Enabled?"} + AccessCheck{"Check
AuthZ"} + Access["✅ Access
Granted"] + Denied["❌ Access
Denied"] + + %% Define authentication method nodes + subgraph auth ["AuthN"] + direction LR + API["API Key"] + OIDC["OIDC"] + AuthResult{"Success?"} + end + + %% Define connections + Request --> AuthCheck + AuthCheck -->|"No"| AccessCheck + AuthCheck -->|"Yes"| auth + API --> AuthResult + OIDC --> AuthResult + AuthResult -->|"Yes"| AccessCheck + AuthResult -->|"No"| Denied + + AccessCheck -->|"Pass"| Access + AccessCheck -->|"Fail"| Denied + + %% Style nodes + style Request fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style AuthCheck fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style AccessCheck fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style Access fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style Denied fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style API fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style OIDC fill:#ffffff,stroke:#B9C8DF,color:#130C49 + style AuthResult fill:#ffffff,stroke:#B9C8DF,color:#130C49 + + %% Style subgraph + style auth fill:#ffffff,stroke:#130C49,stroke-width:2px,color:#130C49 +``` + +For example, a user logging in with the API key `jane-secret` may be granted administrator permissions, while another user logging in with the API key `ian-secret` may be granted read-only permissions. + +In summary, Weaviate allows the following authentication methods: + +- API key +- OpenID Connect (OIDC) +- Anonymous access (no authentication, strongly discouraged except for development or evaluation) + +Note that API key and OIDC authentication can be both enabled at the same time. + +The way to configure authentication differs by your deployment method, depending on whether you are running Weaviate in Docker or Kubernetes. Below, we provide examples for both. + +:::info What about Weaviate Cloud (WCD)? +For Weaviate Cloud (WCD) instances, authentication is pre-configured with OIDC and API key access. You can [authenticate against Weaviate](../connections/connect-cloud.mdx) with your WCD credentials using OIDC, or [with API keys](/docs/cloud/platform/manage-api-keys). +::: + +## API Key Authentication + +API key authentication is a simple and effective way to authenticate users. Each user is assigned a unique API key, which is used to authenticate the user. + +Note that you can either: +- Set one user for all API keys, or +- Define one user per API key (the number of users must match the number of API keys) + +Make sure all listed users are also configured in the authorization settings. + +### API keys: Docker + +API key authentication can be configured using environment variables. In Docker Compose, set them in the configuration file (`docker-compose.yml`) such as in the following example: + +```yaml +services: + weaviate: + ... + environment: + ... + # Disable anonymous access. + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'false' + + # Enables API key authentication. + AUTHENTICATION_APIKEY_ENABLED: 'true' + + # List one or more keys in plaintext separated by commas. Each key corresponds to a specific user identity below. + AUTHENTICATION_APIKEY_ALLOWED_KEYS: 'user-a-key,user-b-key' + + # List one or more user identities, separated by commas. Each identity corresponds to a specific key above. + AUTHENTICATION_APIKEY_USERS: 'user-a,user-b' +``` + +This configuration: +- Disables anonymous access +- Enables API key authentication +- Defines plaintext API keys in `AUTHENTICATION_APIKEY_ALLOWED_KEYS` +- Associates users with the API keys in `AUTHENTICATION_APIKEY_USERS` + +These users can now be assigned permissions based on the authorization settings. + +### API keys: Kubernetes + +For Kubernetes deployments using Helm, API key authentication can be configured in the `values.yaml` file under the `authentication` section. Here's an example configuration: + +```yaml +authentication: + anonymous_access: + # Disable anonymous access. + enabled: false + + apikey: + # Enables API key authentication. + enabled: true + + # List one or more keys in plaintext separated by commas. Each key corresponds to a specific user identity below. + allowed_keys: + - user-a-key + - user-b-key + + # List one or more user identities, separated by commas. Each identity corresponds to a specific key above. + users: + - user-a + - user-b +``` + +This configuration: +- Disables anonymous access +- Enables API key authentication +- Defines plaintext API keys in `allowed_keys` +- Associates users with the API keys in `users` + +:::warning Environment Variables Take Precedence +If you configure API keys using environment variables, those settings will take precedence over the values in `values.yaml`. To use the Helm values configuration, ensure you have not set the corresponding environment variables. +::: + +For enhanced security in production environments, you can store API keys in Kubernetes secrets and reference them using environment variables instead of storing them as plaintext in the Helm values. + +## OIDC Authentication + +OIDC authentication requires the resource (Weaviate) to validate tokens issued by an identity provider. The identity provider authenticates the user and issues tokens, which are then validated by Weaviate. + +In an example setup, a Weaviate instance acts as the resource, Weaviate Cloud (WCD) acts as the identity provider, and the Weaviate client acts on behalf of the user. + +Any "OpenID Connect" compatible token issuer that implements OpenID Connect Discovery is compatible with Weaviate. + +This document discusses how to configure Weaviate as the resource. + +
+ + More about OIDC + + +With [OpenID Connect](https://openid.net/connect/) (based on OAuth2), an +external identity provider and token issuer ('token issuer' hereafter) is responsible for managing users. + +OIDC authentication requires obtaining a valid token from the token issuer so that it can be sent in the header of any request to Weaviate. This applies to both REST and GraphQL requests. + +When Weaviate receives a token (JSON Web Token or JWT), it verifies +that it was indeed signed by the configured token issuer. If the signature is +correct, all contents of the token are trusted, which authenticates the user based on the information in the token. + +
+ +### OIDC: Docker + +To configure Weaviate for OIDC-based authentication, add the following environment variables to your configuration file. + +An example `docker-compose.yml` file looks like this: + +```yaml +services: + weaviate: + ... + environment: + ... + # enabled (optional - defaults to false) turns OIDC auth on. All other fields in + # this section will only be validated if enabled is set to true. + AUTHENTICATION_OIDC_ENABLED: 'true' + + # issuer (required) tells weaviate how to discover the token issuer. This + # endpoint must implement the OpenID Connect Discovery spec, so that weaviate + # can retrieve the issuer's public key. + # + # The example URL below uses the path structure commonly found with keycloak + # where an example realm 'my-weaviate-usecase' was created. The exact + # path structure depends on the token issuer. See the token issuer's documentation + # about which endpoint implements OIDC Discovery. + AUTHENTICATION_OIDC_ISSUER: 'http://my-token-issuer/auth/realms/my-weaviate-usecase' + + # client_id (required unless skip_client_id_check is set to true) tells + # Weaviate to check for a particular OAuth 2.0 client_id in the audience claim. + # This is to prevent that a token which was signed by the correct issuer + # but never intended to be used with Weaviate can be used for authentication. + # + # For more information on what clients are in OAuth 2.0, see + # https://tools.ietf.org/html/rfc6749#section-1.1 + AUTHENTICATION_OIDC_CLIENT_ID: 'my-weaviate-client' + + # username_claim (required) tells Weaviate which claim in the token to use for extracting + # the username. The username will be passed to the authorization plugin. + AUTHENTICATION_OIDC_USERNAME_CLAIM: 'email' + + # skip_client_id_check (optional, defaults to false) skips the client_id + # validation in the audience claim as outlined in the section above. + # Not recommended to set this option as it reduces security, only set this + # if your token issuer is unable to provide a correct audience claim + AUTHENTICATION_OIDC_SKIP_CLIENT_ID_CHECK: 'false' + + # scope (optional) these will be used by clients as default scopes for authentication + AUTHENTICATION_OIDC_SCOPES: '' +``` + +:::info OIDC and Azure +As of November 2022, we were aware of some differences in Microsoft Azure's OIDC implementation compared to others. If you are using Azure and experiencing difficulties, [this external blog post](https://xsreality.medium.com/making-azure-ad-oidc-compliant-5734b70c43ff) may be useful. +::: + +### OIDC: Kubernetes + +For Kubernetes deployments using Helm, OIDC authentication can be configured in the `values.yaml` file under the `authentication` section. Here's an example configuration: + +```yaml +authentication: + anonymous_access: + # Disable anonymous access. + enabled: false + oidc: + # enabled (optional - defaults to false) turns OIDC auth on. All other fields in + # this section will only be validated if enabled is set to true. + enabled: true + + # issuer (required) tells weaviate how to discover the token issuer. This + # endpoint must implement the OpenID Connect Discovery spec, so that weaviate + # can retrieve the issuer's public key. + # + # The example URL below uses the path structure commonly found with keycloak + # where an example realm 'my-weaviate-usecase' was created. The exact + # path structure depends on the token issuer. See the token issuer's documentation + # about which endpoint implements OIDC Discovery. + issuer: 'http://my-token-issuer/auth/realms/my-weaviate-usecase' + + # client_id (required unless skip_client_id_check is set to true) tells + # Weaviate to check for a particular OAuth 2.0 client_id in the audience claim. + # This is to prevent that a token which was signed by the correct issuer + # but never intended to be used with Weaviate can be used for authentication. + # + # For more information on what clients are in OAuth 2.0, see + # https://tools.ietf.org/html/rfc6749#section-1.1 + client_id: 'my-weaviate-client' + + # username_claim (required) tells Weaviate which claim in the token to use for extracting + # the username. The username will be passed to the authorization plugin. + username_claim: 'email' + + # skip_client_id_check (optional, defaults to false) skips the client_id + # validation in the audience claim as outlined in the section above. + # Not recommended to set this option as it reduces security, only set this + # if your token issuer is unable to provide a correct audience claim + skip_client_id_check: 'false' + + # scope (optional) these will be used by clients as default scopes for authentication + scopes: '' + + # groups_claim: '' +``` + +### Note: Configuring the OIDC token issuer + +Configuring the OIDC token issuer is outside the scope of this document, but here are a few options as a starting point: + +- For simple use-cases such as for a single user, you can use Weaviate Cloud (WCD) as the OIDC token issuer. To do so: + - Make sure you have a WCD account (you can [sign up here](https://console.weaviate.cloud/)). + - In the Docker Compose file (e.g. `docker-compose.yml`), specify: + - `https://auth.wcs.api.weaviate.io/auth/realms/SeMI` as the issuer (in `AUTHENTICATION_OIDC_ISSUER`), + - `wcs` as the client id (in `AUTHENTICATION_OIDC_CLIENT_ID`), and + - enable the adminlist (`AUTHORIZATION_ADMINLIST_ENABLED: 'true'`) and add your WCD account email as the user (in `AUTHORIZATION_ADMINLIST_USERS`) . + - `email` as the username claim (in `AUTHENTICATION_OIDC_USERNAME_CLAIM`). + +- If you need a more customizable setup you can use commercial OIDC providers like [Okta](https://www.okta.com/). +- As another alternative, you can run your own OIDC token issuer server, which may be the most complex but also configurable solution. Popular open-source solutions include Java-based [Keycloak](https://www.keycloak.org/) and Golang-based [dex](https://github.com/dexidp/dex). + +:::info +By default, Weaviate validates that the token includes a specified client id in the audience claim. If your token issuer does not support this feature, you can turn it off as outlined in the configuration section below. +::: + +## Anonymous Access + +Weaviate can be configured to accept anonymous requests. This is strongly discouraged except for development or evaluation purposes. + +Users that send requests without explicit authentication are authenticated as `user: anonymous`. + +You can use the authorization plugin to specify which permissions to apply to this `anonymous` user. If anonymous access is disabled altogether, any request without an allowed authentication scheme returns `401 Unauthorized`. + +### Anonymous access: Docker + +To enable anonymous access in Docker Compose, add the following environment variable to your configuration file: + +```yaml +services: + weaviate: + ... + environment: + ... + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' +``` + +### Anonymous access: Kubernetes + +To enable anonymous access in Kubernetes, add the following configuration to your `values.yaml` file: + +```yaml +authentication: + anonymous_access: + enabled: true +``` + +## Client-side Usage + +### API key + +import APIKeyUsage from '/_includes/clients/api-token-usage.mdx'; + + + +We recommend using a client library to authenticate against Weaviate. See [How-to: Connect](../connections/index.mdx) pages for more information. + +### OIDC + +The OIDC standard allows for many different methods *(flows)* of obtaining tokens. The appropriate method can vary depending on your situation, including configurations at the token issuer, and your requirements. + +OIDC authentication flows are outside the scope of this documentation, but here are some options to consider: +1. Use the `client credentials flow` for machine-to-machine authorization. (Note that this authorizes an app, not a user.) + - Validated using Okta and Azure as identity providers; GCP does not support client credentials grant flow (as of December 2022). + - Weaviate's Python client directly supports this method. + - Client credential flows usually do not come with a refresh token and the credentials are saved in the respective clients to acquire a new access token on expiration of the old one. +1. Use the `resource owner password flow` for trusted applications like [Weaviate Cloud](/docs/cloud/manage-clusters/connect). +1. Use `hybrid flow` if Azure is your token issuer or if you would like to prevent exposing passwords. + +### Support for Weaviate clients + +If Weaviate Core is configured to use the `client credentials grant` flow or the `resource owner password flow`, a Weaviate client can instantiate a connection to Weaviate Core that incorporates the authentication flow. + +import OIDCExamples from '/_includes/code/connections/oidc-connect.mdx'; + + + +### Get and pass tokens manually + +
+ + Manually obtaining and passing tokens + + +For cases or workflows where you may wish to manually obtain a token, we outline below the steps to do so, for the resource owner password flow and hybrid flow. + +#### Resource owner password flow + +1. Send a GET request to `WEAVIATE_INSTANCE_URL/v1/.well-known/openid-configuration` to fetch Weaviate's OIDC configuration (`wv_oidc_config`). Replace WEAVIATE_INSTANCE_URL with your instance URL. +1. Parse the `clientId` and `href` from `wv_oidc_config`. +1. Send a GET request to `href` to fetch the token issuer's OIDC configuration (`token_oidc_config`). +1. If `token_oidc_config` includes the optional `grant_types_supported` key, check that `password` is in the list of values. + - If `password` is not in the list of values, the token issuer is likely not configured for `resource owner password flow`. You may need to reconfigure the token issuer or use another method. + - If the `grant_types_supported` key is not available, you may need to contact the token issuer to see if `resource owner password flow` is supported. +1. Send a POST request to the `token_endpoint` of `token_oidc_config` with the body: + - `{"grant_type": "password", "client_id": client_id, "username": USERNAME, "password": PASSWORD`. Replace `USERNAME` and `PASSWORD` with the actual values. +1. Parse the response (`token_resp`), and look for `access_token` in `token_resp`. This is your Bearer token. + +#### Hybrid flow + +1. Send a GET request to `WEAVIATE_INSTANCE_URL/v1/.well-known/openid-configuration` to fetch Weaviate's OIDC configuration (`wv_oidc_config`). Replace WEAVIATE_INSTANCE_URL with your instance URL. +2. Parse the `clientId` and `href` from `wv_oidc_config` +3. Send a GET request to `href` to fetch the token issuer's OIDC configuration (`token_oidc_config`) +4. Construct a URL (`auth_url`) with the following parameters, based on `authorization_endpoint` from `token_oidc_config`. This will look like the following: + - `{authorization_endpoint}`?client_id=`{clientId}`&response_type=code%20id_token&response_mode=fragment&redirect_url=`{redirect_url}`&scope=openid&nonce=abcd + - the `redirect_url` must have been [pre-registered](https://openid.net/specs/openid-connect-core-1_0.html#AuthRequest) with your token issuer. +5. Go to the `auth_url` in your browser, and log in if prompted. If successful, the token issuer will redirect the browser to the `redirect_url`, with additional parameters that include an `id_token` parameter. +6. Parse the `id_token` parameter value. This is your Bearer token. + +#### Code example + +This example demonstrate how to obtain an OIDC token. + +```python +import requests +import re + +url = "http://localhost:8080" # <-- Replace with your actual Weaviate URL + +# Get Weaviate's OIDC configuration +weaviate_open_id_config = requests.get(url + "/v1/.well-known/openid-configuration") +if weaviate_open_id_config.status_code == "404": + print("Your Weaviate instance is not configured with openid") + +response_json = weaviate_open_id_config.json() +client_id = response_json["clientId"] +href = response_json["href"] + +# Get the token issuer's OIDC configuration +response_auth = requests.get(href) + +if "grant_types_supported" in response_auth.json(): + # For resource owner password flow + assert "password" in response_auth.json()["grant_types_supported"] + + username = "username" # <-- Replace with the actual username + password = "password" # <-- Replace with the actual password + + # Construct the POST request to send to 'token_endpoint' + auth_body = { + "grant_type": "password", + "client_id": client_id, + "username": username, + "password": password, + } + response_post = requests.post(response_auth.json()["token_endpoint"], auth_body) + print("Your access_token is:") + print(response_post.json()["access_token"]) +else: + # For hybrid flow + authorization_url = response_auth.json()["authorization_endpoint"] + parameters = { + "client_id": client_id, + "response_type": "code%20id_token", + "response_mode": "fragment", + "redirect_url": url, + "scope": "openid", + "nonce": "abcd", + } + # Construct 'auth_url' + parameter_string = "&".join([key + "=" + item for key, item in parameters.items()]) + response_auth = requests.get(authorization_url + "?" + parameter_string) + + print("To login, open the following url with your browser:") + print(authorization_url + "?" + parameter_string) + print( + "After the login you will be redirected, the token is the 'id_token' parameter of the redirection url." + ) + + # You could use this regular expression to parse the token + resp_txt = "Redirection URL" + token = re.search("(?<=id_token=).+(?=&)", resp_txt)[0] + +print("Set as bearer token in the clients to access Weaviate.") +``` + +#### Token lifetime + +The token has a configurable expiry time that is set by the token issuer. We suggest establishing a workflow to periodically obtain a new token before expiry. + +
+ +### Add a Bearer to a Request + + + +For example, the cURL command looks like this: + +```bash +curl https://localhost:8080/v1/objects -H "Authorization: Bearer ${WEAVIATE_API_KEY}" | jq +``` + +## Further resources + +- [Configuration: Authorization and RBAC](./authorization.md) +- [References: Environment variables / Authentication and Authorization](../config-refs/env-vars.md#authentication-and-authorization) + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/docs/deploy/config-guides/modules.md b/docs/deploy/config-guides/modules.md new file mode 100644 index 00000000..25d48bda --- /dev/null +++ b/docs/deploy/config-guides/modules.md @@ -0,0 +1,152 @@ +--- +title: Modules +image: og/docs/configuration.jpg +# tags: ['configuration', 'modules'] +--- + +Weaviate's functionality can be customized by using [modules](/docs/weaviate/modules/index.md). This page explains how to enable and configure modules. + +## Instance-level configuration + +At the instance (i.e. Weaviate cluster) level, you can: + +- Enable modules +- Configure the default vectorizer module +- Configure module-specific variables (e.g. API keys), where applicable + +This can be done by setting the appropriate [environment variables](/docs/weaviate/config-refs/env-vars.md) as shown below. + +:::tip What about WCD? +Weaviate Cloud (WCD) instances come with modules pre-configured. See [this page](/docs/cloud/manage-clusters/status#enabled-modules) for details. +::: + +### Enable individual modules + +You can enable modules by specifying the list of modules in the `ENABLE_MODULES` variable. For example, this code enables the `text2vec-transformers` module. + +```yaml +services: + weaviate: + environment: + ENABLE_MODULES: 'text2vec-transformers' +``` + +To enable multiple modules, add them in a comma-separated list. + +This example code enables the `'text2vec-huggingface`, `generative-cohere`, and `qna-openai` modules. + +```yaml +services: + weaviate: + environment: + ENABLE_MODULES: 'text2vec-huggingface,generative-cohere,qna-openai' +``` + +### Enable all API-based modules + +:::caution Experimental feature +Available starting in `v1.26.0`. This is an experimental feature. Use with caution. +::: + +You can enable all API-based modules by setting the `ENABLE_API_BASED_MODULES` variable to `true`. This will enable all API-based [model integrations](/docs/weaviate/model-providers/index.md), such as those for Anthropic, Cohere, OpenAI and so on by enabling the relevant modules. These modules are lightweight, so enabling them all will not significantly increase resource usage. + +```yaml +services: + weaviate: + environment: + ENABLE_API_BASED_MODULES: 'true' +``` + +The list of API-based modules can be found on the [model provider integrations page](/docs/weaviate/model-providers/index.md#api-based). You can also inspect the [source code](https://github.com/weaviate/weaviate/blob/main/adapters/handlers/rest/configure_api.go) where the list is defined. + +This can be combined with enabling individual modules. For example, the example below enables all API-based modules, Ollama modules and the `backup-s3` module. + +```yaml +services: + weaviate: + environment: + ENABLE_API_BASED_MODULES: 'true' + ENABLE_MODULES: 'text2vec-ollama,generative-ollama,backup-s3' +``` + +Note that enabling multiple vectorizer (e.g. `text2vec`, `multi2vec`) modules will disable the [`Explore` functionality](/docs/weaviate/api/graphql/explore.md). If you need to use `Explore`, you should only enable one vectorizer module. + +### Module-specific variables + +You may need to specify additional environment variables to configure each module where applicable. For example, the `backup-s3` module requires the backup S3 bucket to be set via `BACKUP_S3_BUCKET`, and the `text2vec-contextionary` module requires the inference API location via `TRANSFORMERS_INFERENCE_API`. + +Refer to the individual [module documentation](../modules/index.md) for more details. + +## Vectorizer modules + +The [vectorization integration](../model-providers/index.md) enable Weaviate to vectorize data at import, and to perform [`near`](/docs/weaviate/search/similarity.md) searches such as `nearText` or `nearImage`. + +:::info List of available vectorizer integrations +Can be found [in this section](/docs/weaviate/model-providers/index.md). +::: + +### Enable vectorizer modules + +You can enable vectorizer modules by adding them to the `ENABLE_MODULES` environment variable. For example, this code enables the `text2vec-cohere`, `text2vec-huggingface`, and `text2vec-openai` vectorizer modules. + +```yaml +services: + weaviate: + environment: + ENABLE_MODULES: 'text2vec-cohere,text2vec-huggingface,text2vec-openai' +``` + +### Default vectorizer module + +You can specify a default vectorization module with the `DEFAULT_VECTORIZER_MODULE` variable as below. + +If a default vectorizer module is not set, you must set a vectorizer in the schema before you can use `near` or vectorization at import time. + +This code sets `text2vec-huggingface` as the default vectorizer. Thus, `text2vec-huggingface` module will be used unless another vectorizer is specified for that class. + +``` yaml +services: + weaviate: + environment: + DEFAULT_VECTORIZER_MODULE: text2vec-huggingface +``` + +## Generative model integrations + +The [generative model integrations](/docs/weaviate/model-providers/index.md) enable [retrieval augmented generation](/docs/weaviate/search/generative.md) functions. + +### Enable a generative module + +You can enable generative modules by adding the desired module to the `ENABLE_MODULES` environment variable. For example, this code enables the `generative-cohere` module and the `text2vec-huggingface` vectorizer module. + +```yaml +services: + weaviate: + environment: + ENABLE_MODULES: 'text2vec-huggingface,generative-cohere' +``` + +:::tip `generative` module selection unrelated to `text2vec` module selection +Your choice of the `text2vec` module does not restrict your choice of `generative` module, or vice versa. +::: + +## Tenant offload modules + +Tenants can be offloaded to cold storage to reduce memory and disk usage, and onloaded back when needed. + +See the [dedicated page on tenant offloading](/docs/weaviate/configuration/tenant-offloading.md) for more information on how to configure Weaviate for tenant offloading. For information on how to offload and onload tenants, see [How-to: manage tenant states](/docs/weaviate/manage-data/tenant-states.mdx). + +## Custom modules + +See [here](/docs/weaviate/concepts/modules.md) how you can create and use your own modules. + +## Related pages + +- [Concepts: Modules](/docs/weaviate/concepts/modules.md) +- [References: Modules](/docs/weaviate/modules/index.md) + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/sidebars.js b/sidebars.js index 72dd6141..0fa7fd5e 100644 --- a/sidebars.js +++ b/sidebars.js @@ -426,6 +426,18 @@ const sidebars = { "deploy/installation-guides/aws-installation", ], }, + { + type: "category", + label: "Configuration Guides", + collapsible: true, + collapsed: true, + items: [ + "deploy/installation-guides/k8s-installation", + "deploy/installation-guides/docker-installation", + "deploy/installation-guides/gcp-installation", + "deploy/installation-guides/aws-installation", + ], + }, ], /*deployAwsSidebar: [ { From 5085b2f95fa705464801d3258a7fed7fbf1a4944 Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Mon, 24 Mar 2025 12:14:30 -0400 Subject: [PATCH 17/39] adding monitoring, persistence and images --- .../weaviate-sample-dashboard-async-queue.png | Bin 0 -> 410449 bytes .../weaviate-sample-dashboard-importing.png | Bin 0 -> 98454 bytes .../img/weaviate-sample-dashboard-lsm.png | Bin 0 -> 80924 bytes .../img/weaviate-sample-dashboard-objects.png | Bin 0 -> 72006 bytes .../img/weaviate-sample-dashboard-startup.png | Bin 0 -> 57628 bytes .../img/weaviate-sample-dashboard-usage.png | Bin 0 -> 38989 bytes .../img/weaviate-sample-dashboard-vector.png | Bin 0 -> 64636 bytes docs/deploy/config-guides/monitoring.md | 141 ++++++++++++++++++ docs/deploy/config-guides/persistence.md | 112 ++++++++++++++ sidebars.js | 8 +- 10 files changed, 257 insertions(+), 4 deletions(-) create mode 100644 docs/deploy/config-guides/img/weaviate-sample-dashboard-async-queue.png create mode 100644 docs/deploy/config-guides/img/weaviate-sample-dashboard-importing.png create mode 100644 docs/deploy/config-guides/img/weaviate-sample-dashboard-lsm.png create mode 100644 docs/deploy/config-guides/img/weaviate-sample-dashboard-objects.png create mode 100644 docs/deploy/config-guides/img/weaviate-sample-dashboard-startup.png create mode 100644 docs/deploy/config-guides/img/weaviate-sample-dashboard-usage.png create mode 100644 docs/deploy/config-guides/img/weaviate-sample-dashboard-vector.png create mode 100644 docs/deploy/config-guides/monitoring.md create mode 100644 docs/deploy/config-guides/persistence.md diff --git a/docs/deploy/config-guides/img/weaviate-sample-dashboard-async-queue.png b/docs/deploy/config-guides/img/weaviate-sample-dashboard-async-queue.png new file mode 100644 index 0000000000000000000000000000000000000000..903f8aa6ea9b45223dd6756a3dcd1827e3d795bb GIT binary patch literal 410449 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

Igb&ztc4Y3--Vhh$Io^7{b1jZ|qz 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%0Agb%=5j9)Bq&`O_?Yv=>3eTq;Xpm! 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≀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�_baFIq?m~@%>R2&I{;!m%I_E}@(J4Fw>$HgwBMiyPo%vk)oW_COf?Li?k_TA z122bv{P-?y))vqqFO&pEjmzqTM+GeUQ!=qB-TZ;++Am4COrA!vYWxHw20MD3ub0 zpSt*+OxW!mTedwQg~T!O4ic8+k^pjgC3InwR8i}iqzn^c|5T6DUu?{gsSJh0v9U$~ zqf~x(utjdHq`HC^D*CSHXuj$JqVs1?PCVPb{O<$n;CUNXR3Jd9ECaS37!~Wg!o)J zdmL|(hi;C|?f2O~aNi^~vT`?D57T%dVh2E^sExp3<{>0DAr~ETk}0Y6za#nVd*C3& zBz%tjtS;e5ppCoX72Sc*N%mOJbV9`kri{K8C3m*bEpSRi5Z}*aD5t+?lKnNT&$im5n)RuxMSp~>Bt z7XOt_U;;;=A_0ZOj9qX>uS8;MM){irT!AI9 z4TyE4?=P$ghn^j+$8IS0im{lKKGc=l7|bEBsBj5TJWCej{MD+DqB|HsX~G>*xzxxE z%oqt}t34Tn3n_dx5f8Sy4^lChj4bK>I+&#&BsC}?*Sq@IIihb6+ZP2B^3M50;>?W2 z06BM-)7Nsuo#y%sZg_0sJm#2?VIy0mWDbt!caLP%{8@Rl9ORT>TgioR4r;O;kF)?@*RHGu<=&7(So|i!XAE}$N{`M;&v>xsN9$MTUGhbr z3V_&nf>eM9;`;%9H_SRsxTh+^e`G?#6ST&1uXJVOJm@fosr5?W$RwBCy);LooaF+a z*r3zJo#UO!{*@)!gc|>m5&qH09cV+$ImIlO${8Qo_KNIOrCq9ir_$Mu`2O+E{e#f_ zV&aiV$ca(F7lt2p;H(rbsUJN1#~rcfHr+=djPJJMnAg*Gj>aQ9&FFbEg~d%~OoV}d z*nQLPoUoV0TF8CV!qA3(IB*pdPr8tcUAs}`@&pW?ko82&cQwiQ8U)>R{?V$z77OigAiZR+tcM5>5rQ^!r>6#@-Sg zP@YD*n?F$wJaSI;qgs_lGNt^}822(avKhZNWkhi-iXb^gt$P?*;>&CAgjy@C}&I1Hb}rTqo$FjoOT9^6{VJsHChK=9jAyAh z91FD0lTWJePjhW#^W?;2B1}C*S*w$?Yz#~Mc{78fbuf49_LTGbQ1}o4C(xTJ)9PFs zNKXYyDD1Km{||d_85CF6wG9UX1PiVKf(Dl$L4p%BxCIFA?$BsMfF!uPCwLN^(73w? zcXw^v$XH-FVA2HQPV=w z72TP3yuOe8OfCY{U~omWI2^0CTa0Lib`KOcr?=ZfE3B!Fq z>-a1-R7_SyQ7h~AsaNkZ`J1N~)yTtSTvhj3g?AkOkN2TnL2J8=M?K zG$o|&yv#56LA!J0!FU5_d?Q5Vi7!JQ_-yUWp4~A%Li5zk(ZyA9y*8CkV$X;{uZuws z^*lfOP--YKNw-L(JFMyC6FOd=C<4@po9_Wqpi-Hw+(EhlUL)nD_jbQ}T;`qm z$(IOSKE;49c6`pYN=9!9U+_+~ahc=E7c#j^*=+WVJPrA^+WnLgDfu8bq%;o8F`1{S zx0RFgYL;p}-LXBr>*7sb`4-~wlMvRtm#1g1LH%zoI-<}+bJms(r!LGqWz7l9LhTW6W&a_@l+RSf3#Gi`Fbs;l%wnveoZs0B}_o=p2HhFb5&~a z0-KN5*9mL~@^B;n$FshW69SXBM7H5V330@tfl;FGLpCLATr{Aiz-IfA+#ugk zSz?rl^m)mA3>3$X^)kG?!=rM&l@cm%jecX1=ey0~sp+}?0KLx#9T`u@&r|Tz zhfV2OxpbH&&Qt|DN3@dp*E)uuvM1MGjD2%hYPCP&fd}H6#sZ;yAnkV@CA9|#E#}8W zFDTwEox&*rnC~Ae8h{ORf&wwvy<5h|!8zZThA80_vMjH(HR=CW0RZxI19v$a6VSY) z{?Fe1k1G{k7^Wu~L*!EqC!dc4bG@ZK=&Ler_-iXCIvV`d1ey~N(*Q7K&_pA_?2xc5 zCJ*Zlv#-BdnN%9t*yFE${0|Q(ToYa;>LA~{4 z5X(xkZ9V6<+b*Rr%4?a1Coz?ttEHaT2lIXPJ@}U=(k})Y_#4?>e<%>f2&fe407-ZH z<804qy@5Ie`KM{;l$$^5{pyKu0~DJQgnD8ma-@>StWWy3>$Mr~bWW=@MqL|dQE;&w z-j3|>Sm2SA=VA1DKpT{ErUueoUq3NZX8t1fA#~*8&DCU;V+}Blr9?(M?S4&t;0)+o zvCKm9|Ac^k?Zkh?`k$^0)IJ#yh+f^c(Z8jKa#Q=#Y<2E_#_-Tc@lK4t;*r)@<$ck<(nzmi3}?isvl}lr?>XJ$(s*yLlM&mjxYP8vuzex= z$9K^Z=@B`yNn7%&8)6@Hfjlu(WsT=_&fa0RT>FGG7GA!2lalA+ZI$;9Tpd*5mItU& zx;~k$IH5k(8%Ud(E!A7BRj3}?c7L44_wvScC||>|t|&X*qO8Pcuw#9n>GW&! z8jWtnDyh4+*9YGF2L*8;5+p?Xxsv}w1b++bKfXtftb*z{a=sAAkCVZnnn%TA+rWbz zg!!75l$o`e#_ziZ1A=a9d9zu=+Zvv^`iV3BW7GMk-&O_clvnzB_s0CyJnPlhO!`mx zR46}vGWiaazxKYqDjO(1m;~mmEVrMy->4&|hUCR-LlMKXH+#XlgoA>gc zNmmrko*c#%Oj%J%KOEp(8i{|q{=)TeLf)G^w8%W)<*ouA+BH{Kl z9t^G5x|qH`>#c5gJHg^pOf9zLQy~P><-o2(v0hviO z^7j8~DE~>K?*F+0wgj8+!u!F42X}YaelRS*M^2|cO2HAsZj%;{qVUZyQozJEQDpU` zR(Sp}DjH7M_Z=+-R_lX+6*5I(2NfJRR)#@F13b(?3S{4vjqxI=dtrqw=gc1QPLriK z8$16jKmT2#_QY2&)ecfTPS$5PNd`G&MPFE;2(XQc8J-;7R}^4;eU60Wzmw^v1Z%KeG#xg0hl zT492F+!yjUTm~x&JWd-CduL`>G%7a-?%pdKpAUilQ6EX5i(|Xb)cUn9uY1RHy1%M6 zY~BR3)T`JOx%$slq=)k=jMBeY*(rOyy%mmE%aZPW`(>PJkTnR0j^5dlYh-zMx~(l3kO`VRSxD{RJvmH>JRA_z ztbMr`@c=2}9l71*rs>A)i*IVl^fprO;3WU;%YZsUXX`-s@@s-b@XYhW#*Syv`*2)K zL9cuJs+vFA?f&rkij|kIDuP>qqec<;_Vst)rLc8~EW{8|QjRHtLgsuMDtp*n8J{7C zxda=4ssMpb6uzf~&=>V3Jq4iwr_$r1kJ9o7ShTK7JP*4JimZP$W7{r_q)M|?Y0;}x&U%o> zfsbNqujV`}2*d9eONf?lQCbL=>fgQsF(g?K4m7&cI^px{H;ar@W3sT*^c-x~usxb> zK-g!*Y+~nuazFa<(inBB72+5*%v|KRZctciCHL~2D!4kb(;1`0g7IBD_R!vAgc7|t zDov`rTdV=%=X8(0uPR@dvj<*EkV0q5fg!b|JE>(Z^s3d$%+>o?+U2Iur-W?Z8(dy0 z4k98T8-$E8O-t>~xExnm)c4%f znZ30YCOv0@p6jVxyfo>arF;|LvjH4NcdSU4rc5V&(Kw>y0}U_8CVr7}NK_z45VH85 z{Pc+bc%Gc_X6X4mBS*G$d?fwZ9P}}d)j8Q@m1V9Av5jYu&s1Q{0o8oh#mY5G_vyn!RP(fMM5dh zC5}=55~JrO9laLK*fU0cm!Yd6!zgYQciY{#hhx_~rKST^a*&_ z#5YV+?$(^PlZ=M#Vc(PA<3c7vDUjr?(7a%u^d5a)D_G6KKH4IuL;~+vI;6u%E=*7g zEq0Zh^}2QZYpE8-`m|4Fk_1t2-GwVbdY#2c10pTkAaw>`o_v=#4g?1fCGk%vIiy6i zB(sR3-CZAr0~7DHwe*LHjCrnQjfE}2v&+v+b7~!X)$z;X)_)!s>3RfZ)eC*IQ5il zZr=kWnk>5qlmWI8FdskM3$+$3PFkg?tIWSQErjGki&EldZW_ctkbHgBKTw~FS;0uZ z=>-|=JyR>x8Y=d}=9$F$kl?t7xAY!3{%Ah<&ZD1L?WY@7?wG z8$Uir90>=A`w~2i7NJHnqU!Q~?GwRM{mB28mx|p)W)K?bfhIx}qL1P-!^wSn>u+10 z(82F=wd>N|W;|R*oYzKp<#c4$9C6fNC$v|;E#R^dVQ6GT$PS9Jn!S{l^vgZoajDcCX#` zl~j=~<5Kj}*PHUyq5(TWD20X|4KNcVTKy*X$qJUb1*#c>E+uqoF=YJMVdOOCyPLCgs~gi`ywsh^GMY8Iv^+R| zv0%LDS~vMPe!$lwJUc#@2*tMKIT;zI0;Z&t8g_)Co|JWT5PU$!9fOSly1eyVKHeU2 zo!+HRtPkJD=i7Dailp?nx;{dmEY`0xN!r9;g9p^Gln+>p(re0<$M?a~zj_fX0;=5l zVIDVK4+BwQtWZ1iR=1$z{RCVaZptTSyb|Q8lHVUpCH}5Cy7jz->tB9XL}Q5@@ClXk z?<|YzgbNwGUwyn%c8bzB+WF-m?Ex*KvT@px{P%_>=)ngXq&ftQbR3p9BCoSdxB@vQ zp2Q*<0}-l@c#NdATiCB4l8gZO>2NKPnZJMF|JMuRZ-9G8TIs@9YmQ!OlQzRdMtF|_ zFM=IYzCA`;f^;j-GZuU8_v`x>iZK8iQLMKn_OGMZu(!Y?6PJg_af$z0AuOmj3bkAq~r=LMD8-i*VHeaAB%9=Y&ezvS;hIN2oP zH4s6Rnx5HALadW_rYl$?HV1785yjC&em&{0P5$k;rR0Q=B$Uc2H=j`*$nhIz-J#Ld ztfuk9OfgXo>{m96NsHTHLT`#me~DWot2CL$dm6jBG{rm&c$$u#EXdVjz`o#s~~YS9MGDanI_dKY6WOu z0)kFG^S(Jz6CpOMkU=EnjsB-Q8xf81?LA zgvCFC}R z(C9Z7C;gI3GA~$R9=+vs;n(sn?XaJ9-u~z2zkTjUAq9~96w_nH|65wAgs9-!%;odz z^A`xHFk&8ZDmpnWP`{42`M>0&s6L-|(!Ogx$(Z@S$V3)k58m6t{#xorR!K72M^+gd z8;!CtWLN(v5)Y6FV1+07%_}%WtDgOm%fAO5l0bxoG!OTCPYff36woF_2M2wUX@yV! zQEyXCjga0i*sC*tD3jLe5zioQGY|9qn!BAoGA z*6a|*YTU17{a?(<2f!$KV*i%wFyZ@+#TJuzWRn3m3FHBPzvYj28Zi*N_oQmF$-9|; zE$jax^2mVOJg5F`?TP*1d>tC8gTl~eM3G7b|M|vupKpYD^@kRGq^VLc=^#22a4+s|mkiu6l3$<%rt|UDAt6)dqBK@=rYzzY6{=|P&aJFc` zFeFOF8~(PARCGTL&)n1hQm=r}2k)udg5x8W+FnZ{NjMpZt7o>-SdJG&K9j~v`a6_J zCXM;ia2UtA@1!vPqXi&FxR1XOI&0y6{fkg3a3f6e2KYZ_)rSMNEeJOrfbhBi)@vnn zvZ(v^=4x2Zq@?cci|u<1;5Z+hY$F7(! z%ftW&k`8*J46O?jna-YYa)vzjwr7nH5?)hV7)eg8A# z+iUykBaMQk^X2gP?%2J!9_Bg`y`$+G+w^;6LC4*#5`aPYzs;hpOT$V@kP+?-9EcEd z=)F&ITbr!D0@(E|v2WrBXl-79*;+zsAk+UCS@Q7LqYI7E{Pdz&!n}6=XkJosFE^>? z%}KcJgdo>t8n>60(Tv*F8+mpD7jv`>{II4eijwYUPc}#d$1{_!s}J#^3A|Kx9GIOz zM%0@kptg`Np#j;E-n>-lXtXI&_}qNxIRG=~nt0=uB;X7I8u>`*LS3F^xmEW0&6W3| z?Umn9%6Ezxv#_d`dbPaVoLOasau1StJne)VDpg$;_2cxve; z-`s65qd<{%#p{{nQc5JMhcFW$oBA)lX~@1|d_VGXN|$ZBevA~-tLapO+{U)qJzL2V z&&G(M+~0OnoRoB$njMb7CIbyReio(H)0{Q*Jv%k0ViU~fj@{QCCq>gUuV>`pKw|1$riop;5;0b7j*5IA^&gB)hPo=wh^^< znCvgt9gzhW(qhoJMOhQUA^C_|VZiG~+jh{I;~0R8VylkkB1(!vg2rOj%V>QZds0}y zSEvUj^O@tyhg~$mb<2kOk0N1%ahP&!Pr?PqdR*q21o3RH@@hJoKLo#?EXCixnkw_C zVAMKRtoEoqog&Io?#QjZj>OSahZd^pIvI3uXpQ?BS0*3`h9 zVoi!yPa*ZLG*;wDt<=&n`)oo;Q1=hy)&lcsrLl2N!4zEzG1f6;L_$=9r&t2DOYFI>7)xlLmVA;gSBh; znS1Il=m~SYRR)^8((kc9^O3AmMQ}sOj27eRx_Ud0l63^;=4j#(l?PS01 ze3*p%4!&ej#N9v{W_Fj~N!UjTkKWl=$z$QK+k#?Gz?6r}{Aa2%9S{0*2#4ozj0A)= ziuYe_4p&H2gAU$QhAsBuq)nipUBhvl&1kD8ahfkOaG<_*jpBlKv6(l2n=AJ^U*z4K z_@Z4)fUYUXH7v!~jH&jnxtGR&_uxR}zaC!*7U@2iBg~p*dzzdb+K4Ex;LnI?nyUIX zeXjPx*6ou$Qw`l&I2&xI(vRgyfjMpd(Ho=-V5CIta;AQ+@C~)n&27ww{bG;N0$o|M z;^)usY9@HHdnE6?T4eA`1le_r@g{vjp(o>Wr&fxO(4WSv_B4!Xc#Q)Lfo(sSpAJeD zx4trkPshi@7ar9deVmdxnLd0bS)XL1ofhq|T6h4k#z&W>_RFMmtS)~ENZEq#-IQ3| z^6%)MiuDgSWe|a;)!PPIx;+}eyV%G)JH`ngh?5P<+cC^zP&3KOAjQjTP94n}p7DiE5(HAdGPsT$Lz0lb)RIXkAf!pz&X4%HF4napbsiG}~U`7g_kM z|7!Slc42BT+GQ<;@V}JS$obxYozQe%{0Z5yt{({`@S zI#2B0wRKsS*j>a;i}cH;vFYTUN@0a7? zUH;vy;NGHi${2S?G-YP1bg`e1QwX3bX5fedqh`KW7WSYncGaD!3=_WTC9W2nm8!qq za&$~^($r*(3fO3!QU9@=X#cmg&8L^_ewoc`vghkgw|P~%QykL-oEH{gz9^MP>9UWJ zw7`V{4HdH_Qcyu9l1C_)#IS{A`$2TTl*st`Hw7I2QZ=EgJXNP+$nt0d%USs=A9`zyCJ`_A_Y;L%t7caKj_H03iF1#3F+AKHp*ojUE^Hffm{+_*l#A zDE&#eKc&=+HuJh*vKH7cuQ{A*tlvXKMrV7o_fDmANFKk32B7@FSEq@e!4<&hwptxx z@N#HHH(l-ue(Rbp;7n^@c!zoBv6YP!jtUi5;v2WI2!0SfZ%`Ctt<`197oVd**O zZ*iZ$d5Cbtpeo7{Gx|+UY929ili^K1ql-$tCNd7UtixAEr0ubySmU1hsBnDGPi4<4 z4VSq!*7OGoRKApDNoB4n<*Os{9JFE^U!8gbpG#J2Z>&edIlNxAl(T^P5?D|U$DVR{PmXuE|5i6rS(-0fEA zt{$-n#KNNp#uRAY9gt*B`W38X1T&AW*DF}l$P?xYIG%O(ajE{G2-L1|k!pElaen$D z)&!s))5u-NWiGVA^@^w8psAL3kwY=J&tq@c;zXP|BEbB?QsI|_i`kvQZEe%R(b0f8)*5qw*B_2f3sEpv-j=op$!7BndBch;jW~&{? z$|5A}c3RCL8YP{{CY$;a-xTlL4?!p7&MZVm{mErUgG=GBZ00BQ<$E177Sd#ZHqH%3 z9sMMic0WD|9By~(_R`Joj;iT00JHrL`yUfbXzGoZ_H5?jM-^(PoqRRvPsy-u)%h^x z11`~Rz>f`OX+x+MHO95~<6hMMs*#zd1p)>T4Uk)v7Y{dnWIr1HayYpzy-QvPb}Y&( zww_^6deglH3pN(pZ+*2S$EQl8s~Xt^$m4b^G{ z-8_YqK*ITqPLAix*U_hoy57GZbDclSxqK?1q7fDW)5cWHHRrZo*In;keVMWnm&)tX zt?O+a)JbAEp_M~B{p_0LY*tOXTi3BJtp(ukzwOrUo$M@!@X?IdBQACob<1fhPA=K^ z0ciV%3j(Lr#MyYEwzY1z%bhPk$j?qa&Q|zL;V>lSW_%Rau*!=YV>P%0U+Q@=UJs^F z<;qPOv-7zGZA?>IjN zJGP(?JZ*LzDtCd7ac=2J!`UwpF+DBL1$>y!L%DQfKLiVu=Ei*n8|sSF2wt&o^?8Ke z05L8FHcjZLMkT|HLru(^dQ?yEmWm%0y67yFglrKU-o@o9&LH!y>@=8bD#5&gAFW-> zBWDZZsJM_;k0O4L zM_A(W18pV*QU3WE%#FX)W?7GG#o+eEo^M-)jqov;@e*B4FJ(_~;i9cG~e}>&1{FlTb9cMFYiqINw)F<3Z{V$KKv>(%0 zrMj!mQoEyNN`#Fs#XHd`GyDt($Lcb5KG{}C#knQ$kRK9JG+y8aJQlAz&LA5~qANj` zk9eG`J>4P8<@2hj!J+#S7ZGb~#AYEi>A8Kr!-mXZ*g@~|sx^X-A4yoc9Xzyk#2i}$ zj-{yK6k;T;eGMH)UkXDA+kk<}HPo|MlmzOMj?^9P@x|(Acvlaf*1$xC8&gIY^? zWN@zTk^2%!1Y3i$#zSGqk%*s%tu-=v(d^12PQzQR|{Sn$kl zDZq7(Myt_y8(AKCg@ue#B1CPTwW{_)Z?QFRkj1^DWT)5Ny1s)5Hraogk6;Lx#Ntz` zgS3k9O@=0CBBdEg-a@4)6aTFq=6l_yBLV>fy9u!upyNuWts`t%jun^C7RC6;9V$Ze z;D!#1>>w52&I|``_5CORB?&^X9n|*_weU34O`14gGxil%am~Alo87Sae)I~9qPAyy zCne8GQCv#)iBYm{y00tdWAObSAM?gWgbun0et_#Z1OckXU4r$nQB>?gB;kV(^`%+c z1|Vt;I+P>=rSrm<$W?e$Vc5~BB? zP$YLZKUH{Dq1kCqF<^cy-SYkMB-Am?1qLQf?+i^X4ZH^52s8 z!8b?;d#6b*dxr^(cc4U|N`9gg= zrd*IO3e)dSwN7sMg>>h<#P{Zj%pS}?v}(_3tQflfi~viNM+YPaVV|VHx&#!tUxZW_ zky~|Ki!$NgA8nKN-G&HomZf`NC|i{>M%Du=Y z$L2b91DUW->#y-A;yr099J#{%TShbjev$>YJZ6t<#DVtvs^TGvlyxB>0UWyo(HSBd6;BGuQ;tb)Riv1>b<6NMtt8iKSrm4>SahW8W+eYPwH- zux!YA`|J4JGlCZ4m!5xQ-?@F_;@%%dwug<Y$1a$!Duu1&ywb

-GNv(UAEV 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%0AR8Fzbn zfj^7kc)#Jr{%A0;zt-JhABWLczRbbw!j&o<cgw*_5B9taEH$T*Q z@<^wv?TQ0lgVApp38P@XbE?f04X5S&TpTsilVcZNiP`Br-;#Y0tGzAnM>}ML4i_(f zXp$&08qx1I?*ICywiK)+VNlu?!*It~P~o6l=d;2L$bIdDguz-`g)kz45F?z7xThx) zdPn1p-VX0<){h*d0OFW0h_v78;B6X{^U3a2M*YYqMg4-LP+A>$Pe|f51XHp zA8AOXgy`=-c^P8lpDcj$Rr4Vr!SB)*JJGV1((16#goAAGywWvt6an^hN+mMecs0jQY#N;#PU!j8Xj%!Tm`~+LnnImI zUx_CZqNF zhTX!lvy1}9T+Ck0KBZOIH{MQDFHgdTULWs^?eBD@MpURSk8f3v)D#TKZWUm2eVnM( zohXU7vlt4$TZmT7lR?HEdC*%a&pKuoI=fKl8bh`$_o5+k>p$#CZk49`vVoc-!gJo! zSspy60n-r^Z7_3ro%~mgbMU01gPzSytjW_ymuwm~h^T+xF-VX;T(%4JobJkq;_%^_ z{ge}@;Xq3d_m%RPaVd{SdfcbbcU_~0a?!-1ag16OlQ(rQ6sjGHp+ob^nE$K0uLIG%$;jV z4hDU7ZyeW!oO{g&u>*BnwiXXIw{@AC`-F+`ovwBF*!Jr@Pqa&ilt*o1w-(E$Deq+t zuYfq%&bkD4-7z;;bD}C- zg%AI2>?8LR^?A{1di8E!QjMgTQ0T{4eynZNX+ufQ_9qif&d%$G`wGibkt0wWnh2uS zFqTs*J?FzD@hEmyrJNr>QsSI6YiAESK0IIQ;hT<_lC{+6O|%VFBeD|7Ab zv(T3o0`=OTsJYM|tn{LC;xkk(enjaNbDVDvmwN!48F}xh@}{0ip~}v@Bd#^(nTWGLt%rZvZ^Tvuoc6v^sWd`vlCC1}#BNMG24(BRXzxA3v^WNkImpttHiE6@?(~3%I zJ1Eu^CR#pmAevCJnVh4n|5*g(ZntLatlT+f=2#4BOch;rUH&W7BXuqlgEb@P35+Bx znPK$dajoaJ-`w*aws$J9?<$BUz)A=_ZVH`jCkwr~jJwo3pBSqcRxVrba34D;V>tM+ zVp@B}T8WAcEqFu=39^IBhLcyKx@TsLNFDgscmCJ0mPu~1wUk#8NmM)kvU30R!|%xJ znnLfDewy?pf0?L?b&vVNYJF6JQ;*_jl$;9mMSHwmh^gjVT;`sg?wFUMoeY%}7p<2| zP(E^Er(KuqbR&vq%I0UqW0W%7Hx10uzBB`c7b}t^QD>^(xi8Z9H%rXw2@VRxa(h}t zCYnNrvlYe6M^v<9vr8XRghi!)8FV`0xYi!4IAE<`hw@&@gYH|BO0n&x(DcN3s-0Rs z=1Mwc_M8)xf-TkwB;uRfkmoA*DfVY|qVq6f!B|=>;>Pvm`~jd(13!(~h)X6+kk(ZC zDJyHhi&w02pkh0vg2r{&26@x1OikS`?lPA1alf-)M{IF=&Q>olywdD+PPiRvJ548l zq_Ujf+t}f?Y=T3PAhR%g7v2{K_FTQzyfY#jwEv%1597Z6kz>Cp-j{vwy#1#i`2gaW zfteWc&5Nl=S;q6Cf*!!$Fm5#6w4^P{Jf+%kUbIwglWq$A^20lCSjzhsxQE$LV^qp` zyPsCH>yM1C9k%86Pkp=#D~arz7=ig^qAnj47#{07A8H&IMweOai(aJ)UL!PBJK;hAMpg1YlTPAw!r1b0})pMoJ)GSUQFORiD-}FPzrbtoF;` zn|Ei=4qC65bttHmo%)u*T-t-#!m%3tK9Vyk=Cf3T0bm{;z}5Z+--N&j^+pt&>Uf)V zl2)RD=UFvQm5USpSG3V=ra4BXTgUGQleBD-z4t0Nwz;%{Oa0iD>rtlQ(u(6H$!V2C z_qzWUtwM>B!E!tEO}n_$Ig7m7j4$PcNo732$VQXVrv1T6hj$@w&`#}zB&T%;_Zj8E zV7RVCtWIg{XRsf?!6grAWiKq!s=1tf?oxZ9HthgfAe~jPplW;6Mml zYrpYirjvET2#m;LoZHCEtqsE@B}U=Xor$&!`K}J<-h`_Eux|VnqnqJ#5&M4wQ@77D zGGfs=&syn&*Y^K;46!>690ll}BOi3)6lE7}%9^oFyz-P!?7o&!b-fy@GVg8*mn7u! z8*8oVaw!j0=&E>;rf@u0-1i2*^Ye;Y2+t7X!W$h*dTqJk0<*F2a$3 zd@P;0)nA|^Rt~Y8`Y4Iai2a5lA`taBd#4Gz@BlA8k<_?EUug@soLDwnmApV#!iGr- zgl65DNfdF7v8B#P(XndR2fWv#;Kv8%yot&ArtC}e?50neXXw!qeiS$yty`Bc?`aca z$wGqUZzD0}e|~67KgD3b?h1v12%NB3v(NMJyDmqeYj;771Sg~QsO!ykL9gmXbn~q5 zQ`f4CWA$?08-j_H$ju_HNcEA=emEV1=;*n!Mw!{;?To^aZMv~0vc}cX;(LKzLgB8p zXI_W3y9Mg8_Dn6LfzxWnwPslE_WR9w1xZ6C(dcOhS4Gmj_lH+v%QRUxOE!r1Hv|Kb zkIxnd0<|YkDLt2V6DtCwMoRLWMsh0Kq=XNVd54YIDmSY#3CvIX>PtWXXSdv>Y|tFD zJy^uD4CuZ&v5GSDWK=9MisruRLWpM8vni_>ca)N%Af;a068XbgAySX~0iQ5VBi&!m86oq=O6icBkohQ-h-xeLm zR12LL6}$l(d34K02=A7ac!d3L4)nWQ64LoD%=SOuh#y!0f2AnCsu3l7dG{+G8|T4d zAk<^%Xl$lcl=9`q=DOvEZ1(pbT9jiDW`ntdUcFAxpEbAsZo0)dGCHfTq&uPjT-bIX z-VQd8!3I`z(9gq4rp_S9d}T2nm#H~l?^K7Ea_$%^fl5gUQ?LJ$ieONq*DdIoZ}u~s zc)8+eYLJQmMV(9_A5!G#Hcb{MAsf@C!$f9s_o3_= z&v7O&_#x5oig)u$I3LW8-+xc^Z>aKi9Q3Q-U|vva`ah%9Z*SdvDZiSayrc|`O8?-* zdLcb#nt0bEsvMfzHZ>ytf-%>Oudpi>JEacw_7}LXBES%EZ`A)3&o%udk3u0|J{r?Y zya#1l8#FNF$cN5wY7IMKy_GNNd1WN@hmn7P-N}j2|MB}RWr{+nO_5;LBhH_(WqlE( z^l_re;m>*S5rKi!V=KJ6;>W4n{}BQpe}Y%MN;p*VN(MaOKcNKva6nWCm0qbpdCo2d z<(2?9|G-B9_h;F^X~6dCA=i3^BePp&4vOJ_9@hQM{P%BR?MZz9pMVH5nH<=!_Ue+s z2Y>ea<706Cvybi^P1fBp;Yk|(cXo06n_Ogm-vQ$9x=8==61=AX2r^8??5E$KFZTwv zB(kCZ(|!IF@z-im-`>>kTK`iZmPGys8}r}4Wn*i&|I=O5NBOhXLEyRoD9-smeE_f( z;r|?>)OWCDj0pH=8UJ>i|4$grKg;<4{b`Khdv^Sn7r?&-Mi?>w=Ys!p!T)x*Z~yb3 z3;u7{1>$xK68?E^0D}DI)&AEEA2Q_sC=2xu_yNhh{}(ajDI{<14SsvUcQI%74?URf zGWUa0GO9LZ#+l*v2MbYK*3u;12qdP+(;JBHr&2?UVVRV}yd=vGWXL-Sh{VbD$Hyyo z;fd}Cv?@SUt|;=c$i zF~WF}G3mi_&%vAwhcLo>YW{$<{Q_x&UW7L3UV7a0SWY+#7VF5k`;JsWY1~7wT0?)M zR}VF)PP}wynYzgQ5QmOzN5x;`VAsdKGzk7C8P$g}lgw}yL$`l_#kyK2oq5rp__X1_ z=`tkymPWe#MI)Usc6a;=(0|5}!aKk({zxDX#xNu2PpAkXr-$bR9|Vv}VVF_>*YDQx zBV&a}7J3$x=I9D$BHe|HgkQ`QQ_&>-_ME?F-2v+%oE-e(&*uvBB;Ocj)oPgbglZpS zVE$n*nhdvTLaDz1H!t$($?GvBu<~#`a27JXAtK0SSP-a6JJu68LhwOrFcoqcXwysh z2us+m6}-m6heJrl5E-cEyAKU;cN2r#ANo$8kNN8{M9rGV*URlW_}byL=9s^p+^&1_ z%zYo9KLjWLcO8@JzZd=zBw#&hR(#wN?r{9n6D31XMhQyK(f0Lo3jiN1h&)12{;y59 z8YA)jdIw$#IdyHC_%mfIf8F;xXY21HN0C>-l2;@M3D$+*DPMmZQHH#VdK#H4&fRB< zDD;Qax{uzb>14zH&;mDf_-kjWV}Wo>A%3VE!B8O?7JLraZ@Ge|*ZjiZ19P(b@brlN zVd=LVw8AL3>CGK?DujNkoxp}rEy(P9Hz(^1F(U*k#5R!cPkuK0)=k-(Tud3^5b?58 zjv`^T6rP0SHxc9Cyk$+#|EgitA;I0$P+ffM;2`-%$se$;fQ16vv5eatBLyF@V-b{+fzGa#r{Xu z;4uHNV94?9QG2ZOhXc-fy1A-_Ilo&X!2E>`5k8{z{RDPwfADt4Fd@R$1il__V(u(U z8MoyRdL^=aOn%6H*fCE5WBR~RfT*dggEOE4xBp=zR3CO& z?|-iMKiB)8>;2E`4ItY;ulGN%_y6x-Z-24cC7noB(%MnW+;8^ct|!LS)ki1Rtl@&_ zJjwx_^YUw>`Jq{*)90W;z)yQvn7G3eed;-=vnlG0(W_K+WTeMYPZ(Fm8x{3Y>`&Qt zE`>t*f`LGA|9ntxgVvBW!SeWX!AfssdxTO+XqrT9N0q(h(iGlJu!fGHPV*OHmm+R1 zh?`pu3^G+%2nj+Q;PziSSO)m;YazCcv~))KfWoxVaL8x{_cS41^M*-9z;&;m_sT>SmOwne}?wDxG(# zPeR>CrZL2E+e;f$0;d?TJ6l&K!l(ztuh|b($809H4ouX_^xc*1`VC|YW@U@gNpZ=ivX0imq!eemH!6gy{}G` zVko`*pYDYj6^LdUHD(#ki_U~XBe9|E+5#_k3vP&|~*u!_g97+__&?p#GPIiItPnYYqwQq)FSGUir#Jq(Uib$BMi|JRLNfl0mF0XL?fd%s45TOg9`^`mZt!kIfR#ZrY3CB_tVT;jzn(rF& zkad*5Yca$yr&_3MF?iQ{4lxp@&%}0eIx42NnAq}cl&HVhaxGJ;uv&Xc8%S{E1Ny^+ zY%1-sI;`)SJfQeaEB``Gl5649CTk(kPa@gR)?n6Gkc;7TDy+nj=b5sW##Ks= zZQPrty4b9C&AX0)i+roIR5|AC!lj>Qb6T=nD_DP0^RPX z94A#S7AwCT*W>J%76X{Z3|i?03RfLJG60$59;d`&7jsW&NJ1;phH2#j1x%pg38LaU zC1w05gFKPT%+&rRYA-@(`ORitqol=3kfY~^T&VNwx29LlHV4uR*JK;HweCRvn;kb; zN><5ht1&u--o~nA`Xq~Uc~sDXE#LnRJQ^aP^|oyy`UoVL5H(VbWeD;Qxc=@EniFLNo93kQsY1 z$s5ddzv=Wui+D~?jBAANbO6ctaVk80CGUF&Bwj!+W}^f1q5CR$S690^NZ`MM_Xq#E zFb6{NV~AYJk&SuLxp+&IGzYXpEWM1~DU~t9(0cn+4P=I7YBil+{gzs|%iKm_&Bs7% z5m$KjxfVaS_O)X1M?#so;#z3%+{u(mHs{5T?Kfq!>+eIuOBcJ|6Zbl~ZlWVhLkS#K z=PU*>Ti><@#A{a{4M&;+bzvdz`8y(~Rn=&oi-9VghH#Y%t8i&3hjht=4cC}{io{~& zPK4gQ!2bdjjZ+_;`BpYjbzu5sx>6%biCEU|2lso!ZS^jNy}}=cKYs4=qnH36gP&i` zEr8BhnuG)d)PUQ7$_7$a_;Sf4-^jrSqF6{E!rrE=dS3y}Mkv3ySeb6!_xB2CCcmg$ zjON=1mRwQJZ^Vh0Oz)|DFcgeo+3N)wL1z1tDO>G2YdM6ADc6~W{v_vMV7@Lc$(|vc zt+PXX9c8t8tKFe+mdqMAjf}Sq?^p7=rvvmc%x7dXnPql*3eS|Y6lApLyuo8jZ_QMAu51m<8R*ED5o z>l^ihM)ZK5OS5j-=$eLRi}y3CFa5OnA|E=wE7`8fcDlK;wNOq>@jP<8c48=>JCF5T za`c`dXApN`t#sXP0C)`oMoFvXt@~0EM^d)>cTIIM!6UO{fqd}{<}(dUA8|LQul_N2 zpQ+RF*C=9R-EkK|0Q(UYPn4>yZc9yLvT%rt5SYuaP`S>R*` z2Fs#k<+(MKiS(2SW^eO8{x3)kajya8S*BcW1amL1!g6n7q>_wFf%FsLpRG}^o*03VP;nlXL& z|A1&~&<~tKDcTu9=jp=D3`ch2+swzh_g4UK&r%?6`yQF7X6WZ|ycX$UEPb;VGx^>@ zE05rqJV!qNl>?!zP__=St5ud!%^6O8;P@d|_D{7w?hoflNN*5zTKJAq{c+FCruQ$l zE!`dvm9X~5=d!Bnqx8srpvgIl;#9+PT;{|)U4R2rW7La)T8lFM`-*-PKv(Leh zDEmiQw$;X1v1+I!4aJAI%}tklrLWc!4Hff{X1$xirswi<*K5NRg~Dzz*3P0g&-=UOO193~{!;%+lh#w2p*^h| zGJK;v_o#OA5oJfw7xrWi%zgt(xn{@zBRtt-U+-~dF^)&6T^jxQc#Es;?#Wl=;b=8# z?u|IqTXKYmE>mLCq!v~NhOJ&ZU*0yN|Pul%Lq$W`P~P?Lg*9qXz= zx_UZ_6rv7r&iJYn4nS4EO9WEKN~+dN{A(_=^#WRLY>W%ASBZd8lGV7nyet0V!?L%@ z`LeMLzG;;&H%A5cs4TBRRTS|6WA4m@%lIf>;e!P(9tWbQS)C`nWsJSr6fH(n#I8)B z^K5Z)lYUM+0>l$?JcpI+v7>U->bC)r%#wTz^49G-EA7I>&QX=+JxdSS#zj~s^K{}b z@<6R;AJwR445vVS?(z~}0SL_Uu^?(%)*S432_P~* zyjya%?%G!G-TpmNnb4?%u&H~>wrOF(BRvpA%J&Y$t}?nF9Y57A0V>uW^g*fT7$RtT z*r~?0`({jU=gKp1={1>3Pu50}Yk-{{4&L2>5M9vAr!x^`D7}R1a3dxz^75}_rR2OuOyl*Y5 zBN=kfF{399O(~qBBBKdl#GHADgz{($?{f94f*R|l0BFQ0sb86nPLIgy;&v}z-T*Ow zanh3hzU&OwCB41IeqlYZ5>|n<9VlUnvbt2W^<* z22G_qHE08XQw~PzMq1b`3!Cj%-?mRyY!KB`9LPLANa3#nz^oef!fn6gfQL5$m5I_C zAz^-LP?;Dc!-3xhl?mID@!$iVIc>=$?u;lF(t|y4rC3f&i% zWdNh0Owj$+;Sxl0tHmpzLNaqbF63F#bG&>-W`4ms9Th zoSNl%qiA9!TnpjoTM>0>P5N<2v)_|k>Hnt?yRq(W`Tq{F2OzADS|EtYBZPt44Y^1I zWcD2>=J<%|BRm2hAPT*L%*y|Xr#iJdr-MOWES_3oXr0$l65ETx7eu%ey*wv}oJres zjzXN)>jYVRTZh;MP=Oa$QE7YwRnsmP5_ncuFY7I~`E(n;M3-r*zPzAq6lKtz$Vew- z08NxEeq)jL_YXep^&*8zudf$&;i$vGAq>LmgK~nT81RVTzM&%YYGCSrx^p&;%<={D z?hc$q@txI&+}brLl)C-(aUJFLH=pOaK0P>K!hYBF>CpjG==&}gQOEDaIclz_U$ag% zJ`0b4ikfIA&${OyC~^ct(b=s@>yzXiaFb4y?`N9NKCpD7>LQvZ;mCZE=~13f?0kx1FrX`@0MaSoQTV?|`^&H>+pY~5mT^!JfguDD zgaHX@X;5MWq(izx1e7j8nn6YBZV?a=1SLd}kWx_^lvF@LO6l%;k8@`5`JU(Y+P>?( z-yiq3UGn4JjyaAM``Xvq*QvgcJGY{1R37(;{_GiFdI694aR0Ga=G(2DCz`K*f5Ccx zf`tAS(Sg&A|5G~L@XI|I7pi);_Q~13{I0;Ok1Ec5#crJvI^YwiVYWltpy#;*vfcD! zaxy&Cz?@&Vzq;79hlUQp>nU$0a zvLaZ~XS41j2TH_`lLJbt)*WsyG#tD#fXyc-yEzN=eh*dwP~EcPx9aV zv^M9_6D78nE-&C0!_BYGv3(UJPD_u+24C%p{j5H_>qv#K{@4|mEO@c2H{_Up+94g` zV0yDDB32`tK_CoxAQBdsvw2q*)y#07Nx&K4_p>S9n3 zra_!jlA;Ny8%)&*(GLmXuE#`1svc4Z*-9?wfGjwfeuMNEXRJwu=dy@vr&r#I`&Hi( zQi5D=rk@e`y4#Y+pm-S8)$(22L2QrZLsDK%{P~LqGSg4G%V*WCCR-CUyLXptcYpbx z6|+dQAM{>re~?@}8U9+0M7X?FCG=0BQy}q;rDBek^s;_YrLTF3?NZ16oUAd1s>cQZ zww#36AP+Q30dBz+Jwd11b~7bEk2fm4=r96p*D6#PU>7ow4xZ1k#?W%ViglQO z9K|^Eq4z|f%k<~Ei^=V-?-eEb*(r)D1Ga8rXl3cLrvCjR8FQ362) zw66n#`pSjtmq6q+U+W`je-LL&=llE`cAkbiDYozEF)T5eD;xV5mOZK>aSJIeZ0E0d zByJuWvGdl6iW&8(3fr)d4sYsPlPkS2{~pF$hrF9a+~P=jvrcH9xa!~`-nVrj>Q*+D z#Ho(QZQuhg@h^%N80`JG-hHts>WF0to6M=JwWVtD=b_!mwEym9w0*Fz|^ zHFoyiJ>3?1y3)^TJ)ZpIT~FGFc~0FuB%sW67S3v(D{9@X`$*+5k@$Ea+GGB*WkwN1 z(HT@a2cE9mu2^|@a`6{;lM?t5Y|*_3BzG-j1 zKAzgFX%EP22IR5NyIHG&$=B2Xk8n=k?;-WO_SRjmu+3KFYq+Fpt)C-t;VI_**9rzlD1= zHGZylyh;juyFI-ozUX+3MrK=O!?Z;gG%xE3UV(cq#wCyZ(`V%0RqyjrchNP*u z(xOhn2pYAK`C>aSi0&qFS2&&5a#zF3n;;54^E2#b(Vf+ax1iP01_l9%bS1DCOm#Z? zI2e7h0A&35lg7_lWbkubs5;@~a2Nq4AQHIGN}QC-yb2mV_bXrC?G*W$W1;y>TP5wr z`Nzjvu;XX3d%B9mxc-*;c@QPOy2C`AuR%;dYx?PvxsPSJcp7&1zI^S>R+jFmZqHp?W?_b_t7cu2@s$E}9z4lSu z!D?cB{QkO=s*g-j{SA~y#tLEFGcS-6>UVaO#dg!QN@v}u{{VUp2+-d-V+uMKy3lNt zqeO5dY8W1yn$2?jt+Iy8zmim#t~CWpcK%lUgzqhZx_E&VbOg$MN3TNZ6rS2Uj^f}Em0;~ zZ*b}>6bv)QW&^y|2&i}C)Wmg2Bqp2`o$??y*Dojg1i$4b(KQ@&+Xb^A#iUR|m`}s9NeC6LMOQ zg?bU!FFJZ11l=kfdJiD?M;zpCcN8E3^kf3zcm^qJ9*)xIP%D431t8}PpO4aKbw<}+0r?4*G(Z1``wk}0B)JU_QAF${3yr7-* zmeXqIN%i`i;e69#vh!Hy72=qEX!bAXsfngME@(Vwgt)^C_V=ZzypL7931NFg=bLQo z-O_i}k5z?^GfLvXyuA86#N{d;zPRVUShJeAH&vmtn|cP?mH@!*d6gA?AOubG>Q^ki z^R3%{`#6cHLQ$3N^`-3(q=%eICN5V2Z1r6G$(Ez~nA=L#y1NZM%acSSkbA4bsa)p@ zjel1*q(vVk1$?0?`&(5M4Qz}bYKH3)q$PG>UkK!~7G18v+_ z&!HmvMTEs70Xxn&$b*Y?I7wF#2y^AC;x>b2De>x_jLG5_Gg}7%w_1tfGU9malP}co z^c8+^RdQXMHT^1H!eQ? zE2sg?iOyEDzPyTz1V;Nq=f?XGFk-xdosn$`V1f7{43NStZs1ru=IB77u2NflR|-@G zbAxltF~07#Z|6w7mOr-4+8YM!6HhF>T}UFC59|L%Rdn{SH;&(8;=|7-+eJNNNtD0W zXGYMh@V`W%RCL}s|D|c|<-6`B!&R&O{Qrpm0->?g^GF1F;8~&^M)}>S-{*}3OZ_P< zd|5<=;I`BXGU@%MK5vkS0MITw7zh@S#g_M=#!xoo2FEw&gj(Q*XC}!mmL1zR{LR_0 zO!mAU{8s?yhHPdu_~EtwpzsFm&1V*4r*}tXQAivx>72ZIG#uT{1kua0I=}IT^V$x{ zRk*xPovN1t$VAALk(A~PIEVfgq8Cr{gMUMAtB-eGSZYtP# znA8Pvzqx&(V))LZGP?mrpC4d{d<^(1LG$S208VISNS(z?urW&>r2V~WHZK<>Xh7riMaH<{Q8Dtp1i0??*PJl z)G6FglUz5-%_P*i1`yQ)h!~3)eM<08lqanR`-;T(2ZU_I0+x%PuufpJ*O$wD^n*Ad z8z5@HEgbq^!`k4=t;Rx3jTkk5!ei6(g5oBd34Z^#lgsOIR__(})4sM9V#8ep_r2e^ zdIq74nZ#*5S}O6sCa0Mt?CoCJPkDT^8$H(?a24#Y#(_v#l zf{b`HK;HM55s0FZ77($2A$QW5;5m5gnH;!mLkbw64^M0$cn)}dcQ^i@IgSi(B@4plgFfw`HuTYo(Yh>s)_v4JN~=!4;ZI|12HQ)G+Rxms3vSl0yNf(`z; zmU1J;Wx(UuVrJXlOnMUB2G=r})hN^O1YApJVl%;Qa4mg8c50#k6{%0vi0E;!c0RAW zkb$^}#ynXZOpt;Ew1Y9P7KGV)Q+V=k;s#W#TbWUDQFr03SIHz3pw#oe4Jb;BK;~aI zjq!9Ocx<2vM4@|+DU;(!-vA*ImqEP9azRS2MtzK3^2i9L1z?P>mKgMZ9jaeYl9%DqK zdNINZhqh(JX8;}R`q$+fp5E}9<_y{DbDue9`laA*k)3-~WkA-xZoPEb$PB%tZx-=@ ze?qde=38Q;u?wRk0Yn1J%#wwV1g_%R`pua7R{dyY!~Z?vV1Vr6v4WQ)aEVJyjMtAr zW`HLOo_GeB!DV(lvg_1GdYk+orwM_2hKvZ(yzp^D?v2dfHq4NM3kM*KOfO&iE;xhk zEw2_GD6f_umiprV!i;gy$(@uz^2@`4S|t@x0|2g;&nzw02c>wDkMuXDFk&?+XaS5L zQCR+i9|6%&@e@RT3G~YETV3zK@BAx~L~LsDjgcJXD;7sJgL`0(N_v4QrzDF3?kQu3 zF1X`%KL#2?_hd(Cw%B)iwEuDFc`{VPO-LK#6W)=3;WI&C&eUxU7bA8W&&<#7hJ)p< z#(X7Y7E-@?vV)NEvjU!LS&TEK3{v`!)sYEbCkZ+RQ-fIeyD)|8a3)IdpoypFc)*Ag zQ~bnrTzEByx9+GOgW)-Wy3*+eYr1DorKrXc6-xn;u@V>l>IC3CTep`(6%#c1TprS& zjRAoGrMX&mES`@1-}-RJz>bQzqS6S9dto}c@xTnd%c1OUp?}cr`aTKYEm_(k|Ag4? zhc5;~)fK6*&lWqeq3|6Si8HC764vnjfRE7e%Jp0eP-QIXLzN@_O}7~WL1|E8w>HMf z37!aT)J5idoilP)I~{lebT5hFH}7Ji30A*WdW<+hh6#->fC6!WGh8O~7~rA?mO|Ry zV^}AnZsyyqzi4+aTp-(22NtgvykYeH!y|PNPxRQ?9V)#Gx8g1F4iAiyL3hG2s`qFE zhAkP?onY~;)e}G)IdOP^ZgLbpqyga*&Wl7{fa=^`_8yvK-~Nqx!Y zoHtpW`z)PRD&MZpB-F>b?rk~4Y+c(6gn=-~;D{PqZUCo5%J(S}2BWM0D3sQ%6;MDW1UgNd2f;RCbijeZ zB@Ro43k8f07v6H2I_Wxv?|&xFnt7$kRpm)XSoMk1A=_-5)&BcGMM}pWor!G}PBT(> z72@jm4RB%l`eR zw0~K8HD>Mnyyi|QJr%IkXcYNs87iKR>fhRG`#?!RH;QFmZ(WC1@?8yuf<>M8T{6)d z@EJx_QUCD}6GU(bHW4NZo>w~#Q8^$0W?{CDNZk6X2QdQ=vb%SBW~Q8i>5MKCY+lvZ zh>Qe^E-|d4i{MD&dFKmx2uQ6Or=ZC9jI&9)AqX5_$oHJUejJbCX+9$M=tf`e9JVI8 z|5o*f3<17EQM++9$CH4WPko%R%>bGCujF^pWxm9_tX}6{x9Q5vNfR=2n-NVmyO23^ zgMmsaR!Jb@#LDoBBx7)X+dzv6x2FXDCWT|>`~LxS&=lQ^N7tC)rG^$;>;Kl^ZEM_0_E(uIGUgKo6HU|5d zi(Qr{#Q$sYq=I3j2bMfb6iZmmft-vII9VpDd!-B=Pj~L$I$85TiF$X#(oNBVj{D|( z6bjOHpTgsNu7XFe!aTYt8D?&KEQb+6iSw{AZm2{tQvR!l}XJ6|pb(}+Na zb4*Vo{ja5$ifvz z`~RwhMkL#qe^n5@%nDS&G^P~-(xY$X6otrfrG{zV+dH>WY_2)sK zAM{WmBQi9Ie2A_?M{S?mkU1BD^L)wEWMsilp+CyVsS)D+0+!@vL4ro7Vxv)cm^u;% zy_V#m%}sAU{XLttep%8xK{MB9#~>T}2m}&A`YbRO2&k>+7zs2`!{em+*OZxAfjl1Q z<$VI;i|B~(s9};*b}bDHn%ct;71?;s!TD}-kKU~NbS^$lrXdDg6hUGMfhYp&W|=ey zATYs%?J*vVo2mcR&6p=I0-^OFe#{t4bdGpL64$N!|4y@xb^_OP^;{evw~V_Hw1Hm< zw-SqA9iMoB2vz`;JVELQWF`_D6@Qjez;I{r#lX@+k-tX8SXaTlXYW?J^}xK3G0u#@ zlLfK^GXl|H1B(7A9V}r6#Lc!8%x6IZ1q>W+9>A7d6+q4H+d43;$hLO1K=}AQFQ!qg zI&bM#8>UfNplN@vbRC{XfGNaXx)B7SxN>(HTkf*_!-2{UgMZ+it`~ehAQ?JncLzd?@A%Ogtd{&2*vn2gZ;*VrMGVHSrmq2afhhV3NDYo=@ z-gcz|>jI*)cXDNAQ8+yZxFZivW_n;mKa-kT6cI%;?y%FZmLS znIHe8F_|-fLelu5pAvI5CM{ z>F@Z1MgGG(Gk=%s#SRE|N$6I#f?ZkvWt47|FmuZ&QyIw)qe7`yB@JAQpgjS4 zxIF=wwE)%J=-W8ZF&czXVOjlEnjagBYkkq)Skn71&oh1Zj!R$2^b6GRYM-87CoOn8 zR~@5xPl8GctdAE7A!u-ZWr1P)jIRFG$8#obAClD`j|Z;0<{bP0r2@Sa-_Hp_#J?*B zTsjAq*xNv@qv$nFxn50yz#D;&r4`p1xYqrDxgdz!qL2;EKxwWB`j@7W{mUI8E*%5T z-68otfZE{Cb1hOnVR2zJ2xYw5Mq7p1 z+X@H~cVOUTOOG6}lf*PTXV{p)I+sQvGl`sucrs@WRMF*07E!=|Va}yZd+gnjQIlfM zHTZY*$|(QAjKLD2Uu=S4H-#xS_jrc53jbT9<};giy5sUJBn2KQI%P+0oPQh;hZ6;F zE-r)72TX8oG_ga1$#%>{L!&MxaoziS;%e47ac_O_c+41k^aJsTJg!?o|1MFWhF65< z>;&C;W<}mv^?|h)cVRAVdW*-zZorwq(v1uErY;d�F-K%DD$P`4KQNXkF-R$6xvD z2Xx#tUroR?o&wGa=t*Kg5r-mQ5oC?W)(Zb3Ta3jQLz*$m(ZH+wp4Fu@R;>EcaPUV$ z#%JdUM8R0`lM-@DfPXO$mL>?lceDtl21DK1wfw``pm~d9?|Bh3J#~}URpHI)f6ZYwARdl_lLuM zyL!%QxN<;0Q6BRXb^cIK1**~JU?I^lh)gDGXk!FGGFZ6|S0HqXYoz$g^%1F*$PzZP zm{9~NS%EPiVAm)XW>_RPZ;0BSdT^9CM6n1h=5KkUVUv#d~4Y9?-2bt5|1GhAE5n}F#PtNNqvG!M6gWVL%;A`e=z%H$(qsbuAyVWG+K+I zTj}$WDJ)YgNvMyr zwbC$xZA6inZA8?6D0h=GSqmmKDjvhQPPe{7I5Q$1`9jZrU1;a5iSZ2!Rz)Pqb}F;_ z%)S41kq~+jqJZC0o~ihmM6jL;kFmHo>XZH{I$lc}r2~2+lK}hxh7h;d=dw*G{Ms=P z{QzYc6`df%I4Ya@dApT#NVMuDT=hBX>8jAvm)b;l?jVIciANKN;!?;EE6@Dv!k;Ax zd59OM3Z^sz)s$deX&TMHOddfPfQaj!CiQ^@R3V6q+I6h3C?zD~>9MMFjKYtk8#J-) z!AX`pQCw);x`@HhcmH}h8K9b{OUG*Dem_MJ1|}13rRDKuPuxK`God0c-(a~2!v0Yk zOXo2XM1DY2g6<_XI!Oj}ORhinB@XxuKz%_{oH-#ibfC0^8L078glRn8!i6BA6R;yf z+7}ywn*SDpM%^MGQmCJ$>$fA74b4M$d7V?&=sfi=kRrg<}FWD!>H!`yFl@00%c?x7z;N+YL z_c~Up*wB3`pS$#V*Id~A_u8ICjs+o`JzvTZ-w#Q>y`%uEo+$`9dE7KOk~;Ny@Uk^! z6x=-=R>c2PQ}z+<1HAAiIsdo!ic-HZ+h(1v4sB8v)`*t5@!5HQ%4S8}>!FwRR7&29 z>e-?76sctY>bC_ie&~$QzistCht~#cEU+>!m2b#I*Lhm~40$)j#(6}xGnw1Mgzf!O z8i+X+z-s8v$jrs72KPCvWE;}ZQ)kZ`_er6j7wL1g+36+AFtWkvC_dBWMQUi$!Cw*} zvUT-aDDkpkk{|Q)UDQ8uM|fQ22b|bhxNr4lQ$rgI*(DBydrfW=I)Uu@ z;`99P$76hIhY-cPXh^_zfaT=U`px?rBSe`goz| znsV@V!rPHw)|mN5RBjhZMaMmcrH=QiYA6Mv4e%^_U$Rv(n#(lgi3$lVv{XKeNLNUQ z=qI!~RMb>a!Gz&i;RD?(lA6Zd2Ksj_vRPVsP6l2a?>nhJ6O87@v*=6Y+Ga90MVZx< zE;ah{B9F$0oJ|{g;r3rc`2%Tnqt^(KnO9LG_e)Rcv<9Qa@Cx}1jk~WYwfPLxPg_3I z*5l$oDXm5z3S3U@d`^x6fj${huCOGQ9VUnG8>*!>o*r&=ZvLJnU^Vy%wm`fKOj2et z*G3k2&i57Pt<4yb$3NjM_Rj< z&bKSMF|Wt{*VpSmtEx`9I{#p52PRepBBa{)GtVpulFxuIig?G;g8Mi+(ctfp2@KH- zov1s(4qPKL)KfKzCAYQ9Gb=)uSse(3gZ0d~^4Va*_`y1lt0yABmHREXzNdICfgZ+z zK~xYrpYUr*f)z~UC2|@FChw!`PFfKc#FOESskzF{@`l zhshAn=Y+k12kRJ>PK2Sou!mW#MbjN2W-mM~ijo_gt#C*EtKApS=o5H;q^;+)*)PDR z;ANj~+juds^GtK~oe8t@nm^@+oOpn~4>KI^y{Z)Y0DT6S(<#mr@G^hQ=?jm7H87|9 zkU5?8tYQWaYTv|ZW`47*s=3__Z)kZ&jJHp|AsM_?cx*VLga`XpwOY=&9EEUJ$JkLS z-{0*h^&s(mYpK}OrDj4rdHk|Z`PpfdM0n${#^)}Y{IU&|XmuA`+u=ADSFp5t&`{7gj z-j@UHhZ@+=nbx)3x0zDl4$1liAE;w+=NVS{dsbrfTN`-_CsDrFVwCwqt` zHSjm@lZruPC0wYNh9_8k;HOXh4%4GbKWpz_ic@3babtZy>94*Y{$)+%4F3)LB8KR= zA=tU`UIz`ONB`3I?LXS#o;;j!@V3y(nhrS5&WvI$SqTg3jS| z)rFZFZhvZvGB5X&1WiTRw+k(pb&X4ym5BqWhFo+6@GXYi)(+Y@hd1OkKO^-}I>yAa~i1+4YtPPX9Vo=ck$a}t|>ILY=KX}5WGwaak9Px&MUN+D<(V8Y=S zs*vVde@wW8UhxMo;UG*z6t6k~d|9Q*ZX+vhCiG)zjYm+&SeyvVlrT9`uXyP>7mVx_ z;su$78#`PY`%Dk)U1N_zv>e8{W;_4pT!No|j}{!@9UIZT{ogzkIFk2ViM45AZ@Y;_ zcJo9Cx&oFv-e;u15s9_}QJVkKw+rUiu~FK5HSP>965b}mm~-7fm~$>$6!cjCh2f}t zvfFWBEowmuAVH!uDkcs|~CQKV+) zUgQS(RLT7#lN$mAo)56WvECa>p%4FM;8FQ#=lw;oz}fdk#1~d30XRP_cT6abkrs^L zT>}pPUMUyk9gM@j>LzPGYFP|ZVQwh#uQy~Ap34@!-7oFthfW)&{!Ep(5T+>&Z$E{| zww7oi#-sg{;vLpxS7gB&PJEE!<)>TA5haY~Or||%x^Wx~;}3-mL&V9xvVy<70$lel zfE|7}i_mCxYy@68bf0#4PK&4d@ zk55}y5gpgb^K0DGz4>mRxg~e^oWP2rA^znMmr}>?dL14KT54jd{@y#^N*C*PTS%_V zU9=l0im_twM@C6V%1Q38#aZ`k{QjcFQ}^3d?03U`%On$zgyQ-iNQQuwSK4}Av3h1c zRo}|;@9U9N%SB2SB+b>{6|ot5QwZ%6_+hX@O=BXaB<#576E-ad)Q9b-KnN7!ly@YM z2;6T$|=M6?QkyyKXeP&(_7iD6W<6e`)Y!bxTLjl=D`)M(XO< zTvgg9f5zZ|~z@s8UN_oA69AlDIPPbVqQ0VnjY7<~Zq|Zs+)m zftRs%Gi~3yvr^JRz5)1v4~2i;vmp-%M41r6z$CO^*LXmX$Tdfo@_3--sRt1QmIc>2 z;lmV2-S2i3N)J$4*q^Uj&a(SI?Q{tIk$(hP@=ZI0{@{k30FhRe3r+aK?-1P%`|?g_ z|M(Kfl+{1kC18bs-^wd|elCwGngGv2kgP+2g`8(pD=qchX1MoosnLMn#4Ex$0g2@g zI~DOY%To+i8GhAmoAr0g<|@b4-o5J0iVNcv6LB;3zBw9{)QbPhjM8_w#_M&>c7Mi1 zc2pw1O%IXu8~bleNu<@+>$WVcE*mWE4n5k4end~l?J!tIC|SSzL(^*)?3{|0@ov6L zaz*_0*~yqM7p#81|3#al>UUPCRFg!kQof|Vs7TGy&UpE)zx<-(M!6>Pi~ zcSN2n%?Ek=(6R8!qO{VeG^M(cnI`D7eLwESkDSD!v0J_4i37xS8VB?78Sw8e!wNZu+k5RdjlFvM%7gY)32ry>b=LTyM?WaIlnlyeh^l~? zMW9KOHb01u;*$>kuBMY^)mUp7bNLqYde0jNBN{C+jnJ@7B1t{*C1tPm@}&C?2Vm-J z7X|?1yqzmPeD2hPkb$+N-d+s)s2Z`iu2`FhM4N#t?c-&)4MWwy8f|M1jL$=!1p$z< zTt6{t+y#LD)qUJ4+hQHH*ilZk+kV^D7_Nd9L&Q)W*)U9w~{a0suoyUfhj(W$bACjduJ*?9K3+l7f&+SP_7QsgX z`JdUUm6QP6OlonLDQZ=tvL7+^kD|Lf7j2aYeq;J4PSRFvMBgvddb0uuv)gFo?#pT_LdeM1B22- zX@&ErysXI3SaF7>jtLs8Dn_8y@GP`%z16U-#}yz&5k?y`?k|VEnrg2$`B|*8Xbk(`3@ViqdX6t*@_hW9`aH8!!G4HOa*|JnDG- zp_@$-99Ed8IIjVUm~_=1K@cc&85024l1_o+_WA;Sc#x z<;%+MA1w?_-!fH2NOvHkfS4Zi+}@{`hgXuRh;0 zY)$Idoo{7cL$u18CT`u0Hr-XLKT5qjIN0A#)TGsx+YLCbY&~Fq_lia!uesMo{lt*S zcTsJ%->)6`n!i2Ev;Og*)Q{CI!(Z+4ov)0Z*@`nAtkW6ztEQ)aSg#Du7B}yo+03~s zvh~F9YpmgD>`v86LD-~I#(w!b7igQ=d8q90fVZ3hAH_1HE&j-2l2cZ5_d4oFIGxEA z7Z$iCtS~~a7Yy~%gB(YHw0^l;f%}Iqq~3$Z>_F7@IMMf|Og|JwNcV zCtx!qMKcV7@DYpT;RA&ZS0dnM!$Rh~uofz$T-^7%ULG3k&2&{ZaYu=c?UsTs5BAlw zPoTCdwEUTT=3d?UOq0a59X71%FLOUq%p1b`yQZI;#Br&q13iznz|JBn2pt(>VV|X15&x0YYGK zhg@;h8Hncy%7jg6nWv5envoTteYuVx1OYcDjFVS?X~A|a@!)INFuqy|h4Bnb7?*@@ zXf^-LFJv?wFrn0RZR?+kt~(4uE$YB>d0&`+~jIk`78qB!)% zf%Z=Gtqdb11^upSc13JX*Z!*6kN7JOzYil-Hy(Mp9m;@jGO_{b(=8hB-H3Njm&em% z7j`L?O-!DoNsYdo>!G!eV%W{OvshPb|MfcCFO!n_nngN~O6_4O4pH9n-%xZOP*-fZ zu`+r*3jT;yLdEp-HB^4 zNeM(uqi<1mV|{lyXQEJPAUvn-7}Ey!6Jo=2QIHrYp)kfn&Il16Tyn!ucvgqPGm-%c z&)dDBZU}`)bmCbnO))XQ$kZ}ZlycgeI_n%1k_Oxg{~)w0@XxJSdGjfHbg9%PSnh;# zqzL&KZa5lTTD%5*ybb~h6Gd+y35zD~KlSb;>aO$i@!G6?=DNy#|Go?b!($Hi*AR-r zJHBg`@x%PB>)K7%hJ%x>A|t-sztZl?InVvhj*J1SY~HW*0vlwIi0)jDVu0xH%=?ou zkDBlq@>Bx~>PX`L(^8s6Onb)f=S%D8aTS^QmNLbzxPXAOm4~WZ-sz&W2XoSN;AZG% zj41-&!`D7?5~-iEv(Y>%J8Us!2iaJ91F?}mAUux2wjtcunWvj}ALR-!YrO4kQH3q5 zV$)7!vJy-%X0oWQK0lR*j8*{9DW*f|896I1efbQR$~+^tEe_SEcE+l3*zQpyzr6bNl?h-#F~U{Y&|+r zw4+`wEd*5x5B_3V&Q`9NizQ=v%3a#-lS*pKMQo`qS;qmZCmB9zjq{WB@i(LPpW1(~*6Ez_QSyjAG4$G+D>^Id z$>dRbr&H#&-Y!m}YJL8Qp?R+B$8SCFB4dx~u6rgj{>uW}OCLx}Nk!h)uJXKX?z}=R zD!1s<7(){>ehdta z0b^)YaNivUU)R12KY~i0OcuGGk=y#%3dQ+J!V06gHgLsrg@P%JnF{E$I=%XoeMVS- znHM&m7=ifUfv6{oN#tsb)lI~ot(ZJ2BhvpUr*H_6#-e!Z!lve!Fjen{(d0L1@3x2Mto zH3!O{`N`K{zuf(znv38$#_N8Pw)}h)!2319`-RfXJjWi$ZGKR0+YqXP!94H{LkHF# zM{7NM&h_|a#ia@GjpU9~Wt7DotW!{j=>LD{cB2NNyFUa9-3=R1=&mTn%OF#D10s|v zulNmDv2Xh^gOgOB$@8j|yG-G+yr6WekH~-OkAvRvr(pu>A-Cn!+TRaE80CjA8IuIk!8$(LMfQ9H zb3lB68sU5AW&l5hz)%qEnJJ3*aK1N)@jdroSD1*sfg&V&q2z#yyU(eyBzR9?=Pb%9 zbHd^iH;V##T9opO^m8auH7_8fQ8H-{pVKRnT?dy`;3Um48i@5jff<*!8L_Sb-p=1h zTH)RnmZT?Uhdwg*)4$d3*74`MW&s_a+QDLR+vF{&dS40ayb6asr-*!CtW@OThibIaCn+rb5lT$_~L`41fqm3pe;?#&Y zI?{x$<*N9VV)2s%#>OaHplz_JVW3R;Qu3QQ_01>;K^gOBN2mnvhgZb}DeOQ|h82K!v4Gvc0=EsDK+AKyz@Mdf_@aPqk8M2!5&>4BFf zELyqZ?8-?zF+iUBOoCTGKK635HwHz1ladnK=c?NIC3DZ@v9LodjR0GlU2#2=e1Fof ztiU8CjW3<=UX9dlrG*#KB|H)Qnl4#xc-doE=&R|DV<8X(Uz-trnN)Wx<3iK<-E8wi zumfarc(v;}=*PU$@b>sW*fSOQXEM@Ej>5#qnFVf0ew)M8NU6yM8f!u8NAy2_!HAH< z6f4XsK5!Oz^9I#N4G38x!evUv%v7XuTG8m=S)~;LGo{^LK|8>HREg?u_JBetESP`AuCt zsi1|Thk?3I6*# z?)+Xe%w8Mcw)3M@4|0Auy7s5+&la1+i`^RkRNn@8sWi7&%2PQz5w#mLT$>|Tq^sR$ z)4kp*6%2#*kg;GFD?8Z0ZMrdS4>nT3p{n)5=ma@|{+X|mrZ`$-G}V_ZLdTn5KC=%t z)MWQU0Eq{}H4}gX@7u2-F5x<8IX_$AIFq=8McT8KfLKp_j6vFVQ2knw>yZ|Q_QxaU zyIffiaIB+(c4pD3H}ev(3Pb%4g&-6^1P013l!K6t>C6Z$xIi1In=44UV>*n4l^y1< z6fR_buU@zS>bBO{!3wJn4~YwvMqZ5Jm!bmz={~x zI>u*xG_jx%I7JTXP%{J~1mUb;zU!$PKu8>>MrX?$dapqW{w7M#93X2|K!|sEJk=(c zAjbsTmcGcjBW2eEOz)zNaue?ObtMj365T8hI+w1JU$ldlsK7 z&ccnOdiwhwz9v&hKgO3@Bm7LRg<^?aO*O)Y-!Y{|G*gaXixmq06>px^wNNxi9-;WF zEHp$arbb#9_F>{zW!W#f>!f)*&bW`7R(vnel1LJ~$6WWA$o1?uqxcZ7P<#>EZx|@b;K&^v!6}+F$-9A=g#Sh=<9q^2RRvw~xBjOSE>J|t2uA}*E@_UTXa@Z91>m%0U2RvSSM7F>CcKZ5%2! z*TI}e`mas;ft&F`Y*T}&X=|q{>GQm;*u`Mh@L&yr$ccMs)&FTc`!IWfxIziV74V_0 za|Frc&9{CMI!W+7QPLadU^SoB^+t zFeVNk!}fSX>IbgFj$X+ab1V1$`btSR1^0=Ag;s5!Suc>gC9tx=;|aluS}(Hmz;wa& zaK5w*MQi-I9=W$jpj<_rhOX!4=wvJbCD(NCbX z2R)BD5$K7nRmY~;jnCkMuEiM)h9Uo3E2?4gESONK@?d5A4&!OccQjCn`j74p81MLx zW@avY#lZ7@(&yxERtC_@UE1ucVHaaEmjPV)Q>Ao*uegR-4@L9QDblbFvDkk&g{r!& zo*q}?WI5-N5xb^wWCJ7qH!~gAOHkNG-*>Yy(D~?3|RCPhpUQ++iGZi2en5x2`aJW z@|Z4ZmLSft5Fr@g5ENkttC$<(oahbMRlL3jsHITpr~bRW^2)B1JaqtKoqA!%aOw^K)k$(`UO1WA|^g*nrp=!eX(8; zlZ@>U>u|@W$hWQgn-THH4<|EETw}OYqTOG(Tkx)~$mDHH_Mzlej~`yYPVDwD9ISm} zm{{<6m@6f`H#Kg8rHJ(jt6MWdFD6p$if?O=q_MpQ?dxzT(_yuPYlDfQM7> zWtj&zKUi4l2HW!!x}~T_@Rbs&>o5~50>T@{%G)=NxgIg(XRt|4xRr2t(Qol$)oSF= z?x!C}B0_8T-^cZiMHmQ7wMAZ8piJBS_A3D5RdclRYVTD9=WHGxY!C0_-aivac&76QSrAkbP}TxOEH3()&#^Qwo3qIMjL>Jz_#_IE>(JRHVYg4 zM~eg>Q48`S%GrqP~Z=+MMC7j%Nx(N@{)GgeR=Bb+7Yk$@INpkm265)8kJ-^w0KXyH1 zFO6J#hoLtKd_+qVKfz3=TWo7cEt-!Y7Kn7 zND7NNRe3HihRK-^P6s*y=N;)n9|BB_9cR;sH0suXy2)T>;rp(`Rty{L4SqL~I!D_S z!LqH<<2^9CgQ`h=&CCX-bO7vf2je-fv9Qb9=UCMdoq7txa&gj5!X0gYwsc-uWTK!y zi~tmi@Ak*_idMzL9jB{j-k5pvyRXoFbEx=k1*qfh!{Lk*L<*&|gKszMTe(HP)6eb9 zzh1T6d(hhcGfw@oP7#Bv@=}%e4|^|*?k&*GlIzoYeXk1njH)Km9!= zwwArR+C6%)g|7_w8BXWDYkT|a;>0|DmHh0UJ=p~QR5^Xl>u`UQA9PHwUAxBbwsQ}8 zs4lfHTU6&UG?sdTZ5fOugcCvju7-L@Aj&;z8*Z&Gd4*WvCn6Zt&?g#^Ib#gNI|HC> zsC8C!IuSMoX46%y)%a-o!4W0Q5bP&s{KjOiYQ8ISo}#$_dCOU7Fzp3qFzsJVCuXNL z)UHq6;I|r#TM0Paw7EW)OO<|Seo&P@;}VPLuMUwzP8J3g3!IAFxh?AgJ6{M_cu&$% z(p_Gii*tJd(jwv#7i4~yj(uYstwe_%fwq&b`A!nLXPeWHb^%PB#2djk4%ZqPda!dL zni~~vZC4V3evIP?E;ez0pA(8dg$FN##v%rO=*Evo;Zdb;4NUclih&TRs%E4aX9=cY zTO7@7lenuV2<(s2Tr}*-IKxV@Ab$(3K{H zn=W`{KfHB!`fjH>|1XtPQPsBZau-1Ueyan~-q)CNUqI3YAK^H5HXK$f{=|8Zozdiku=Ruz}ghJU9m$=iKB z%&r1C(Q0zSs!lDcD0+Go%6Q&B26PU6KK9WaE4U5 zD}5vZY&ul5IqZ3(9=k1GWt%wn%7@LMYQ?Q;E|lp0{@eLCk5!(Ci+oM5H;)vTbg`e> zn~MM+Ayag$c`E)@Xs_;urq-(W#to=_eh*3%LDO71Y<+*F#4)|Fo! z`=mAlMNev0J2R|)&x@S+6~V9>57;izO6!?H)&1~)Y7#2M8s3RD^o^a(%bB?3wG=3S zPbMy%j@RwQtzVZTAeQSoG*$hs6%6#9f*Xf_IU3aV%*s5j(Wn6a)T6-Bc@1%$2^G#^ zb1`(f9G6ZzU6hNja6+H;z6k~Vh^H}RFfxLP9q58!o;-nQMsPt0=5I)I18_m7RW=CD zQerRY>z?KR!`hq2Q@wWY$GlyeVktt(Il3_Qh%wuMSBpDLP zEU64h8A1ukP$Kg@{nmT$t!Mc3e81=O{J#I4^E#(<-h18aUcs739pkgg7a2u;*@ccX!$}=%=U;Vr&YP}XJ&iDdV6bzf%j(}IhQr4bKbgvpP&xKh zRaO8isB|gz#S0%~Vwn95B90d8fdcC&MPG71Bp@$#M5+qxhH>0q8Sr(0GP-%J9w*Ywgh=OM*66+f;q zT*u>FDLV%wUFq|}0-eEp<=aSO;OOUDC%6m+-Q=pL z*IEu!yI~*Q#8=|;{pB-F`gUf=n+Qpri?cl*)VZB%FGf}jUva4K*e)yqANW@$H!e+$ z2;Lvlow%Q|3GtA84n_94t2++;#qM*_La&&Gr3x1o${z7FLE=Gkl;wpV0!Wp)W$S!X zlA+x4K{=a^Eud;F(n_8s!g$Lq$wxKY!fUAb#hZhtIU+`^FY3>Xi=1e;Ze7pCW(I33YL%*bN zu~iEuqc9jdLu@@6xLMF+w31T4)G9uejL-lgg|pJuh@^-4WROvL6_DCANX*)(aa~X_ z2Cs$nlw-uJIr^G(H6egEBz0HkTGxCy`Z3>{pT(l9L|=+tKI3LEn?CDUz*GOJH_4`V z6bo6xf)fvzrTAU&PoF)#KQ(-9{H*F2`T_owxYgfY!ShDQ9E*&`fD)$<3`xMy|XPgo7}uwmD<2K&LYRlowb- zSV%jY6u6zi-K?f~w~G_%ljAX(o51Vt9BB9SYG9}I0+%Y|ORr%k6X=n!Rd5G+rJ(?a zge??@DVL3kjeEy4vD6&l#5P>OKr!Vu4y?Ob;6<-89|1NL5Z|SgUu;FaBeD5q`?3Xa zWO(i_30txC(CL>hp5!sgN_5*Fr%J*$~)xgU5{wX$|>;12oHieG%!BSu8t> zU=MboEKE!d!HzRmRoK0}ygZkfw%Gc8S$;dkv9X9Qg~}ElxlmZNUV0T`g8Y0w?IgbB z!xJLrC9W~|O8RhGu@%X3y~WNltSgBc@P5F}Wto^&%jM*mD5Nzy_=ZjFrR#=K!Niw^ z*v96P?XK>t%kUgj1Ap?Ku|zrN+sEUVZAnBuK!@3*$7KO-%mW`npx=z=8Bc*>i-1%X zcIg&CeCRhzQZ@4ty%C54mfcZq{bLiGT;NdiOMNFPp)ukn=E=YaYE&%MZ895lsw!sg zoBy3X79kg1YF=zZCo$u!l3m$pZsJt~|7zANAOy~k>aTa+`)M|}BZi6NToF^qn$03d zeiV&ZO%G(0O${bK+y;+jzqa*O!-m_|D6D_B>IfnRn~0FnuS# z5xo3LXz$)kdti&)C3@K3?(iykP@SYEPc;|zSKhytF zba1Q)cmdoogBY{Ot zsLsY>@2Go*nNu=GV=hV5hyQeaC#=w2m4}3|t2ZrptuH_ETv0Ck7J9fLJuEm5I9W1> zVtWs+{P5x>Bf^!5rNqJ$ngWV$quaW#hZCMjx)v?avr} z@577bec3AfFDLf#1+2Dh3?6z5olXI=>(`A!nR4|P1Zo}p)FZ=j=(zd^SYGNkNHWV8 zX2Ij{LE&ETL7>q4p9=S%X(wRu_A#=*R)SK0fZ2`UiqA>ZqE?*ue|I4tFvkGH$nhwX z=x+CCkMqs@9v)Kj+t?OqhA#Y>S8m6gmci_Ld3EZhf&ZHj0~3=@0qsj_Kx-RHDW8a& z@E^fI(WQK;va4o@h|tvtXo?7joYyvEaZZJ z_}a?XD|TgKALo}cua*i+I~ZUVUYgs_>fe_<4ev?}X}(5G#DkbJ8O@D6nPa&%?%E0lT2@^I)(@IO&81tEH8g^1@LF>%>SD{Kx z0ZbBhM~`6(NO<9?Cx^qO$f4@_ej=)~R&>1onOmn0EH1d4t_+zieNVT`&AU*N2YUrm zRfQSzF5Lwum2+CX$DZdz&wdvKI2AYY*~qMM?B7O;nX_za6og46fV}LCXT!ed={E>2 zoIGaOa_=!Dq+O7Z5+Na}KtgIYh;FkdC8Vraz^YcHyx@-xBa}uNu^0Lr1f`7G`2Z}bgbA5!z|bshuoxi z%1rboK8MO|&kVPfxwa+>eTorhbvk{d7E`1N06P;4KQ}gq#OHXt@5UW+7{DJPhJo0W zKMweIrHg1QCFV%Uai(d3$93?kIWh#P2JQ}d9iM~4!oC1$+tuzayP6ri34)lUnzlEZ zlJEdc4(q;Oi3dTBCy91rXL>fCjlh8jv_M`$5*h&4z0h`dlgchEnQnM&VR2h7fp`}wa zGhnPiAHF{>-3dHxQX|A#B3x7wv4awA!2t91iQ95Rcw8Kwv>W)gHp)VFOc|nHfHjl! z9+i26z`y1SyR(Z7NM%;0Wyo(?)!jsZurXY-=}${=7Ps^P#C10G)JzE!@<=#h>U8aI zO|h=iYzOKyPcD=;w#;?TQIc%<8aZfSOZo2MF@u1plWj#r)RV^4cLBmgghR$i)E3P@ z?FaU20yJ|kht%f{?^oBs@Zf7=WVI=Hjqrc#epR4bttH9ZJWk?tQ=fR~wqf0MpybNa z5Wu43pcP6I9y?Y;u15I}@4UXb&`Db6j{WoadT08N>-^1rEBF43L$mQE%+^LF_!JvR zcsI=7lt{hxzilM`xQNU0PaHIjnLdAqypIr$L@8MYPQ>lbRKb}6Ro2Wc?*`D?H@Dtt ze>i5q0!kcGvX>9)m}2Xh)dM~p*K(8PvwGUmrCQ?x2RJ@|?>r_03`Lx2Ta#|xnw1JQ zxo3n0UnE9So&M9U6RmTo`tLqPoi?M|fp4xfQwFk+qm(~)e-*{lsQ+GlC1C2;?O&sy zlqVG?moBmJlEqH|NI?n{=Ab`DBy2kD5qG8xMjr>8NX8eo(@;u424q$9JPNC=n@h@x z@{tw5gP4bj2Buf60a zss0NEn-I%>?rT`&r5Jd^&O9kLj^^dTc-A>st@{m=LXlbfVV5x8E)k;;k$WTa-b> zEz09fL)dz)G^uZXbEw7PGLh2(g(aKB`=WBH1Y)>J@7?Tuz*I3Plr>_J97FUF$? z85K0%5Un)}dO|FqjE7-2rEs0@%^kBtmO-7&w`3_P?E#jxPq=ag_x>@(lTX6*+Zf!* zD?!;ij-A~6vOT0P`(t2)FPlAfo{WE5ysD=rpsDNjWl`VH*#EZ%>+c`qo!_hkb)J!v z3koy@Lm4(7J&ARIKpF|C@;J=UG#0{*8eiZp9Y6#)^>7ruB55rD6I+*Va zL5Fqb)b$O}10dS)&12*drsy9D*7?%z5m0NsgOvN0vw#WEB7vHM+uGuBHSn<0!s{32n}`*!Z>r*%M1qaHt4V_ zd2RG-2#{8ylOp-C-bsAA(R(;;jG+Meso@He2)_%EbpA+wC_n^}0z}g!?>b%q1u+$v zH`8)(Xcc#5sVVv4(D)MwO1Ss;;n27k_;LNgBpncmC)HjOV3RX zk~TT#se}*1_jo)~yB*1e4Wl@?C+x6^N}AMfzcz1s30taY3uJ|A;=ZEYv`Jcc$zI0% z^?4SjJl(*H9i3;QyL5rH)^Z{1;~~;q`24)2CJ_6Hr*)5LnEl86PW>s5VZEVbt+OzX zH1wnz2yGi|G>|~Q1r?GrY_KLzp1gnxiOanDH1Nsl1ZV!Bv5*@9Ax6Gt@IjUiCGa@Vn9POBGQnU zNcES{KEm;djl9PdV_Sw(4PnJA=ri)$O#?T{hCBb#PX}X>%*V z2jS*4uUyeiszxAGuAS)WhxK(BmAfH`rupIH8v!x0fp%kw zw@u)Ww=IvzA(ZCH8l(lAG{j}zz}$tT-YgqQ3#uo-b&tj(1|jq46P1{1qnvT?VIbE0 znna0=9M);}3BE|aUy#+$GSghgbAvZCP#?y+8irF|og><}j;Zrhm!n;e&roz2mPYzkEF z&LD18?c?etk0JrS@g&Fs?8Ev>4QBv-mVvA24UowA-DizD@xXucCX&|=*XigV*>&LH zJGF{ST^98gcD-7a50&$oUKC&;()lBFUfAFcQSm!X7C?S+Ak|ZJQnEEp7vv zdk^`fn^(9FqByCJ2hT9%bM7S!VvY&mD^!D;GqD)Z^|?{QEeMau5EojH^{6~&BY)L% z9Pyr8-mUqc`fGSLSo00fLplmBq@$o3fR5svfz;pYC@|0+Arek6Mh<+tT<3fvnhu== zi8a}cizWzPV{^JGIol z-X|CG*nHvzE4KMli>&|VVK%knITSSOD=7Up*(+SpSjrNhF_(P0+KLO;`i+$3rPKkg z3;1VSrL|$X-bY(%SU5vAUxbfn7(X@Gi%vjzy2Q#IMoAs<57Ka$A`(E`dMe!$IL^dm z&qGx6`iu3Cb*dM!PW>DarHFirVqyEPzttmqQX@UZ7#w)iPxoGEa>yj%pw6zuKol+< z;lHym@^kiIBc)QteK(ah%l9Hu`JV8n^8MI85Uo&pOjhyxFV2l;ZAhFXSae^HtIkn__B@pbU$0nhk_Rn?pOfu%)D{KbU-tc2jM3mH1U3ul(X!d&#OLrop$F|Pgelb7E*dQ*hqO54D6PlDZKXUFv74Yy z71XI-TDlts_t+e&wg@bto>aebP4HN3ik=OSCV+f@Od5^5MMQsaWe!zdtu={lK4?Pi zsf7EA(tqt(E11pxw=#1l9_cR+LV zwMSJ_AGrOGF`=u;LqfkDRtLLP zznhE5yapAZ#r|do<8>(8PDA9;Idg%lKLd&$+oyU0NH>r}>;}lB%Xb&}Xh05;c&p|~ z_Tc;v_8|AgWa_}(95e(VcQB3Q*XR@U|04iNv&r&J&M`Zzi``5RF-Q11K4(m zMQCumWJ5SimrV%9Y#nF&WQU^L2D7qKMOJ>5r;Zi83@yAczQ=U_>$d5xZ>I;_bQK+? zUH)&x^hE8%Ll=kAoCm+BU!odv{TmWdMZz_;QL!PiTL>9I^p(mM(W;Du#bUl(m2BNe zlJ7?LaAfZ#M;u8+`rz5Ev6k$o+4_(G4->(w*&$4b?*l9JEEcAn?B*VVy0 zV#dQq{KaaAdUW4~k__hH!R7e>lQL9Z<^5MG5^{_P-JFIQ-~j6b zJE>u#ux55Q$CR0ka`<+T2@UGp{T`$gsQ?9}N{c`f?vgz7)aZVT&6Ujo(z@#o54f@- z5=5<#k2Fx6ySmWHaZrAN>-q49hU1s%Xm-LX?5(%0YQ2ib;KG3x+_rO7wZ@XntYG^V z8^fgiR(41(pvE-h(B~Rju^4!UR-mie zXXcF0Os-;s8iz>KM8L%Nw^zcE)rX<0qGyZThsZim`zkDXV_uX`h~x&mY)tg5=ae5j zd~;ulY4CLY_lQFGuQMTe@=msyY@Y66HUW<=SLgc}RV@uWBeZgfI}RWJg;Sn_bmqRd z2ZQma3A3MdK;#QqSP0P-u%Vwaqu2wg+8TiuL#R`lxZZ0*+>NnG3dIML5Zr?oSVT8* z6c5r?IQvsnqYg{EPe1MmbgCTB3&)VF&w3i^3PX+UJjK`pUel8<|Y3fRWCho!b7{ z@bw9u=z)Q?D=kd)s|GOB9kNLbfXh&YSZ^i4f|3wGlfja*DFDSY-|}?kGnduOxdC{E z2#d3_bf9Vs#5X~g)1;b22oxe2FmHBWBY_-=7)axk!T+!+j5P}WbT|5Aj!pxELo)t^ z$EPv_50DN5eE$Ox-!~yEjm$kC;*;(-t6;^%(7pT?pi2k zNsamtlP>;7SK-HrQvZ697bBxSPls-4e3N+7y7x~SQ2#$U;@L9AZxbaaligx#ap;hgsFg6K>=0Pi{kK${-LmRL#`{^ z9PvC}@Ux?nS?kr7jfx9S2ah}HzXe}w2qa{7H;8{u=SaqFc-9iTB^RWMHBl0fxsp-$yxkrYcXfuASQPQ)#6G?Et9icH2dEticVItK>Wzw!o zZK)|Diq)fKX;Jd?i@QxH-}W58nJDRzaQ;_C$z!XhnvJ4zVu%LGrZiOEf0TxbOqMQA zHk*w!Ta6?w_5WAWP_I$Xs{Vpz^=vac+JXu0n+t2>b-XeJtb5y1vF@g%-g#*KST}iO z0J~bq^y}3*7f^=qQ%B%N*l1ozOUhv$Q^u8|^j|#;aZ^6-nxiLy-a`YPLzmyk4-3sE z5UEUV&tQXeNf+)%>vOx&5U#eYcXZ7DuvVdA;3k!wlhbtmp{Ybl1n8eFEk@DXO?sJ} znRlz6db@i4MP3}UNOVLxJLXw{H>n+@0U zaXv$SH**S!fER2&mj}AuE_LtaPjQdzxv1<@;JoPfGULJU+}KN4P!Hrq8s=C`12bTu z!bcpDiFO4e%$dBkb*{(2oJn(U=qX?FCaaxVW-F<$SQJJ2!N=)ZPy_u`BI?h<0D-lzGG!cCuMNqvu*$qC>`c5oCohO|phcQw<6+6CN|Sy0TdEWa@Q?r=aX zP}g>|?NR(C_@heKqab_;xZ;T5k?(33f2Qw(AFQ(P=A2mbiHA=tE@mo$IXd=RLtSV_amWJKneaNBKD?VbHP#g}DX`V$Nre;Gobz{iHyd4*GFQ0vs@fOzg z47P3`i&H56FwyuStbuZcL!j^SOmWh=Ue*^=>0yUde^vdgvhjV}r8c<4lHwRGTKp~T z>W)}7c6JuFMCmobc!krR?`FCn9-Ki;k{H7+gZ8BDT0I4n^%6N>26ug!tUoalU<4_i zppMskV@GR@NC3FW%Fdz9$@(2)Z^ir}2AZom93l_$J_(A!p<$<&2hlJzQbDkIpS2r% zRD`f9Nvh`DFtq+33P#sGnmDhzMS@DI{P$?*k9m!qpBML#wZ?CZ z573{VrlyD*Me(2EZ#c`b$=4p)Sfaik8vHIu!x@c zkpvgW6qP*Rqh*}C&gD#>2+*l&zjeNx!TkEiU(*|}D|m$z{$k|IQFXl4sme2kuQ3JI zLHC1uHW*3ROWo@}NlBUYPr^>>^vo&O&^&VF=E8wgX8-a)WE>TVW%gyFs?+pTKO5SD zF^EeQkzjvhX)67uc+`*`eFAfgA!|QQ0A5c4k>F72?XQ$@WRQh* zaQ-~g_`lJ0>UpNecW#nn?*d(b`VPfa-xpc!=0={C#da%_mjTkBL?*W{og=oOL}dS_`K|mKv+d2D#tv3EfTQ$jdAc} z;!Uc3_UG16k>;+II_nE-3kl=u-FMVpYws2T>SFbWrGH~!UvWoPs|SM`Z8rXih^=zq zKM=89W{qQ!&7Gv~7OFdj5U(`1ZtscJ<=Y|+MREdCBs&M$2E)qarMaJimCLc}BeAJy?Pr~`VC@NhUooSIz3ygumaQ^(L3_qBSp zxCkUqFZwoEdiU|Utu2Kx``YR2N4&i&ZEbMp$S5r3P77_VUoM-AKi_@FRAI3{V2DM= zDp@Y}(_M1GgUG4f==HxUY&v~m_#&)}*p9jJY24hgZ?x~kG-*o?b|v4iovYXm+hH%N zy!*`e%k+sqe=+s*W)Bx=u{ssF4L=qXw;PQjZMlshz*9+<`a8^7M)k0XCzIFMp-ouz z%cRGpfxJM+2c77hglHo8MJ>OnBMaa($m_?7hJtnMNY*hUS|^utggea~tn(@5?#Eo+ z9}M-nH5Wj?k>;He1+eylK0L7P3JW|;_88C_0&2M)>r}r3tX)~Y_do(h%bc09<3X=OpjvqlMi%rV?+0O(_IkpD=|LvE{V%)??-pGoEsE*>Q;o03GLV8t1u1x#SsV5c@HO+FgKwD}+Jm|Tvr2gv6^%7!obj4#fK$E} zvGzM=LZ4nlDtK@i{8jLV`v%35<|EdaGH~$2Py-t7U{+79-@T$9f@20$9myPxE z%Mh9EF|e*DxAx@2MEjM<&o`_%DsI`WTqQ~|?U~xE5yRQ3>-3>v()VTq$HuH;>5iv> zK?)OH;h6d}3>rn2J}p2(;%%BK@)I3!afq}d03rV`@0%PLMJ^66a&h#6ki@Ozqya<_ znl50-$Z#2xSpBm~`kv@hy9)MY9W)Nn;{KmHOqY5*2ZJ=_X2WY)QZmZi|D6*3z$E|w zIVD;E>43PnO}TOUm$SD|X{ssX!ziX6W#tNF_W`Y&;y!J8r*$)BU0}5MGZ8d zV|a_*nr_hTHS6F+&@9bMv(bpOJ8bJlkHr1_`5|I*=GfUUg&Y1o0KGvs;Q8>OpP0x$m|FLy$RX82U@$G&l(Q`pFg4}@z(K&9#BpXeHAVJFtJjQr$7-g_9~*rTMswM%F| zy7M>KG#UIT{g82n{FL(okK!?u15$_x{1K>mjQ>2%O8q#&aI%t4-{#6UjAzJ_;&-0Ibp?-#G&hp0C7vCfcmE?sf4rOeu_O)xDal*m{@%8uf#wham%KESV zx^26&R9P<%#ei0k2ntl)y=y14xF;hz(w+LGIHj=-%LSWpDWUwCA*HEWW zzQV`ZGE4Y%yk&Owy!YB@(sJ_hAbsn(GTr1y-W>~dhIZPznxTs+pSkn5^e-_G0;%eq zYm${au;2Od#w#Z$cM@u-#)e`-_zCoakD#n1#$g3?5wnfu&)2BD9NY*5bC95?Z)84^ z%?(efD@d4GB>hV2$uv2ssf1IaOqB}>kK*HoH@;LmGz78mO4?n|M^Y0F6`9KiGVo}u zx+xAGP-`r*5Zy@_j{VU3Q9;x(ccN5&dQU^z{rFNWF2D4<>K+CHg=t7yl;bH^H1TUn zSuaa&s;Qeb}YgHl;}i@iP^ls{2b zo=#t`FLPsWQ?Sxy@;}^$Ql_noHq70_F-Q; zieQ6YT#&k(m&S!T!Gy~(^0~-JNF$l*C>?J9rcS^QjDtu`*~eHa3zMVoAbHZF=Gmh~ z9>S*YEc&utbO`??zhfGh#YVwGm=ST~RlV2*sVGxX2Zv5L_eS|>rE*6W!Udos-2JuY zc+oRt5&ht8LbPPrInTI-*HI=DbruwqQeYcZjiZ>0@EK%d5p6R{k@lOI&zV+C@$-`z zv%4h~;PPl;OqZ|Tvoy_p4DT5yV?GSHsf_*li$}{h?uXIcNNkW^jfoC-Mn(hXA_Fen z>My}vlt#aOXcU_P|J8at;zL_2EW}4pudD^07I~MR_ZFV*HJctyzDtWs* z^HH`PLSoms)Arkl<)1yGzmHAEe4`a}e-qez+bop-DT{0=N!rx<3mhM!V1XWz( zA4XvwQiq#JY0@aw5n zP4Cr0Dx=Y$z!Y%iLU;~2On{owT22Mh<#}}d!%*%_T)*MwXZ$#K%m9IxIkCVjqSMV| zh{JnWiRHS9^W}Slh?zN?2UdLgrRc;F1~)1z-!a>d4f|_y$kWa)K)7fsDYgVCjaN)W5<8mDd3%0%DpAR;5fWUzzoKGcQh0RIle^t6XW$DjmSfCb|W??gVb5 zoF1i&;bNG?;f>|f40uo}BqvU}fqJz$C$2}C(H7*n*iv>Hh0hQb6DmP5;ZZvSr934E zt4p%1u^E4nddn57AMw?HthSjVR_179e0tN;SeeE;2S-M+vx}; z=u?f^A1nB0Vlx1NdQ1!VyQJ5oT~U}IJUmzL{MYHgPdGj8zzXBGukz?x23*e9St_Zc zHnPMsYjF2#Tp<_6;mU~9nC$uEor?JIY<{Y>M_jY)Fmpp|uid4XOdd2B(_}=Ox}c*p z$_jjl#h3Iz3U-j9;J-yaqGf*Gg2?w3ah!{}8LF5rCS3Z3 zmC%GY+`l6qKS$9nLIn*H`J6dg^Jb}T_gw(L^XU_dHoa>G>B_0y0z+vJj&od{5|hD& zH#R&u%!PS~A>FG(DN38Tactm6)MMuy(;6=(cpnBf8f{=*@5+9!V|ZQs;q+#a^vqm8 zi$0m;jBecX(3iMX$M}E4>Mw*5&sOAA2k2C z?1tsCKH4D(w4D9Ic&lV;K?=eNbiLF5x3K@mM7nI6ZwxVH|LNKZ*~`mCiuQTll_V$% znUU0Gu9q2#`A+R%FPTH-B+mee^a$m6(v42g#td|!6n84$c<9Hr8J3%53y%sh)IY@^ zUsyk~!0n=Cl9uaNAz2bUy7DYa#jpCr8B-?~{`_qHbDZcTs`?xWPAXjZZ3+yGR zX~Y1u=XqaKUxl>BgFb#EFl8GLYJ>BCAGSz6+W zB^^#iZJt;P@x+?`!-<)$ojLZuHjXZ?$(m2us_mzJ-nGCSaACw3TET^X$ev?DOOjl8 z&zcVFrVAe@x^VZOTsSTH!()Gm`zaV+PHYO;_7gvW4$0Zl?mr3* z|EdxB)(_g+_1S@y+lG=ZpqrI!FqFuV*kT-ZaQEZVk_~S@a^H`_oWSDJne=3@;cb39 zNzK-S9Y-k$WmHhzbcVd7hJUBtQzxv#_&at7C-xzQ4_(pehs>xg==xC#tp72b4bf9I zYF^%Yw3(O0hEvuFR0xg3nWE=Y8TLo>XWv@) zIK;?8Preo7Fnk{WVHLL0X;8K&C?mMAlfs*!X7-4HAgBygAW?WBw1LV~EPO7B-KTjC zn@*71iOZK8J)RKhOj(%l^H-*a9AiP8iFC@~SxhS%x#oMQ0T#UODwFivauc$#chCp;Az6&ulcysK0IMF+|9Mwcu#p`EJUX%rrlC)^-)4s_nq z{N&snXi3aclz+-n@83FnywiSZKjiDbPziE$Id<(^370Y9A1=>w=hl~O#uo9u_%ts} z9S*5(Zmeg7ti!-FH0C3^Zl{tG*<0~XQ=t3uhrlwbCY%m z$ECu9t!jb6qp}7xCtv*NJ0;aL6F zFHh8C=SACcaJ;}cb{N{FiN;Ps&$9O1U_UD1cc=k0!W2TybtKdXUoJhPfL2;k5g(M| z_;$;!*s#FLioz+Lln)wOWV@sxM`OOf;023tzcl8JBb4Ks zNI5QOwf|1w(?Da@Ea-sRd7Jt|zXu`<8{$(Bdw22q|NPuGXj1K8I546x|0Jxb+J688 zf`i^ohkKut!V9KC)2p;C4c=~5I{q6geMU#JF1o+H`vei1Z?f|J#cS?T3{Tp;-s3an zEvD(cAV0mx7{;V1J=m9(d?}V~l3?8J@g_MlJ6j`G%$l#-bk#Y&TTc07-rCRbk*Tdv z2+%?w_faP87+Q(>eZ9lECI?4nj?M*b{-%|xDch6v&6%#4ySv`kXE)q1bOc>dkek@2 zB9+b@B$#D3lfv0zt}1`m5g6F*!r;Z#XLczB)ld-h{3Eve?0bK3H3(mW8kFjPch3nk z3w`(6fs42B{X{>Gs=2wVgNz-4uOr=o7p)KFLU3DFJ^zMRZGm=@hu6*3{+k<8-_HTR z=o#C3!?UArXt#mTo6xxR+I?YDgQXJwedpgRYOI)uYDfp4*x�vupIymzn*Q9p3LA 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 Ss^{+v@>4rE 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 z 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%0A~00%I(tToMO;KlIW`OP6$_>vXTR)O3nalBK_l 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 a-Qy!%NRf@wvOgYRKI+QaN>vIrpZ`A_ZjNmL literal 0 HcmV?d00001 diff --git a/docs/deploy/config-guides/img/weaviate-sample-dashboard-objects.png b/docs/deploy/config-guides/img/weaviate-sample-dashboard-objects.png new file mode 100644 index 0000000000000000000000000000000000000000..4b0c148bc47693eb25cde00a48991ca3d653b11d GIT binary patch literal 72006 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�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 V*t5h|S}DlSMIA%!VojSz{{xc;=hpxL literal 0 HcmV?d00001 diff --git a/docs/deploy/config-guides/img/weaviate-sample-dashboard-startup.png b/docs/deploy/config-guides/img/weaviate-sample-dashboard-startup.png new file mode 100644 index 0000000000000000000000000000000000000000..aae320f17d23753b9fe0b5f20beba500f7c2f0cf GIT binary patch literal 57628 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 Mos(^e_0@a-1DFS1Jpcdz literal 0 HcmV?d00001 diff --git a/docs/deploy/config-guides/img/weaviate-sample-dashboard-vector.png b/docs/deploy/config-guides/img/weaviate-sample-dashboard-vector.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3e28a19ebd7ab5462bcc9c90b61161991fa53a GIT binary patch literal 64636 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 literal 0 HcmV?d00001 diff --git a/docs/deploy/config-guides/monitoring.md b/docs/deploy/config-guides/monitoring.md new file mode 100644 index 00000000..4fd4d77e --- /dev/null +++ b/docs/deploy/config-guides/monitoring.md @@ -0,0 +1,141 @@ +--- +title: Monitoring +sidebar_position: 50 +image: og/docs/configuration.jpg +# tags: ['configuration', 'operations', 'monitoring', 'observability'] +--- + +Weaviate can expose Prometheus-compatible metrics for monitoring. A standard +Prometheus/Grafana setup can be used to visualize metrics on various +dashboards. + +Metrics can be used to measure request latencies, import +speed, time spent on vector vs object storage, memory usage, application usage, +and more. + +## Configure Monitoring + +### Enable within Weaviate + +To tell Weaviate to collect metrics and expose them in a Prometheus-compatible +format, all that's required is to set the following environment variable: + +```sh +PROMETHEUS_MONITORING_ENABLED=true +``` + +By default, Weaviate will expose the metrics at `:2112/metrics`. You +can optionally change the port to a custom port using the following environment +variable: + +```sh +PROMETHEUS_MONITORING_PORT=3456 +``` + +### Scrape metrics from Weaviate + +Metrics are typically scraped into a time-series database, such as Prometheus. +How you consume metrics depends on your setup and environment. + +The [Weaviate examples repo contains a fully pre-configured setup using +Prometheus, Grafana and some example +dashboards](https://github.com/weaviate/weaviate-examples/tree/main/monitoring-prometheus-grafana). +You can start up a full-setup including monitoring and dashboards with a single +command. In this setup the following components are used: + +* Docker Compose is used to provide a fully-configured setup that can be + started with a single command. +* Weaviate is configured to expose Prometheus metrics as outlined in the + section above. +* A Prometheus instance is started with the setup and configured to scrape + metrics from Weaviate every 15s. +* A Grafana instance is started with the setup and configured to use the + Prometheus instance as a metrics provider. Additionally, it runs a dashboard + provider that contains a few sample dashboards. + +### Multi-tenancy + +When using multi-tenancy, we suggest setting the `PROMETHEUS_MONITORING_GROUP` [environment variable](docs/weaviate/config-refs/env-vars.md) as `true` so that data across all tenants are grouped together for monitoring. + +## Obtainable Metrics + +The list of metrics that are obtainable through Weaviate's metric system is +constantly being expanded. The complete list is in the [`prometheus.go`](https://github.com/weaviate/weaviate/blob/main/usecases/monitoring/prometheus.go) source code file. + +This page describes some noteworthy metrics and their uses. + +Typically metrics are quite granular, as they can always be aggregated later +on. For example if the granularity is "shard", you could aggregate all "shard" +metrics of the same "class" to obtain a class metrics, or aggregate all metrics +to obtain the metric for the entire Weaviate instance. + +| Metric | Description | Labels | Type | +| --- | --- | --- | --- | +| `batch_durations_ms` | Duration of a single batch operation in ms. The `operation` label further defines what operation as part of the batch (e.g. object, inverted, vector) is being used. Granularity is a shard of a class. | `operation`, `class_name`, `shard_name` | Histogram | +| `batch_delete_durations_ms` | Duration of a batch delete in ms. The `operation` label further defines what operation as part of the batch delete is being measured. Granularity is a shard of a class | `class_name`, `shard_name` | Histogram | +| `objects_durations_ms` | Duration of an individual object operation, such as `put`, `delete`, etc. as indicated by the `operation` label, also as part of a batch. The `step` label adds additional precisions to each `operation`. Granularity is a shard of a class. | `class_name`, `shard_name` | Histogram | +| `object_count` | Numbers of objects present. Granularity is a shard of a class | `class_name`, `shard_name` | Gauge | +| `async_operations_running` | Number of currently running async operations. The operation itself is defined through the `operation` label. | `operation`, `class_name`, `shard_name`, `path` | Gauge | +| `lsm_active_segments` | Number of currently present segments per shard. Granularity is shard of a class. Grouped by `strategy`.| `strategy`, `class_name`, `shard_name`, `path` | Gauge | +| `lsm_bloom_filter_duration_ms` | Duration of a bloom filter operation per shard in ms. Granularity is shard of a class. Grouped by `strategy`. | `operation`, `strategy`, `class_name`, `shard_name` | Histogram | +| `lsm_segment_objects` | Number of entries per LSM segment by level. Granularity is shard of a class. Grouped by `strategy` and `level`. | `operation`, `strategy`, `class_name`, `shard_name`, `path`, `level` | Gauge | +| `lsm_segment_size` | Size of LSM segment by level and unit. | `strategy`, `class_name`, `shard_name`, `path`, `level`, `unit` | Gauge | +| `lsm_segment_count` | Number of segments by level | `strategy`, `class_name`, `shard_name`, `path`, `level` | Gauge | +| `vector_index_tombstones` | Number of currently active tombstones in the vector index. Will go up on each incoming delete and go down after a completed repair operation. | `class_name`, `shard_name` | Gauge | +| `vector_index_tombstone_cleanup_threads` | Number of currently active threads for repairing/cleaning up the vector index after deletes have occurred. | `class_name`, `shard_name` | Gauge | +| `vector_index_tombstone_cleaned` | Total number of deleted and removed vectors after repair operations. | `class_name`, `shard_name` | Counter | +| `vector_index_operations` | Total number of mutating operations on the vector index. The operation itself is defined by the `operation` label. | `operation`, `class_name`, `shard_name` | Gauge | +| `vector_index_size` | The total capacity of the vector index. Typically larger than the number of vectors imported as it grows proactively. | `class_name`, `shard_name` | Gauge | +| `vector_index_maintenance_durations_ms` | Duration of a sync or async vector index maintenance operation. The operation itself is defined through the `operation` label. | `opeartion`, `class_name`, `shard_name` | Histogram | +| `vector_index_durations_ms` | Duration of regular vector index operation, such as insert or delete. The operation itself is defined through the `operation` label. The `step` label adds more granularity to each operation. | `operation`, `step`, `class_name`, `shard_name` | Histogram | +| `startup_durations_ms` | Duration of individual startup operations in ms. The operation itself is defined through the `operation` label. | `operation`, `class_name`, `shard_name` | Histogram | +| `startup_diskio_throughput` | Disk I/O throughput in bytes/s at startup operations, such as reading back the HNSW index or recovering LSM segments. The operation itself is defined by the `operation` label. | `operation`, `step`, `class_name`, `shard_name` | Histogram | +| `requests_total` | Metric that tracks all user requests to determine if it was successful or failed. | `api`, `query_type`, `class_name` | `GaugeVec` | +| `index_queue_push_duration_ms` | Duration of pushing one or more vectors to the index queue. | `class_name`, `shard_name`, `target_vector` | `Summary` | +| `index_queue_delete_duration_ms` | Duration of deleting one or more vectors from the index queue and the underlying index. | `class_name`, `shard_name`, `target_vector` | `Summary` | +| `index_queue_preload_duration_ms` | Duration of preloading un-indexed vectors to the index queue. | `class_name`, `shard_name`, `target_vector` | `Summary` | +| `index_queue_preload_count` | Number of vectors preloaded to the index queue. | `class_name`, `shard_name`, `target_vector` | `Gauge` | +| `index_queue_search_duration_ms` | Duration of searching for vectors in the index queue and the underlying index. | `class_name`, `shard_name`, `target_vector` | `Summary` | +| `index_queue_paused` | Whether the index queue is paused. | `class_name`, `shard_name`, `target_vector` | `Gauge` | +| `index_queue_size` | Number of vectors in the index queue. | `class_name`, `shard_name`, `target_vector` | `Gauge` | +| `index_queue_stale_count` | Number of times the index queue has been marked as stale. | `class_name`, `shard_name`, `target_vector` | `Counter` | +| `index_queue_vectors_dequeued` | Number of vectors sent to the workers per tick. | `class_name`, `shard_name`, `target_vector` | `Gauge` | +| `index_queue_wait_duration_ms` | Duration of waiting for the workers to finish. | `class_name`, `shard_name`, `target_vector` | `Summary` | + +Extending Weaviate with new metrics is very easy. To suggest a new metric, see the [contributor guide](/docs/contributor-guide). + +### Versioning + +Be aware that metrics do not follow the semantic versioning guidelines of other Weaviate features. Weaviate's main APIs are stable and breaking changes are extremely rare. Metrics, however, have shorter feature lifecycles. It can sometimes be necessary to introduce an incompatible change or entirely remove a metric, for example, because the cost of observing a specific metric in production has grown too high. As a result, it is possible that a Weaviate minor release contains a breaking change for the Monitoring system. If so, it will be clearly highlighted in the release notes. + +## Sample Dashboards + +Weaviate does not ship with any dashboards by default, but here is a list of +dashboards being used by the various Weaviate teams, both during development, +and when helping users. These do not come with any support, but may still be +helpful. Treat them as inspiration to design your own dashboards which fit +your uses perfectly: + +| Dashboard | Purpose | Preview | +| --- | --- | --- | +| [Importing Data Into Weaviate](https://github.com/weaviate/weaviate/blob/master/tools/dev/grafana/dashboards/importing.json) | Visualize speed of import operations (including its components, such as object store, inverted index, and vector index). | ![Importing Data into Weaviate](./img/weaviate-sample-dashboard-importing.png "Importing Data Into Weaviate") | +| [Object Operations](https://github.com/weaviate/weaviate/blob/master/tools/dev/grafana/dashboards/objects.json) | Visualize speed of whole object operations, such as GET, PUT, etc. | ![Objects](./img/weaviate-sample-dashboard-objects.png "Objects") | +| [Vector Index](https://github.com/weaviate/weaviate/blob/master/tools/dev/grafana/dashboards/vectorindex.json) | Visualize the current state, as well as operations on the HNSW vector index | ![Vector Index](./img/weaviate-sample-dashboard-vector.png "Vector Index") | +| [LSM Stores](https://github.com/weaviate/weaviate/blob/master/tools/dev/grafana/dashboards/lsm.json) | Get insights into the internals (including segments) of the various LSM stores within Weaviate. | ![LSM Store](./img/weaviate-sample-dashboard-lsm.png "LSM Store") | +| [Startup](https://github.com/weaviate/weaviate/blob/master/tools/dev/grafana/dashboards/startup.json) | Visualize the startup process, including recovery operations | ![Startup](./img/weaviate-sample-dashboard-startup.png "Vector Index") | +| [Usage](https://github.com/weaviate/weaviate/blob/master/tools/dev/grafana/dashboards/usage.json) | Obtain usage metrics, such as number of objects imported, etc.| ![Usage](./img/weaviate-sample-dashboard-usage.png "Usage") | +| [Aysnc index queue](https://github.com/weaviate/weaviate/blob/main/tools/dev/grafana/dashboards/index_queue.json) | Observe index queue activity | ![Async index queue](./img/weaviate-sample-dashboard-async-queue.png "Async index queue") | + +## `nodes` API Endpoint + +To get collection details programmatically, use the [`nodes`](../config-refs/nodes.md) REST endpoint. + +import APIOutputs from '/_includes/rest/node-endpoint-info.mdx'; + + + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/docs/deploy/config-guides/persistence.md b/docs/deploy/config-guides/persistence.md new file mode 100644 index 00000000..5649bf34 --- /dev/null +++ b/docs/deploy/config-guides/persistence.md @@ -0,0 +1,112 @@ +--- +title: Persistence +image: og/docs/configuration.jpg +--- + +import SkipLink from '/src/components/SkipValidationLink' + +When running Weaviate with Docker or Kubernetes, you can persist its data by mounting a volume to store the data outside of the containers. Doing so will cause the Weaviate instance to also load the data from the mounted volume when it is restarted. + +Note that Weaviate now offers native backup modules starting with `v1.15` for single-node instances, and `v1.16` for multi-node instances. For older versions of Weaviate, persisting data as described here will allow you to back up Weaviate. + +## Docker Compose + +### Persistence + +When running Weaviate with Docker Compose, you can set the `volumes` variable under the `weaviate` service and a unique cluster hostname as an environment variable. + +```yaml +services: + weaviate: + volumes: + - /var/weaviate:/var/lib/weaviate + environment: + CLUSTER_HOSTNAME: 'node1' + PERSISTENCE_DATA_PATH: '/var/lib/weaviate' +``` + +* About the volumes + * `/var/weaviate` is the location where you want to store the data on the local machine + * `/var/lib/weaviate` The value after the colon (:) is the storage location inside the container. This value must match the PERSISTENCE_DATA_PATH variable. +* About the hostname + * `CLUSTER_HOSTNAME` can be any name + +In the case you want a more verbose output, you can change the environment variable for the `LOG_LEVEL` + +```yaml +services: + weaviate: + environment: + LOG_LEVEL: 'debug' +``` + +A complete example of a Weaviate without modules but with an externally mounted volume and more verbose output: + +```yaml +--- +services: + weaviate: + command: + - --host + - 0.0.0.0 + - --port + - '8080' + - --scheme + - http + image: cr.weaviate.io/semitechnologies/weaviate:||site.weaviate_version|| + ports: + - 8080:8080 + - 50051:50051 + restart: on-failure:0 + volumes: + - /var/weaviate:/var/lib/weaviate # <== set a volume here + environment: + QUERY_DEFAULTS_LIMIT: 25 + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' + PERSISTENCE_DATA_PATH: '/var/lib/weaviate' + ENABLE_API_BASED_MODULES: 'true' + CLUSTER_HOSTNAME: 'node1' # <== this can be set to an arbitrary name +... +``` + +### Backups + +See [Backups](./backups.md). + +## Kubernetes + +For Kubernetes setup, the only thing to bear in mind is that Weaviate needs a `PersistentVolumes` through `PersistentVolumeClaims` ([more info](../installation-guides/k8s-installation.md#requirements)) but the Helm chart is already configured to store the data on an external volume. + +## Disk Pressure Warnings and Limits + +Starting with `v1.12.0` there are two levels of disk usage notifications and actions configured through environment variables. Both variables are optional. If not set they default to the values outlined below: + +| Variable | Default Value | Description | +| --- | --- | --- | +| `DISK_USE_WARNING_PERCENTAGE` | `80` | If disk usage is higher than the given percentage a warning will be logged by all shards on the affected node's disk | +| `DISK_USE_READONLY_PERCENTAGE` | `90` | If disk usage is higher than the given percentage all shards on the affected node will be marked as `READONLY`, meaning all future write requests will fail. | + +If a shard was marked `READONLY` due to disk pressure and you want to mark the +shard as ready again (either because you have made more space available or +changed the thresholds) you can use the Shards API to do so. + +## Disk access method + +:::info Added in `v1.21` +::: + +Weaviate maps data on disk to memory. To configure how Weaviate uses virtual memory, set the `PERSISTENCE_LSM_ACCESS_STRATEGY` environment variable. The default value is `mmap`. Use `pread` to as an alternative. + +The two functions reflect different under-the-hood memory management behaviors. `mmap` uses a memory-mapped file, which means that the file is mapped into the virtual memory of the process. `pread` is a function that reads data from a file descriptor at a given offset. + +In general, `mmap` may be a preferred option with memory management benefits. However, if you experience stalling situations under heavy memory load, we suggest trying `pread` instead. + + +## Related pages +- [Configuration: Backups](docs/weaviate/configuration/backups.md) + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/sidebars.js b/sidebars.js index 0fa7fd5e..a2652ab3 100644 --- a/sidebars.js +++ b/sidebars.js @@ -432,10 +432,10 @@ const sidebars = { collapsible: true, collapsed: true, items: [ - "deploy/installation-guides/k8s-installation", - "deploy/installation-guides/docker-installation", - "deploy/installation-guides/gcp-installation", - "deploy/installation-guides/aws-installation", + "deploy/config-guides/authentication", + "deploy/config-guides/modules", + "deploy/config-guides/monitoring", + "deploy/config-guides/persistence", ], }, ], From e2c7f1dde2a0d55cd155b7ff6513079d9d1ea2ef Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Sat, 5 Apr 2025 22:02:43 -0400 Subject: [PATCH 18/39] adding k8s cli doc --- docs/deploy/installation-guides/aws-cli.md | 92 +++++++++++++++++++++ docs/deploy/production/Kubernetes/index.mdx | 2 +- docs/deploy/production/index.mdx | 1 + sidebars.js | 1 + 4 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 docs/deploy/installation-guides/aws-cli.md diff --git a/docs/deploy/installation-guides/aws-cli.md b/docs/deploy/installation-guides/aws-cli.md new file mode 100644 index 00000000..84a78efb --- /dev/null +++ b/docs/deploy/installation-guides/aws-cli.md @@ -0,0 +1,92 @@ +--- +title: AWS CLI Installation +description: Deploy Weaviate on EKS using the AWS CLI +--- + +## Prerequisites + +- Helm installed +- The AWS CLI installed with the latest version +- `kubectl` installed +- `eksctl` installed + +#### Verify your tools + +Before starting, ensure that your tools are installed: + +```bash +helm version +aws --version +kubectl version +eksctl version +``` + +### Step 1: Create the Cluster + +```bash +eksctl create cluster --name --region --nodegroup-name --nodes 3 --nodes-min 2 --nodes-max 4 --node-type t3.medium +``` + +This creates an EKS cluster within your speciifed region with an autoscaling node group. There are 3 nodes for high availability and having autoscaling enabled allows for the cluster to dynamically adjust resources based on demand. + +#### Enable `kubectl` to interact with the newly created cluster: + +```bash +aws eks --region update-kubeconfig --name +``` + +#### Verify that the node has been created and that you are able to interact with the cluster: + +```bash +kubectl get nodes +``` + +### Step 2: Enable Persistent Storage on the Cluster + +Peristent storage is required for running Weaviate on a Kubernetes cluster, it ensures that data is retained should a pod restart, a node crashes, or a cluster scales up or down. + +```bash +eksctl create addon --name aws-ebs-csi-driver --cluster --region --service-account-role-arn :role/AmazonEKS_EBS_CSI_DriverRole> +``` + +The above adds the EBS CSI Driver add-on for your cluster. After adding the add-on, a storage class and `PersistentValueClaim` is needed to enable persistent storage. + +See [Persistent storage for Kubernetes](https://aws.amazon.com/blogs/storage/persistent-storage-for-kubernetes/) for more information. + +### Step 3: Add Weaviate to EKS + +#### Create a Weaviate namespace: + +```bash +kubectl create namespace weaviate +``` + +#### Add the Weaviate Helm chart: + +```bash +helm repo add weaviate https://weaviate.github.io/weaviate-helm +helm repo update +``` + +After you've added the Weaviate Helm chart, configure the `values.yaml` file before you deploy Weaviate on the cluster. + + +#### Deploy Weaviate on your cluster: + +```bash +helm upgrade --install weaviate weaviate/weaviate \ + --namespace weaviate \ + --values values.yaml \ +``` + +#### Verify that Weaviate has been deployed: + +```bash +kubectl get pods +``` + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/docs/deploy/production/Kubernetes/index.mdx b/docs/deploy/production/Kubernetes/index.mdx index 8c887185..d9d9bca9 100644 --- a/docs/deploy/production/Kubernetes/index.mdx +++ b/docs/deploy/production/Kubernetes/index.mdx @@ -1,6 +1,6 @@ --- -sidebar_label: "Kubernetes in Production" +sidebar_label: "Kubernetes" --- diff --git a/docs/deploy/production/index.mdx b/docs/deploy/production/index.mdx index 1c61ce9b..4f2c75c0 100644 --- a/docs/deploy/production/index.mdx +++ b/docs/deploy/production/index.mdx @@ -8,6 +8,7 @@ sidebar_position: 0 # Production Environments Deploying Weaviate in a production environment requires careful planning to ensure stability, security, and performance. +Currently, the only supported method of deploying Weaviate in a production environment is through Kubernetes. Unlike development or testing environments, a production instance must be resilient, scalable, and optimized for real-world workloads. ## Key Aspects of a Production Environments diff --git a/sidebars.js b/sidebars.js index 708d108d..0d642115 100644 --- a/sidebars.js +++ b/sidebars.js @@ -427,6 +427,7 @@ const sidebars = { "deploy/installation-guides/docker-installation", "deploy/installation-guides/gcp-installation", "deploy/installation-guides/aws-installation", + "deploy/installation-guides/aws-cli", ], }, { From b2d5e3ac9b12a72288e223b7a76967098340b293 Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Mon, 7 Apr 2025 09:07:44 -0400 Subject: [PATCH 19/39] adding placeholders --- docs/deploy/config-guides/async-rep.md | 1 + docs/deploy/faqs/index.md | 0 docs/deploy/faqs/troubleshooting.md | 0 .../installation-guides/aws-installation.md | 6 +-- .../installation-guides/helm-installation.md | 1 + .../monitoring-obs/grafana-prometheus.md | 0 docs/deploy/monitoring-obs/index.md | 0 .../scaling-strategies/horizontal-scaling.md | 1 + docs/deploy/scaling-strategies/index.md | 1 + docs/deploy/scaling-strategies/multi-node.md | 1 + docs/weaviate/installation/kubernetes.md | 49 ++++++++++++------- secondaryNavbar.js | 5 +- sidebars.js | 23 +++++++++ 13 files changed, 65 insertions(+), 23 deletions(-) create mode 100644 docs/deploy/config-guides/async-rep.md create mode 100644 docs/deploy/faqs/index.md create mode 100644 docs/deploy/faqs/troubleshooting.md create mode 100644 docs/deploy/installation-guides/helm-installation.md create mode 100644 docs/deploy/monitoring-obs/grafana-prometheus.md create mode 100644 docs/deploy/monitoring-obs/index.md create mode 100644 docs/deploy/scaling-strategies/horizontal-scaling.md create mode 100644 docs/deploy/scaling-strategies/index.md create mode 100644 docs/deploy/scaling-strategies/multi-node.md diff --git a/docs/deploy/config-guides/async-rep.md b/docs/deploy/config-guides/async-rep.md new file mode 100644 index 00000000..aac65027 --- /dev/null +++ b/docs/deploy/config-guides/async-rep.md @@ -0,0 +1 @@ +# Async Replication \ No newline at end of file diff --git a/docs/deploy/faqs/index.md b/docs/deploy/faqs/index.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/deploy/faqs/troubleshooting.md b/docs/deploy/faqs/troubleshooting.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/deploy/installation-guides/aws-installation.md b/docs/deploy/installation-guides/aws-installation.md index 6d88d782..cfd7a13e 100644 --- a/docs/deploy/installation-guides/aws-installation.md +++ b/docs/deploy/installation-guides/aws-installation.md @@ -65,7 +65,7 @@ If you prefer a video, you can watch the following walkthrough. This video is re #### Some settings may not be changed after launch Not all settings may be changed after launch. For example, these settings are currently not changeable after launch: -- weaviatePVCSize +- helmstoragesize - albDriver - ebsDriver - vpcUseDefault @@ -77,8 +77,8 @@ Not all settings may be changed after launch. For example, these settings are cu #### Suggested configurations - The default values should be suitable for a majority of cases. -- `weaviatePVCSize`: For production environments, at least 500GB per StatefulSet pod is recommended. (Smaller disks may be sufficient for dev environments.) -- `weaviateAuthType`: We recommend not running Weaviate with anonymous access. We suggest setting it to `apikey` and setting a key, for example by executing `pwgen -A -s 32` to generate a random string. +- `helmstoragesize`: For production environments, at least 500GB per StatefulSet pod is recommended. (Smaller disks may be sufficient for dev environments.) +- `helmauthenticationtype`: We recommend not running Weaviate with anonymous access. We suggest setting it to `apikey` and setting a key, for example by executing `pwgen -A -s 32` to generate a random string. ::: Once you open the CloudFormation template, you should see a set of options similar to below. diff --git a/docs/deploy/installation-guides/helm-installation.md b/docs/deploy/installation-guides/helm-installation.md new file mode 100644 index 00000000..56178afe --- /dev/null +++ b/docs/deploy/installation-guides/helm-installation.md @@ -0,0 +1 @@ +# Placeholder for Helm Chart Installation \ No newline at end of file diff --git a/docs/deploy/monitoring-obs/grafana-prometheus.md b/docs/deploy/monitoring-obs/grafana-prometheus.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/deploy/monitoring-obs/index.md b/docs/deploy/monitoring-obs/index.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/deploy/scaling-strategies/horizontal-scaling.md b/docs/deploy/scaling-strategies/horizontal-scaling.md new file mode 100644 index 00000000..7bffcb57 --- /dev/null +++ b/docs/deploy/scaling-strategies/horizontal-scaling.md @@ -0,0 +1 @@ +# Horizontal Scaling Placeholder \ No newline at end of file diff --git a/docs/deploy/scaling-strategies/index.md b/docs/deploy/scaling-strategies/index.md new file mode 100644 index 00000000..7cc631f4 --- /dev/null +++ b/docs/deploy/scaling-strategies/index.md @@ -0,0 +1 @@ +# Placeholder Scaling Strategy Landing Page \ No newline at end of file diff --git a/docs/deploy/scaling-strategies/multi-node.md b/docs/deploy/scaling-strategies/multi-node.md new file mode 100644 index 00000000..064cb77b --- /dev/null +++ b/docs/deploy/scaling-strategies/multi-node.md @@ -0,0 +1 @@ +# Multi-Node Placeholder \ No newline at end of file diff --git a/docs/weaviate/installation/kubernetes.md b/docs/weaviate/installation/kubernetes.md index c9b43685..46269b75 100644 --- a/docs/weaviate/installation/kubernetes.md +++ b/docs/weaviate/installation/kubernetes.md @@ -1,5 +1,5 @@ --- -title: Kubernetes +title: Installing Kubernetes sidebar_position: 3 image: og/docs/installation.jpg # tags: ['installation', 'Kubernetes'] @@ -9,7 +9,11 @@ image: og/docs/installation.jpg For a tutorial on how to use [minikube](https://minikube.sigs.k8s.io/docs/) to deploy Weaviate on Kubernetes, see the Weaviate Academy course, [Weaviate on Kubernetes](../../academy/deployment/k8s/index.md). ::: -## Requirements +:::info Deploying to Production +If looking for details and best practices for deploying Weaviate in production, see [Weaviate in Production](docs/deploy/production/Kubernetes/k8s-poc.md) +::: + +## Prerequisites * A recent Kubernetes Cluster (at least version 1.23). If you are in a development environment, consider using the kubernetes cluster that is built into Docker desktop. For more information, see the [Docker documentation](https://docs.docker.com/desktop/kubernetes/). * The cluster needs to be able to provision `PersistentVolumes` using Kubernetes' `PersistentVolumeClaims`. @@ -66,12 +70,11 @@ Local models, such as `text2vec-transformers`, `qna-transformers`, and `img2vec #### Resource limits -Starting in Helm chart version 17.0.1, constraints on module resources are commented out to improve performance. To constrain resources for specific modules, add the constraints in your `values.yaml` file. +In an effort to improve performance, constraints on module resources are commented out. To constrain resources for specific modules, add the constraints in your `values.yaml` file. #### gRPC service configuration -Starting in Helm chart version 17.0.0, the gRPC service is enabled by default. If you use an older Helm chart, edit your `values.yaml` file to enable gRPC. - +gRPC service is enabled by default. If using an older Helm chart, edit your `values.yaml` file to enable gRPC. Check that the `enabled` field is set to `true` and the `type` field to `LoadBalancer`. These settings allow you to access the [gRPC API](https://weaviate.io/blog/grpc-performance-improvements) from outside the Kubernetes cluster. ```yaml @@ -87,7 +90,7 @@ grpcService: #### Authentication and authorization -An example configuration for authentication is shown below. +An example configuration for authentication is shown below: ```yaml authentication: @@ -167,24 +170,19 @@ To upgrade to `1.25` or higher from a pre-`1.25` version, you must delete the de See the [1.25 migration guide for Kubernetes](../more-resources/migration/weaviate-1-25.md) for more details. -## Additional Configuration Help - -- [Cannot list resource "configmaps" in API group when deploying Weaviate k8s setup on GCP](https://stackoverflow.com/questions/58501558/cannot-list-resource-configmaps-in-api-group-when-deploying-weaviate-k8s-setup) -- [Error: UPGRADE FAILED: configmaps is forbidden](https://stackoverflow.com/questions/58501558/cannot-list-resource-configmaps-in-api-group-when-deploying-weaviate-k8s-setup) - ### Using EFS with Weaviate In some circumstances, you may wish, or need, to use EFS (Amazon Elastic File System) with Weaviate. And we note in the case of AWS Fargate, you must create the [PV (persistent volume)](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) manually, as the PVC will NOT create a PV for you. To use EFS with Weaviate, you need to: -- Create an EFS file system. -- Create an EFS access point for every Weaviate replica. - - All of the Access Points must have a different root-directory so that Pods do not share the data, otherwise it will fail. -- Create EFS mount targets for each subnet of the VPC where Weaviate is deployed. -- Create StorageClass in Kubernetes using EFS. -- Create Weaviate Volumes, where each volume has a different AccessPoint for VolumeHandle(as mentioned above). -- Deploy Weaviate. +1. Create an EFS file system. +1. Create an EFS access point for every Weaviate replica. + 1. All of the Access Points must have a different root-directory so that Pods do not share the data, otherwise it will fail. +1. Create EFS mount targets for each subnet of the VPC where Weaviate is deployed. +1. Create StorageClass in Kubernetes using EFS. +1. Create Weaviate Volumes, where each volume has a different AccessPoint for VolumeHandle(as mentioned above). +1. Deploy Weaviate. This code is an example of a PV for `weaviate-0` Pod: @@ -212,7 +210,14 @@ spec: For more, general information on running EFS with Fargate, we recommend reading [this AWS blog](https://aws.amazon.com/blogs/containers/running-stateful-workloads-with-amazon-eks-on-aws-fargate-using-amazon-efs/). ### Using Azure file CSI with Weaviate -The provisioner `file.csi.azure.com` is **not supported** and will lead to file corruptions. Instead, make sure the storage class defined in values.yaml is from provisioner `disk.csi.azure.com`, for example: + +:::danger Important + +The provisioner `file.csi.azure.com` is **not supported** and will lead to file corruptions. + +::: + +Instead, make sure the storage class defined in values.yaml is from provisioner `disk.csi.azure.com`, for example: ```yaml storage: @@ -247,6 +252,12 @@ env: - CLUSTER_HOSTNAME: "node-1" ``` +## Additional Configuration Help + +- [Cannot list resource "configmaps" in API group when deploying Weaviate k8s setup on GCP](https://stackoverflow.com/questions/58501558/cannot-list-resource-configmaps-in-api-group-when-deploying-weaviate-k8s-setup) + +- [Error: UPGRADE FAILED: configmaps is forbidden](https://stackoverflow.com/questions/58501558/cannot-list-resource-configmaps-in-api-group-when-deploying-weaviate-k8s-setup) + ## Questions and feedback import DocsFeedback from '/_includes/docs-feedback.mdx'; diff --git a/secondaryNavbar.js b/secondaryNavbar.js index 64e4ba8b..ba821d66 100644 --- a/secondaryNavbar.js +++ b/secondaryNavbar.js @@ -67,7 +67,10 @@ const secondaryNavbarItems = { /*{ label: "Kubernetes", link: "/docs/deploy/k8s", sidebar: "deployK8sSidebar" },*/ { label: "Production Environments", link: "/docs/deploy/production", sidebar: "deployProductionSidebar"}, /*{ label: "AWS", link: "/docs/deploy/aws", sidebar: "deployAwsSidebar" },*/ - ], + { label: "Scaling Strategies", link: "/docs/deploy/scaling-strategies", sidebar: "deployScalingSidebar"}, + { label: "Monitoring and Observability", link: "/docs/deploy/monitoring-obs", sidebar: "deployObservabilitySidebar"}, + { label: "FAQs", link: "/docs/deploy/faqs", sidebar: "deployFaqsSidebar"}, + ] }, agents: { diff --git a/sidebars.js b/sidebars.js index 0d642115..05dbdc80 100644 --- a/sidebars.js +++ b/sidebars.js @@ -428,6 +428,8 @@ const sidebars = { "deploy/installation-guides/gcp-installation", "deploy/installation-guides/aws-installation", "deploy/installation-guides/aws-cli", + "deploy/installation-guides/aws-cli", + "deploy/installation-guides/helm-installation", ], }, { @@ -462,6 +464,27 @@ const sidebars = { }, ], + deployScalingSidebar: [ + { + type: "autogenerated", + dirName: "deploy/scaling-strategies", + + }, + ], + deployObservabilitySidebar: [ + { + type: "autogenerated", + dirName: "deploy/monitoring-obs", + + }, + ], + deployFaqsSidebar: [ + { + type: "autogenerated", + dirName: "deploy/faqs", + + }, + ], agentsSidebar: [ { type: "autogenerated", From 4a5b877b212abecec2ff577622cb8ccf4306bc5a Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Thu, 10 Apr 2025 14:16:18 -0400 Subject: [PATCH 20/39] making code blocks multi-line and removing duplicate on sidebar --- docs/deploy/installation-guides/aws-cli.md | 19 +++++++++++++++---- sidebars.js | 1 - 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/docs/deploy/installation-guides/aws-cli.md b/docs/deploy/installation-guides/aws-cli.md index 84a78efb..5ab2f3da 100644 --- a/docs/deploy/installation-guides/aws-cli.md +++ b/docs/deploy/installation-guides/aws-cli.md @@ -24,15 +24,23 @@ eksctl version ### Step 1: Create the Cluster ```bash -eksctl create cluster --name --region --nodegroup-name --nodes 3 --nodes-min 2 --nodes-max 4 --node-type t3.medium +eksctl create cluster +--name +--region +--nodegroup-name +--nodes 3 --nodes-min 2 --nodes-max 4 +--node-type t3.medium ``` -This creates an EKS cluster within your speciifed region with an autoscaling node group. There are 3 nodes for high availability and having autoscaling enabled allows for the cluster to dynamically adjust resources based on demand. +This creates an EKS cluster within your specified region with an autoscaling node group. There are 3 nodes for high availability and having autoscaling enabled allows for the cluster to dynamically adjust resources based on demand. #### Enable `kubectl` to interact with the newly created cluster: ```bash -aws eks --region update-kubeconfig --name +aws eks +--region +update-kubeconfig +--name ``` #### Verify that the node has been created and that you are able to interact with the cluster: @@ -46,7 +54,10 @@ kubectl get nodes Peristent storage is required for running Weaviate on a Kubernetes cluster, it ensures that data is retained should a pod restart, a node crashes, or a cluster scales up or down. ```bash -eksctl create addon --name aws-ebs-csi-driver --cluster --region --service-account-role-arn :role/AmazonEKS_EBS_CSI_DriverRole> +eksctl create addon +--name aws-ebs-csi-driver +--cluster +--region --service-account-role-arn :role/AmazonEKS_EBS_CSI_DriverRole> ``` The above adds the EBS CSI Driver add-on for your cluster. After adding the add-on, a storage class and `PersistentValueClaim` is needed to enable persistent storage. diff --git a/sidebars.js b/sidebars.js index 356f8491..8872ab2e 100644 --- a/sidebars.js +++ b/sidebars.js @@ -442,7 +442,6 @@ const sidebars = { "deploy/installation-guides/gcp-installation", "deploy/installation-guides/aws-installation", "deploy/installation-guides/aws-cli", - "deploy/installation-guides/aws-cli", "deploy/installation-guides/helm-installation", ], }, From 077f7ef8a2af61e32c30845c3ed2f910826b4291 Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Fri, 11 Apr 2025 14:08:34 -0400 Subject: [PATCH 21/39] adding the async replication env vars doc --- docs/deploy/config-guides/async-rep.md | 117 ++++++++++++++++++++++++- sidebars.js | 1 + 2 files changed, 117 insertions(+), 1 deletion(-) diff --git a/docs/deploy/config-guides/async-rep.md b/docs/deploy/config-guides/async-rep.md index aac65027..754a4fed 100644 --- a/docs/deploy/config-guides/async-rep.md +++ b/docs/deploy/config-guides/async-rep.md @@ -1 +1,116 @@ -# Async Replication \ No newline at end of file +--- + +title: Async Replication + +--- + +Introduced to GA in the 1.29 release, Async Replication is a mechanism used to ensure eventual consistency across nodes in a distributed cluster. It works as a background process that automatically keeps nodes in sync without requiring user queries. Previously, consistency was achieved through "read repair" which involved nodes comparing data during a read request and exchanging missing or outdated information. This approach guarantees eventual consistency without requiring read operations. + +### Under the Hood + +- Async replication operates as a background process either per tenant (in a multi-tenant collection) or per shard (in a non-multi-tenant collection). +- It is disabled by default but can be enabled through schema changes, similar to setting the replication factor. + +### Environment Variable Deep Dive + +These environment variables can be used to fine-tune behavior for your specific use case or deployment environment. + +:::tip +The optimal values for these variables will ultimately depend on factors like: data size, network conditions, write patterns, and the desired level of eventual consistency. +::: + +#### `ASYNC_REPLICATION_DISABLED` +Globally disables the entire async replication feature. + +- Its default value is `false`. +- **Use case**: This is useful when you have many tenants or collections where a temporary global disable is needed, like during debugging or critical maintenance. +- **Special Considerations**: + - This overrides any schema-level settings. + +#### `ASYNC_REPLICATION_HASHTREE_HEIGHT` +Customizes the height of the hash tree built by each node to represent its locally stored data. +- By default the value is set to 16 which is roughly 2MB of RAM per shard on each node. +- **Use case(s)**: + - In multi-tenant setups with a large number of tenants, reducing the hash tree would minimize the memory footprint. + - For very large collections, a larger hash tree could be more beneficial for more efficient identification of differing data ranges. +- **Special Considerations**: + - Modification of the hash tree height requires rebuilding the hash tree on each node, which involves iterating over all existing objects. + + +#### `ASYNC_REPLICATION_FREQUENCY` +Defines how often each node initiates the process of comparing its local data (via the hash tree) with other nodes storing the same shard. This regularly checks for inconsistencies, even if no changes have been explicitly triggered. +- It's default value is 30 seconds. +- **Use Case(s)** + - Decreasing the frequency can be beneficial for applications that require faster convergence to eventual consistency. + - Increasing the frequency can be beneficial for reducing the load on the system by relaxing the eventual consistency. + +#### `ASYNC_REPLICATION_FREQUENCY_WHILE_PROPAGATING` +Defines a shorter frequency for subsequent comparison and propagation attempts when a previous propagation cycle did not complete (i.e., not all detected differences were synchronized). + - By default it is set to 20 milliseconds. + - **Use Case(s)**: When inconsistencies are known to exist, this expedites the synchronization process. + - **Considerations**: This is activated after a propogation cycle detects differences but does not propagate all of them due to limits. + +#### `ASYNC_REPLICATION_ALIVE_NODES_CHECKING_FREQUENCY` +Defines the frequency at which the system checks for changes in the availability of nodes within the cluster. + - By default it is set to 5 seconds. + - **Use Case(s)**: When a node rejoins the cluster after a period of downtime, it is highly likely to be out of sync. This setting ensures that the replication process is initiated promptly. + +#### `ASYNC_REPLICATION_LOGGING_FREQUENCY` +Controls how often the background async replication process logs its activity. + - By default it is set to 5 seconds. + - **Use Case(s)**: Increasing the frequency provides more detailed logs, while decreasing it reduces log verbosity. + +#### `ASYNC_REPLICATION_DIFF_BATCH_SIZE` +Sets the number of object metadata fetched per request during the comparison phase. + - By default it is set to 1000. + - **Use Case(s)**: May be increased to potentially improve performance if network latency is low and nodes can handle larger requests. + - **Considerations**: Fetching metadata in batches optimizes network communication. + +#### `ASYNC_REPLICATION_DIFF_PER_NODE_TIMEOUT` +Defines the maximum time to wait for a response when requesting object metadata from a remote node during the comparison phase, this prevents indefinite blocking if a node is unresponsive. + - By default is set to 10 seconds. + - **Use Case(s)**: May need to be increased in environments with high network latency or potentially slow-responding nodes. + +#### `ASYNC_REPLICATION_PROPAGATION_TIMEOUT` +Sets the maximum time allowed for a single propagation request (sending actual object data) to a remote node. + - By default is set to 30 seconds. + - **Use Case(s)**: May need to be increased in scenarios with high network latency, large object sizes (e.g., images, vectors), or when sending large batches of objects. + - **Considerations**: Network latency, batch size, and the size of the objects being propagated can all affect timeouts. + +#### `ASYNC_REPLICATION_PROPAGATION_LIMIT` +Defines the maximum number of objects that will be propagated in a single async replication iteration (after one hash tree comparison). + - By default is set to 10,000. + - **Use Case(s)**: Can be adjusted based on network capacity and the desired rate of convergence. + - **Considerations**: Even if more than this number of differences are detected, only this many objects will be propagated in the current iteration. Subsequent iterations will handle the remaining differences. + + +#### `ASYNC_REPLICATION_PROPAGATION_DELAY` +Introduces a delay before considering an object for propagation. Only objects older than this delay are considered. + - By default it is set to 30 seconds. + - **Use Case(s)**: If an object is inserted into one node but the insertion is still in progress, the hash comparison might detect it. This delay prevents the async replication from trying to propagate it before the local write operation is fully complete. + - **Considerations**: This should be set based on the typical write latency of the system. + +#### `ASYNC_REPLICATION_PROPAGATION_CONCURRENCY` +Controls the number of concurrent goroutines (or threads) used to send batches of objects during the propagation phase. + - By default it is set to 5. + - **Considerations**: Increasing concurrency can improve propagation speed, but needs to be balanced with potential resource contention (CPU, network). + + +#### `ASYNC_REPLICATION_PROPAGATION_BATCH_SIZE` +Sets the maximum number of objects included in each batch when propagating data to a remote node. + - By default is set to 100. + - **Use Case(s)**: + - For large objects, reducing the batch size can help manage memory usage during propagation. The batch size could be similar to the batch size used during initial data insertion. + - For smaller objects, increasing the batch size might improve propagation efficiency by reducing the overhead of individual requests, but needs to be balanced with potential memory pressure. + - **Considerations**: This setting is particularly important for large objects, as larger batches can lead to higher memory consumption during transmission. Multiple batches may be sent within a single iteration to reach the `ASYNC_REPLICATION_PROPAGATION_LIMIT`. + +### Further Resources +[Replication How-To](https://weaviate.io/developers/weaviate/configuration/replication#async-replication-settings) + +[Environment Variables](https://weaviate.io/developers/weaviate/config-refs/env-vars#async-replication) + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/sidebars.js b/sidebars.js index 8872ab2e..fbff1200 100644 --- a/sidebars.js +++ b/sidebars.js @@ -455,6 +455,7 @@ const sidebars = { "deploy/config-guides/modules", "deploy/config-guides/monitoring", "deploy/config-guides/persistence", + "deploy/config-guides/async-rep", ], }, ], From 895f98755e3fea49c301b206fa2fcaf0df69416b Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Mon, 14 Apr 2025 13:18:51 -0400 Subject: [PATCH 22/39] updated per JP's review --- docs/deploy/config-guides/async-rep.md | 135 ++++++++++++++++++------- 1 file changed, 99 insertions(+), 36 deletions(-) diff --git a/docs/deploy/config-guides/async-rep.md b/docs/deploy/config-guides/async-rep.md index 754a4fed..3bed2b78 100644 --- a/docs/deploy/config-guides/async-rep.md +++ b/docs/deploy/config-guides/async-rep.md @@ -6,12 +6,17 @@ title: Async Replication Introduced to GA in the 1.29 release, Async Replication is a mechanism used to ensure eventual consistency across nodes in a distributed cluster. It works as a background process that automatically keeps nodes in sync without requiring user queries. Previously, consistency was achieved through "read repair" which involved nodes comparing data during a read request and exchanging missing or outdated information. This approach guarantees eventual consistency without requiring read operations. +:::info + +This applies solely to data objects, as metadata consistency is treated differently (through RAFT consensus). +::: + ### Under the Hood - Async replication operates as a background process either per tenant (in a multi-tenant collection) or per shard (in a non-multi-tenant collection). -- It is disabled by default but can be enabled through schema changes, similar to setting the replication factor. +- It is disabled by default but can be enabled through collection configuration changes, similar to setting the replication factor. -### Environment Variable Deep Dive +## Environment Variable Deep Dive These environment variables can be used to fine-tune behavior for your specific use case or deployment environment. @@ -19,13 +24,54 @@ These environment variables can be used to fine-tune behavior for your specific The optimal values for these variables will ultimately depend on factors like: data size, network conditions, write patterns, and the desired level of eventual consistency. ::: +## Use Cases + +### General + +
    + + Feature Control #### `ASYNC_REPLICATION_DISABLED` Globally disables the entire async replication feature. - Its default value is `false`. - **Use case**: This is useful when you have many tenants or collections where a temporary global disable is needed, like during debugging or critical maintenance. - **Special Considerations**: - - This overrides any schema-level settings. + - This overrides any collection configuration. + +
    + +
    +Replication Control + +#### `ASYNC_REPLICATION_PROPAGATION_LIMIT` +Defines the maximum number of objects that will be propagated in a single async replication iteration (after one hash tree comparison). + - By default is set to 10,000. + - **Use Case(s)**: Can be adjusted based on network capacity and the desired rate of convergence. + - **Considerations**: Even if more than this number of differences are detected, only this many objects will be propagated in the current iteration. Subsequent iterations will handle the remaining differences. + + +#### `ASYNC_REPLICATION_PROPAGATION_DELAY` +Introduces a delay before considering an object for propagation. Only objects older than this delay are considered. + - By default it is set to 30 seconds. + - **Use Case(s)**: If an object is inserted into one node but the insertion is still in progress, the hash comparison might detect it. This delay prevents the async replication from trying to propagate it before the local write operation is fully complete. + - **Considerations**: This should be set based on the typical write latency of the system. +
    + +
    + Operational Visibility + +#### `ASYNC_REPLICATION_LOGGING_FREQUENCY` +Controls how often the background async replication process logs its activity. + - By default it is set to 5 seconds. + - **Use Case(s)**: Increasing the frequency provides more detailed logs, while decreasing it reduces log verbosity. +
    + +### Performance Tuning + +
    + + Memory Optimization #### `ASYNC_REPLICATION_HASHTREE_HEIGHT` Customizes the height of the hash tree built by each node to represent its locally stored data. @@ -36,7 +82,45 @@ Customizes the height of the hash tree built by each node to represent its local - **Special Considerations**: - Modification of the hash tree height requires rebuilding the hash tree on each node, which involves iterating over all existing objects. +
    + +
    + + Throughput and Concurrency + +#### `ASYNC_REPLICATION_PROPAGATION_CONCURRENCY` +Controls the number of concurrent goroutines (or threads) used to send batches of objects during the propagation phase. + - By default it is set to 5. + - **Considerations**: Increasing concurrency can improve propagation speed, but needs to be balanced with potential resource contention (CPU, network). + +
    + +
    + + Batch Processing + +#### `ASYNC_REPLICATION_DIFF_BATCH_SIZE` +Sets the number of object metadata fetched per request during the comparison phase. + - By default it is set to 1000. + - **Use Case(s)**: May be increased to potentially improve performance if network latency is low and nodes can handle larger requests. + - **Considerations**: Fetching metadata in batches optimizes network communication. + +#### `ASYNC_REPLICATION_PROPAGATION_BATCH_SIZE` +Sets the maximum number of objects included in each batch when propagating data to a remote node. + - By default is set to 100. + - **Use Case(s)**: + - For large objects, reducing the batch size can help manage memory usage during propagation. The batch size could be similar to the batch size used during initial data insertion. + - For smaller objects, increasing the batch size might improve propagation efficiency by reducing the overhead of individual requests, but needs to be balanced with potential memory pressure. + - **Considerations**: This setting is particularly important for large objects, as larger batches can lead to higher memory consumption during transmission. Multiple batches may be sent within a single iteration to reach the `ASYNC_REPLICATION_PROPAGATION_LIMIT`. + +
    + +### Consistency Tuning + +
    + + Synchronization Frequency #### `ASYNC_REPLICATION_FREQUENCY` Defines how often each node initiates the process of comparing its local data (via the hash tree) with other nodes storing the same shard. This regularly checks for inconsistencies, even if no changes have been explicitly triggered. - It's default value is 30 seconds. @@ -48,23 +132,22 @@ Defines how often each node initiates the process of comparing its local data (v Defines a shorter frequency for subsequent comparison and propagation attempts when a previous propagation cycle did not complete (i.e., not all detected differences were synchronized). - By default it is set to 20 milliseconds. - **Use Case(s)**: When inconsistencies are known to exist, this expedites the synchronization process. - - **Considerations**: This is activated after a propogation cycle detects differences but does not propagate all of them due to limits. + - **Considerations**: This is activated after a propagation cycle detects differences but does not propagate all of them due to limits. + +
    + +
    + Node Status Monitoring #### `ASYNC_REPLICATION_ALIVE_NODES_CHECKING_FREQUENCY` Defines the frequency at which the system checks for changes in the availability of nodes within the cluster. - By default it is set to 5 seconds. - **Use Case(s)**: When a node rejoins the cluster after a period of downtime, it is highly likely to be out of sync. This setting ensures that the replication process is initiated promptly. -#### `ASYNC_REPLICATION_LOGGING_FREQUENCY` -Controls how often the background async replication process logs its activity. - - By default it is set to 5 seconds. - - **Use Case(s)**: Increasing the frequency provides more detailed logs, while decreasing it reduces log verbosity. +
    -#### `ASYNC_REPLICATION_DIFF_BATCH_SIZE` -Sets the number of object metadata fetched per request during the comparison phase. - - By default it is set to 1000. - - **Use Case(s)**: May be increased to potentially improve performance if network latency is low and nodes can handle larger requests. - - **Considerations**: Fetching metadata in batches optimizes network communication. +
    +Timeout Management #### `ASYNC_REPLICATION_DIFF_PER_NODE_TIMEOUT` Defines the maximum time to wait for a response when requesting object metadata from a remote node during the comparison phase, this prevents indefinite blocking if a node is unresponsive. @@ -77,34 +160,14 @@ Sets the maximum time allowed for a single propagation request (sending actual o - **Use Case(s)**: May need to be increased in scenarios with high network latency, large object sizes (e.g., images, vectors), or when sending large batches of objects. - **Considerations**: Network latency, batch size, and the size of the objects being propagated can all affect timeouts. -#### `ASYNC_REPLICATION_PROPAGATION_LIMIT` -Defines the maximum number of objects that will be propagated in a single async replication iteration (after one hash tree comparison). - - By default is set to 10,000. - - **Use Case(s)**: Can be adjusted based on network capacity and the desired rate of convergence. - - **Considerations**: Even if more than this number of differences are detected, only this many objects will be propagated in the current iteration. Subsequent iterations will handle the remaining differences. - +
    -#### `ASYNC_REPLICATION_PROPAGATION_DELAY` -Introduces a delay before considering an object for propagation. Only objects older than this delay are considered. - - By default it is set to 30 seconds. - - **Use Case(s)**: If an object is inserted into one node but the insertion is still in progress, the hash comparison might detect it. This delay prevents the async replication from trying to propagate it before the local write operation is fully complete. - - **Considerations**: This should be set based on the typical write latency of the system. -#### `ASYNC_REPLICATION_PROPAGATION_CONCURRENCY` -Controls the number of concurrent goroutines (or threads) used to send batches of objects during the propagation phase. - - By default it is set to 5. - - **Considerations**: Increasing concurrency can improve propagation speed, but needs to be balanced with potential resource contention (CPU, network). +### Further Resources -#### `ASYNC_REPLICATION_PROPAGATION_BATCH_SIZE` -Sets the maximum number of objects included in each batch when propagating data to a remote node. - - By default is set to 100. - - **Use Case(s)**: - - For large objects, reducing the batch size can help manage memory usage during propagation. The batch size could be similar to the batch size used during initial data insertion. - - For smaller objects, increasing the batch size might improve propagation efficiency by reducing the overhead of individual requests, but needs to be balanced with potential memory pressure. - - **Considerations**: This setting is particularly important for large objects, as larger batches can lead to higher memory consumption during transmission. Multiple batches may be sent within a single iteration to reach the `ASYNC_REPLICATION_PROPAGATION_LIMIT`. +[Concepts: Replication](https://weaviate.io/developers/weaviate/concepts/replication-architecture/consistency) -### Further Resources [Replication How-To](https://weaviate.io/developers/weaviate/configuration/replication#async-replication-settings) [Environment Variables](https://weaviate.io/developers/weaviate/config-refs/env-vars#async-replication) From e5c59cb288bfbb1d07f7dd24b0a2609f8d92ac43 Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Mon, 14 Apr 2025 14:31:14 -0400 Subject: [PATCH 23/39] updating broken links --- .../model-providers/voyageai/embeddings-multimodal.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/weaviate/model-providers/voyageai/embeddings-multimodal.md b/docs/weaviate/model-providers/voyageai/embeddings-multimodal.md index e9e420c7..ba8098cb 100644 --- a/docs/weaviate/model-providers/voyageai/embeddings-multimodal.md +++ b/docs/weaviate/model-providers/voyageai/embeddings-multimodal.md @@ -167,7 +167,7 @@ The following examples show how to configure VoyageAI-specific options. -For further details on model parameters, see the [VoyageAI API documentation](https://docs.voyageai.com/reference/multimodal-embeddings-api). +For further details on model parameters, see the [VoyageAI API documentation](https://docs.voyageai.com/docs/multimodal-embeddings). ## Header parameters @@ -329,7 +329,7 @@ Once the integrations are configured at the collection, the data management and ### External resources -- VoyageAI [Multimodal Embed API documentation](https://docs.voyageai.com/reference/multimodal-embeddings-api) +- VoyageAI [Multimodal Embed API documentation](https://docs.voyageai.com/docs/multimodal-embeddings) ## Questions and feedback From e4099019a7ac70c1d3ae1f268d8a6ed2925e5f8e Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Thu, 17 Apr 2025 13:16:30 -0400 Subject: [PATCH 24/39] updated doc with further instructions --- docs/deploy/installation-guides/aws-cli.md | 83 +++++++++++++++++----- 1 file changed, 64 insertions(+), 19 deletions(-) diff --git a/docs/deploy/installation-guides/aws-cli.md b/docs/deploy/installation-guides/aws-cli.md index 5ab2f3da..314ce6df 100644 --- a/docs/deploy/installation-guides/aws-cli.md +++ b/docs/deploy/installation-guides/aws-cli.md @@ -1,14 +1,17 @@ --- -title: AWS CLI Installation +title: AWS EKS Installation description: Deploy Weaviate on EKS using the AWS CLI --- -## Prerequisites +Weaviate can be deployed on an EKS cluster using the `eksctl` command-line tool that creates and manages clusters. By the end of this document, you'll have all the necessary information to create an EKS cluster using the command line, add persistent storage to your cluster and then deploy Weaviate onto the cluster. + +:::info Prerequisites - Helm installed - The AWS CLI installed with the latest version - `kubectl` installed - `eksctl` installed +::: #### Verify your tools @@ -24,12 +27,7 @@ eksctl version ### Step 1: Create the Cluster ```bash -eksctl create cluster ---name ---region ---nodegroup-name ---nodes 3 --nodes-min 2 --nodes-max 4 ---node-type t3.medium +eksctl create cluster --name --region --nodegroup-name --nodes 3 --nodes-min 2 --nodes-max 4 --node-type t3.medium ``` This creates an EKS cluster within your specified region with an autoscaling node group. There are 3 nodes for high availability and having autoscaling enabled allows for the cluster to dynamically adjust resources based on demand. @@ -37,10 +35,7 @@ This creates an EKS cluster within your specified region with an autoscaling nod #### Enable `kubectl` to interact with the newly created cluster: ```bash -aws eks ---region -update-kubeconfig ---name +aws eks --region update-kubeconfig --name ``` #### Verify that the node has been created and that you are able to interact with the cluster: @@ -53,19 +48,62 @@ kubectl get nodes Peristent storage is required for running Weaviate on a Kubernetes cluster, it ensures that data is retained should a pod restart, a node crashes, or a cluster scales up or down. +#### Add the EBS CSI Driver Add-On ```bash -eksctl create addon ---name aws-ebs-csi-driver ---cluster ---region --service-account-role-arn :role/AmazonEKS_EBS_CSI_DriverRole> +eksctl create addon --name aws-ebs-csi-driver --cluster --region --service-account-role-arn :role/AmazonEKS_EBS_CSI_DriverRole> +``` + +The above adds the EBS CSI Driver add-on for your cluster. After adding the add-on, a storage class and `PersistentValueClaim` is needed to enable persistent storage. + +#### Add Storage Class + +After adding the EBS CSI Driver add-on, you'll need to create a `storageclass.yaml` file: +``` +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: +provisioner: ebs.csi.aws.com +parameters: + type: gp3 + encrypted: "true" +reclaimPolicy: Retain +volumeBindingMode: Immediate +allowVolumeExpansion: true +``` + +After creating the storage class, apply it: ```kubectl apply -f .yaml``` + +#### Create a `PersistentValueClaim` + +After creating and applying the Storage class, you'll need to also create a `PersistentValueClaim` file: + +```apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: +spec: + accessModes: + - ReadWriteOnce + storageClassName: + resources: + requests: + storage: 10Gi ``` +After creating the persistent value claim, you also need to apply it: +```kubectl apply -f .yaml``` -The above adds the EBS CSI Driver add-on for your cluster. After adding the add-on, a storage class and `PersistentValueClaim` is needed to enable persistent storage. +#### Verify your storage class and PersistentValueClaim have both been applied -See [Persistent storage for Kubernetes](https://aws.amazon.com/blogs/storage/persistent-storage-for-kubernetes/) for more information. +``` +kubectl get sc +kubectl get pvc +``` ### Step 3: Add Weaviate to EKS +After creating + #### Create a Weaviate namespace: ```bash @@ -90,12 +128,19 @@ helm upgrade --install weaviate weaviate/weaviate \ --values values.yaml \ ``` -#### Verify that Weaviate has been deployed: +#### Verify your deployment ```bash kubectl get pods ``` + +### Next Steps: [Connecting to Weaviate](docs/weaviate/connections/index.mdx) + +### Further Resources + +- [Persistent storage for Kubernetes](https://aws.amazon.com/blogs/storage/persistent-storage-for-kubernetes/) + ## Questions and feedback import DocsFeedback from '/_includes/docs-feedback.mdx'; From 814f779291174aadf76e65201bd0d1ce96fd0e0a Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Sat, 26 Apr 2025 23:07:21 -0400 Subject: [PATCH 25/39] adding and updating docs --- docs/deploy/faqs/index.md | 102 +++++++++++++ docs/deploy/faqs/troubleshooting.md | 56 +++++++ .../installation-guides/aws-installation.md | 139 ++---------------- .../installation-guides/gcp-installation.md | 122 +-------------- .../monitoring-obs/grafana-prometheus.md | 8 + docs/deploy/monitoring-obs/index.md | 6 + 6 files changed, 191 insertions(+), 242 deletions(-) diff --git a/docs/deploy/faqs/index.md b/docs/deploy/faqs/index.md index e69de29b..8119d470 100644 --- a/docs/deploy/faqs/index.md +++ b/docs/deploy/faqs/index.md @@ -0,0 +1,102 @@ +--- + +title: Deployment FAQs + +--- + +Looking for guidance on deploying Weaviate in a production environment? Whether you're scaling up from a proof-of-concept to an enterprise-wide implementation, migrating from another solution, or optimizing for specific workloads, you'll find practical answers to streamline your deployment process. Our goal is to help you achieve reliable performance, maintain data integrity, and minimize operational overhead as you harness the power of vector search for your applications! + + +#### Q1: Why did my cluster suddenly become read-only? + +
    + + Answer + +This almost always means you've run out of disk space. Weaviate protects itself by switching to read-only mode when disk usage exceeds a configured threshold. You'll need to increase the disk size available to Weaviate and then reset the read-only status. + +
    + +#### Q2: How do I deploy Weaviate using AWS Marketplace? + +
    + + Answer + +This [doc](../installation-guides/aws-installation.md) will walk you through all the necessary steps to deploy Weaviate using AWS marketplace. + +
    + +#### Q3: How do I deploy Weaviate using GCP Marketplace? + +
    + + Answer + +This [doc](../installation-guides/gcp-installation.md) will walk you through all the necessary steps to deploy Weaviate using GCP marketplace. + +
    + +#### Q4: Is there a recommended limit for collections? + +
    + + Answer + +If you plan to create more than **20** collections, you may want to consider multi-tenancy instead for better scaling and performance. + +**Additional information:** [Scaling limits with collections](docs/weaviate/starter-guides/managing-collections/collections-scaling-limits.mdx) + +
    + +#### Q5: What are some common issues that occur during deployment? + +
    + + Answer + +Common issues that occur during deployment include: + +- The cluster becoming `read-only` +- Query results being inconsistent +- Nodes unable to maintain consensus. +- Creating too many collections + +
    + +#### Q6: What's the difference between Weaviate and other databases? + +
    + + Answer + +Weaviate has complex processes which means that ingestion and deletion require more steps than other types of databases. +
    + +#### Q7: Do my resources free up immediately after deleting objects? + +
    + + Answer + +No, it does not happen instantaneously. When you delete objects a tombstone is created. The data removal and index cleanup occur as background processes. + +
    + +#### Q8: What's the difference between client timeouts and module timeouts? + +
    + + Answer + +- **Client timeout:** These are timeouts between the client and Weaviate server. + +- **Module timeout:** These are timeouts that occurs when Weaviate interacts with external modules like LLMs and vectorizers. + +
    + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + \ No newline at end of file diff --git a/docs/deploy/faqs/troubleshooting.md b/docs/deploy/faqs/troubleshooting.md index e69de29b..a931c424 100644 --- a/docs/deploy/faqs/troubleshooting.md +++ b/docs/deploy/faqs/troubleshooting.md @@ -0,0 +1,56 @@ +--- + +title: Deployment Troubleshooting Guide + +--- + +So you've deployed Weaviate and you're fully immersed in the world of vectors when suddenly you encounter a puzzling mystery. This page will serve as your handbook for when things go awry in "Vector Land!" Consider every error message a clue to solving the mystery you're encountering. + + +## Common Issues and Solutions + +
    + + The cluster is not accepting new information and there are disk space or `read-only` error messages in the logs. + +#### Identifying the issue + +As a first step, you'll want to examine your cluster's logs to identify the problem. If after checking the logs of your cluster you see error messages that include phrases like "read-only" or "disk space," then your cluster is more than likely in a `read-only` state due to insufficient disk space. + +#### Resolving the issue + +To solve this mystery, you'll need to increase the available disk space for your nodes. Once the disk space is increased, then you'll need to manually mark the affected shards or collections as writeable again. + +
    + +
    + + You're receiving inconsistent query results. + +#### Identifying the issue + +To confirm and identify the issue, you'll want to first run the same query multiple times to confirm that the results are inconsistent. If the inconsistent results are persisting, then you probably have asynchronous replication disabled for your deployment. + +#### Resolving the issue + +Check your settings to check if you have asynchronous replication enabled. If `async_replication_disabled` is set to "true" then you'll need to set that variable to "false." Once it is enabled, the logs will show messages that indicate successful peers checks and synchronization for the nodes. +
    + +
    + + Your nodes won't communicate, join a cluster, or maintain consensus. + +#### Identifying the issue + +To confirm and identify the issue, you'll want to first run the same query multiple times to confirm that the results are inconsistent. If the inconsistent results are persisting, then you probably have asynchronous replication disabled for your deployment. + +#### Resolving the issue + +Check your settings to check if you have asynchronous replication enabled. If `async_replication_disabled` is set to "true" then you'll need to set that variable to "false." Once it is enabled, the logs will show messages that indicate successful peers checks and synchronization for the nodes. +
    + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + \ No newline at end of file diff --git a/docs/deploy/installation-guides/aws-installation.md b/docs/deploy/installation-guides/aws-installation.md index cfd7a13e..6427e623 100644 --- a/docs/deploy/installation-guides/aws-installation.md +++ b/docs/deploy/installation-guides/aws-installation.md @@ -9,155 +9,38 @@ import ReactPlayer from 'react-player/lazy' -You can use [AWS Marketplace](https://aws.amazon.com/marketplace) to directly launch a Weaviate cluster. - -We use an [AWS CloudFormation template](https://aws.amazon.com/cloudformation/) for delivery. +It is easy to deploy a Weaviate cluster through the AWS Marketplace. :::info Prerequisites - An AWS account with sufficient credit / payment method. - (Recommended) Familiarity with AWS and the AWS console. ::: -
    - - What resources are used & installed? - +You can use [AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-ng2dfhb4yjoic?sr=0-3&ref_=beagle&applicationId=AWSMPContessa) to directly launch a Weaviate cluster. -This will set up the following resources: -- EKS Cluster with a Single Node Group - - In the default VPC or a fresh VPC with CIDR 10.0.0.0/16 -- Load Balancer Controller for EKS -- aws-ebs-csi-driver for EKS -- The latest selected version of Weaviate (e.g. `1.20.3` if you select `1.20`) - - This will be installed using our official Helm chart -
    ## Installation instructions -### Video - -If you prefer a video, you can watch the following walkthrough. This video is recorded in September 2023, some details may have changed since then. - - -
    - ### AWS Marketplace -1. Go to Weaviate's [AWS Marketplace listing](https://aws.amazon.com/marketplace/pp/prodview-cicacyv63r43i) -1. Subscribe to the product in AWS Marketplace by following the instructions on the page. At the time of writing (August 2023), the steps are to: - 1. Click Continue to Subscribe, then go to the next page - 1. Click Continue to Configuration, then go to the next page - 1. Select the fulfillment option & software version from the list. Then click Continue to Launch. -1. Launch the software using a CloudFormation template (select the one for your preferred availability zone in the table below): - -| Region | CloudFormation template link (per Availability Zone) | -| --- | --- | -| AP | [ap-northeast-1](https://ap-northeast-1.console.aws.amazon.com/cloudformation/home?region=ap-northeast-1#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json); [ap-northeast-2](https://ap-northeast-2.console.aws.amazon.com/cloudformation/home?region=ap-northeast-2#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json); [ap-northeast-3](https://ap-northeast-3.console.aws.amazon.com/cloudformation/home?region=ap-northeast-3#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json); [ap-south-1](https://ap-south-1.console.aws.amazon.com/cloudformation/home?region=ap-south-1#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json); [ap-southeast-1](https://ap-southeast-1.console.aws.amazon.com/cloudformation/home?region=ap-southeast-1#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json); [ap-southeast-2](https://ap-southeast-2.console.aws.amazon.com/cloudformation/home?region=ap-southeast-2#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json) | -| CA | [ca-central-1](https://ca-central-1.console.aws.amazon.com/cloudformation/home?region=ca-central-1#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json) | -| EU | [eu-central-1](https://eu-central-1.console.aws.amazon.com/cloudformation/home?region=eu-central-1#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json); [eu-north-1](https://eu-north-1.console.aws.amazon.com/cloudformation/home?region=eu-north-1#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json); [eu-west-1](https://eu-west-1.console.aws.amazon.com/cloudformation/home?region=eu-west-1#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json); [eu-west-2](https://eu-west-2.console.aws.amazon.com/cloudformation/home?region=eu-west-2#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json); [eu-west-3](https://eu-west-3.console.aws.amazon.com/cloudformation/home?region=eu-west-3#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json) | -| SA | [sa-east-1](https://sa-east-1.console.aws.amazon.com/cloudformation/home?region=sa-east-1#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json) | -| US | [us-east-1](https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json); [us-east-2](https://us-east-2.console.aws.amazon.com/cloudformation/home?region=us-east-2#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json); [us-west-1](https://us-west-1.console.aws.amazon.com/cloudformation/home?region=us-west-1#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json); [us-west-2](https://us-west-2.console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/quickcreate?templateURL=https://weaviate-aws-marketplace.s3.amazonaws.com/cdk-assets/latest/WeaviateEKS.template.json) | - -### Configuration & Cluster creation - -:::info Before you get started -#### Some settings may not be changed after launch - -Not all settings may be changed after launch. For example, these settings are currently not changeable after launch: -- helmstoragesize -- albDriver -- ebsDriver -- vpcUseDefault - -#### Some settings may lead to recreation of the cluster - -- Changes to the instance type will lead to recreation of the node pool. - -#### Suggested configurations - -- The default values should be suitable for a majority of cases. -- `helmstoragesize`: For production environments, at least 500GB per StatefulSet pod is recommended. (Smaller disks may be sufficient for dev environments.) -- `helmauthenticationtype`: We recommend not running Weaviate with anonymous access. We suggest setting it to `apikey` and setting a key, for example by executing `pwgen -A -s 32` to generate a random string. -::: - -Once you open the CloudFormation template, you should see a set of options similar to below. - -Here, you can: - -1. Set the `stack name` for identifying the stack in AWS (required). -1. Set Weaviate/AWS parameters, such as: - - number of nodes - - instance types - - Weaviate authentication parameters. -1. Confirm required resources & proceed to Create stack. - - This template may require additional resources and capabilities. - -After clicking Create stack, the creation process may take a while, such as around 30 minutes. - -You can check the status of individual resources in the `Events` tab. Once the stack has been created, the status for the stack will change to `✅ CREATE_COMPLETE`. - -## Accessing the cluster - -Once the stack has been created, you can access the cluster using [`kubectl`](https://kubernetes.io/docs/tasks/tools/), and Weaviate itself using the load balancer. - -### Interaction using `kubectl` +1. Go to Weaviate's [AWS Marketplace listing](https://aws.amazon.com/marketplace/pp/prodview-ng2dfhb4yjoic?sr=0-3&ref_=beagle&applicationId=AWSMPContessa) to directly launch a Weaviate cluster. +1. Subscribe to the product in AWS Marketplace by following the instructions on the page. + 1. Click View Purchase Options, then go to the next page. + 2. Review the pricing, terms and conditions, and click Subscribe. +From there you will be prompted to set up your account on [Weaviate Cloud](docs/cloud/index.mdx). -You can run the following command which will update or create a kubeconfig file for the Weaviate cluster: -``` -aws eks update-kubeconfig --name [cluster-name] --region [aws-region]--role-arn arn:aws:iam::[AccountID]:role/[StackName]-MastersRole[XX] -``` - -:::tip How to find the kubectl command -The exact command can be found in the CloudFormation stack, in the `Outputs` tab, under the `EKSClusterConfigCommand` output. -::: - -Once that's set up, you can run `kubectl` commands as usual. For example - -- `kubectl get pods -n weaviate` to list all pods in the `weaviate` namespace. -- `kubectl get svc --all-namespaces` to list all services in all namespaces. - -### Finding the Weaviate URL - -Once the stack has been created, you can access Weaviate via the load balancer URL. - -You can find the Weaviate endpoint URL by any of: -- Going to the `Services` section of AWS, under `EC2` > `Load Balancers`. Find the load balancer, and look for the `DNS name` column. -- Running `kubectl get svc -n weaviate` and looking for the `EXTERNAL-IP` of the `weaviate` service. - -The load balancer URL (e.g. `a520f010285b8475eb4b86095cabf265-854109584.eu-north-1.elb.amazonaws.com`) will be the Weaviate URL (e.g. `http://a520f010285b8475eb4b86095cabf265-854109584.eu-north-1.elb.amazonaws.com`). - -## Deleting the cluster +## Billing -You can delete the cluster by deleting the CloudFormation stack. +You will be charged for Weaviate directly by AWS. -Caution. This action deletes your data from Weaviate. If you want to keep your data, back it up or export the data before you delete the cluster. +:::warning -### Some resources many require manual deletion +If you cancel your Weaviate AWS marketplace subscription, your Weaviate organization and its clusters will be deleted by Weaviate. -:::caution -Verify that all unused resources are deleted. You continue to incur costs for undeleted resources. ::: -There may be some AWS resources that are not deleted automatically when the CloudFormation stack is deleted. For example, EBS volumes, and Key Management Service (KMS) keys may not be deleted from time to time. - -You must delete these manually. - -#### Tips - -- If your CloudFormation stack indicates "DELETE_FAILED", you may be able to re-initiate deletion of these resources. -- Review the `Resources` tab of the CloudFormation stack to find resources that may not have been deleted. -- Key Management Service (KMS) keys may be deleted by going to the KMS console, and deleting the keys manually. You may need to schedule deletion of the keys. - - -## Billing - -You will be charged for Weaviate and associated resources directly by AWS. - -This will, for example, include the EC2 instances, EBS volumes, and any other resources used by the cluster. - - ## Questions and feedback import DocsFeedback from '/_includes/docs-feedback.mdx'; diff --git a/docs/deploy/installation-guides/gcp-installation.md b/docs/deploy/installation-guides/gcp-installation.md index 477c4cda..50c80a8f 100644 --- a/docs/deploy/installation-guides/gcp-installation.md +++ b/docs/deploy/installation-guides/gcp-installation.md @@ -1,11 +1,11 @@ --- -title: Google Cloud Marketplace +title: GCP Marketplace description: Set up Weaviate using Google Cloud Marketplace for simplified deployment. image: og/docs/installation.jpg tags: ['installation', 'Google Cloud Marketplace'] --- -You can use [Google Cloud Marketplace](https://console.cloud.google.com/marketplace) to directly launch a Weaviate cluster. +A Weaviate cluster is easy to deploy with Google Cloud Marketplace (GCP). :::info Prerequisites - A Google Cloud account with sufficient credit / payment method. @@ -16,127 +16,21 @@ You can use [Google Cloud Marketplace](https://console.cloud.google.com/marketpl Broadly, the steps are as follows: -1. Go to Weaviate's Google Cloud Marketplace listing page and click Configure. +1. Go to Weaviate's [Google Cloud Marketplace listing](https://console.cloud.google.com/marketplace/product/weaviate-gcp-mktplace/weaviate) page and click Subscribe. 1. Configure and deploy Weaviate by following the on-screen instructions. - - -We go through these steps in detail below. +Once completed, you will have a [Weaviate severless cloud](docs/cloud/index.mdx) deployment. -### Configuration options - -:::info Before you get started - - - -#### Suggested configurations - -- The default values for settings such as `Global Query limit`, `Modules` and `Storage Size` should be suitable for a majority of cases. -- `Storage size`: For production environments, at least 500GB per pod is recommended. (Smaller disks may be sufficient for dev environments.) - - -::: - -Once you are at the deployment page, you should see a set of options. - -You will need to: -1. Select a GKE cluster to deploy Weaviate to. - 1. Optionally, you can create a new cluster and then specify it. -1. Set the `namespace` (for dividing cluster resources) and a unique `app instance name` for identifying the application. -1. Set the app instance name. -1. Set the service account for billing. -1. Set Weaviate parameters, such as `Replicas of Weaviate Instances`, `Global Query Limit`, `Enable Modules` and `Storage Size`. - -1. If you agree, accept the terms of service and click Deploy. - -Once you have done so, Weaviate will be deployed to the selected cluster. This should take a few minutes. - -## Accessing the cluster - -Once the application has been created, you can access the cluster through the load balancer. - -You can interact with the cluster using [`kubectl`](https://kubernetes.io/docs/tasks/tools/), or through the Weaviate API. We show examples below. - -### Interaction using `kubectl` - -You can run the following command which will update or create a kubeconfig file for the Weaviate cluster: - -``` -gcloud container clusters get-credentials [YOUR_CLUSTER_NAME] --zone [YOUR_GC_ZONE] --project [YOUR_GC_PROJECT] -``` - -:::tip How to find the kubectl command -The exact command can be found in the Kubernetes Engine page, by clicking on the vertical ellipsis ( ) for your cluster, and clicking Connect. -::: - -Once that's set up, you can run `kubectl` commands as usual. For example -- `kubectl get pods -n default` to list all pods in the `default` namespace (or whatever namespace you specified). -- `kubectl get svc --all-namespaces` to list all services in all namespaces. - -
    - Example output - -An example output of `kubectl get svc --all-namespaces` is: - -```bash -NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -application-system application-controller-manager-service ClusterIP 10.24.8.231 443/TCP 11m -default kubernetes ClusterIP 10.24.0.1 443/TCP 11m -default weaviate LoadBalancer 10.24.13.245 34.173.96.14 80:30664/TCP 8m38s -default weaviate-headless ClusterIP None 80/TCP 8m38s -gmp-system alertmanager ClusterIP None 9093/TCP 10m -gmp-system gmp-operator ClusterIP 10.24.12.8 8443/TCP,443/TCP 10m -kalm-system kalm-controller-manager-service ClusterIP 10.24.7.189 443/TCP 11m -kube-system default-http-backend NodePort 10.24.12.61 80:32508/TCP 10m -kube-system kube-dns ClusterIP 10.24.0.10 53/UDP,53/TCP 11m -kube-system metrics-server ClusterIP 10.24.13.204 443/TCP -``` - -Here, the externally accessible Weaviate IP is `34.173.96.14`. - -
    - -### Finding the Weaviate URL - -Once the application has been created, you can access Weaviate via the load balancer URL. - -You can find the Weaviate endpoint URL by any of: -- Going to the `Kubernetes Engine` section of Google Cloud, under `Service & Ingress`. Find the load balancer, and look for the `Endpoints` column. -- Running `kubectl get svc -n [YOUR_NAMESPACE_NAME]` and looking for the `EXTERNAL-IP` of the `weaviate` service. -The load balancer URL (e.g. `34.38.6.240`) will be the Weaviate URL (e.g. `http://34.38.6.240`). - -## Removing Weaviate and the cluster - -:::caution -Verify that all unused resources are deleted. You continue to incur costs for any remaining resources. -::: - -### Removing Weaviate - -To remove Weaviate and the associated services, go to the `Applications` section of `Kubernetes Engine` in Google Cloud, and delete the Weaviate deployment. - -Review the `Services & Ingress` section as well as the `Storage` section to ensure that all associated services and storage are removed. You may need to delete any remaining resources manually. - -### Removing the cluster - -If you no longer require the cluster (e.g. if you created a new cluster for Weaviate), you can delete the cluster by going to the `Applications` section of `Kubernetes Engine` in Google Cloud. Delete the cluster by selecting it from the list, clicking DELETE, and following the prompts. ## Billing You will be charged for Weaviate and associated resources directly by Google Cloud. -This will, for example, include the compute instances, volumes, and any other resources used by the cluster. +:::warning +If you cancel your Weaviate GCP marketplace subscription, your Weaviate organization and its clusters will be deleted by Weaviate. + +::: ## Questions and feedback diff --git a/docs/deploy/monitoring-obs/grafana-prometheus.md b/docs/deploy/monitoring-obs/grafana-prometheus.md index e69de29b..be198a1c 100644 --- a/docs/deploy/monitoring-obs/grafana-prometheus.md +++ b/docs/deploy/monitoring-obs/grafana-prometheus.md @@ -0,0 +1,8 @@ +--- + +title: Grafana and Prometheus in Production + +--- + +So you've got your Weaviate deployment up and running and have now found yourself wondering about how to collect metrics of your deployment? Fear not, in this document we'll show how to use Grafana agent to scrape your metrics. + diff --git a/docs/deploy/monitoring-obs/index.md b/docs/deploy/monitoring-obs/index.md index e69de29b..9e5e8fe7 100644 --- a/docs/deploy/monitoring-obs/index.md +++ b/docs/deploy/monitoring-obs/index.md @@ -0,0 +1,6 @@ +--- +title: Monitoring and Observability +sidebar_position: 0 + +--- + From 3c30e471882ff10fa1ef9c3b417bb0b5436492c8 Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Thu, 8 May 2025 20:25:53 -0400 Subject: [PATCH 26/39] updating EKS doc, adding horizontal scaling doc and migrating docs from core to deployment section --- docs/deploy/config-guides/authentication.md | 145 ------- docs/deploy/config-guides/authorization.md | 259 ++++++++++++ .../config-guides}/backups.md | 44 --- docs/deploy/config-guides/index.mdx | 34 ++ .../monitoring-obs/grafana-prometheus.md | 0 .../weaviate-sample-dashboard-async-queue.png | Bin .../weaviate-sample-dashboard-importing.png | Bin .../img/weaviate-sample-dashboard-lsm.png | Bin .../img/weaviate-sample-dashboard-objects.png | Bin .../img/weaviate-sample-dashboard-startup.png | Bin .../img/weaviate-sample-dashboard-usage.png | Bin .../img/weaviate-sample-dashboard-vector.png | Bin .../monitoring-obs/index.mdx} | 1 - .../{ => monitoring-obs}/monitoring.md | 0 .../scaling-strategies/horizontal-scaling.mdx | 369 ++++++++++++++++++ .../scaling-strategies/imgs/horiz-scaling.png | Bin 0 -> 139432 bytes .../scaling-strategies/index.mdx | 53 +++ .../scaling-strategies/multi-node.md | 4 + docs/deploy/installation-guides/aws-cli.md | 91 +++-- .../installation-guides/aws-installation.md | 2 - .../scaling-strategies/horizontal-scaling.md | 1 - docs/deploy/scaling-strategies/index.md | 1 - docs/deploy/scaling-strategies/multi-node.md | 1 - docs/weaviate/configuration/authentication.md | 273 ------------- docs/weaviate/configuration/authorization.md | 1 - secondaryNavbar.js | 5 +- sidebars.js | 32 +- 27 files changed, 781 insertions(+), 535 deletions(-) create mode 100644 docs/deploy/config-guides/authorization.md rename docs/{weaviate/configuration => deploy/config-guides}/backups.md (96%) create mode 100644 docs/deploy/config-guides/index.mdx rename docs/deploy/{ => config-guides}/monitoring-obs/grafana-prometheus.md (100%) rename docs/deploy/config-guides/{ => monitoring-obs}/img/weaviate-sample-dashboard-async-queue.png (100%) rename docs/deploy/config-guides/{ => monitoring-obs}/img/weaviate-sample-dashboard-importing.png (100%) rename docs/deploy/config-guides/{ => monitoring-obs}/img/weaviate-sample-dashboard-lsm.png (100%) rename docs/deploy/config-guides/{ => monitoring-obs}/img/weaviate-sample-dashboard-objects.png (100%) rename docs/deploy/config-guides/{ => monitoring-obs}/img/weaviate-sample-dashboard-startup.png (100%) rename docs/deploy/config-guides/{ => monitoring-obs}/img/weaviate-sample-dashboard-usage.png (100%) rename docs/deploy/config-guides/{ => monitoring-obs}/img/weaviate-sample-dashboard-vector.png (100%) rename docs/deploy/{monitoring-obs/index.md => config-guides/monitoring-obs/index.mdx} (98%) rename docs/deploy/config-guides/{ => monitoring-obs}/monitoring.md (100%) create mode 100644 docs/deploy/config-guides/scaling-strategies/horizontal-scaling.mdx create mode 100644 docs/deploy/config-guides/scaling-strategies/imgs/horiz-scaling.png create mode 100644 docs/deploy/config-guides/scaling-strategies/index.mdx create mode 100644 docs/deploy/config-guides/scaling-strategies/multi-node.md delete mode 100644 docs/deploy/scaling-strategies/horizontal-scaling.md delete mode 100644 docs/deploy/scaling-strategies/index.md delete mode 100644 docs/deploy/scaling-strategies/multi-node.md diff --git a/docs/deploy/config-guides/authentication.md b/docs/deploy/config-guides/authentication.md index bb479d5f..2e10e013 100644 --- a/docs/deploy/config-guides/authentication.md +++ b/docs/deploy/config-guides/authentication.md @@ -325,151 +325,6 @@ authentication: enabled: true ``` -## Client-side Usage - -### API key - -import APIKeyUsage from '/_includes/clients/api-token-usage.mdx'; - - - -We recommend using a client library to authenticate against Weaviate. See [How-to: Connect](../connections/index.mdx) pages for more information. - -### OIDC - -The OIDC standard allows for many different methods *(flows)* of obtaining tokens. The appropriate method can vary depending on your situation, including configurations at the token issuer, and your requirements. - -OIDC authentication flows are outside the scope of this documentation, but here are some options to consider: -1. Use the `client credentials flow` for machine-to-machine authorization. (Note that this authorizes an app, not a user.) - - Validated using Okta and Azure as identity providers; GCP does not support client credentials grant flow (as of December 2022). - - Weaviate's Python client directly supports this method. - - Client credential flows usually do not come with a refresh token and the credentials are saved in the respective clients to acquire a new access token on expiration of the old one. -1. Use the `resource owner password flow` for trusted applications like [Weaviate Cloud](/docs/cloud/manage-clusters/connect). -1. Use `hybrid flow` if Azure is your token issuer or if you would like to prevent exposing passwords. - -### Support for Weaviate clients - -If Weaviate Core is configured to use the `client credentials grant` flow or the `resource owner password flow`, a Weaviate client can instantiate a connection to Weaviate Core that incorporates the authentication flow. - -import OIDCExamples from '/_includes/code/connections/oidc-connect.mdx'; - - - -### Get and pass tokens manually - -
    - - Manually obtaining and passing tokens - - -For cases or workflows where you may wish to manually obtain a token, we outline below the steps to do so, for the resource owner password flow and hybrid flow. - -#### Resource owner password flow - -1. Send a GET request to `WEAVIATE_INSTANCE_URL/v1/.well-known/openid-configuration` to fetch Weaviate's OIDC configuration (`wv_oidc_config`). Replace WEAVIATE_INSTANCE_URL with your instance URL. -1. Parse the `clientId` and `href` from `wv_oidc_config`. -1. Send a GET request to `href` to fetch the token issuer's OIDC configuration (`token_oidc_config`). -1. If `token_oidc_config` includes the optional `grant_types_supported` key, check that `password` is in the list of values. - - If `password` is not in the list of values, the token issuer is likely not configured for `resource owner password flow`. You may need to reconfigure the token issuer or use another method. - - If the `grant_types_supported` key is not available, you may need to contact the token issuer to see if `resource owner password flow` is supported. -1. Send a POST request to the `token_endpoint` of `token_oidc_config` with the body: - - `{"grant_type": "password", "client_id": client_id, "username": USERNAME, "password": PASSWORD`. Replace `USERNAME` and `PASSWORD` with the actual values. -1. Parse the response (`token_resp`), and look for `access_token` in `token_resp`. This is your Bearer token. - -#### Hybrid flow - -1. Send a GET request to `WEAVIATE_INSTANCE_URL/v1/.well-known/openid-configuration` to fetch Weaviate's OIDC configuration (`wv_oidc_config`). Replace WEAVIATE_INSTANCE_URL with your instance URL. -2. Parse the `clientId` and `href` from `wv_oidc_config` -3. Send a GET request to `href` to fetch the token issuer's OIDC configuration (`token_oidc_config`) -4. Construct a URL (`auth_url`) with the following parameters, based on `authorization_endpoint` from `token_oidc_config`. This will look like the following: - - `{authorization_endpoint}`?client_id=`{clientId}`&response_type=code%20id_token&response_mode=fragment&redirect_url=`{redirect_url}`&scope=openid&nonce=abcd - - the `redirect_url` must have been [pre-registered](https://openid.net/specs/openid-connect-core-1_0.html#AuthRequest) with your token issuer. -5. Go to the `auth_url` in your browser, and log in if prompted. If successful, the token issuer will redirect the browser to the `redirect_url`, with additional parameters that include an `id_token` parameter. -6. Parse the `id_token` parameter value. This is your Bearer token. - -#### Code example - -This example demonstrate how to obtain an OIDC token. - -```python -import requests -import re - -url = "http://localhost:8080" # <-- Replace with your actual Weaviate URL - -# Get Weaviate's OIDC configuration -weaviate_open_id_config = requests.get(url + "/v1/.well-known/openid-configuration") -if weaviate_open_id_config.status_code == "404": - print("Your Weaviate instance is not configured with openid") - -response_json = weaviate_open_id_config.json() -client_id = response_json["clientId"] -href = response_json["href"] - -# Get the token issuer's OIDC configuration -response_auth = requests.get(href) - -if "grant_types_supported" in response_auth.json(): - # For resource owner password flow - assert "password" in response_auth.json()["grant_types_supported"] - - username = "username" # <-- Replace with the actual username - password = "password" # <-- Replace with the actual password - - # Construct the POST request to send to 'token_endpoint' - auth_body = { - "grant_type": "password", - "client_id": client_id, - "username": username, - "password": password, - } - response_post = requests.post(response_auth.json()["token_endpoint"], auth_body) - print("Your access_token is:") - print(response_post.json()["access_token"]) -else: - # For hybrid flow - authorization_url = response_auth.json()["authorization_endpoint"] - parameters = { - "client_id": client_id, - "response_type": "code%20id_token", - "response_mode": "fragment", - "redirect_url": url, - "scope": "openid", - "nonce": "abcd", - } - # Construct 'auth_url' - parameter_string = "&".join([key + "=" + item for key, item in parameters.items()]) - response_auth = requests.get(authorization_url + "?" + parameter_string) - - print("To login, open the following url with your browser:") - print(authorization_url + "?" + parameter_string) - print( - "After the login you will be redirected, the token is the 'id_token' parameter of the redirection url." - ) - - # You could use this regular expression to parse the token - resp_txt = "Redirection URL" - token = re.search("(?<=id_token=).+(?=&)", resp_txt)[0] - -print("Set as bearer token in the clients to access Weaviate.") -``` - -#### Token lifetime - -The token has a configurable expiry time that is set by the token issuer. We suggest establishing a workflow to periodically obtain a new token before expiry. - -
    - -### Add a Bearer to a Request - - - -For example, the cURL command looks like this: - -```bash -curl https://localhost:8080/v1/objects -H "Authorization: Bearer ${WEAVIATE_API_KEY}" | jq -``` - ## Further resources - [Configuration: Authorization and RBAC](./authorization.md) diff --git a/docs/deploy/config-guides/authorization.md b/docs/deploy/config-guides/authorization.md new file mode 100644 index 00000000..51711aac --- /dev/null +++ b/docs/deploy/config-guides/authorization.md @@ -0,0 +1,259 @@ +--- +title: Authorization +image: og/docs/configuration.jpg +# tags: ['authorization'] +--- + +:::info Authentication and authorization +Authentication and authorization are closely related concepts, and sometimes abbreviated as `AuthN` and `AuthZ`. Authentication (`AuthN`) is the process of verifying the identity of a user, while authorization (`AuthZ`) is the process of determining what permissions the user has. +::: + +Weaviate provides differentiated access through [authorization](./authorization.md) levels, based on the user's [authentication](./authentication.md) status. A user can be granted admin permission, read-only permission, or no permission at all. From `v1.29.0`, Weaviate also supports [Role-Based Access Control (RBAC)](/docs/weaviate/configuration/rbac) for more fine-grained control over user permissions. + +The following diagram illustrates the flow of a user request through the authentication and authorization process: + +```mermaid +flowchart TB + User(["Authenticated User"]) --> AuthScheme{"Authorization
    Scheme?"} + + subgraph rbac ["RBAC Authorization"] + direction TB + AdminRole["Admin Role"] + ViewerRole["Viewer Role"] + CustomRole["Custom Roles"] + + Perms1["Full Access
    All Operations"] + Perms2["Read-only
    Access"] + Perms3["Custom
    Permissions"] + + AdminRole --> Perms1 + ViewerRole --> Perms2 + CustomRole --> Perms3 + end + + subgraph adminlist ["Admin List Authorization"] + direction TB + AdminUser["Admin Users"] + ReadOnly["Read-only Users"] + AnonUser["Anonymous Users
    (Optional)"] + + AllPerms["Full Access
    All Operations"] + ReadPerms["Read-only
    Access"] + + AdminUser --> AllPerms + ReadOnly --> ReadPerms + AnonUser -.->|"If enabled"| AllPerms + AnonUser -.->|"If enabled"| ReadPerms + end + + subgraph undiffer ["Undifferentiated Access"] + AllAccess["Full Access
    All Operations"] + end + + AuthScheme -->|"RBAC"| rbac + AuthScheme -->|"Admin List"| adminlist + AuthScheme -->|"Undifferentiated"| undiffer + + %% Style nodes + style User fill:#f9f9f9,stroke:#666 + style AuthScheme fill:#f5f5f5,stroke:#666 + style AnonUser fill:#f9f9f9,stroke:#666,stroke-dasharray: 5 5 + + %% Style subgraphs + style rbac fill:#e6f3ff,stroke:#4a90e2 + style adminlist fill:#e6ffe6,stroke:#2ea44f + style undiffer fill:#fff0e6,stroke:#ff9933 +``` + +## Available authorization schemes + +The following authorization schemes are available in Weaviate: + +- [Role-Based Access Control (RBAC)](#role-based-access-control-rbac) +- [Admin list](#admin-list) +- [Undifferentiated access](#undifferentiated-access) + +In the Admin list authorization scheme, [anonymous users](#anonymous-users) can be granted permissions. + +The way to configure authorization differs by your deployment method, depending on whether you are running Weaviate in Docker or Kubernetes. Below, we provide examples for both. + +:::info What about Weaviate Cloud (WCD)? +For Weaviate Cloud (WCD) instances, authorization is pre-configured with Admin list access. You can [authenticate against Weaviate](../connections/connect-cloud.mdx) with your WCD credentials using OIDC, or [with admin or read-only API keys](/docs/cloud/platform/manage-api-keys). +
    + +RBAC access will be available in WCD in a future release. +::: + +## Role-Based Access Control (RBAC) + +:::info Available from `v1.29` +Role-based access control (RBAC) is generally available in Weaviate from version `v1.29`. +::: + +Role-based access control (RBAC) is a method of restricting access to resources based on the roles of users. In Weaviate, RBAC allows you to define **roles** and assign **permissions** to those roles. Users can then be assigned to roles, and inherit the permissions associated with those roles. + +Check out the dedicated **[RBAC documentation](./rbac/index.mdx)** for instructions on how to [configure RBAC](./rbac/configuration.md) in your Weaviate instance and examples on how to [manage roles an users](./rbac/manage-roles.mdx). + +## Admin list + +The "Admin list" authorization scheme allows you to specify a list of admin users with full permissions to perform all actions in Weaviate, and a list of read-only users with permissions to perform only read operations. + +These permissions cannot be customized or extended. For more fine-grained control over user permissions, use [RBAC](#role-based-access-control-rbac) instead. + +Admin list authorization scheme cannot be used in combination with RBAC. + +### Admin list: Docker + +Admin list authorization can be configured using environment variables. In Docker Compose, set them in the configuration file (`docker-compose.yml`) such as in the following example: + +```yaml +services: + weaviate: + ... + environment: + ... + # Example authentication configuration using API keys + # OIDC access can also be used with RBAC + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'false' + AUTHENTICATION_APIKEY_ENABLED: 'true' + AUTHENTICATION_APIKEY_ALLOWED_KEYS: 'user-a-key,user-b-key,user-c-key' + AUTHENTICATION_APIKEY_USERS: 'user-a,user-b,user-c' + + # Authorization configuration + # Enable admin list + AUTHORIZATION_ADMINLIST_ENABLED: 'true' + + # Provide pre-configured roles to users + # This assumes that the relevant user has been authenticated and identified + # + # You MUST define at least one admin user + AUTHORIZATION_ADMINLIST_USERS: 'user-a' + AUTHORIZATION_ADMINLIST_READONLY_USERS: 'user-b' +``` + +This configuration: +- Enables Admin list authorization +- Configures `user-a` as a user with built-in admin permissions +- Configures `user-b` as a user with built-in viewer permissions + +Note that in this configuration, `user-c` has no permissions. + +### Admin list: Kubernetes + +For Kubernetes deployments using Helm, API key authentication can be configured in the `values.yaml` file under the `authorization` section. Here's an example configuration: + +```yaml +# Example authentication configuration using API keys +authentication: + anonymous_access: + enabled: false + apikey: + enabled: true + allowed_keys: + - user-a-key + - user-b-key + - user-c-key + users: + - user-a + - user-b + - user-c + +# Authorization configuration +authorization: + admin_list: + # Enable admin list + enabled: true + + # Provide pre-configured roles to users + # This assumes that the relevant user has been authenticated and identified + # + # You MUST define at least one admin user + users: + - user-a + read_only_users: + - user-b +``` + +### Anonymous users + +Anonymous users are identified as `anonymous` in Weaviate. In the Admin list authorization scheme, you can apply permissions to anonymous users. The RBAC authorization scheme is not compatible with anonymous users. + +To confer permissions to anonymous users in the Admin list scheme, you can use the `anonymous` keyword in the configuration as shown below. + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + + + + + +```yaml +services: + weaviate: + ... + environment: + ... + # Enable anonymous access + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' + + # Configure admin user API key + AUTHORIZATION_ADMINLIST_ENABLED: 'true' + AUTHENTICATION_APIKEY_ALLOWED_KEYS: 'user-a-key' + AUTHENTICATION_APIKEY_USERS: 'user-a' + + # Enable admin list and provide admin access to "user-a" only + AUTHORIZATION_ADMINLIST_USERS: 'user-a' + # Provide read-only access to anonymous users + AUTHORIZATION_ADMINLIST_READONLY_USERS: 'anonymous' +``` + + + + + +```yaml +# Example authentication configuration using API keys +authentication: + # Enable anonymous access + anonymous_access: + enabled: true + + # Enable admin list and configure admin user API key + apikey: + enabled: true + allowed_keys: + - user-a-key + users: + - user-a + +authorization: + # Enable admin list and provide admin access to "user-a" only + admin_list: + # Enable admin list + enabled: true + users: + - user-a + # Provide read-only access to anonymous users + read_only_users: + - anonymous +``` + + + + + +## Undifferentiated access + +Weaviate can be configured to provide undifferentiated access, by disabling authentication for example and enabling anonymous access. This configuration is strongly discouraged except for development or evaluation purposes. + +## Further resources + +- [Configuration: Authentication](./authentication.md) +- [Configuration: RBAC](./rbac/index.mdx) +- [References: Environment variables / Authentication and Authorization](../config-refs/env-vars/index.md#authentication-and-authorization) + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/docs/weaviate/configuration/backups.md b/docs/deploy/config-guides/backups.md similarity index 96% rename from docs/weaviate/configuration/backups.md rename to docs/deploy/config-guides/backups.md index e59e0920..073c2e14 100644 --- a/docs/weaviate/configuration/backups.md +++ b/docs/deploy/config-guides/backups.md @@ -1,6 +1,5 @@ --- title: Backups -sidebar_position: 12 image: og/docs/configuration.jpg --- @@ -62,15 +61,6 @@ Restart Weaviate to apply the new configuration. Then, you are ready to start a /> - - - - - - - - - - - - - - - - - - diff --git a/docs/deploy/monitoring-obs/grafana-prometheus.md b/docs/deploy/config-guides/monitoring-obs/grafana-prometheus.md similarity index 100% rename from docs/deploy/monitoring-obs/grafana-prometheus.md rename to docs/deploy/config-guides/monitoring-obs/grafana-prometheus.md diff --git a/docs/deploy/config-guides/img/weaviate-sample-dashboard-async-queue.png b/docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-async-queue.png similarity index 100% rename from docs/deploy/config-guides/img/weaviate-sample-dashboard-async-queue.png rename to docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-async-queue.png diff --git a/docs/deploy/config-guides/img/weaviate-sample-dashboard-importing.png b/docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-importing.png similarity index 100% rename from docs/deploy/config-guides/img/weaviate-sample-dashboard-importing.png rename to docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-importing.png diff --git a/docs/deploy/config-guides/img/weaviate-sample-dashboard-lsm.png b/docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-lsm.png similarity index 100% rename from docs/deploy/config-guides/img/weaviate-sample-dashboard-lsm.png rename to docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-lsm.png diff --git a/docs/deploy/config-guides/img/weaviate-sample-dashboard-objects.png b/docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-objects.png similarity index 100% rename from docs/deploy/config-guides/img/weaviate-sample-dashboard-objects.png rename to docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-objects.png diff --git a/docs/deploy/config-guides/img/weaviate-sample-dashboard-startup.png b/docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-startup.png similarity index 100% rename from docs/deploy/config-guides/img/weaviate-sample-dashboard-startup.png rename to docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-startup.png diff --git a/docs/deploy/config-guides/img/weaviate-sample-dashboard-usage.png b/docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-usage.png similarity index 100% rename from docs/deploy/config-guides/img/weaviate-sample-dashboard-usage.png rename to docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-usage.png diff --git a/docs/deploy/config-guides/img/weaviate-sample-dashboard-vector.png b/docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-vector.png similarity index 100% rename from docs/deploy/config-guides/img/weaviate-sample-dashboard-vector.png rename to docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-vector.png diff --git a/docs/deploy/monitoring-obs/index.md b/docs/deploy/config-guides/monitoring-obs/index.mdx similarity index 98% rename from docs/deploy/monitoring-obs/index.md rename to docs/deploy/config-guides/monitoring-obs/index.mdx index 9e5e8fe7..3c355582 100644 --- a/docs/deploy/monitoring-obs/index.md +++ b/docs/deploy/config-guides/monitoring-obs/index.mdx @@ -1,6 +1,5 @@ --- title: Monitoring and Observability sidebar_position: 0 - --- diff --git a/docs/deploy/config-guides/monitoring.md b/docs/deploy/config-guides/monitoring-obs/monitoring.md similarity index 100% rename from docs/deploy/config-guides/monitoring.md rename to docs/deploy/config-guides/monitoring-obs/monitoring.md diff --git a/docs/deploy/config-guides/scaling-strategies/horizontal-scaling.mdx b/docs/deploy/config-guides/scaling-strategies/horizontal-scaling.mdx new file mode 100644 index 00000000..80a47b01 --- /dev/null +++ b/docs/deploy/config-guides/scaling-strategies/horizontal-scaling.mdx @@ -0,0 +1,369 @@ +--- +title: Horizontal Scaling Deployment Strategies +--- + +import FilteredTextBlock from '@site/src/components/Documentation/FilteredTextBlock'; +import TabItem from '@theme/TabItem'; +import Tabs from '@theme/Tabs'; +import PyCode from '!!raw-loader!/_includes/code/howto/manage-data.collections.py'; +import PyCodeV3 from '!!raw-loader!/_includes/code/howto/manage-data.collections-v3.py'; +import TSCode from '!!raw-loader!/_includes/code/howto/manage-data.collections.ts'; +import TSCodeLegacy from '!!raw-loader!/_includes/code/howto/manage-data.collections-v2.ts'; +import JavaCode from '!!raw-loader!/_includes/code/howto/java/src/test/java/io/weaviate/docs/manage-data.classes.java'; +import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/manage-data.classes_test.go'; + + +This document provides detailed implementation guidance for horizontally scaling your Weaviate deployment. + +## Scaling Methods + +![Sharding vs Replication](./imgs/horiz-scaling.png) + +### Replication + +Replication creates redundant copies of your data, it is useful when your data needs to be highly available. + +### Sharding + +Sharding divides data across nodes, it is useful when your dataset is too large for just a single node. + + +### Choosing your strategy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Requirement/GoalShardingReplicationBoth CombinedPrimary Consideration
    + Handle dataset too large for single node + +
    Yes
    +
    +
    No
    +
    +
    Yes
    +
    +
    +

    How much data are you storing?

    +
      +
    • + Vector dimensions and count determine memory requirements +
    • +
    • + Sharding divides this across nodes +
    • +
    +
    +
    + Improve query throughput + +
    Maybe*
    +
    +
    Yes
    +
    +
    Yes
    +
    +
    +

    Is your workload read-heavy?

    +
      +
    • + Replication allows distributing read queries across nodes +
    • +
    • + Sharding may help with certain query patterns +
    • +
    +
    +
    + Accelerate data imports + +
    Yes
    +
    +
    No
    +
    +
    Yes
    +
    +
    +

    Is import speed a priority?

    +
      +
    • + Sharding enables parallel processing of imports +
    • +
    • + Replication adds overhead during imports +
    • +
    +
    +
    + Ensure high availability + +
    No
    +
    +
    Yes
    +
    +
    Yes
    +
    +
    +

    Can you tolerate downtime?

    +
      +
    • + Replication provides redundancy if nodes fail +
    • +
    • + Without replication, shard loss = data loss +
    • +
    +
    +
    + Enable zero-downtime upgrades + +
    No
    +
    +
    Yes
    +
    +
    Yes
    +
    +
    +

    How critical is continuous operation?

    +
      +
    • + Replication allows rolling updates +
    • +
    • + Production systems typically require this capability +
    • +
    +
    +
    + Optimize resource utilization + +
    Yes
    +
    +
    Maybe*
    +
    +
    Maybe*
    +
    +
    +

    Are you resource-constrained?

    +
      +
    • + Sharding distributes load efficiently +
    • +
    • + Replication adds resource overhead +
    • +
    +
    +
    + Geographic distribution + +
    No
    +
    +
    Yes
    +
    +
    Yes
    +
    +
    +

    Do you need multi-region support?

    +
      +
    • + Replicas can be deployed across regions +
    • +
    • + Reduces latency for geographically distributed users +
    • +
    +
    +
    + +**This may serve as a partial solution and will depend on your configuration.* + +### Sharding: Divide and Conquer + +You've made the decision to shard your data, now let's get it configured: + + + + + + + + + + + + + + + + + +#### Parameters + +These parameters are used to configure your collection shards: + +| Parameter | Type | Description | +| :-------------------- | :------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `desiredCount` | integer | *Immutable, Optional*. Controls the target number of physical shards for the collection index. Defaults to the number of nodes in the cluster, but can be explicitly set lower. If set higher than the node count, some nodes will host multiple shards. | +| `virtualPerPhysical` | integer | *Immutable, Optional*. Defines how many virtual shards correspond to one physical shard, defaulting to `128`. Using virtual shards aids in reducing data movement during resharding. | +| `desiredVirtualCount` | integer | *Read-only*. Shows the target total number of virtual shards, calculated as `desiredCount * virtualPerPhysical`. | + + +### Replication: An army of clones + +Configure your data's replication to ensure it's always available: + +import RaftRFChangeWarning from '/_includes/1-25-replication-factor.mdx'; + + + +Configure replication settings, such as [async replication](/docs/weaviate/configuration/replication#async-replication-settings) and [deletion resolution strategy](../concepts/replication-architecture/consistency.md#deletion-resolution-strategies). + + + + + + + + + + + + + + + +```bash +curl \ +-X POST \ +-H "Content-Type: application/json" \ +-d '{ + "class": "Article", + "properties": [ + { + "dataType": [ + "string" + ], + "description": "Title of the article", + "name": "title" + } + ], + "replicationConfig": { + "factor": 3, + "asyncEnabled": true, + "deletionStrategy": "TimeBasedResolution" + } +}' \ +http://localhost:8080/v1/schema +``` + + + + +#### Sharding and Replication: The Dynamic Duo + +In a highly available environment, combining sharding and replication leverages the power and capabilities of both methods to be a dynamic duo that keeps your deployment highly available. + + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/docs/deploy/config-guides/scaling-strategies/imgs/horiz-scaling.png b/docs/deploy/config-guides/scaling-strategies/imgs/horiz-scaling.png new file mode 100644 index 0000000000000000000000000000000000000000..433be7441a77390c2b7d07c2889e357ed96118d2 GIT binary patch literal 139432 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%0DVUGmL#rn050 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 literal 0 HcmV?d00001 diff --git a/docs/deploy/config-guides/scaling-strategies/index.mdx b/docs/deploy/config-guides/scaling-strategies/index.mdx new file mode 100644 index 00000000..22d01448 --- /dev/null +++ b/docs/deploy/config-guides/scaling-strategies/index.mdx @@ -0,0 +1,53 @@ +--- + +title: Scaling Overview +sidebar_position: 1 + +--- + +Interested in taking a journey to Weaviate's wonderful world of horizontal scaling and learn about the various scaling strategies available for your deployments? As your database grows from an experimental playground to a mission-critical infrastructure, you'll need strategies to scale effectively. So don't worry, we've got you covered! + +### Why Scaling Matters + +Vector databases face unique scaling challenges and as your data grows: + +- Memory requirements increase dramatically with vector dimensions and dataset size +- Query performance becomes critical as user traffic grows +- System reliability becomes non-negotiable for production deployments +- Cost optimization becomes increasingly important + + +### High Availability: Downtime is not an option + +A highly available architecture ensures that your deployment is operational even when individual components fails, this architecture is essential for: + +- Mission-critical applications where search functionality cannot go offline +- Zero-downtime maintenance for seamless upgrades and updates +- Resilience against hardware failures or cloud provider issues +- Consistent performance even during peak traffic periods + +### Horizontal Scaling: Growing out, not up + +Your deployment will grow beyond the limits of a single machine by distributing your workload across multiple nodes by using horizontal scaling. Implementing this will allow your deployment to: + +- Handle larger datasets that exceed single-machine memory +- Improve query throughput by distributing read operations +- Accelerate imports through parallel processing +- Optimize resource usage across your infrastructure + + +### Next Steps + +- [High Availability Strategies] +- [Horizontal Scaling] + +#### Further resources + +- [Concepts: Horizontal Scaling](/docs/weaviate/concepts/cluster.md) + + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + \ No newline at end of file diff --git a/docs/deploy/config-guides/scaling-strategies/multi-node.md b/docs/deploy/config-guides/scaling-strategies/multi-node.md new file mode 100644 index 00000000..456eaca2 --- /dev/null +++ b/docs/deploy/config-guides/scaling-strategies/multi-node.md @@ -0,0 +1,4 @@ +--- +title: Deploying Highly Available Applications +--- + diff --git a/docs/deploy/installation-guides/aws-cli.md b/docs/deploy/installation-guides/aws-cli.md index 314ce6df..0a66fe1c 100644 --- a/docs/deploy/installation-guides/aws-cli.md +++ b/docs/deploy/installation-guides/aws-cli.md @@ -26,11 +26,58 @@ eksctl version ### Step 1: Create the Cluster +To create your cluster, prepare a `yaml` file that with a name of your choosing (e.g. `eks-cluster.yaml`) + ```bash -eksctl create cluster --name --region --nodegroup-name --nodes 3 --nodes-min 2 --nodes-max 4 --node-type t3.medium +apiVersion: eksctl.io/v1alpha5 +kind: ClusterConfig +metadata: + name: 'your-cluster-name' # Replace with your desired cluster name + region: 'your-region' # Replace with your desired AWS region + version: "1.33" # Kubernetes version + +iam: + withOIDC: true # Enable IAM OIDC provider + + serviceAccounts: + - metadata: + name: aws-load-balancer-controller + namespace: kube-system + wellKnownPolicies: + awsLoadBalancerController: true + +managedNodeGroups: + - name: node-group-name + labels: { role: worker } + instanceType: t3.large # Choose an appropriate instance type + desiredCapacity: 3 # Number of nodes + minSize: 2 # Minimum number of nodes for autoscaling + maxSize: 5 # Maximum number of nodes for autoscaling + privateNetworking: true # Use private networking + volumeSize: 80 # Root volume size in GB + volumeType: gp3 # Root volume type + +addons: + - name: vpc-cni + version: latest + attachPolicyARNs: + - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy + - name: coredns + version: latest + - name: kube-proxy + version: latest + - name: aws-ebs-csi-driver + version: latest + wellKnownPolicies: + ebsCSIController: true # Enable EBS CSI driver ``` -This creates an EKS cluster within your specified region with an autoscaling node group. There are 3 nodes for high availability and having autoscaling enabled allows for the cluster to dynamically adjust resources based on demand. +This creates an EKS cluster within your specified region with an autoscaling node group. There are 3 nodes for high availability and having autoscaling enabled allows for the cluster to dynamically adjust resources based on demand. + +Run this command to create your EKS cluster: +``` +eksctl create cluster -f your-file-name.yaml +``` #### Enable `kubectl` to interact with the newly created cluster: @@ -38,26 +85,15 @@ This creates an EKS cluster within your specified region with an autoscaling nod aws eks --region update-kubeconfig --name ``` -#### Verify that the node has been created and that you are able to interact with the cluster: +#### Verify that the cluster has been created and that you are able to interact with it: ```bash kubectl get nodes ``` -### Step 2: Enable Persistent Storage on the Cluster - -Peristent storage is required for running Weaviate on a Kubernetes cluster, it ensures that data is retained should a pod restart, a node crashes, or a cluster scales up or down. +#### Step 2: Add Storage Class -#### Add the EBS CSI Driver Add-On -```bash -eksctl create addon --name aws-ebs-csi-driver --cluster --region --service-account-role-arn :role/AmazonEKS_EBS_CSI_DriverRole> -``` - -The above adds the EBS CSI Driver add-on for your cluster. After adding the add-on, a storage class and `PersistentValueClaim` is needed to enable persistent storage. - -#### Add Storage Class - -After adding the EBS CSI Driver add-on, you'll need to create a `storageclass.yaml` file: +After creating your cluster and verifying that you can interact with it , you'll need to create a `storageclass.yaml` file: ``` apiVersion: storage.k8s.io/v1 kind: StorageClass @@ -74,35 +110,16 @@ allowVolumeExpansion: true After creating the storage class, apply it: ```kubectl apply -f .yaml``` -#### Create a `PersistentValueClaim` - -After creating and applying the Storage class, you'll need to also create a `PersistentValueClaim` file: - -```apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: -spec: - accessModes: - - ReadWriteOnce - storageClassName: - resources: - requests: - storage: 10Gi -``` -After creating the persistent value claim, you also need to apply it: -```kubectl apply -f .yaml``` -#### Verify your storage class and PersistentValueClaim have both been applied +#### Verify your storage class and has been created and applied ``` kubectl get sc -kubectl get pvc ``` ### Step 3: Add Weaviate to EKS -After creating +After adding persistent storage to your cluster, you can now deploy Weaviate into it. #### Create a Weaviate namespace: diff --git a/docs/deploy/installation-guides/aws-installation.md b/docs/deploy/installation-guides/aws-installation.md index 6427e623..8854e1e0 100644 --- a/docs/deploy/installation-guides/aws-installation.md +++ b/docs/deploy/installation-guides/aws-installation.md @@ -18,8 +18,6 @@ It is easy to deploy a Weaviate cluster through the AWS Marketplace. You can use [AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-ng2dfhb4yjoic?sr=0-3&ref_=beagle&applicationId=AWSMPContessa) to directly launch a Weaviate cluster. - - ## Installation instructions ### AWS Marketplace diff --git a/docs/deploy/scaling-strategies/horizontal-scaling.md b/docs/deploy/scaling-strategies/horizontal-scaling.md deleted file mode 100644 index 7bffcb57..00000000 --- a/docs/deploy/scaling-strategies/horizontal-scaling.md +++ /dev/null @@ -1 +0,0 @@ -# Horizontal Scaling Placeholder \ No newline at end of file diff --git a/docs/deploy/scaling-strategies/index.md b/docs/deploy/scaling-strategies/index.md deleted file mode 100644 index 7cc631f4..00000000 --- a/docs/deploy/scaling-strategies/index.md +++ /dev/null @@ -1 +0,0 @@ -# Placeholder Scaling Strategy Landing Page \ No newline at end of file diff --git a/docs/deploy/scaling-strategies/multi-node.md b/docs/deploy/scaling-strategies/multi-node.md deleted file mode 100644 index 064cb77b..00000000 --- a/docs/deploy/scaling-strategies/multi-node.md +++ /dev/null @@ -1 +0,0 @@ -# Multi-Node Placeholder \ No newline at end of file diff --git a/docs/weaviate/configuration/authentication.md b/docs/weaviate/configuration/authentication.md index ecedbba3..0777f586 100644 --- a/docs/weaviate/configuration/authentication.md +++ b/docs/weaviate/configuration/authentication.md @@ -70,279 +70,6 @@ The way to configure authentication differs by your deployment method, depending For Weaviate Cloud (WCD) instances, authentication is pre-configured with OIDC and API key access. You can [authenticate against Weaviate](../connections/connect-cloud.mdx) with your WCD credentials using OIDC, or [with API keys](/docs/cloud/platform/manage-api-keys). ::: -## API Key Authentication - -API key authentication is a simple and effective way to authenticate users. Each user is assigned a unique API key, which is used to authenticate the user. - -### API keys: Database users - -When [creating database users programatically](./rbac/manage-users.mdx#create-a-user), each user is assigned a distinct API key at creation time. These API keys can also be [regenerated (rotated)](./rbac/manage-users.mdx#rotate-user-api-key). - -### API keys: Docker - -API key authentication can be configured using environment variables. In Docker Compose, set them in the configuration file (`docker-compose.yml`) such as in the following example: - -```yaml -services: - weaviate: - ... - environment: - ... - # Disable anonymous access. - AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'false' - - # Enables API key authentication. - AUTHENTICATION_APIKEY_ENABLED: 'true' - - # List one or more keys in plaintext separated by commas. Each key corresponds to a specific user identity below. - AUTHENTICATION_APIKEY_ALLOWED_KEYS: 'user-a-key,user-b-key' - - # List one or more user identities, separated by commas. Each identity corresponds to a specific key above. - AUTHENTICATION_APIKEY_USERS: 'user-a,user-b' -``` - -This configuration: -- Disables anonymous access -- Enables API key authentication -- Defines plaintext API keys in `AUTHENTICATION_APIKEY_ALLOWED_KEYS` -- Associates users with the API keys in `AUTHENTICATION_APIKEY_USERS` - -These users can now be assigned permissions based on the authorization settings. - -import DynamicUserManagement from '/_includes/configuration/dynamic-user-management.mdx'; - - - -:::note - -Note that you can either: -- Set one user for all API keys, or -- Define one user per API key (the number of users must match the number of API keys) - -Make sure all listed users are also configured in the authorization settings. - -::: - -### API keys: Kubernetes - -For Kubernetes deployments using Helm, API key authentication can be configured in the `values.yaml` file under the `authentication` section. Here's an example configuration: - -```yaml -authentication: - anonymous_access: - # Disable anonymous access. - enabled: false - - apikey: - # Enables API key authentication. - enabled: true - - # List one or more keys in plaintext separated by commas. Each key corresponds to a specific user identity below. - allowed_keys: - - user-a-key - - user-b-key - - # List one or more user identities, separated by commas. Each identity corresponds to a specific key above. - users: - - user-a - - user-b -``` - -This configuration: -- Disables anonymous access -- Enables API key authentication -- Defines plaintext API keys in `allowed_keys` -- Associates users with the API keys in `users` - -:::warning Environment Variables Take Precedence -If you configure API keys using environment variables, those settings will take precedence over the values in `values.yaml`. To use the Helm values configuration, ensure you have not set the corresponding environment variables. -::: - -For enhanced security in production environments, you can store API keys in Kubernetes secrets and reference them using environment variables instead of storing them as plaintext in the Helm values. - -## OIDC Authentication - -OIDC authentication requires the resource (Weaviate) to validate tokens issued by an identity provider. The identity provider authenticates the user and issues tokens, which are then validated by Weaviate. - -In an example setup, a Weaviate instance acts as the resource, Weaviate Cloud (WCD) acts as the identity provider, and the Weaviate client acts on behalf of the user. - -Any "OpenID Connect" compatible token issuer that implements OpenID Connect Discovery is compatible with Weaviate. - -This document discusses how to configure Weaviate as the resource. - -
    - - More about OIDC - - -With [OpenID Connect](https://openid.net/connect/) (based on OAuth2), an -external identity provider and token issuer ('token issuer' hereafter) is responsible for managing users. - -OIDC authentication requires obtaining a valid token from the token issuer so that it can be sent in the header of any request to Weaviate. This applies to both REST and GraphQL requests. - -When Weaviate receives a token (JSON Web Token or JWT), it verifies -that it was indeed signed by the configured token issuer. If the signature is -correct, all contents of the token are trusted, which authenticates the user based on the information in the token. - -
    - -:::tip TIP: OIDC and RBAC - -The [user mmanagement API](./rbac/manage-users.mdx#oidc-user-permissions-management) allows you to assign cuton roles and permissions to OIDC users via [Role-Based Access Control (RBAC)](./rbac/index.mdx). - -::: - -### OIDC: Docker - -To configure Weaviate for OIDC-based authentication, add the following environment variables to your configuration file. - -An example `docker-compose.yml` file looks like this: - -```yaml -services: - weaviate: - ... - environment: - ... - # enabled (optional - defaults to false) turns OIDC auth on. All other fields in - # this section will only be validated if enabled is set to true. - AUTHENTICATION_OIDC_ENABLED: 'true' - - # issuer (required) tells weaviate how to discover the token issuer. This - # endpoint must implement the OpenID Connect Discovery spec, so that weaviate - # can retrieve the issuer's public key. - # - # The example URL below uses the path structure commonly found with keycloak - # where an example realm 'my-weaviate-usecase' was created. The exact - # path structure depends on the token issuer. See the token issuer's documentation - # about which endpoint implements OIDC Discovery. - AUTHENTICATION_OIDC_ISSUER: 'http://my-token-issuer/auth/realms/my-weaviate-usecase' - - # client_id (required unless skip_client_id_check is set to true) tells - # Weaviate to check for a particular OAuth 2.0 client_id in the audience claim. - # This is to prevent that a token which was signed by the correct issuer - # but never intended to be used with Weaviate can be used for authentication. - # - # For more information on what clients are in OAuth 2.0, see - # https://tools.ietf.org/html/rfc6749#section-1.1 - AUTHENTICATION_OIDC_CLIENT_ID: 'my-weaviate-client' - - # username_claim (required) tells Weaviate which claim in the token to use for extracting - # the username. The username will be passed to the authorization plugin. - AUTHENTICATION_OIDC_USERNAME_CLAIM: 'email' - - # skip_client_id_check (optional, defaults to false) skips the client_id - # validation in the audience claim as outlined in the section above. - # Not recommended to set this option as it reduces security, only set this - # if your token issuer is unable to provide a correct audience claim - AUTHENTICATION_OIDC_SKIP_CLIENT_ID_CHECK: 'false' - - # scope (optional) these will be used by clients as default scopes for authentication - AUTHENTICATION_OIDC_SCOPES: '' -``` - -:::info OIDC and Azure -As of November 2022, we were aware of some differences in Microsoft Azure's OIDC implementation compared to others. If you are using Azure and experiencing difficulties, [this external blog post](https://xsreality.medium.com/making-azure-ad-oidc-compliant-5734b70c43ff) may be useful. -::: - -### OIDC: Kubernetes - -For Kubernetes deployments using Helm, OIDC authentication can be configured in the `values.yaml` file under the `authentication` section. Here's an example configuration: - -```yaml -authentication: - anonymous_access: - # Disable anonymous access. - enabled: false - oidc: - # enabled (optional - defaults to false) turns OIDC auth on. All other fields in - # this section will only be validated if enabled is set to true. - enabled: true - - # issuer (required) tells weaviate how to discover the token issuer. This - # endpoint must implement the OpenID Connect Discovery spec, so that weaviate - # can retrieve the issuer's public key. - # - # The example URL below uses the path structure commonly found with keycloak - # where an example realm 'my-weaviate-usecase' was created. The exact - # path structure depends on the token issuer. See the token issuer's documentation - # about which endpoint implements OIDC Discovery. - issuer: 'http://my-token-issuer/auth/realms/my-weaviate-usecase' - - # client_id (required unless skip_client_id_check is set to true) tells - # Weaviate to check for a particular OAuth 2.0 client_id in the audience claim. - # This is to prevent that a token which was signed by the correct issuer - # but never intended to be used with Weaviate can be used for authentication. - # - # For more information on what clients are in OAuth 2.0, see - # https://tools.ietf.org/html/rfc6749#section-1.1 - client_id: 'my-weaviate-client' - - # username_claim (required) tells Weaviate which claim in the token to use for extracting - # the username. The username will be passed to the authorization plugin. - username_claim: 'email' - - # skip_client_id_check (optional, defaults to false) skips the client_id - # validation in the audience claim as outlined in the section above. - # Not recommended to set this option as it reduces security, only set this - # if your token issuer is unable to provide a correct audience claim - skip_client_id_check: 'false' - - # scope (optional) these will be used by clients as default scopes for authentication - scopes: '' - - # groups_claim: '' -``` - -### Note: Configuring the OIDC token issuer - -Configuring the OIDC token issuer is outside the scope of this document, but here are a few options as a starting point: - -- For simple use-cases such as for a single user, you can use Weaviate Cloud (WCD) as the OIDC token issuer. To do so: - - Make sure you have a WCD account (you can [sign up here](https://console.weaviate.cloud/)). - - In the Docker Compose file (e.g. `docker-compose.yml`), specify: - - `https://auth.wcs.api.weaviate.io/auth/realms/SeMI` as the issuer (in `AUTHENTICATION_OIDC_ISSUER`), - - `wcs` as the client id (in `AUTHENTICATION_OIDC_CLIENT_ID`), and - - enable the adminlist (`AUTHORIZATION_ADMINLIST_ENABLED: 'true'`) and add your WCD account email as the user (in `AUTHORIZATION_ADMINLIST_USERS`) . - - `email` as the username claim (in `AUTHENTICATION_OIDC_USERNAME_CLAIM`). - -- If you need a more customizable setup you can use commercial OIDC providers like [Okta](https://www.okta.com/). -- As another alternative, you can run your own OIDC token issuer server, which may be the most complex but also configurable solution. Popular open-source solutions include Java-based [Keycloak](https://www.keycloak.org/) and Golang-based [dex](https://github.com/dexidp/dex). - -:::info -By default, Weaviate validates that the token includes a specified client id in the audience claim. If your token issuer does not support this feature, you can turn it off as outlined in the configuration section below. -::: - -## Anonymous Access - -Weaviate can be configured to accept anonymous requests. This is strongly discouraged except for development or evaluation purposes. - -Users that send requests without explicit authentication are authenticated as `user: anonymous`. - -You can use the authorization plugin to specify which permissions to apply to this `anonymous` user. If anonymous access is disabled altogether, any request without an allowed authentication scheme returns `401 Unauthorized`. - -### Anonymous access: Docker - -To enable anonymous access in Docker Compose, add the following environment variable to your configuration file: - -```yaml -services: - weaviate: - ... - environment: - ... - AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' -``` - -### Anonymous access: Kubernetes - -To enable anonymous access in Kubernetes, add the following configuration to your `values.yaml` file: - -```yaml -authentication: - anonymous_access: - enabled: true -``` ## Client-side Usage diff --git a/docs/weaviate/configuration/authorization.md b/docs/weaviate/configuration/authorization.md index fdab62fe..51711aac 100644 --- a/docs/weaviate/configuration/authorization.md +++ b/docs/weaviate/configuration/authorization.md @@ -1,6 +1,5 @@ --- title: Authorization -sidebar_position: 35 image: og/docs/configuration.jpg # tags: ['authorization'] --- diff --git a/secondaryNavbar.js b/secondaryNavbar.js index ba821d66..c88768c6 100644 --- a/secondaryNavbar.js +++ b/secondaryNavbar.js @@ -64,11 +64,12 @@ const secondaryNavbarItems = { link: "/docs/deploy", links: [ { label: "Get Started", link: "/docs/deploy", sidebar: "deploySidebar" }, + { label: "Configuration Guides", link: "/docs/deploy/config-guides", sidebar: "deployConfigSidebar"}, /*{ label: "Kubernetes", link: "/docs/deploy/k8s", sidebar: "deployK8sSidebar" },*/ { label: "Production Environments", link: "/docs/deploy/production", sidebar: "deployProductionSidebar"}, /*{ label: "AWS", link: "/docs/deploy/aws", sidebar: "deployAwsSidebar" },*/ - { label: "Scaling Strategies", link: "/docs/deploy/scaling-strategies", sidebar: "deployScalingSidebar"}, - { label: "Monitoring and Observability", link: "/docs/deploy/monitoring-obs", sidebar: "deployObservabilitySidebar"}, + /*{ label: "Scaling Strategies", link: "/docs/deploy/scaling-strategies", sidebar: "deployScalingSidebar"},*/ + /*{ label: "Monitoring and Observability", link: "/docs/deploy/monitoring-obs", sidebar: "deployObservabilitySidebar"},*/ { label: "FAQs", link: "/docs/deploy/faqs", sidebar: "deployFaqsSidebar"}, ] }, diff --git a/sidebars.js b/sidebars.js index fbff1200..6e01ddb0 100644 --- a/sidebars.js +++ b/sidebars.js @@ -159,9 +159,8 @@ const sidebars = { }, "weaviate/configuration/tenant-offloading", "weaviate/configuration/modules", - "weaviate/configuration/backups", - "weaviate/configuration/authentication", "weaviate/configuration/authorization", + "weaviate/configuration/authentication", { type: "category", label: "RBAC", @@ -445,18 +444,11 @@ const sidebars = { "deploy/installation-guides/helm-installation", ], }, + ], + deployConfigSidebar: [ { - type: "category", - label: "Configuration Guides", - collapsible: true, - collapsed: true, - items: [ - "deploy/config-guides/authentication", - "deploy/config-guides/modules", - "deploy/config-guides/monitoring", - "deploy/config-guides/persistence", - "deploy/config-guides/async-rep", - ], + type: "autogenerated", + dirName: "deploy/config-guides", }, ], /*deployAwsSidebar: [ @@ -478,20 +470,6 @@ const sidebars = { }, ], - deployScalingSidebar: [ - { - type: "autogenerated", - dirName: "deploy/scaling-strategies", - - }, - ], - deployObservabilitySidebar: [ - { - type: "autogenerated", - dirName: "deploy/monitoring-obs", - - }, - ], deployFaqsSidebar: [ { type: "autogenerated", From 72852f7fc1ca2712d0bdc4bfae84a728f20065be Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Thu, 8 May 2025 20:39:53 -0400 Subject: [PATCH 27/39] fixing broken link --- docs/weaviate/configuration/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/weaviate/configuration/index.md b/docs/weaviate/configuration/index.md index fc88fd43..942faa08 100644 --- a/docs/weaviate/configuration/index.md +++ b/docs/weaviate/configuration/index.md @@ -15,7 +15,7 @@ This section shows you how to configure Weaviate. - [distance metrics](../config-refs/distances.md) - Manage performance and cost with [vector index properties](/docs/weaviate/config-refs/schema/vector-index) -- [Back up](./backups.md) your Weaviate instance +- [Back up](docs/deploy/config-guides/backups.md) your Weaviate instance - Control access - [authentication](./authentication.md) - [authorization](./authorization.md) From bb6c04604727ba1b2977a463b83d925d85b1ec69 Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Thu, 8 May 2025 21:08:13 -0400 Subject: [PATCH 28/39] fixing broken links --- docs/weaviate/config-refs/env-vars/index.md | 2 +- docs/weaviate/configuration/persistence.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/weaviate/config-refs/env-vars/index.md b/docs/weaviate/config-refs/env-vars/index.md index 0ff1627b..9ef56610 100644 --- a/docs/weaviate/config-refs/env-vars/index.md +++ b/docs/weaviate/config-refs/env-vars/index.md @@ -90,7 +90,7 @@ import APITable from '@site/src/components/APITable'; | Variable | Description | Type | Example Value | | --- | --- | --- | --- | -| `BACKUP_*` | Various configuration variables for backup provider modules. They are outlined in detail on the [Backups page](/docs/weaviate/configuration/backups.md). | | +| `BACKUP_*` | Various configuration variables for backup provider modules. They are outlined in detail on the [Backups page](docs/deploy/config-guides/backups.md). | | | `AZURE_BLOCK_SIZE` | The block size for Azure Blob Storage for backups. Default: `41943040` (40MB) | `int - bytes` | `10000000` | | `AZURE_CONCURRENCY` | The maximum number of parts that will be concurrently uploaded/downloaded during backup operations. Default: `1` | `int` | `3` | | `CLIP_INFERENCE_API` | The endpoint where to reach the clip module if enabled | `string` | `http://multi2vec-clip:8000` | diff --git a/docs/weaviate/configuration/persistence.md b/docs/weaviate/configuration/persistence.md index 7ded1689..fe93ea2d 100644 --- a/docs/weaviate/configuration/persistence.md +++ b/docs/weaviate/configuration/persistence.md @@ -72,7 +72,7 @@ services: ### Backups -See [Backups](./backups.md). +See [Backups](docs/deploy/config-guides/backups.md). ## Kubernetes From 6307881c88d13897bd7dcf3256661bdf9ad0ebea Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Sun, 11 May 2025 22:41:16 -0400 Subject: [PATCH 29/39] more updates and doc migrations --- docs/deploy/config-guides/authentication.md | 3 +- docs/deploy/config-guides/backups.md | 1 + .../config-guides/configuring-rbac.md} | 11 +- .../config-guides}/env-vars/_category_.json | 0 .../config-guides}/env-vars/index.md | 0 .../config-guides}/env-vars/runtime-config.md | 0 .../config-guides}/nodes.md | 1 - docs/deploy/config-guides/replication.md | 120 ++++++++ .../scaling-strategies/horizontal-scaling.mdx | 2 + docs/deploy/faqs/index.md | 16 +- docs/deploy/faqs/troubleshooting.md | 23 +- docs/deploy/installation-guides/aws-cli.md | 2 +- .../installation-guides/aws-installation.md | 27 +- .../installation-guides/gcp-installation.md | 22 +- .../installation-guides/helm-installation.md | 1 - .../other}/migration/_category_.json | 0 .../other}/migration/archive.md | 0 .../other}/migration/index.md | 0 .../other}/migration/weaviate-1-25.md | 0 .../other}/migration/weaviate-1-30.md | 0 .../Kubernetes/production-readiness.md | 8 +- docs/deploy/tutorials/index.mdx | 31 +++ docs/{weaviate => deploy}/tutorials/rbac.mdx | 1 - docs/weaviate/configuration/authorization.md | 259 ------------------ secondaryNavbar.js | 4 +- sidebars.js | 59 ++-- 26 files changed, 262 insertions(+), 329 deletions(-) rename docs/{weaviate/configuration/rbac/configuration.md => deploy/config-guides/configuring-rbac.md} (94%) rename docs/{weaviate/config-refs => deploy/config-guides}/env-vars/_category_.json (100%) rename docs/{weaviate/config-refs => deploy/config-guides}/env-vars/index.md (100%) rename docs/{weaviate/config-refs => deploy/config-guides}/env-vars/runtime-config.md (100%) rename docs/{weaviate/config-refs => deploy/config-guides}/nodes.md (98%) create mode 100644 docs/deploy/config-guides/replication.md delete mode 100644 docs/deploy/installation-guides/helm-installation.md rename docs/{weaviate/more-resources => deploy/other}/migration/_category_.json (100%) rename docs/{weaviate/more-resources => deploy/other}/migration/archive.md (100%) rename docs/{weaviate/more-resources => deploy/other}/migration/index.md (100%) rename docs/{weaviate/more-resources => deploy/other}/migration/weaviate-1-25.md (100%) rename docs/{weaviate/more-resources => deploy/other}/migration/weaviate-1-30.md (100%) create mode 100644 docs/deploy/tutorials/index.mdx rename docs/{weaviate => deploy}/tutorials/rbac.mdx (99%) delete mode 100644 docs/weaviate/configuration/authorization.md diff --git a/docs/deploy/config-guides/authentication.md b/docs/deploy/config-guides/authentication.md index 2e10e013..783a1f5f 100644 --- a/docs/deploy/config-guides/authentication.md +++ b/docs/deploy/config-guides/authentication.md @@ -59,7 +59,7 @@ In summary, Weaviate allows the following authentication methods: - API key - OpenID Connect (OIDC) -- Anonymous access (no authentication, strongly discouraged except for development or evaluation) +- Anonymous access **(no authentication, strongly discouraged except for development or evaluation)** Note that API key and OIDC authentication can be both enabled at the same time. @@ -136,6 +136,7 @@ authentication: ``` This configuration: + - Disables anonymous access - Enables API key authentication - Defines plaintext API keys in `allowed_keys` diff --git a/docs/deploy/config-guides/backups.md b/docs/deploy/config-guides/backups.md index 6024eeb6..d2ef9780 100644 --- a/docs/deploy/config-guides/backups.md +++ b/docs/deploy/config-guides/backups.md @@ -110,6 +110,7 @@ Restart Weaviate to apply the new configuration. Then, you are ready to start a That's all there is to getting started with backups in Weaviate. The backup will be stored in the specified location on the local filesystem. You can also: + - [Restore the backup](#restore-backup) to a Weaviate instance - [Check the status](#asynchronous-status-checking) of the backup (if you did not wait for completion) - [Cancel the backup](#cancel-backup) if needed diff --git a/docs/weaviate/configuration/rbac/configuration.md b/docs/deploy/config-guides/configuring-rbac.md similarity index 94% rename from docs/weaviate/configuration/rbac/configuration.md rename to docs/deploy/config-guides/configuring-rbac.md index f69460a4..1cf313cb 100644 --- a/docs/weaviate/configuration/rbac/configuration.md +++ b/docs/deploy/config-guides/configuring-rbac.md @@ -1,7 +1,6 @@ --- title: Enable and configure RBAC -sidebar_label: Enable RBAC -sidebar_position: 1 +sidebar_label: RBAC image: og/docs/configuration.jpg # tags: ['rbac', 'roles', 'configuration', 'authorization'] --- @@ -120,10 +119,10 @@ Here are some tips to optimize performance when using RBAC: ## Further resources -- [RBAC: Overview](./index.mdx) -- [RBAC: Manage roles](./manage-roles.mdx) -- [RBAC: Manage users](./manage-users.mdx) -- [RBAC: Tutorial](../../tutorials/rbac.mdx) +- [RBAC: Overview](docs/weaviate/configuration/rbac/index.mdx) +- [RBAC: Manage roles](docs/weaviate/configuration/rbac/manage-roles.mdx) +- [RBAC: Manage users](docs/weaviate/configuration/rbac/manage-users.mdx) +- [RBAC: Tutorial](docs/weaviate/tutorials/rbac.mdx) ## Questions and feedback diff --git a/docs/weaviate/config-refs/env-vars/_category_.json b/docs/deploy/config-guides/env-vars/_category_.json similarity index 100% rename from docs/weaviate/config-refs/env-vars/_category_.json rename to docs/deploy/config-guides/env-vars/_category_.json diff --git a/docs/weaviate/config-refs/env-vars/index.md b/docs/deploy/config-guides/env-vars/index.md similarity index 100% rename from docs/weaviate/config-refs/env-vars/index.md rename to docs/deploy/config-guides/env-vars/index.md diff --git a/docs/weaviate/config-refs/env-vars/runtime-config.md b/docs/deploy/config-guides/env-vars/runtime-config.md similarity index 100% rename from docs/weaviate/config-refs/env-vars/runtime-config.md rename to docs/deploy/config-guides/env-vars/runtime-config.md diff --git a/docs/weaviate/config-refs/nodes.md b/docs/deploy/config-guides/nodes.md similarity index 98% rename from docs/weaviate/config-refs/nodes.md rename to docs/deploy/config-guides/nodes.md index ff4ea134..a4dc1205 100644 --- a/docs/weaviate/config-refs/nodes.md +++ b/docs/deploy/config-guides/nodes.md @@ -1,6 +1,5 @@ --- title: Cluster node data -sidebar_position: 93 image: og/docs/configuration.jpg # tags: ['nodes', 'reference', 'configuration'] --- diff --git a/docs/deploy/config-guides/replication.md b/docs/deploy/config-guides/replication.md new file mode 100644 index 00000000..9d09615d --- /dev/null +++ b/docs/deploy/config-guides/replication.md @@ -0,0 +1,120 @@ +--- +title: Replication +image: og/docs/configuration.jpg +# tags: ['configuration', 'operations', 'monitoring', 'observability'] +--- + +Weaviate instances can be replicated. Replication can improve read throughput, improve availability, and enable zero-downtime upgrades. + +For more details on how replication is designed and built in Weaviate, see [Replication Architecture](../concepts/replication-architecture/index.md). + +## How to configure + +import RaftRFChangeWarning from '/\_includes/1-25-replication-factor.mdx'; + + + +Replication is disabled by default. It can be enabled per collection in the [collection configuration](../manage-collections/multi-node-setup.mdx#replication-settings). This means you can set different replication factors per class in your dataset. + +To enable replication, you can set one or both of the following: + +- `REPLICATION_MINIMUM_FACTOR` environment variable for the entire Weaviate instance, or +- `replicationFactor` parameter for a collection. + +### Weaviate-wide minimum replication factor + +The `REPLICATION_MINIMUM_FACTOR` environment variable sets the minimum replication factor for all collections in the Weaviate instance. + +If you set the [replication factor for a collection](#replication-factor-for-a-collection), the collection's replication factor overrides the minimum replication factor. + + +## Data consistency + +When Weaviate detects inconsistent data across nodes, it attempts to repair the out of sync data. + +Starting in v1.26, Weaviate adds [async replication](../concepts/replication-architecture/consistency.md#async-replication) to proactively detect inconsistencies. In earlier versions, Weaviate uses a [repair-on-read](../concepts/replication-architecture/consistency.md#repair-on-read) strategy to repair inconsistencies at read time. + +Repair-on-read is automatic. To activate async replication, set `asyncEnabled` to true in the `replicationConfig` section of your collection definition. + +import ReplicationConfigWithAsyncRepair from '/\_includes/code/configuration/replication-consistency.mdx'; + + + +### Configure async replication settings {#async-replication-settings} + +:::info Added in `v1.29` +The [environment variables](/docs/weaviate/config-refs/env-vars#async-replication) for configuring async replication (`ASYNC_*`) have been introduced in `v1.29`. +::: + +Async replication helps achieve consistency for data replicated across multiple nodes. + +Update the following [environment variables](/docs/weaviate/config-refs/env-vars#async-replication) to configure async replication for your particular use case. + +#### Logging + +- **Set the frequency of the logger:** `ASYNC_REPLICATION_LOGGING_FREQUENCY` + Define how often the async replication background process will log events. + +#### Data comparison + +- **Set the frequency of comparisons:** `ASYNC_REPLICATION_FREQUENCY` + Define how often each node compares its local data with other nodes. +- **Set comparison timeout:** `ASYNC_REPLICATION_DIFF_PER_NODE_TIMEOUT` + Optionally configure a timeout for how long to wait during comparison when a node is unresponsive. +- **Monitor node availability:** `ASYNC_REPLICATION_ALIVE_NODES_CHECKING_FREQUENCY` + Trigger comparisons whenever there’s a change in node availability. +- **Configure hash tree height:** `ASYNC_REPLICATION_HASHTREE_HEIGHT` + Specify the size of the hash tree, which helps narrow down data differences by comparing hash digests at multiple levels instead of scanning entire datasets. See [this page](../concepts/replication-architecture/consistency.md#memory-and-performance-considerations-for-async-replication) for more information on the memory and performance considerations for async replication. +- **Batch size for digest comparison:** `ASYNC_REPLICATION_DIFF_BATCH_SIZE` + Define the number of objects whose digest (e.g., last update time) is compared between nodes before propagating actual objects. + +#### Data synchronization + +Once differences between nodes are detected, Weaviate propagates outdated or missing data. Configure synchronization as follows: + +- **Set the frequency of propagation:** `ASYNC_REPLICATION_FREQUENCY_WHILE_PROPAGATING` + After synchronization is completed on a node, temporarily adjust the data comparison frequency to the set value. +- **Set propagation timeout:** `ASYNC_REPLICATION_PROPAGATION_TIMEOUT` + Optionally configure a timeout for how long to wait during propagation when a node is unresponsive. +- **Set propagation delay:** `ASYNC_REPLICATION_PROPAGATION_DELAY` + Define a delay period to allow asynchronous write operations to reach all nodes before propagating new or updated objects. +- **Batch size for data propagation:** `ASYNC_REPLICATION_PROPAGATION_BATCH_SIZE` + Define the number of objects that are sent in each synchronization batch during the propagation phase. +- **Set propagation limits:** `ASYNC_REPLICATION_PROPAGATION_LIMIT` + Enforce a limit on the number of out-of-sync objects to be propagated per replication iteration. +- **Set propagation concurrency:** `ASYNC_REPLICATION_PROPAGATION_CONCURRENCY` + Specify the number of concurrent workers that can send batches of objects to other nodes, allowing multiple propagation batches to be sent simultaneously. + +:::tip +Tweak these settings based on your cluster size and network latency to achieve optimal performance. Smaller batch sizes and shorter timeouts may be beneficial for high-traffic clusters, while larger clusters might require more conservative settings. +::: + +## How to use: Queries + +When you add (write) or query (read) data, one or more replica nodes in the cluster will respond to the request. How many nodes need to send a successful response and acknowledgment to the coordinator node depends on the `consistency_level`. Available [consistency levels](../concepts/replication-architecture/consistency.md) are `ONE`, `QUORUM` (replication_factor / 2 + 1) and `ALL`. + +The `consistency_level` can be specified at query time: + +```bash +# Get an object by ID, with consistency level ONE +curl "http://localhost:8080/v1/objects/{ClassName}/{id}?consistency_level=ONE" +``` + +:::note +In v1.17, only [read queries that get data by ID](../manage-objects/read.mdx#get-an-object-by-id) had a tunable consistency level. All other object-specific REST endpoints (read or write) used the consistency level `ALL`. Starting with v1.18, all write and read queries are tunable to either `ONE`, `QUORUM` (default) or `ALL`. GraphQL endpoints use the consistency level `ONE` (in both versions). +::: + +import QueryReplication from '/\_includes/code/replication.get.object.by.id.mdx'; + + + +## Related pages + +- [Concepts: Replication Architecture](../concepts/replication-architecture/index.md) +- [Configurinfg Async Replication](./async-rep.md) + +## Questions and feedback + +import DocsFeedback from '/\_includes/docs-feedback.mdx'; + + diff --git a/docs/deploy/config-guides/scaling-strategies/horizontal-scaling.mdx b/docs/deploy/config-guides/scaling-strategies/horizontal-scaling.mdx index 80a47b01..fd20d426 100644 --- a/docs/deploy/config-guides/scaling-strategies/horizontal-scaling.mdx +++ b/docs/deploy/config-guides/scaling-strategies/horizontal-scaling.mdx @@ -19,6 +19,8 @@ This document provides detailed implementation guidance for horizontally scaling ![Sharding vs Replication](./imgs/horiz-scaling.png) + + ### Replication Replication creates redundant copies of your data, it is useful when your data needs to be highly available. diff --git a/docs/deploy/faqs/index.md b/docs/deploy/faqs/index.md index 8119d470..e2fc4e80 100644 --- a/docs/deploy/faqs/index.md +++ b/docs/deploy/faqs/index.md @@ -23,7 +23,7 @@ This almost always means you've run out of disk space. Weaviate protects itself Answer -This [doc](../installation-guides/aws-installation.md) will walk you through all the necessary steps to deploy Weaviate using AWS marketplace. +This [page](../installation-guides/aws-installation.md) will walk you through all the necessary steps to deploy Weaviate using AWS marketplace. @@ -33,7 +33,7 @@ This [doc](../installation-guides/aws-installation.md) will walk you through all Answer -This [doc](../installation-guides/gcp-installation.md) will walk you through all the necessary steps to deploy Weaviate using GCP marketplace. +This [page](../installation-guides/gcp-installation.md) will walk you through all the necessary steps to deploy Weaviate using GCP marketplace. @@ -57,10 +57,14 @@ If you plan to create more than **20** collections, you may want to consider mul Common issues that occur during deployment include: -- The cluster becoming `read-only` -- Query results being inconsistent +- The cluster becoming `read-only`. +- Query results being inconsistent. - Nodes unable to maintain consensus. -- Creating too many collections +- Creating too many collections. + +#### Further resources + +For further information, the [troubleshooting page](./troubleshooting.md) will help with some of the common issue encountered. @@ -70,7 +74,7 @@ Common issues that occur during deployment include: Answer -Weaviate has complex processes which means that ingestion and deletion require more steps than other types of databases. +Weaviate has complex processes which means that ingestion and deletion require more steps than other types of databases. Data ingestion tends to take longer than a traditional database because of vectorization and deleting objects can be expensive due to the embedding costs. #### Q7: Do my resources free up immediately after deleting objects? diff --git a/docs/deploy/faqs/troubleshooting.md b/docs/deploy/faqs/troubleshooting.md index a931c424..f62a34e9 100644 --- a/docs/deploy/faqs/troubleshooting.md +++ b/docs/deploy/faqs/troubleshooting.md @@ -7,25 +7,28 @@ title: Deployment Troubleshooting Guide So you've deployed Weaviate and you're fully immersed in the world of vectors when suddenly you encounter a puzzling mystery. This page will serve as your handbook for when things go awry in "Vector Land!" Consider every error message a clue to solving the mystery you're encountering. -## Common Issues and Solutions +## Common issues and solutions + +### The cluster is not accepting new information and there are disk space or `read-only` error messages in the logs.
    - The cluster is not accepting new information and there are disk space or `read-only` error messages in the logs. +Answer #### Identifying the issue - As a first step, you'll want to examine your cluster's logs to identify the problem. If after checking the logs of your cluster you see error messages that include phrases like "read-only" or "disk space," then your cluster is more than likely in a `read-only` state due to insufficient disk space. #### Resolving the issue To solve this mystery, you'll need to increase the available disk space for your nodes. Once the disk space is increased, then you'll need to manually mark the affected shards or collections as writeable again. - +You can also set the [`MEMORY_WARNING_PERCENTAGE`](/weaviate/config-refs/env-vars/index.md#MEMORY_WARNING_PERCENTAGE) environment variable to issue warnings when the memory limit is near.
    +### You're receiving inconsistent query results. +
    - You're receiving inconsistent query results. + Answer #### Identifying the issue @@ -36,9 +39,11 @@ To confirm and identify the issue, you'll want to first run the same query multi Check your settings to check if you have asynchronous replication enabled. If `async_replication_disabled` is set to "true" then you'll need to set that variable to "false." Once it is enabled, the logs will show messages that indicate successful peers checks and synchronization for the nodes.
    +### Your nodes won't communicate, join a cluster, or maintain consensus. +
    - Your nodes won't communicate, join a cluster, or maintain consensus. + Answer #### Identifying the issue @@ -46,9 +51,13 @@ To confirm and identify the issue, you'll want to first run the same query multi #### Resolving the issue -Check your settings to check if you have asynchronous replication enabled. If `async_replication_disabled` is set to "true" then you'll need to set that variable to "false." Once it is enabled, the logs will show messages that indicate successful peers checks and synchronization for the nodes. +Check your settings to check if you have asynchronous replication enabled. If `async_replication_disabled` is set to "true" then you'll need to set that variable to "false." Once it is enabled, the logs will show messages that indicate successful peers checks and synchronization for the nodes. Additionally, test the [live and ready REST endpoints](/docs/weaviate/api/rest#tag/well-known/GET/.well-known/live) and check the network configuration of the nodes.
    +## Further reading + +- [LOG_LEVEL](insert env vars `log_level`) + ## Questions and feedback import DocsFeedback from '/_includes/docs-feedback.mdx'; diff --git a/docs/deploy/installation-guides/aws-cli.md b/docs/deploy/installation-guides/aws-cli.md index 0a66fe1c..2df72178 100644 --- a/docs/deploy/installation-guides/aws-cli.md +++ b/docs/deploy/installation-guides/aws-cli.md @@ -1,5 +1,5 @@ --- -title: AWS EKS Installation +title: EKS Installation description: Deploy Weaviate on EKS using the AWS CLI --- diff --git a/docs/deploy/installation-guides/aws-installation.md b/docs/deploy/installation-guides/aws-installation.md index 8854e1e0..185efc58 100644 --- a/docs/deploy/installation-guides/aws-installation.md +++ b/docs/deploy/installation-guides/aws-installation.md @@ -9,25 +9,40 @@ import ReactPlayer from 'react-player/lazy' -It is easy to deploy a Weaviate cluster through the AWS Marketplace. +Through the AWS Marketplace you can launch a Weaviate serverless instance billed directly from AWS. :::info Prerequisites - An AWS account with sufficient credit / payment method. - (Recommended) Familiarity with AWS and the AWS console. ::: -You can use [AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-ng2dfhb4yjoic?sr=0-3&ref_=beagle&applicationId=AWSMPContessa) to directly launch a Weaviate cluster. +You can use [AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-ng2dfhb4yjoic?sr=0-3&ref_=beagle&applicationId=AWSMPContessa) to launch a Weaviate serverless instance. ## Installation instructions -### AWS Marketplace - -1. Go to Weaviate's [AWS Marketplace listing](https://aws.amazon.com/marketplace/pp/prodview-ng2dfhb4yjoic?sr=0-3&ref_=beagle&applicationId=AWSMPContessa) to directly launch a Weaviate cluster. -1. Subscribe to the product in AWS Marketplace by following the instructions on the page. +1. Go to Weaviate's [AWS Marketplace listing](https://aws.amazon.com/marketplace/pp/prodview-ng2dfhb4yjoic?sr=0-3&ref_=beagle&applicationId=AWSMPContessa). +1. Subscribe to the product by following the instructions on the page. 1. Click View Purchase Options, then go to the next page. 2. Review the pricing, terms and conditions, and click Subscribe. From there you will be prompted to set up your account on [Weaviate Cloud](docs/cloud/index.mdx). +:::info +
    + + A little background information + +- When you deploy Weaviate Serverless Cloud through the AWS Marketplace, you're subscribing to a Software as a Service (SaaS) solution that is specifically built for AWS customers. + +- AWS will notify you once your Weaviate serverless cluster is available. + +**This solution is ideal for:** + +- Organizations requiring AWS billing integration. +- Organizations with regulatory requirements who need specific regional deployments. + +
    + +::: ## Billing diff --git a/docs/deploy/installation-guides/gcp-installation.md b/docs/deploy/installation-guides/gcp-installation.md index 50c80a8f..c3c6f808 100644 --- a/docs/deploy/installation-guides/gcp-installation.md +++ b/docs/deploy/installation-guides/gcp-installation.md @@ -8,19 +8,35 @@ tags: ['installation', 'Google Cloud Marketplace'] A Weaviate cluster is easy to deploy with Google Cloud Marketplace (GCP). :::info Prerequisites + - A Google Cloud account with sufficient credit / payment method. - (Recommended) Familiarity with Google Cloud and the Google Cloud console. ::: ## Installation instructions -Broadly, the steps are as follows: - 1. Go to Weaviate's [Google Cloud Marketplace listing](https://console.cloud.google.com/marketplace/product/weaviate-gcp-mktplace/weaviate) page and click Subscribe. 1. Configure and deploy Weaviate by following the on-screen instructions. -Once completed, you will have a [Weaviate severless cloud](docs/cloud/index.mdx) deployment. +Once completed, you will have a [Weaviate serverless cloud](docs/cloud/index.mdx) deployment. + +:::info +
    + + A little background information + +- When you deploy Weaviate Serverless Cloud through the GCP Marketplace, you're subscribing to a Software as a Service (SaaS) solution that is specifically built for GCP customers. +- GCP will notify you once your Weaviate serverless cluster is available. + +**This solution is ideal for:** + +- Organizations requiring GCP billing integration. +- Organizations with regulatory requirements who need specific regional deployments. + +
    + +::: ## Billing diff --git a/docs/deploy/installation-guides/helm-installation.md b/docs/deploy/installation-guides/helm-installation.md deleted file mode 100644 index 56178afe..00000000 --- a/docs/deploy/installation-guides/helm-installation.md +++ /dev/null @@ -1 +0,0 @@ -# Placeholder for Helm Chart Installation \ No newline at end of file diff --git a/docs/weaviate/more-resources/migration/_category_.json b/docs/deploy/other/migration/_category_.json similarity index 100% rename from docs/weaviate/more-resources/migration/_category_.json rename to docs/deploy/other/migration/_category_.json diff --git a/docs/weaviate/more-resources/migration/archive.md b/docs/deploy/other/migration/archive.md similarity index 100% rename from docs/weaviate/more-resources/migration/archive.md rename to docs/deploy/other/migration/archive.md diff --git a/docs/weaviate/more-resources/migration/index.md b/docs/deploy/other/migration/index.md similarity index 100% rename from docs/weaviate/more-resources/migration/index.md rename to docs/deploy/other/migration/index.md diff --git a/docs/weaviate/more-resources/migration/weaviate-1-25.md b/docs/deploy/other/migration/weaviate-1-25.md similarity index 100% rename from docs/weaviate/more-resources/migration/weaviate-1-25.md rename to docs/deploy/other/migration/weaviate-1-25.md diff --git a/docs/weaviate/more-resources/migration/weaviate-1-30.md b/docs/deploy/other/migration/weaviate-1-30.md similarity index 100% rename from docs/weaviate/more-resources/migration/weaviate-1-30.md rename to docs/deploy/other/migration/weaviate-1-30.md diff --git a/docs/deploy/production/Kubernetes/production-readiness.md b/docs/deploy/production/Kubernetes/production-readiness.md index fab9e81a..751338e1 100644 --- a/docs/deploy/production/Kubernetes/production-readiness.md +++ b/docs/deploy/production/Kubernetes/production-readiness.md @@ -6,6 +6,11 @@ sidebar_label: Production Readiness Self-Assessment Think you’re ready for production? Ensuring that your Weaviate cluster is production-ready requires careful planning, configuration, and ongoing maintenance. Ensuring that you have a stable, reliable deployment requires you to think of your *ending* at the *beginning.* This guide provides you with introspective questions to assess readiness and identify any potential gaps before moving your workloads into production. +:::tip +If you *do* identify gaps within your deployment, be sure to reach out to your SE (solutions engineer) who can help steer you on the path to production success! +::: + + ### High Availability and Resilience - [ ] Are your clusters deployed across multiple availability zones (AZs) or regions to prevent downtime? @@ -81,6 +86,3 @@ Think you’re ready for production? Ensuring that your Weaviate cluster is prod Evaluate these key areas to build a highly available, resilient, and efficient deployment that will scale to meet your business needs. By ensuring that these self-assessment questions have been addressed, you can proactively identify potential risks and maximize the reliability of your deployment. -:::tip -If you *do* identify gaps within your deployment, be sure to reach out to your SE (sales engineer) who can help steer you on the path to production success! -::: diff --git a/docs/deploy/tutorials/index.mdx b/docs/deploy/tutorials/index.mdx new file mode 100644 index 00000000..54266bad --- /dev/null +++ b/docs/deploy/tutorials/index.mdx @@ -0,0 +1,31 @@ +--- +title: Tutorials +description: Explore Weaviate tutorials for practical guidance on data management and queries. +sidebar_position: 0 +image: og/docs/tutorials.jpg +hide_table_of_contents: true +# tags: ['how to', 'schema'] +--- + +import BasicPrereqs from "/_includes/prerequisites-quickstart.md"; + + + +Tutorials aim to empower you to use Weaviate based on _your_ particular needs. +Here, you can learn how to: + +import CardsSection from "/src/components/CardsSection"; + +export const advancedFeaturesData = [ + { + title: "Set up Role-Based Access Control (RBAC)", + description: + "Configure roles, permissions, and user assignments for secure access control in Weaviate.", + link: "docs/deploy/tutorials/rbac.mdx", + icon: "fas fa-user-shield", + }, +]; + +
    + +
    diff --git a/docs/weaviate/tutorials/rbac.mdx b/docs/deploy/tutorials/rbac.mdx similarity index 99% rename from docs/weaviate/tutorials/rbac.mdx rename to docs/deploy/tutorials/rbac.mdx index 7d828ea6..7868eaa2 100644 --- a/docs/weaviate/tutorials/rbac.mdx +++ b/docs/deploy/tutorials/rbac.mdx @@ -1,7 +1,6 @@ --- title: Set up RBAC in Weaviate description: Learn how to set up RBAC (Role Based Access Control) in Weaviate -sidebar_position: 3 image: og/docs/tutorials.jpg # tags: ['basics'] --- diff --git a/docs/weaviate/configuration/authorization.md b/docs/weaviate/configuration/authorization.md deleted file mode 100644 index 51711aac..00000000 --- a/docs/weaviate/configuration/authorization.md +++ /dev/null @@ -1,259 +0,0 @@ ---- -title: Authorization -image: og/docs/configuration.jpg -# tags: ['authorization'] ---- - -:::info Authentication and authorization -Authentication and authorization are closely related concepts, and sometimes abbreviated as `AuthN` and `AuthZ`. Authentication (`AuthN`) is the process of verifying the identity of a user, while authorization (`AuthZ`) is the process of determining what permissions the user has. -::: - -Weaviate provides differentiated access through [authorization](./authorization.md) levels, based on the user's [authentication](./authentication.md) status. A user can be granted admin permission, read-only permission, or no permission at all. From `v1.29.0`, Weaviate also supports [Role-Based Access Control (RBAC)](/docs/weaviate/configuration/rbac) for more fine-grained control over user permissions. - -The following diagram illustrates the flow of a user request through the authentication and authorization process: - -```mermaid -flowchart TB - User(["Authenticated User"]) --> AuthScheme{"Authorization
    Scheme?"} - - subgraph rbac ["RBAC Authorization"] - direction TB - AdminRole["Admin Role"] - ViewerRole["Viewer Role"] - CustomRole["Custom Roles"] - - Perms1["Full Access
    All Operations"] - Perms2["Read-only
    Access"] - Perms3["Custom
    Permissions"] - - AdminRole --> Perms1 - ViewerRole --> Perms2 - CustomRole --> Perms3 - end - - subgraph adminlist ["Admin List Authorization"] - direction TB - AdminUser["Admin Users"] - ReadOnly["Read-only Users"] - AnonUser["Anonymous Users
    (Optional)"] - - AllPerms["Full Access
    All Operations"] - ReadPerms["Read-only
    Access"] - - AdminUser --> AllPerms - ReadOnly --> ReadPerms - AnonUser -.->|"If enabled"| AllPerms - AnonUser -.->|"If enabled"| ReadPerms - end - - subgraph undiffer ["Undifferentiated Access"] - AllAccess["Full Access
    All Operations"] - end - - AuthScheme -->|"RBAC"| rbac - AuthScheme -->|"Admin List"| adminlist - AuthScheme -->|"Undifferentiated"| undiffer - - %% Style nodes - style User fill:#f9f9f9,stroke:#666 - style AuthScheme fill:#f5f5f5,stroke:#666 - style AnonUser fill:#f9f9f9,stroke:#666,stroke-dasharray: 5 5 - - %% Style subgraphs - style rbac fill:#e6f3ff,stroke:#4a90e2 - style adminlist fill:#e6ffe6,stroke:#2ea44f - style undiffer fill:#fff0e6,stroke:#ff9933 -``` - -## Available authorization schemes - -The following authorization schemes are available in Weaviate: - -- [Role-Based Access Control (RBAC)](#role-based-access-control-rbac) -- [Admin list](#admin-list) -- [Undifferentiated access](#undifferentiated-access) - -In the Admin list authorization scheme, [anonymous users](#anonymous-users) can be granted permissions. - -The way to configure authorization differs by your deployment method, depending on whether you are running Weaviate in Docker or Kubernetes. Below, we provide examples for both. - -:::info What about Weaviate Cloud (WCD)? -For Weaviate Cloud (WCD) instances, authorization is pre-configured with Admin list access. You can [authenticate against Weaviate](../connections/connect-cloud.mdx) with your WCD credentials using OIDC, or [with admin or read-only API keys](/docs/cloud/platform/manage-api-keys). -
    - -RBAC access will be available in WCD in a future release. -::: - -## Role-Based Access Control (RBAC) - -:::info Available from `v1.29` -Role-based access control (RBAC) is generally available in Weaviate from version `v1.29`. -::: - -Role-based access control (RBAC) is a method of restricting access to resources based on the roles of users. In Weaviate, RBAC allows you to define **roles** and assign **permissions** to those roles. Users can then be assigned to roles, and inherit the permissions associated with those roles. - -Check out the dedicated **[RBAC documentation](./rbac/index.mdx)** for instructions on how to [configure RBAC](./rbac/configuration.md) in your Weaviate instance and examples on how to [manage roles an users](./rbac/manage-roles.mdx). - -## Admin list - -The "Admin list" authorization scheme allows you to specify a list of admin users with full permissions to perform all actions in Weaviate, and a list of read-only users with permissions to perform only read operations. - -These permissions cannot be customized or extended. For more fine-grained control over user permissions, use [RBAC](#role-based-access-control-rbac) instead. - -Admin list authorization scheme cannot be used in combination with RBAC. - -### Admin list: Docker - -Admin list authorization can be configured using environment variables. In Docker Compose, set them in the configuration file (`docker-compose.yml`) such as in the following example: - -```yaml -services: - weaviate: - ... - environment: - ... - # Example authentication configuration using API keys - # OIDC access can also be used with RBAC - AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'false' - AUTHENTICATION_APIKEY_ENABLED: 'true' - AUTHENTICATION_APIKEY_ALLOWED_KEYS: 'user-a-key,user-b-key,user-c-key' - AUTHENTICATION_APIKEY_USERS: 'user-a,user-b,user-c' - - # Authorization configuration - # Enable admin list - AUTHORIZATION_ADMINLIST_ENABLED: 'true' - - # Provide pre-configured roles to users - # This assumes that the relevant user has been authenticated and identified - # - # You MUST define at least one admin user - AUTHORIZATION_ADMINLIST_USERS: 'user-a' - AUTHORIZATION_ADMINLIST_READONLY_USERS: 'user-b' -``` - -This configuration: -- Enables Admin list authorization -- Configures `user-a` as a user with built-in admin permissions -- Configures `user-b` as a user with built-in viewer permissions - -Note that in this configuration, `user-c` has no permissions. - -### Admin list: Kubernetes - -For Kubernetes deployments using Helm, API key authentication can be configured in the `values.yaml` file under the `authorization` section. Here's an example configuration: - -```yaml -# Example authentication configuration using API keys -authentication: - anonymous_access: - enabled: false - apikey: - enabled: true - allowed_keys: - - user-a-key - - user-b-key - - user-c-key - users: - - user-a - - user-b - - user-c - -# Authorization configuration -authorization: - admin_list: - # Enable admin list - enabled: true - - # Provide pre-configured roles to users - # This assumes that the relevant user has been authenticated and identified - # - # You MUST define at least one admin user - users: - - user-a - read_only_users: - - user-b -``` - -### Anonymous users - -Anonymous users are identified as `anonymous` in Weaviate. In the Admin list authorization scheme, you can apply permissions to anonymous users. The RBAC authorization scheme is not compatible with anonymous users. - -To confer permissions to anonymous users in the Admin list scheme, you can use the `anonymous` keyword in the configuration as shown below. - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - - - - - -```yaml -services: - weaviate: - ... - environment: - ... - # Enable anonymous access - AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' - - # Configure admin user API key - AUTHORIZATION_ADMINLIST_ENABLED: 'true' - AUTHENTICATION_APIKEY_ALLOWED_KEYS: 'user-a-key' - AUTHENTICATION_APIKEY_USERS: 'user-a' - - # Enable admin list and provide admin access to "user-a" only - AUTHORIZATION_ADMINLIST_USERS: 'user-a' - # Provide read-only access to anonymous users - AUTHORIZATION_ADMINLIST_READONLY_USERS: 'anonymous' -``` - - - - - -```yaml -# Example authentication configuration using API keys -authentication: - # Enable anonymous access - anonymous_access: - enabled: true - - # Enable admin list and configure admin user API key - apikey: - enabled: true - allowed_keys: - - user-a-key - users: - - user-a - -authorization: - # Enable admin list and provide admin access to "user-a" only - admin_list: - # Enable admin list - enabled: true - users: - - user-a - # Provide read-only access to anonymous users - read_only_users: - - anonymous -``` - - - - - -## Undifferentiated access - -Weaviate can be configured to provide undifferentiated access, by disabling authentication for example and enabling anonymous access. This configuration is strongly discouraged except for development or evaluation purposes. - -## Further resources - -- [Configuration: Authentication](./authentication.md) -- [Configuration: RBAC](./rbac/index.mdx) -- [References: Environment variables / Authentication and Authorization](../config-refs/env-vars/index.md#authentication-and-authorization) - -## Questions and feedback - -import DocsFeedback from '/_includes/docs-feedback.mdx'; - - diff --git a/secondaryNavbar.js b/secondaryNavbar.js index 7037b4da..0e710ab2 100644 --- a/secondaryNavbar.js +++ b/secondaryNavbar.js @@ -66,11 +66,13 @@ const secondaryNavbarItems = { { label: "Get Started", link: "/docs/deploy", sidebar: "deploySidebar" }, { label: "Configuration Guides", link: "/docs/deploy/config-guides", sidebar: "deployConfigSidebar"}, /*{ label: "Kubernetes", link: "/docs/deploy/k8s", sidebar: "deployK8sSidebar" },*/ - { label: "Production Environments", link: "/docs/deploy/production", sidebar: "deployProductionSidebar"}, + { label: "Production Guides", link: "/docs/deploy/production", sidebar: "deployProductionSidebar"}, + { label: "Tutorials", link: "/docs/deploy/tutorials", sidebar: "deployTutorialSidebar"}, /*{ label: "AWS", link: "/docs/deploy/aws", sidebar: "deployAwsSidebar" },*/ /*{ label: "Scaling Strategies", link: "/docs/deploy/scaling-strategies", sidebar: "deployScalingSidebar"},*/ /*{ label: "Monitoring and Observability", link: "/docs/deploy/monitoring-obs", sidebar: "deployObservabilitySidebar"},*/ { label: "FAQs", link: "/docs/deploy/faqs", sidebar: "deployFaqsSidebar"}, + { label: "Other", link: "/docs/deploy/other", sidebar: "deployOtherSidebar"}, ] }, diff --git a/sidebars.js b/sidebars.js index a2cd2dee..acdc0e09 100644 --- a/sidebars.js +++ b/sidebars.js @@ -428,7 +428,6 @@ const sidebars = { }, "weaviate/configuration/tenant-offloading", "weaviate/configuration/modules", - "weaviate/configuration/authorization", "weaviate/configuration/authentication", { type: "category", @@ -438,7 +437,6 @@ const sidebars = { id: "weaviate/configuration/rbac/index", }, items: [ - "weaviate/configuration/rbac/configuration", "weaviate/configuration/rbac/manage-roles", "weaviate/configuration/rbac/manage-users", ], @@ -517,7 +515,6 @@ const sidebars = { id: "weaviate/tutorials/index", }, items: [ - "weaviate/tutorials/rbac", "weaviate/tutorials/multi-vector-embeddings", //"weaviate/tutorials/import", "weaviate/tutorials/cross-references", @@ -563,16 +560,6 @@ const sidebars = { id: "weaviate/config-refs/distances", className: "sidebar-item", }, - { - type: "category", - label: "Environment variables", - className: "sidebar-item", - link: { - type: "doc", - id: "weaviate/config-refs/env-vars/index", - }, - items: ["weaviate/config-refs/env-vars/runtime-config"], - }, { type: "doc", id: "weaviate/config-refs/status", @@ -588,11 +575,6 @@ const sidebars = { id: "weaviate/config-refs/meta", className: "sidebar-item", }, - { - type: "doc", - id: "weaviate/config-refs/nodes", - className: "sidebar-item", - }, { type: "doc", id: "weaviate/config-refs/oidc", @@ -730,7 +712,7 @@ const sidebars = { ], }, ], - othersSidebar: [ + othersSidebar: [ { type: "category", label: "Releases", @@ -739,19 +721,6 @@ const sidebars = { id: "weaviate/release-notes/index", }, items: [ - { - type: "category", - label: "Migration", - link: { - type: "doc", - id: "weaviate/more-resources/migration/index", - }, - items: [ - "weaviate/more-resources/migration/weaviate-1-30", - "weaviate/more-resources/migration/weaviate-1-25", - "weaviate/more-resources/migration/archive", - ], - }, ], }, { @@ -802,7 +771,6 @@ const sidebars = { "deploy/installation-guides/gcp-installation", "deploy/installation-guides/aws-installation", "deploy/installation-guides/aws-cli", - "deploy/installation-guides/helm-installation", ], }, ], @@ -831,6 +799,12 @@ const sidebars = { }, ], + deployTutorialSidebar: [ + { + type: "autogenerated", + dirName: "deploy/tutorials", + }, + ], deployFaqsSidebar: [ { type: "autogenerated", @@ -838,6 +812,25 @@ const sidebars = { }, ], + deployOtherSidebar: [ + { + type: "autogenerated", + dirName: "deploy/other", + }, + { + type: "category", + label: "Migration", + link: { + type: "doc", + id: "deploy/other/migration/index.md", + }, + items: [ + "deploy/other/migration/weaviate-1-30", + "deploy/other/migration/weaviate-1-25.md", + "deploy/other/migration/archive.md", + ], + }, + ], agentsSidebar: [ "agents/index", { From 306b9bb3c8f59c5b9d0861fbbf043d09dc53d84b Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Mon, 12 May 2025 13:47:01 -0400 Subject: [PATCH 30/39] fixing sidebar links --- sidebars.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sidebars.js b/sidebars.js index acdc0e09..5b52c53f 100644 --- a/sidebars.js +++ b/sidebars.js @@ -822,12 +822,12 @@ const sidebars = { label: "Migration", link: { type: "doc", - id: "deploy/other/migration/index.md", + id: "deploy/other/migration/index", }, items: [ "deploy/other/migration/weaviate-1-30", - "deploy/other/migration/weaviate-1-25.md", - "deploy/other/migration/archive.md", + "deploy/other/migration/weaviate-1-25", + "deploy/other/migration/archive", ], }, ], From 2d5e616b4b4d3829b9a3d34cadc09bc9ce4ba8ac Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Mon, 12 May 2025 15:25:43 -0400 Subject: [PATCH 31/39] broken link fixes --- docs/cloud/manage-clusters/status.mdx | 2 +- docs/weaviate/best-practices/index.md | 3 ++- docs/weaviate/concepts/data.md | 2 +- docs/weaviate/concepts/indexing/inverted-index.md | 2 +- docs/weaviate/concepts/indexing/vector-index.md | 2 +- docs/weaviate/concepts/replication-architecture/index.md | 2 +- docs/weaviate/config-refs/index.mdx | 4 ++-- docs/weaviate/config-refs/schema/index.md | 2 +- 8 files changed, 10 insertions(+), 9 deletions(-) diff --git a/docs/cloud/manage-clusters/status.mdx b/docs/cloud/manage-clusters/status.mdx index ac0b36c6..df1b47f1 100644 --- a/docs/cloud/manage-clusters/status.mdx +++ b/docs/cloud/manage-clusters/status.mdx @@ -72,7 +72,7 @@ Serverless clusters also have an `Advanced configuration` section to configure o ## API Endpoint {#api-endpoint} -To get cluster details programmatically, use the [`nodes`](/docs/weaviate/config-refs/nodes.md) REST endpoint. +To get cluster details programmatically, use the [`nodes`](/docs/deploy/config-guides/nodes.md) REST endpoint. import APIOutputs from '/_includes/rest/node-endpoint-info.mdx'; diff --git a/docs/weaviate/best-practices/index.md b/docs/weaviate/best-practices/index.md index fb73d759..b201fef8 100644 --- a/docs/weaviate/best-practices/index.md +++ b/docs/weaviate/best-practices/index.md @@ -97,7 +97,8 @@ These thresholds can be adjusted to better fit your use case. For example, if yo Set `DISK_USE_WARNING_PERCENTAGE` and `DISK_USE_READONLY_PERCENTAGE` to adjust the disk usage thresholds, and `MEMORY_WARNING_PERCENTAGE` and `MEMORY_READONLY_PERCENTAGE` to adjust the memory usage thresholds. :::tip Further resources -- [References: Environment variables](../config-refs/env-vars/index.md#general) +- [References: Environment variables](/docs/deploy/config-guides/env-vars/index.md#general) () + ::: ### Plan memory allocation diff --git a/docs/weaviate/concepts/data.md b/docs/weaviate/concepts/data.md index 2c68df98..a3aacb32 100644 --- a/docs/weaviate/concepts/data.md +++ b/docs/weaviate/concepts/data.md @@ -466,7 +466,7 @@ Cross-references like these are not supported: ### Monitoring metrics -To group tenants together for monitoring, set [`PROMETHEUS_MONITORING_GROUP = true`](../config-refs/env-vars/index.md) in your system configuration file. +To group tenants together for monitoring, set [`PROMETHEUS_MONITORING_GROUP = true`](/docs/deploy/config-guides/env-vars/index.md) in your system configuration file. ### Number of tenants per node diff --git a/docs/weaviate/concepts/indexing/inverted-index.md b/docs/weaviate/concepts/indexing/inverted-index.md index b8e61e43..0fa74ffb 100644 --- a/docs/weaviate/concepts/indexing/inverted-index.md +++ b/docs/weaviate/concepts/indexing/inverted-index.md @@ -27,7 +27,7 @@ As always, we recommend upgrading to the latest version of Weaviate to benefit f The BlockMax WAND algorithm is a variant of the WAND algorithm that is used to speed up BM25 and hybrid searches. It organizes the inverted index in blocks to enable skipping over blocks that are not relevant to the query. This can significantly reduce the number of documents that need to be scored, improving search performance. -If you are experiencing slow BM25 (or hybrid) searches and use a Weaviate version prior to `v1.30`, try migrating to a newer version that uses the BlockMax WAND algorithm to see if it improves performance. If you need to migrate existing data from a previous version of Weaviate, follow the [v1.30 migration guide](../../more-resources/migration/weaviate-1-30.md). +If you are experiencing slow BM25 (or hybrid) searches and use a Weaviate version prior to `v1.30`, try migrating to a newer version that uses the BlockMax WAND algorithm to see if it improves performance. If you need to migrate existing data from a previous version of Weaviate, follow the [v1.30 migration guide](/docs/deploy/other/migration/weaviate-1-30.md). :::note Scoring changes with BlockMax WAND diff --git a/docs/weaviate/concepts/indexing/vector-index.md b/docs/weaviate/concepts/indexing/vector-index.md index 2c6f9660..5299115d 100644 --- a/docs/weaviate/concepts/indexing/vector-index.md +++ b/docs/weaviate/concepts/indexing/vector-index.md @@ -162,7 +162,7 @@ When asynchronous indexing is enabled, all vector indexing operations go through This means that the object store can be updated quickly to finish performing user requests while the vector index updates in the background. Asynchronous indexing is especially useful for importing large amounts of data. -This means that there will be a short delay between object creation and the object being available for vector search using the HNSW index. The number of objects in the queue can be monitored per node [as shown here](../../config-refs/nodes.md). +This means that there will be a short delay between object creation and the object being available for vector search using the HNSW index. The number of objects in the queue can be monitored per node [as shown here](/docs/deploy/config-guides/nodes.md). :::info Changes in `v1.28` In Weaviate `v1.22` to `v1.27`, the async indexing feature only affected batch import operations, using an in-memory queue. diff --git a/docs/weaviate/concepts/replication-architecture/index.md b/docs/weaviate/concepts/replication-architecture/index.md index 5f1c6bb9..01753a13 100644 --- a/docs/weaviate/concepts/replication-architecture/index.md +++ b/docs/weaviate/concepts/replication-architecture/index.md @@ -147,7 +147,7 @@ Prior to Weaviate `v1.25`, each cluster metadata change was recorded via a distr This is a synchronous process, which means that the cluster metadata change is only committed when all nodes have acknowledged the change. In this architecture, any node downtime would temporarily prevent metadata operations. Additionally, only one such operation could be processed at a time. -If you are using Weaviate `v1.24` or earlier, you can [upgrade to `v1.25`](../../more-resources/migration/weaviate-1-25.md) to benefit from the Raft consensus algorithm for cluster metadata changes. +If you are using Weaviate `v1.24` or earlier, you can [upgrade to `v1.25`](/docs/deploy/other/migration/weaviate-1-25.md) to benefit from the Raft consensus algorithm for cluster metadata changes. diff --git a/docs/weaviate/config-refs/index.mdx b/docs/weaviate/config-refs/index.mdx index f314e200..870cbac0 100644 --- a/docs/weaviate/config-refs/index.mdx +++ b/docs/weaviate/config-refs/index.mdx @@ -48,7 +48,7 @@ export const mainReferencesData = [ title: "Environment variables", description: "Configure Weaviate through environment variables and runtime settings.", - link: "/docs/weaviate/config-refs/env-vars", + link: "/docs/deploy/config-guides/env-vars", icon: "fas fa-cogs", }, ]; @@ -76,7 +76,7 @@ export const otherReferencesData = [ { title: "Cluster node data", description: "View and manage data about individual nodes in your cluster.", - link: "/docs/weaviate/config-refs/nodes", + link: "/docs/deploy/config-guides/nodes", icon: "fas fa-server", }, { diff --git a/docs/weaviate/config-refs/schema/index.md b/docs/weaviate/config-refs/schema/index.md index 9448629b..1ceaf4b3 100644 --- a/docs/weaviate/config-refs/schema/index.md +++ b/docs/weaviate/config-refs/schema/index.md @@ -159,7 +159,7 @@ We are working on a re-indexing API to allow you to re-index the data after addi To ensure optimal performance, Weaviate **limits the number of collections per node**. Each collection adds overhead in terms of indexing, definition management, and storage. This limit aims to ensure Weaviate remains performant. - **Default limit**: `1000` collections. -- **Modify the limit**: Use the [`MAXIMUM_ALLOWED_COLLECTIONS_COUNT`](../../config-refs/env-vars/index.md) environment variable to adjust the collection count limit. +- **Modify the limit**: Use the [`MAXIMUM_ALLOWED_COLLECTIONS_COUNT`](docs/deploy/config-guides/env-vars/index.md) environment variable to adjust the collection count limit. :::note If your instance already exceeds the limit, Weaviate will not allow the creation of any new collections. Existing collections will not be deleted. From 341c8703e849efa813926e8b0c8f817f258f7e09 Mon Sep 17 00:00:00 2001 From: g-despot <66276597+g-despot@users.noreply.github.com> Date: Tue, 13 May 2025 15:35:00 +0200 Subject: [PATCH 32/39] Update navigation modal --- secondaryNavbar.js | 1 + 1 file changed, 1 insertion(+) diff --git a/secondaryNavbar.js b/secondaryNavbar.js index 0e710ab2..8611c672 100644 --- a/secondaryNavbar.js +++ b/secondaryNavbar.js @@ -127,6 +127,7 @@ const secondaryNavbarItems = { integrations: { title: "Integrations", icon: "fa fa-puzzle-piece", + isSmall: true, description: "For hyperscalers, data platforms, LLM frameworks, etc.", link: "/docs/integrations", links: [ From c507c9a723fa1621bbaef59f76a3614890f5a69c Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Wed, 14 May 2025 14:12:47 -0400 Subject: [PATCH 33/39] sidebar updates --- .../weaviate-sample-dashboard-async-queue.png | Bin .../weaviate-sample-dashboard-importing.png | Bin .../img/weaviate-sample-dashboard-lsm.png | Bin .../img/weaviate-sample-dashboard-objects.png | Bin .../img/weaviate-sample-dashboard-startup.png | Bin .../img/weaviate-sample-dashboard-usage.png | Bin .../img/weaviate-sample-dashboard-vector.png | Bin .../monitoring-obs/grafana-prometheus.md | 8 ---- .../config-guides/monitoring-obs/index.mdx | 5 -- .../{monitoring-obs => }/monitoring.md | 2 +- .../scaling-strategies/index.mdx | 11 ++--- .../scaling-strategies/multi-node.md | 4 -- docs/deploy/faqs/troubleshooting.md | 26 ++++++++-- docs/deploy/installation-guides/aws-cli.md | 45 +++++++----------- docs/deploy/migration/_category_.json | 4 ++ docs/deploy/{other => }/migration/archive.md | 2 +- docs/deploy/{other => }/migration/index.md | 12 ++++- .../{other => }/migration/weaviate-1-25.md | 2 +- .../{other => }/migration/weaviate-1-30.md | 2 +- docs/deploy/other/migration/_category_.json | 4 -- secondaryNavbar.js | 2 +- sidebars.js | 17 +------ 22 files changed, 66 insertions(+), 80 deletions(-) rename docs/deploy/config-guides/{monitoring-obs => }/img/weaviate-sample-dashboard-async-queue.png (100%) rename docs/deploy/config-guides/{monitoring-obs => }/img/weaviate-sample-dashboard-importing.png (100%) rename docs/deploy/config-guides/{monitoring-obs => }/img/weaviate-sample-dashboard-lsm.png (100%) rename docs/deploy/config-guides/{monitoring-obs => }/img/weaviate-sample-dashboard-objects.png (100%) rename docs/deploy/config-guides/{monitoring-obs => }/img/weaviate-sample-dashboard-startup.png (100%) rename docs/deploy/config-guides/{monitoring-obs => }/img/weaviate-sample-dashboard-usage.png (100%) rename docs/deploy/config-guides/{monitoring-obs => }/img/weaviate-sample-dashboard-vector.png (100%) delete mode 100644 docs/deploy/config-guides/monitoring-obs/grafana-prometheus.md delete mode 100644 docs/deploy/config-guides/monitoring-obs/index.mdx rename docs/deploy/config-guides/{monitoring-obs => }/monitoring.md (98%) delete mode 100644 docs/deploy/config-guides/scaling-strategies/multi-node.md create mode 100644 docs/deploy/migration/_category_.json rename docs/deploy/{other => }/migration/archive.md (99%) rename docs/deploy/{other => }/migration/index.md (86%) rename docs/deploy/{other => }/migration/weaviate-1-25.md (99%) rename docs/deploy/{other => }/migration/weaviate-1-30.md (99%) delete mode 100644 docs/deploy/other/migration/_category_.json diff --git a/docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-async-queue.png b/docs/deploy/config-guides/img/weaviate-sample-dashboard-async-queue.png similarity index 100% rename from docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-async-queue.png rename to docs/deploy/config-guides/img/weaviate-sample-dashboard-async-queue.png diff --git a/docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-importing.png b/docs/deploy/config-guides/img/weaviate-sample-dashboard-importing.png similarity index 100% rename from docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-importing.png rename to docs/deploy/config-guides/img/weaviate-sample-dashboard-importing.png diff --git a/docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-lsm.png b/docs/deploy/config-guides/img/weaviate-sample-dashboard-lsm.png similarity index 100% rename from docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-lsm.png rename to docs/deploy/config-guides/img/weaviate-sample-dashboard-lsm.png diff --git a/docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-objects.png b/docs/deploy/config-guides/img/weaviate-sample-dashboard-objects.png similarity index 100% rename from docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-objects.png rename to docs/deploy/config-guides/img/weaviate-sample-dashboard-objects.png diff --git a/docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-startup.png b/docs/deploy/config-guides/img/weaviate-sample-dashboard-startup.png similarity index 100% rename from docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-startup.png rename to docs/deploy/config-guides/img/weaviate-sample-dashboard-startup.png diff --git a/docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-usage.png b/docs/deploy/config-guides/img/weaviate-sample-dashboard-usage.png similarity index 100% rename from docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-usage.png rename to docs/deploy/config-guides/img/weaviate-sample-dashboard-usage.png diff --git a/docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-vector.png b/docs/deploy/config-guides/img/weaviate-sample-dashboard-vector.png similarity index 100% rename from docs/deploy/config-guides/monitoring-obs/img/weaviate-sample-dashboard-vector.png rename to docs/deploy/config-guides/img/weaviate-sample-dashboard-vector.png diff --git a/docs/deploy/config-guides/monitoring-obs/grafana-prometheus.md b/docs/deploy/config-guides/monitoring-obs/grafana-prometheus.md deleted file mode 100644 index be198a1c..00000000 --- a/docs/deploy/config-guides/monitoring-obs/grafana-prometheus.md +++ /dev/null @@ -1,8 +0,0 @@ ---- - -title: Grafana and Prometheus in Production - ---- - -So you've got your Weaviate deployment up and running and have now found yourself wondering about how to collect metrics of your deployment? Fear not, in this document we'll show how to use Grafana agent to scrape your metrics. - diff --git a/docs/deploy/config-guides/monitoring-obs/index.mdx b/docs/deploy/config-guides/monitoring-obs/index.mdx deleted file mode 100644 index 3c355582..00000000 --- a/docs/deploy/config-guides/monitoring-obs/index.mdx +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Monitoring and Observability -sidebar_position: 0 ---- - diff --git a/docs/deploy/config-guides/monitoring-obs/monitoring.md b/docs/deploy/config-guides/monitoring.md similarity index 98% rename from docs/deploy/config-guides/monitoring-obs/monitoring.md rename to docs/deploy/config-guides/monitoring.md index 4fd4d77e..39d14f43 100644 --- a/docs/deploy/config-guides/monitoring-obs/monitoring.md +++ b/docs/deploy/config-guides/monitoring.md @@ -55,7 +55,7 @@ command. In this setup the following components are used: ### Multi-tenancy -When using multi-tenancy, we suggest setting the `PROMETHEUS_MONITORING_GROUP` [environment variable](docs/weaviate/config-refs/env-vars.md) as `true` so that data across all tenants are grouped together for monitoring. +When using multi-tenancy, we suggest setting the `PROMETHEUS_MONITORING_GROUP` [environment variable](docs/deploy/config-guides/env-vars/index.md) as `true` so that data across all tenants are grouped together for monitoring. ## Obtainable Metrics diff --git a/docs/deploy/config-guides/scaling-strategies/index.mdx b/docs/deploy/config-guides/scaling-strategies/index.mdx index 22d01448..8f28d9b8 100644 --- a/docs/deploy/config-guides/scaling-strategies/index.mdx +++ b/docs/deploy/config-guides/scaling-strategies/index.mdx @@ -1,7 +1,7 @@ --- -title: Scaling Overview -sidebar_position: 1 +title: Scaling +sidebar_position: 0 --- @@ -36,12 +36,7 @@ Your deployment will grow beyond the limits of a single machine by distributing - Optimize resource usage across your infrastructure -### Next Steps - -- [High Availability Strategies] -- [Horizontal Scaling] - -#### Further resources +### Further resources - [Concepts: Horizontal Scaling](/docs/weaviate/concepts/cluster.md) diff --git a/docs/deploy/config-guides/scaling-strategies/multi-node.md b/docs/deploy/config-guides/scaling-strategies/multi-node.md deleted file mode 100644 index 456eaca2..00000000 --- a/docs/deploy/config-guides/scaling-strategies/multi-node.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Deploying Highly Available Applications ---- - diff --git a/docs/deploy/faqs/troubleshooting.md b/docs/deploy/faqs/troubleshooting.md index f62a34e9..8a725b8d 100644 --- a/docs/deploy/faqs/troubleshooting.md +++ b/docs/deploy/faqs/troubleshooting.md @@ -4,7 +4,10 @@ title: Deployment Troubleshooting Guide --- -So you've deployed Weaviate and you're fully immersed in the world of vectors when suddenly you encounter a puzzling mystery. This page will serve as your handbook for when things go awry in "Vector Land!" Consider every error message a clue to solving the mystery you're encountering. +So you've deployed Weaviate and you're fully immersed in the world of vectors when suddenly you encounter a puzzling mystery. This page will serve as your handbook for when things go awry in "Vector Land!" + +Consider every error message a clue to solving the mystery you're encountering. The [LOG_LEVEL](/deploy/config-guides/env-vars#LOG_LEVEL) environment variable helps you to solve any mysteries you encounter. The various levels of logging will allow you to right-size the precise amount of information you need to solve any Vector Land mysteries. + ## Common issues and solutions @@ -54,9 +57,26 @@ To confirm and identify the issue, you'll want to first run the same query multi Check your settings to check if you have asynchronous replication enabled. If `async_replication_disabled` is set to "true" then you'll need to set that variable to "false." Once it is enabled, the logs will show messages that indicate successful peers checks and synchronization for the nodes. Additionally, test the [live and ready REST endpoints](/docs/weaviate/api/rest#tag/well-known/GET/.well-known/live) and check the network configuration of the nodes. -## Further reading +### You've downgraded and now your clusters won't reach the `Ready` state. + +
    + + Answer + +#### Identifying the issue + +If you have a multi-node instance running `1.28.13+`, `1.29.5+`, or `1.30.2+` and have downgraded to a `v1.27.x` version earlier than `1.27.26`. + +#### Resolving the issue + +If you need to downgrade Weaviate to `v1.27.x`, use `1.27.26` or higher. + +- [Migration guides](../migration/index.md) + +
    + -- [LOG_LEVEL](insert env vars `log_level`) +As you continue your adventures in Vector Land, remember that even the most seasoned vector detectives encounter mysterious cases from time to time. Behind every error message lies not just a problem, but the clue you need to run Weaviate in its most optimal form! ## Questions and feedback diff --git a/docs/deploy/installation-guides/aws-cli.md b/docs/deploy/installation-guides/aws-cli.md index 2df72178..d4932de1 100644 --- a/docs/deploy/installation-guides/aws-cli.md +++ b/docs/deploy/installation-guides/aws-cli.md @@ -28,28 +28,18 @@ eksctl version To create your cluster, prepare a `yaml` file that with a name of your choosing (e.g. `eks-cluster.yaml`) -```bash +```yaml apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: - name: 'your-cluster-name' # Replace with your desired cluster name - region: 'your-region' # Replace with your desired AWS region - version: "1.33" # Kubernetes version - -iam: - withOIDC: true # Enable IAM OIDC provider + name: + region: + version: "1.31" - serviceAccounts: - - metadata: - name: aws-load-balancer-controller - namespace: kube-system - wellKnownPolicies: - awsLoadBalancerController: true - managedNodeGroups: - name: node-group-name labels: { role: worker } - instanceType: t3.large # Choose an appropriate instance type + instanceType: t3.large # Choose your instance type desiredCapacity: 3 # Number of nodes minSize: 2 # Minimum number of nodes for autoscaling maxSize: 5 # Maximum number of nodes for autoscaling @@ -74,9 +64,10 @@ addons: This creates an EKS cluster within your specified region with an autoscaling node group. There are 3 nodes for high availability and having autoscaling enabled allows for the cluster to dynamically adjust resources based on demand. -Run this command to create your EKS cluster: -``` -eksctl create cluster -f your-file-name.yaml +#### Run this command to create your EKS cluster: + +```bash +eksctl create cluster -f ``` #### Enable `kubectl` to interact with the newly created cluster: @@ -91,10 +82,10 @@ aws eks --region update-kubeconfig --name kubectl get nodes ``` -#### Step 2: Add Storage Class +### Step 2: Add Storage Class After creating your cluster and verifying that you can interact with it , you'll need to create a `storageclass.yaml` file: -``` +```yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: @@ -108,12 +99,15 @@ volumeBindingMode: Immediate allowVolumeExpansion: true ``` -After creating the storage class, apply it: ```kubectl apply -f .yaml``` +After creating the storage class, apply it: +```bash +kubectl apply -f .yaml +``` #### Verify your storage class and has been created and applied -``` +```bash kubectl get sc ``` @@ -148,13 +142,10 @@ helm upgrade --install weaviate weaviate/weaviate \ #### Verify your deployment ```bash -kubectl get pods +kubectl get pods -n weaviate ``` - -### Next Steps: [Connecting to Weaviate](docs/weaviate/connections/index.mdx) - -### Further Resources +## Further Resources - [Persistent storage for Kubernetes](https://aws.amazon.com/blogs/storage/persistent-storage-for-kubernetes/) diff --git a/docs/deploy/migration/_category_.json b/docs/deploy/migration/_category_.json new file mode 100644 index 00000000..aecbb8a4 --- /dev/null +++ b/docs/deploy/migration/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Migration guides", + "position": 8 +} diff --git a/docs/deploy/other/migration/archive.md b/docs/deploy/migration/archive.md similarity index 99% rename from docs/deploy/other/migration/archive.md rename to docs/deploy/migration/archive.md index 87117745..786f1984 100644 --- a/docs/deploy/other/migration/archive.md +++ b/docs/deploy/migration/archive.md @@ -1,7 +1,7 @@ --- title: Archive -sidebar_position: 90 image: og/docs/more-resources.jpg +sidebar_position: 10 # tags: ['migration'] --- diff --git a/docs/deploy/other/migration/index.md b/docs/deploy/migration/index.md similarity index 86% rename from docs/deploy/other/migration/index.md rename to docs/deploy/migration/index.md index 28ff4e1d..dd1c0b3e 100644 --- a/docs/deploy/other/migration/index.md +++ b/docs/deploy/migration/index.md @@ -1,6 +1,6 @@ --- title: Migration Guide -sidebar_position: 10 +sidebar_position: 0 image: og/docs/more-resources.jpg # tags: ['migration'] --- @@ -59,6 +59,16 @@ If you are upgrading from a version before `v1.23.13`, we recommend that you: 2. Upgrade to at least `v1.23.13` (preferably to `v1.23.16`) or higher, using the [general upgrade instructions above](#general-upgrade-instructions). 3. Restore your backup to the upgraded instance. +## Downgrades + +### RAFT Snapshots (v1.28.13+, v1.29.5+, v1.30.2+) + +Multi-node instances of Weaviate running `1.28.13+`, `1.29.5+`, or `1.30.2+` may experience problems if downgraded to a `v1.27.x` version earlier than `1.27.26`. The cluster may not reach a **Ready** state due to a change in the way that RAFT snapshots are stored in the database. + +A fix for this issue will be released with `1.27.26`, which safely handles the downgrade path to `1.27`. + +If you need to downgrade Weaviate to `v1.27.x`, use `1.27.26` or higher. + ## Questions and feedback import DocsFeedback from '/_includes/docs-feedback.mdx'; diff --git a/docs/deploy/other/migration/weaviate-1-25.md b/docs/deploy/migration/weaviate-1-25.md similarity index 99% rename from docs/deploy/other/migration/weaviate-1-25.md rename to docs/deploy/migration/weaviate-1-25.md index 501334f7..2344fbeb 100644 --- a/docs/deploy/other/migration/weaviate-1-25.md +++ b/docs/deploy/migration/weaviate-1-25.md @@ -1,6 +1,6 @@ --- title: 1.25 (For Kubernetes users) -sidebar_position: 10 +sidebar_position: 2 image: og/docs/more-resources.jpg # tags: ['migration'] --- diff --git a/docs/deploy/other/migration/weaviate-1-30.md b/docs/deploy/migration/weaviate-1-30.md similarity index 99% rename from docs/deploy/other/migration/weaviate-1-30.md rename to docs/deploy/migration/weaviate-1-30.md index f939599d..f26bbb46 100644 --- a/docs/deploy/other/migration/weaviate-1-30.md +++ b/docs/deploy/migration/weaviate-1-30.md @@ -1,7 +1,7 @@ --- title: BlockMax WAND migration guide sidebar_label: 1.30 (BlockMax WAND migration) -sidebar_position: 9 +sidebar_position: 1 image: og/docs/more-resources.jpg --- diff --git a/docs/deploy/other/migration/_category_.json b/docs/deploy/other/migration/_category_.json deleted file mode 100644 index d2921f4f..00000000 --- a/docs/deploy/other/migration/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Migration guide", - "position": 8 -} diff --git a/secondaryNavbar.js b/secondaryNavbar.js index 8611c672..880d3494 100644 --- a/secondaryNavbar.js +++ b/secondaryNavbar.js @@ -72,7 +72,7 @@ const secondaryNavbarItems = { /*{ label: "Scaling Strategies", link: "/docs/deploy/scaling-strategies", sidebar: "deployScalingSidebar"},*/ /*{ label: "Monitoring and Observability", link: "/docs/deploy/monitoring-obs", sidebar: "deployObservabilitySidebar"},*/ { label: "FAQs", link: "/docs/deploy/faqs", sidebar: "deployFaqsSidebar"}, - { label: "Other", link: "/docs/deploy/other", sidebar: "deployOtherSidebar"}, + { label: "Migration", link: "/docs/deploy/migration", sidebar: "deployMigrationSidebar"}, ] }, diff --git a/sidebars.js b/sidebars.js index 5b52c53f..b7d97a97 100644 --- a/sidebars.js +++ b/sidebars.js @@ -812,23 +812,10 @@ const sidebars = { }, ], - deployOtherSidebar: [ + deployMigrationSidebar: [ { type: "autogenerated", - dirName: "deploy/other", - }, - { - type: "category", - label: "Migration", - link: { - type: "doc", - id: "deploy/other/migration/index", - }, - items: [ - "deploy/other/migration/weaviate-1-30", - "deploy/other/migration/weaviate-1-25", - "deploy/other/migration/archive", - ], + dirName: "deploy/migration" }, ], agentsSidebar: [ From d5a1dcc884de6598ddf43117583d9a84cf6f3102 Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Wed, 14 May 2025 14:13:00 -0400 Subject: [PATCH 34/39] sidebar changes --- docs/deploy/config-guides/configuring-rbac.md | 2 +- .../horizontal-scaling.mdx | 18 +++++-- .../imgs => img}/horiz-scaling.png | Bin docs/deploy/config-guides/monitoring.md | 1 - .../scaling-strategies/index.mdx | 48 ------------------ .../installation-guides/aws-installation.md | 6 ++- 6 files changed, 19 insertions(+), 56 deletions(-) rename docs/deploy/config-guides/{scaling-strategies => }/horizontal-scaling.mdx (91%) rename docs/deploy/config-guides/{scaling-strategies/imgs => img}/horiz-scaling.png (100%) delete mode 100644 docs/deploy/config-guides/scaling-strategies/index.mdx diff --git a/docs/deploy/config-guides/configuring-rbac.md b/docs/deploy/config-guides/configuring-rbac.md index 1cf313cb..15b1b54a 100644 --- a/docs/deploy/config-guides/configuring-rbac.md +++ b/docs/deploy/config-guides/configuring-rbac.md @@ -1,5 +1,5 @@ --- -title: Enable and configure RBAC +title: RBAC sidebar_label: RBAC image: og/docs/configuration.jpg # tags: ['rbac', 'roles', 'configuration', 'authorization'] diff --git a/docs/deploy/config-guides/scaling-strategies/horizontal-scaling.mdx b/docs/deploy/config-guides/horizontal-scaling.mdx similarity index 91% rename from docs/deploy/config-guides/scaling-strategies/horizontal-scaling.mdx rename to docs/deploy/config-guides/horizontal-scaling.mdx index fd20d426..d7356a9c 100644 --- a/docs/deploy/config-guides/scaling-strategies/horizontal-scaling.mdx +++ b/docs/deploy/config-guides/horizontal-scaling.mdx @@ -1,4 +1,5 @@ --- +sidebar_label: Horizontal scaling title: Horizontal Scaling Deployment Strategies --- @@ -13,11 +14,16 @@ import JavaCode from '!!raw-loader!/_includes/code/howto/java/src/test/java/io/w import GoCode from '!!raw-loader!/_includes/code/howto/go/docs/manage-data.classes_test.go'; -This document provides detailed implementation guidance for horizontally scaling your Weaviate deployment. +Weaviate offers two complementary superpowers for scaling your deployment: sharding and replication. +Sharding divides your data across multiple nodes, allowing you to handle datasets far larger than a single machine could process. +Meanwhile, replication creates redundant copies of your data, ensuring high availability even when individual nodes fail or need maintenance. +While each scaling method shines on its own, the true magic happens when they join forces. + +Let's explore how you can harness these capabilities to build a deployment that's both massive in scale and rock-solid in reliability! ## Scaling Methods -![Sharding vs Replication](./imgs/horiz-scaling.png) +![Sharding vs Replication](./img/horiz-scaling.png) @@ -359,10 +365,12 @@ http://localhost:8080/v1/schema
    -#### Sharding and Replication: The Dynamic Duo - -In a highly available environment, combining sharding and replication leverages the power and capabilities of both methods to be a dynamic duo that keeps your deployment highly available. +In a highly available environment, combining sharding and replication leverages the power and +capabilities of both methods to be a dynamic duo that keeps your deployment highly available. +If given the opportunity, those two techniques will be your deployment's dynamic duo. +Specifically using the [`ASYNC_REPLICATION` environment variables](./async-rep.md) introduced in the 1.29 release +will allow you to unleash the full power of horizontal scaling! ## Questions and feedback diff --git a/docs/deploy/config-guides/scaling-strategies/imgs/horiz-scaling.png b/docs/deploy/config-guides/img/horiz-scaling.png similarity index 100% rename from docs/deploy/config-guides/scaling-strategies/imgs/horiz-scaling.png rename to docs/deploy/config-guides/img/horiz-scaling.png diff --git a/docs/deploy/config-guides/monitoring.md b/docs/deploy/config-guides/monitoring.md index 39d14f43..6525945b 100644 --- a/docs/deploy/config-guides/monitoring.md +++ b/docs/deploy/config-guides/monitoring.md @@ -1,6 +1,5 @@ --- title: Monitoring -sidebar_position: 50 image: og/docs/configuration.jpg # tags: ['configuration', 'operations', 'monitoring', 'observability'] --- diff --git a/docs/deploy/config-guides/scaling-strategies/index.mdx b/docs/deploy/config-guides/scaling-strategies/index.mdx deleted file mode 100644 index 8f28d9b8..00000000 --- a/docs/deploy/config-guides/scaling-strategies/index.mdx +++ /dev/null @@ -1,48 +0,0 @@ ---- - -title: Scaling -sidebar_position: 0 - ---- - -Interested in taking a journey to Weaviate's wonderful world of horizontal scaling and learn about the various scaling strategies available for your deployments? As your database grows from an experimental playground to a mission-critical infrastructure, you'll need strategies to scale effectively. So don't worry, we've got you covered! - -### Why Scaling Matters - -Vector databases face unique scaling challenges and as your data grows: - -- Memory requirements increase dramatically with vector dimensions and dataset size -- Query performance becomes critical as user traffic grows -- System reliability becomes non-negotiable for production deployments -- Cost optimization becomes increasingly important - - -### High Availability: Downtime is not an option - -A highly available architecture ensures that your deployment is operational even when individual components fails, this architecture is essential for: - -- Mission-critical applications where search functionality cannot go offline -- Zero-downtime maintenance for seamless upgrades and updates -- Resilience against hardware failures or cloud provider issues -- Consistent performance even during peak traffic periods - -### Horizontal Scaling: Growing out, not up - -Your deployment will grow beyond the limits of a single machine by distributing your workload across multiple nodes by using horizontal scaling. Implementing this will allow your deployment to: - -- Handle larger datasets that exceed single-machine memory -- Improve query throughput by distributing read operations -- Accelerate imports through parallel processing -- Optimize resource usage across your infrastructure - - -### Further resources - -- [Concepts: Horizontal Scaling](/docs/weaviate/concepts/cluster.md) - - -## Questions and feedback - -import DocsFeedback from '/_includes/docs-feedback.mdx'; - - \ No newline at end of file diff --git a/docs/deploy/installation-guides/aws-installation.md b/docs/deploy/installation-guides/aws-installation.md index 185efc58..8af042d5 100644 --- a/docs/deploy/installation-guides/aws-installation.md +++ b/docs/deploy/installation-guides/aws-installation.md @@ -44,7 +44,7 @@ From there you will be prompted to set up your account on [Weaviate Cloud](docs ::: -## Billing +### Billing You will be charged for Weaviate directly by AWS. @@ -54,6 +54,10 @@ If you cancel your Weaviate AWS marketplace subscription, your Weaviate organiza ::: +### Other marketplace offerings + +- [Weaviate Kubernetes Cluster](https://aws.amazon.com/marketplace/pp/prodview-cicacyv63r43i?sr=0-1&ref_=beagle&applicationId=AWSMPContessa) this product uses a CloudFormation template to create an EKS cluster with Weaviate already installed. + ## Questions and feedback import DocsFeedback from '/_includes/docs-feedback.mdx'; From 68b7297ab2b481d45f768ad8cb3634202c9c84bf Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Thu, 15 May 2025 16:05:29 -0400 Subject: [PATCH 35/39] broken link fixes --- _includes/collections-count-limit.mdx | 2 +- _includes/dynamic-index-async-req.mdx | 2 +- .../deployment/k8s/30_setup_weaviate.mdx | 2 +- docs/academy/deployment/k8s/90_next_steps.mdx | 2 +- .../academy/js/_snippets/intro_next_steps.mdx | 2 +- .../js/_snippets/intro_next_steps_js.mdx | 2 +- .../academy/py/_snippets/intro_next_steps.mdx | 2 +- .../101_hello_weaviate/90_next_steps.mdx | 2 +- docs/contributor-guide/weaviate-core/setup.md | 3 +- docs/deploy/config-guides/async-rep.md | 6 ++-- docs/deploy/config-guides/authentication.md | 4 +-- docs/deploy/config-guides/authorization.md | 8 ++--- docs/deploy/config-guides/backups.md | 6 ++-- docs/deploy/config-guides/configuring-rbac.md | 6 ++-- docs/deploy/config-guides/env-vars/index.md | 36 +++++++++---------- .../config-guides/env-vars/runtime-config.md | 8 ++++- .../config-guides/horizontal-scaling.mdx | 2 +- docs/deploy/config-guides/modules.md | 4 +-- docs/deploy/config-guides/persistence.md | 2 +- docs/deploy/config-guides/replication.md | 4 +-- docs/deploy/faqs/troubleshooting.md | 2 +- .../docker-installation.md | 6 ++-- .../installation-guides/k8s-installation.md | 6 ++-- docs/deploy/production/Kubernetes/k8s-poc.md | 2 +- docs/weaviate/api/grpc.md | 2 +- docs/weaviate/concepts/cluster.md | 2 +- docs/weaviate/concepts/filtering.md | 2 +- .../cluster-architecture.md | 2 +- .../replication-architecture/consistency.md | 2 +- docs/weaviate/concepts/resources.md | 6 ++-- .../weaviate/concepts/search/vector-search.md | 2 +- docs/weaviate/configuration/authentication.md | 2 +- docs/weaviate/configuration/index.mdx | 2 +- docs/weaviate/configuration/modules.md | 2 +- docs/weaviate/configuration/monitoring.md | 2 +- docs/weaviate/configuration/rbac/index.mdx | 6 ++-- docs/weaviate/configuration/replication.md | 4 +-- docs/weaviate/installation/docker-compose.md | 6 ++-- docs/weaviate/installation/kubernetes.md | 4 +-- .../manage-collections/vector-config.mdx | 2 +- docs/weaviate/manage-objects/delete.mdx | 4 +-- .../use_google_auth_instructions.mdx | 2 +- docs/weaviate/more-resources/faq.md | 2 +- .../collections-scaling-limits.mdx | 4 +-- docs/weaviate/tutorials/import.md | 2 +- 45 files changed, 94 insertions(+), 89 deletions(-) diff --git a/_includes/collections-count-limit.mdx b/_includes/collections-count-limit.mdx index 2c9dd21c..1079633a 100644 --- a/_includes/collections-count-limit.mdx +++ b/_includes/collections-count-limit.mdx @@ -1,3 +1,3 @@ :::info -To ensure optimal performance, Weaviate **limits the number of collections per instance**. The default limit is `100` collections and it can be adjusted via the [`MAXIMUM_ALLOWED_COLLECTIONS_COUNT`](/docs/weaviate/config-refs/env-vars) environment variable. +To ensure optimal performance, Weaviate **limits the number of collections per instance**. The default limit is `100` collections and it can be adjusted via the [`MAXIMUM_ALLOWED_COLLECTIONS_COUNT`](/docs/deploy/config-guides/env-vars/index.md) environment variable. ::: \ No newline at end of file diff --git a/_includes/dynamic-index-async-req.mdx b/_includes/dynamic-index-async-req.mdx index 2a3d3d68..5a230a7d 100644 --- a/_includes/dynamic-index-async-req.mdx +++ b/_includes/dynamic-index-async-req.mdx @@ -1,3 +1,3 @@ :::info Dynamic index requires `ASYNC_INDEXING` -Dynamic indexes require asynchronous indexing. To enable asynchronous indexing in a self-hosted Weaviate instance, set the `ASYNC_INDEXING` [environment variable](/docs/weaviate/config-refs/env-vars#general) to `true`. If your instance is hosted in Weaviate Cloud, use the Weaviate Cloud console to enable asynchronous indexing. +Dynamic indexes require asynchronous indexing. To enable asynchronous indexing in a self-hosted Weaviate instance, set the `ASYNC_INDEXING` [environment variable](/docs/deploy/config-guides/env-vars/index.md#general) to `true`. If your instance is hosted in Weaviate Cloud, use the Weaviate Cloud console to enable asynchronous indexing. ::: \ No newline at end of file diff --git a/docs/academy/deployment/k8s/30_setup_weaviate.mdx b/docs/academy/deployment/k8s/30_setup_weaviate.mdx index dbb25836..f1259e1f 100644 --- a/docs/academy/deployment/k8s/30_setup_weaviate.mdx +++ b/docs/academy/deployment/k8s/30_setup_weaviate.mdx @@ -139,7 +139,7 @@ Congratulations! You have successfully deployed Weaviate on your local Kubernete To upgrade to `1.25` or higher from a pre-`1.25` version, you must delete the deployed `StatefulSet`, update the helm chart to version `17.0.0` or higher, and re-deploy Weaviate. -See the [1.25 migration guide for Kubernetes](/docs/weaviate/more-resources/migration/weaviate-1-25) for more details. +See the [1.25 migration guide for Kubernetes](docs/deploy/migration/weaviate-1-25.md) for more details. ::: ## Questions and feedback diff --git a/docs/academy/deployment/k8s/90_next_steps.mdx b/docs/academy/deployment/k8s/90_next_steps.mdx index bbe15bb2..beded78a 100644 --- a/docs/academy/deployment/k8s/90_next_steps.mdx +++ b/docs/academy/deployment/k8s/90_next_steps.mdx @@ -31,7 +31,7 @@ If you have replication configured, you can apply [tunable consistency](/docs/we - How-to guides - - The [How-to: Manage collections](/docs/weaviate/manage-collections/index.mdx) and [How-to: Manage objects](/docs/weaviate/manage-objects/index.mdx) guides show how to perform data operations (i.e. create, read, update, delete collections and objects within them).. - [How-to: search](/docs/weaviate/search/index.mdx): Code examples for all types of search operations. - - [How-to: configure Weaviate](/docs/weaviate/configuration/index.mdx): Guides for configuring Weaviate, such as [PQ](/docs/weaviate/configuration/compression/pq-compression.md) and [BQ](/docs/weaviate/configuration/compression/bq-compression.md) compression, [backups](/docs/weaviate/configuration/backups.md) and [replication](/docs/weaviate/configuration/replication.md). + - [How-to: configure Weaviate](/docs/weaviate/configuration/index.mdx): Guides for configuring Weaviate, such as [PQ](/docs/weaviate/configuration/compression/pq-compression.md) and [BQ](/docs/weaviate/configuration/compression/bq-compression.md) compression, [backups](docs/deploy/config-guides/backups.md) and [replication](/docs/weaviate/configuration/replication.md). - [Concepts guides](/docs/weaviate/concepts/index.md): Guides for understanding Weaviate's architecture and concepts. - [API reference](/docs/weaviate/api/index.mdx): Detailed information about Weaviate's APIs. diff --git a/docs/academy/js/_snippets/intro_next_steps.mdx b/docs/academy/js/_snippets/intro_next_steps.mdx index df7f9d1f..0fb1baad 100644 --- a/docs/academy/js/_snippets/intro_next_steps.mdx +++ b/docs/academy/js/_snippets/intro_next_steps.mdx @@ -9,7 +9,7 @@ Some of our more popular resources include: - How-to guides - The [How-to: Manage collections](/docs/weaviate/manage-collections/index.mdx) and [How-to: Manage objects](/docs/weaviate/manage-objects/index.mdx) guides show how to perform data operations (i.e. create, read, update, delete collections and objects within them).. - [How-to: search](/docs/weaviate/search/index.mdx): Code examples for all types of search operations. - - [How-to: configure Weaviate](/docs/weaviate/configuration/index.mdx): Guides for configuring Weaviate, such as [PQ](/docs/weaviate/configuration/compression/pq-compression.md) and [BQ](/docs/weaviate/configuration/compression/bq-compression.md) compression, [backups](/docs/weaviate/configuration/backups.md) and [replication](/docs/weaviate/configuration/replication.md). + - [How-to: configure Weaviate](/docs/weaviate/configuration/index.mdx): Guides for configuring Weaviate, such as [PQ](/docs/weaviate/configuration/compression/pq-compression.md) and [BQ](/docs/weaviate/configuration/compression/bq-compression.md) compression, [backups](docs/deploy/config-guides/backups.md) and [replication](/docs/weaviate/configuration/replication.md). - [Concepts guides](/docs/weaviate/concepts/index.md): Guides for understanding Weaviate's architecture and concepts. - [API reference](/docs/weaviate/api/index.mdx): Detailed information about Weaviate's APIs. diff --git a/docs/academy/js/_snippets/intro_next_steps_js.mdx b/docs/academy/js/_snippets/intro_next_steps_js.mdx index 854b7b3a..aed9bb8e 100644 --- a/docs/academy/js/_snippets/intro_next_steps_js.mdx +++ b/docs/academy/js/_snippets/intro_next_steps_js.mdx @@ -9,7 +9,7 @@ Some of our more popular resources include: - How-to guides - The [How-to: Manage collections](/docs/weaviate/manage-collections/index.mdx) and [How-to: Manage objects](/docs/weaviate/manage-objects/index.mdx) guides show how to perform data operations (i.e. create, read, update, delete collections and objects within them).. - [How-to: search](/docs/weaviate/search/index.mdx): Code examples for all types of search operations. - - [How-to: configure Weaviate](/docs/weaviate/configuration/index.mdx): Guides for configuring Weaviate, such as [PQ](/docs/weaviate/configuration/compression/pq-compression.md) and [BQ](/docs/weaviate/configuration/compression/bq-compression.md) compression, [backups](/docs/weaviate/configuration/backups.md) and [replication](/docs/weaviate/configuration/replication.md). + - [How-to: configure Weaviate](/docs/weaviate/configuration/index.mdx): Guides for configuring Weaviate, such as [PQ](/docs/weaviate/configuration/compression/pq-compression.md) and [BQ](/docs/weaviate/configuration/compression/bq-compression.md) compression, [backups](docs/deploy/config-guides/backups.md) and [replication](/docs/weaviate/configuration/replication.md). - [Concepts guides](/docs/weaviate/concepts/index.md): Guides for understanding Weaviate's architecture and concepts. - [API reference](/docs/weaviate/api/index.mdx): Detailed information about Weaviate's APIs. diff --git a/docs/academy/py/_snippets/intro_next_steps.mdx b/docs/academy/py/_snippets/intro_next_steps.mdx index 02bf0dbf..4c52713b 100644 --- a/docs/academy/py/_snippets/intro_next_steps.mdx +++ b/docs/academy/py/_snippets/intro_next_steps.mdx @@ -9,7 +9,7 @@ Some of our more popular resources include: - How-to guides - The [How-to: Manage collections](/docs/weaviate/manage-collections/index.mdx) and [How-to: Manage objects](/docs/weaviate/manage-objects/index.mdx) guides show how to perform data operations (i.e. create, read, update, delete collections and objects within them).. - [How-to: search](/docs/weaviate/search/index.mdx): Code examples for all types of search operations. - - [How-to: configure Weaviate](/docs/weaviate/configuration/index.mdx): Guides for configuring Weaviate, such as [PQ](/docs/weaviate/configuration/compression/pq-compression.md) and [BQ](/docs/weaviate/configuration/compression/bq-compression.md) compression, [backups](/docs/weaviate/configuration/backups.md) and [replication](/docs/weaviate/configuration/replication.md). + - [How-to: configure Weaviate](/docs/weaviate/configuration/index.mdx): Guides for configuring Weaviate, such as [PQ](/docs/weaviate/configuration/compression/pq-compression.md) and [BQ](/docs/weaviate/configuration/compression/bq-compression.md) compression, [backups](docs/deploy/config-guides/backups.md) and [replication](/docs/weaviate/configuration/replication.md). - [Concepts guides](/docs/weaviate/concepts/index.md): Guides for understanding Weaviate's architecture and concepts. - [API reference](/docs/weaviate/api/index.mdx): Detailed information about Weaviate's APIs. diff --git a/docs/academy/theory/101_hello_weaviate/90_next_steps.mdx b/docs/academy/theory/101_hello_weaviate/90_next_steps.mdx index 00f90bc0..6ddc7d52 100644 --- a/docs/academy/theory/101_hello_weaviate/90_next_steps.mdx +++ b/docs/academy/theory/101_hello_weaviate/90_next_steps.mdx @@ -23,7 +23,7 @@ And for TypeScript/JavaScript: - How-to guides - The [How-to: Manage collections](/docs/weaviate/manage-collections/index.mdx) and [How-to: Manage objects](/docs/weaviate/manage-objects/index.mdx) guides show how to perform data operations (i.e. create, read, update, delete collections and objects within them).. - [How-to: search](/docs/weaviate/search/index.mdx): Code examples for all types of search operations. - - [How-to: configure Weaviate](/docs/weaviate/configuration/index.mdx): Guides for configuring Weaviate, such as [PQ](/docs/weaviate/configuration/compression/pq-compression.md) and [BQ](/docs/weaviate/configuration/compression/bq-compression.md) compression, [backups](/docs/weaviate/configuration/backups.md) and [replication](/docs/weaviate/configuration/replication.md). + - [How-to: configure Weaviate](/docs/weaviate/configuration/index.mdx): Guides for configuring Weaviate, such as [PQ](/docs/weaviate/configuration/compression/pq-compression.md) and [BQ](/docs/weaviate/configuration/compression/bq-compression.md) compression, [backups](docs/deploy/config-guides/backups.md) and [replication](/docs/weaviate/configuration/replication.md). - [Concepts guides](/docs/weaviate/concepts/index.md): Guides for understanding Weaviate's architecture and concepts. - [API reference](/docs/weaviate/api/index.mdx): Detailed information about Weaviate's APIs. diff --git a/docs/contributor-guide/weaviate-core/setup.md b/docs/contributor-guide/weaviate-core/setup.md index 0174aa37..fe625c50 100644 --- a/docs/contributor-guide/weaviate-core/setup.md +++ b/docs/contributor-guide/weaviate-core/setup.md @@ -31,8 +31,7 @@ To run the server locally with the OpenAI module. The default configuration is `local-development` which will run the server locally with the `text2vec-contextionary` and `backup-filesystem` modules. -You can also create your own configuration. For instance, you can clone an entry (`local-all-openai-cohere-google` is a good start) and add the required [environment variables](../../weaviate/config-refs/env-vars/index.md). - +You can also create your own configuration. For instance, you can clone an entry (`local-all-openai-cohere-google` is a good start) and add the required [environment variables](docs/deploy/config-guides/env-vars/index.md). ## Running with Docker diff --git a/docs/deploy/config-guides/async-rep.md b/docs/deploy/config-guides/async-rep.md index 3bed2b78..34ac5ffb 100644 --- a/docs/deploy/config-guides/async-rep.md +++ b/docs/deploy/config-guides/async-rep.md @@ -166,11 +166,11 @@ Sets the maximum time allowed for a single propagation request (sending actual o ### Further Resources -[Concepts: Replication](https://weaviate.io/developers/weaviate/concepts/replication-architecture/consistency) +- [Concepts: Replication](https://weaviate.io/developers/weaviate/concepts/replication-architecture/consistency) -[Replication How-To](https://weaviate.io/developers/weaviate/configuration/replication#async-replication-settings) +- [Replication How-To](https://weaviate.io/developers/weaviate/configuration/replication#async-replication-settings) -[Environment Variables](https://weaviate.io/developers/weaviate/config-refs/env-vars#async-replication) +- [Environment Variables](docs/deploy/config-guides/env-vars/index.md#async-replication) ## Questions and feedback diff --git a/docs/deploy/config-guides/authentication.md b/docs/deploy/config-guides/authentication.md index 783a1f5f..89bc07df 100644 --- a/docs/deploy/config-guides/authentication.md +++ b/docs/deploy/config-guides/authentication.md @@ -66,7 +66,7 @@ Note that API key and OIDC authentication can be both enabled at the same time. The way to configure authentication differs by your deployment method, depending on whether you are running Weaviate in Docker or Kubernetes. Below, we provide examples for both. :::info What about Weaviate Cloud (WCD)? -For Weaviate Cloud (WCD) instances, authentication is pre-configured with OIDC and API key access. You can [authenticate against Weaviate](../connections/connect-cloud.mdx) with your WCD credentials using OIDC, or [with API keys](/docs/cloud/platform/manage-api-keys). +For Weaviate Cloud (WCD) instances, authentication is pre-configured with OIDC and API key access. You can [authenticate against Weaviate](/docs/weaviate/connections/connect-cloud.mdx) with your WCD credentials using OIDC, or [with API keys](/docs/cloud/platform/manage-api-keys). ::: ## API Key Authentication @@ -329,7 +329,7 @@ authentication: ## Further resources - [Configuration: Authorization and RBAC](./authorization.md) -- [References: Environment variables / Authentication and Authorization](../config-refs/env-vars.md#authentication-and-authorization) +- [References: Environment variables / Authentication and Authorization](/docs/deploy/config-guides/env-vars#authentication-and-authorization) ## Questions and feedback diff --git a/docs/deploy/config-guides/authorization.md b/docs/deploy/config-guides/authorization.md index 51711aac..58e5c776 100644 --- a/docs/deploy/config-guides/authorization.md +++ b/docs/deploy/config-guides/authorization.md @@ -78,7 +78,7 @@ In the Admin list authorization scheme, [anonymous users](#anonymous-users) can The way to configure authorization differs by your deployment method, depending on whether you are running Weaviate in Docker or Kubernetes. Below, we provide examples for both. :::info What about Weaviate Cloud (WCD)? -For Weaviate Cloud (WCD) instances, authorization is pre-configured with Admin list access. You can [authenticate against Weaviate](../connections/connect-cloud.mdx) with your WCD credentials using OIDC, or [with admin or read-only API keys](/docs/cloud/platform/manage-api-keys). +For Weaviate Cloud (WCD) instances, authorization is pre-configured with Admin list access. You can [authenticate against Weaviate](/docs/weaviate/connections/connect-cloud.mdx) with your WCD credentials using OIDC, or [with admin or read-only API keys](/docs/cloud/platform/manage-api-keys).
    RBAC access will be available in WCD in a future release. @@ -92,7 +92,7 @@ Role-based access control (RBAC) is generally available in Weaviate from version Role-based access control (RBAC) is a method of restricting access to resources based on the roles of users. In Weaviate, RBAC allows you to define **roles** and assign **permissions** to those roles. Users can then be assigned to roles, and inherit the permissions associated with those roles. -Check out the dedicated **[RBAC documentation](./rbac/index.mdx)** for instructions on how to [configure RBAC](./rbac/configuration.md) in your Weaviate instance and examples on how to [manage roles an users](./rbac/manage-roles.mdx). +Check out the dedicated **[RBAC documentation](/docs/weaviate/configuration/rbac/index.mdx)** for instructions on how to [configure RBAC](/docs/deploy/config-guides/configuring-rbac.md) in your Weaviate instance and examples on how to [manage roles an users](/docs/weaviate/configuration/rbac/manage-roles.mdx). ## Admin list @@ -249,8 +249,8 @@ Weaviate can be configured to provide undifferentiated access, by disabling auth ## Further resources - [Configuration: Authentication](./authentication.md) -- [Configuration: RBAC](./rbac/index.mdx) -- [References: Environment variables / Authentication and Authorization](../config-refs/env-vars/index.md#authentication-and-authorization) +- [Configuration: RBAC](/docs/weaviate/configuration/rbac/index.mdx) +- [References: Environment variables / Authentication and Authorization](docs/deploy/config-guides/env-vars/index.md#authentication-and-authorization) ## Questions and feedback diff --git a/docs/deploy/config-guides/backups.md b/docs/deploy/config-guides/backups.md index d2ef9780..7ee6f17a 100644 --- a/docs/deploy/config-guides/backups.md +++ b/docs/deploy/config-guides/backups.md @@ -27,8 +27,8 @@ Weaviate's Backup feature is designed to work natively with cloud technology. Mo :::caution Important backup considerations -- **Version Requirements**: If you are running Weaviate `v1.23.12` or older, you must [update](../more-resources/migration/index.md) to `v1.23.13` or higher before restoring a backup to prevent data corruption. -- **[Multi-tenancy](../concepts/data.md#multi-tenancy) limitations**: Backups will only include `active` tenants. `Inactive` or `offloaded` tenants in multi-tenant collections will not be included. Be sure to [activate](../manage-collections/multi-tenancy.mdx#manage-tenant-states) any required tenants before creating a backup. +- **Version Requirements**: If you are running Weaviate `v1.23.12` or older, you must [update](/docs/deploy/migration/index.md) to `v1.23.13` or higher before restoring a backup to prevent data corruption. +- **[Multi-tenancy](docs/weaviate/concepts/data.md#multi-tenancy) limitations**: Backups will only include `active` tenants. `Inactive` or `offloaded` tenants in multi-tenant collections will not be included. Be sure to [activate](docs/weaviate/manage-collections/multi-tenancy.mdx#manage-tenant-states) any required tenants before creating a backup. ::: ## Backup Quickstart @@ -643,7 +643,7 @@ These values are available under the `backups` key in the `values.yaml` file. Re The backup process is designed to be minimally invasive to a running setup. Even on very large setups, where terabytes of data need to be copied, Weaviate stays available during backup. It even accepts write requests while a backup process is running. This sections explains how backups work under the hood and why Weaviate can safely accept writes while a backup is copied. -Weaviate uses a custom [LSM Store](../concepts/storage.md#object-and-inverted-index-store) for its object store and inverted index. LSM stores are a hybrid of immutable disk segments and an in-memory structure called a memtable that accepts all writes (including updates and deletes). Most of the time, files on disk are immutable, there are only three situations where files are changed: +Weaviate uses a custom [LSM Store](docs/weaviate/concepts/storage.md#object-and-inverted-index-store) for its object store and inverted index. LSM stores are a hybrid of immutable disk segments and an in-memory structure called a memtable that accepts all writes (including updates and deletes). Most of the time, files on disk are immutable, there are only three situations where files are changed: 1. Anytime a memtable is flushed. This creates a new segment. Existing segments are not changed. 2. Any write into the memtable is also written into a Write-Ahead-Log (WAL). The WAL is only needed for disaster-recovery. Once a segment has been orderly flushed, the WAL can be discarded. diff --git a/docs/deploy/config-guides/configuring-rbac.md b/docs/deploy/config-guides/configuring-rbac.md index 15b1b54a..696a2ca9 100644 --- a/docs/deploy/config-guides/configuring-rbac.md +++ b/docs/deploy/config-guides/configuring-rbac.md @@ -58,7 +58,7 @@ This configuration: - Enables RBAC - Configures `root-user` as a user with built-in admin permissions -You can connect to your instance with the root user in order to [create new users](./manage-users.mdx) which can be assigned custom roles and permissions using the REST API or [programmatically using a client library](./manage-roles.mdx). +You can connect to your instance with the root user in order to [create new users](docs/weaviate/configuration/rbac/manage-users.mdx) which can be assigned custom roles and permissions using the REST API or [programmatically using a client library](docs/weaviate/configuration/rbac/manage-roles.mdx). import DynamicUserManagement from '/_includes/configuration/dynamic-user-management.mdx'; @@ -103,7 +103,7 @@ This configuration: - Enables RBAC - Configures `root-user` as a user with built-in admin permissions -You can connect to your instance with the root user in order to [create new users](./manage-users.mdx) which can be assigned custom roles and permissions using the REST API or [programmatically using a client library](./manage-roles.mdx). +You can connect to your instance with the root user in order to [create new users](docs/weaviate/configuration/rbac/manage-users.mdx) which can be assigned custom roles and permissions using the REST API or [programmatically using a client library](docs/weaviate/configuration/rbac/manage-roles.mdx). ## RBAC and performance @@ -122,7 +122,7 @@ Here are some tips to optimize performance when using RBAC: - [RBAC: Overview](docs/weaviate/configuration/rbac/index.mdx) - [RBAC: Manage roles](docs/weaviate/configuration/rbac/manage-roles.mdx) - [RBAC: Manage users](docs/weaviate/configuration/rbac/manage-users.mdx) -- [RBAC: Tutorial](docs/weaviate/tutorials/rbac.mdx) +- [RBAC: Tutorial](docs/deploy/tutorials/rbac.mdx) ## Questions and feedback diff --git a/docs/deploy/config-guides/env-vars/index.md b/docs/deploy/config-guides/env-vars/index.md index 9ef56610..0b31a99c 100644 --- a/docs/deploy/config-guides/env-vars/index.md +++ b/docs/deploy/config-guides/env-vars/index.md @@ -5,7 +5,7 @@ image: og/docs/configuration.jpg # tags: ['HNSW'] --- -To configure Weaviate in a [Docker](../../installation/docker-compose.md) or a [Kubernetes](../../installation/kubernetes.md) deployment, you can set these environment variables. +To configure Weaviate in a [Docker](/docs/deploy/installation-guides/docker-installation.md) or a [Kubernetes](/docs/deploy/installation-guides/k8s-installation.md) deployment, you can set these environment variables. :::info Boolean environment variables For Boolean environment variables, `"on"`, `"enabled"`, `"1"`, and `"true"` are interpreted as `true`. @@ -35,14 +35,14 @@ import APITable from '@site/src/components/APITable'; | `RAFT_ENABLE_ONE_NODE_RECOVERY` | Enable running the single node recovery routine on restart. This is useful if the default hostname has changed and a single node cluster believes there are supposed to be two nodes. | `boolean` | `false` | | `DEFAULT_VECTORIZER_MODULE` | Default vectorizer module - will be overridden by any class-level value defined in the schema | `string` | `text2vec-contextionary` | | `DISABLE_LAZY_LOAD_SHARDS` | New in v1.23. When `false`, enable lazy shard loading to improve mean time to recovery in multi-tenant deployments. | `string` | `false` | -| `DISABLE_TELEMETRY` | Disable [telemetry](../telemetry.md) data collection | boolean | `false` | +| `DISABLE_TELEMETRY` | Disable [telemetry](docs/weaviate/config-refs/telemetry.md) data collection | boolean | `false` | | `DISK_USE_READONLY_PERCENTAGE` | If disk usage is higher than the given percentage all shards on the affected node will be marked as `READONLY`, meaning all future write requests will fail. See [Disk Pressure Warnings and Limits for details](/docs/weaviate/configuration/persistence.md#disk-pressure-warnings-and-limits). | `string - number` | `90` | | `DISK_USE_WARNING_PERCENTAGE` | If disk usage is higher than the given percentage a warning will be logged by all shards on the affected node's disk. See [Disk Pressure Warnings and Limits for details](/docs/weaviate/configuration/persistence.md#disk-pressure-warnings-and-limits). | `string - number` | `80` | | `ENABLE_API_BASED_MODULES` | Enable all API-based modules. (Experimental as of `v1.26.0`) | `boolean` | `true` | | `ENABLE_MODULES` | Specify Weaviate modules to enable | `string - comma separated names` | `text2vec-openai,generative-openai` | -| `ENABLE_TOKENIZER_GSE` | Enable the [`GSE` tokenizer](../../config-refs/schema/index.md#gse-and-trigram-tokenization-methods) for use | `boolean` | `true` | -| `ENABLE_TOKENIZER_KAGOME_JA` | Enable the [`Kagome` tokenizer for Japanese](../../config-refs/schema/index.md#kagome_ja-tokenization-method) for use (Experimental as of `v1.28.0`) | `boolean` | `true` | -| `ENABLE_TOKENIZER_KAGOME_KR` | Enable the [`Kagome` tokenizer for Korean](../../config-refs/schema/index.md#kagome_kr-tokenization-method) for use (Experimental as of `v1.25.7`) | `boolean` | `true` | +| `ENABLE_TOKENIZER_GSE` | Enable the [`GSE` tokenizer](/docs/weaviate/config-refs/schema/index.md#gse-and-trigram-tokenization-methods) for use | `boolean` | `true` | +| `ENABLE_TOKENIZER_KAGOME_JA` | Enable the [`Kagome` tokenizer for Japanese](docs/weaviate/config-refs/schema/index.md#kagome_ja-tokenization-method) for use (Experimental as of `v1.28.0`) | `boolean` | `true` | +| `ENABLE_TOKENIZER_KAGOME_KR` | Enable the [`Kagome` tokenizer for Korean](docs/weaviate/config-refs/schema/index.md#kagome_kr-tokenization-method) for use (Experimental as of `v1.25.7`) | `boolean` | `true` | | `GODEBUG` | Controls debugging variables within the runtime. [See official Go docs](https://pkg.go.dev/runtime). | `string - comma-separated list of name=val pairs` | `gctrace=1` | | `GOMAXPROCS` | Set the maximum number of threads that can be executing simultaneously. If this value is set, it be respected by `LIMIT_RESOURCES`. | `string - number` | `NUMBER_OF_CPU_CORES` | | `GOMEMLIMIT` | Set the memory limit for the Go runtime. A suggested value is between 90-80% of your total memory for Weaviate. The Go runtime tries to make sure that long-lived and temporary memory allocations do not exceed this value by making the garbage collector more aggressive as the memory usage approaches the limit. [Learn more about GOMEMLIMIT](https://weaviate.io/blog/gomemlimit-a-game-changer-for-high-memory-applications). | `string - memory limit in SI units` | `4096MiB` | @@ -53,28 +53,28 @@ import APITable from '@site/src/components/APITable'; | `LIMIT_RESOURCES` | If `true`, Weaviate will automatically attempt to auto-detect and limit the amount of resources (memory & threads) it uses to (0.8 * total memory) and (number of cores-1). It will override any `GOMEMLIMIT` values, however it will respect `GOMAXPROCS` values. | `boolean` | `false` | | `LOG_FORMAT` | Set the Weaviate logging format

    Default: Outputs log data to json. e.g.: `{"action":"startup","level":"debug","msg":"finished initializing modules","time":"2023-04-12T05:07:43Z"}`
    `text`: Outputs log data to a string. e.g. `time="2023-04-12T04:54:23Z" level=debug msg="finished initializing modules" action=startup` | `string` | | | `LOG_LEVEL` | Sets the Weaviate logging level. Default: `info`

    `panic`: Panic entries only. (new in `v1.24`)
    `fatal`: Fatal entries only. (new in `v1.24`)
    `error`: Error entries only. (new in `v1.24`)
    `warning`: Warning entries only. (new in `v1.24`)
    `info`: General operational entries.
    `debug`: Very verbose logging.
    `trace`: Even finer-grained informational events than `debug`. | `string` | | -| `MAXIMUM_ALLOWED_COLLECTIONS_COUNT` | Maximum allowed number of collections in a Weaviate node. A value of `-1` removes the limit. Default: `1000`

    Instead of raising the collections count limit, consider [rethinking your architecture](../../starter-guides/managing-collections/collections-scaling-limits.mdx).
    Added in `v1.30`| `string - number` | `20` | +| `MAXIMUM_ALLOWED_COLLECTIONS_COUNT` | Maximum allowed number of collections in a Weaviate node. A value of `-1` removes the limit. Default: `1000`

    Instead of raising the collections count limit, consider [rethinking your architecture](docs/weaviate/starter-guides/managing-collections/collections-scaling-limits.mdx).
    Added in `v1.30`| `string - number` | `20` | | `MEMORY_READONLY_PERCENTAGE` | If memory usage is higher than the given percentage all shards on the affected node will be marked as `READONLY`, meaning all future write requests will fail. (Default: `80`) | `string - number` | `75` | | `MEMORY_WARNING_PERCENTAGE` | If memory usage is higher than the given percentage a warning will be logged by all shards on the affected node's disk. (Default: `0` - i.e. no limit) | `string - number` | `85` | | `MODULES_CLIENT_TIMEOUT` | Timeout for requests to Weaviate modules. Default: `50s` | `string - duration` | `5s`, `10m`, `1h` | | `ORIGIN` | Set the http(s) origin for Weaviate | `string - HTTP origin` | `https://my-weaviate-deployment.com` | -| `PERSISTENCE_DATA_PATH` | Path to the Weaviate data store.
    [Note about file systems and performance](../../concepts/resources.md#file-system). | `string - file path` | `/var/lib/weaviate`
    Starting in v1.24, defaults to `./data`| -| `PERSISTENCE_HNSW_MAX_LOG_SIZE` | Maximum size of the HNSW [write-ahead-log](../../concepts/storage.md#hnsw-vector-index-storage). Increase this to improve log compaction efficiency, or decrease to reduce memory requirements. Default: 500MiB | `string` | `4GiB` (IEC units), `4GB` (SI units), `4000000000` (bytes) | +| `PERSISTENCE_DATA_PATH` | Path to the Weaviate data store.
    [Note about file systems and performance](docs/weaviate/concepts/resources.md#file-system). | `string - file path` | `/var/lib/weaviate`
    Starting in v1.24, defaults to `./data`| +| `PERSISTENCE_HNSW_MAX_LOG_SIZE` | Maximum size of the HNSW [write-ahead-log](docs/weaviate/concepts/storage.md#hnsw-vector-index-storage). Increase this to improve log compaction efficiency, or decrease to reduce memory requirements. Default: 500MiB | `string` | `4GiB` (IEC units), `4GB` (SI units), `4000000000` (bytes) | | `PERSISTENCE_LSM_ACCESS_STRATEGY` | Function used to access disk data in virtual memory. Default: `mmap` | `string` | `mmap` or `pread` | -| `PERSISTENCE_LSM_MAX_SEGMENT_SIZE` | Maximum size of a segment in the [LSM store](../../concepts/storage.md#object-and-inverted-index-store). Set this to limit disk usage spikes during compaction to ~2x the segment size. Default: no limit | `string` | `4GiB` (IEC units), `4GB` (SI units), `4000000000` (bytes) | -| `PROMETHEUS_MONITORING_ENABLED` | If set, Weaviate collects [metrics in a Prometheus-compatible format](/docs/weaviate/configuration/monitoring.md) | `boolean` | `false` | +| `PERSISTENCE_LSM_MAX_SEGMENT_SIZE` | Maximum size of a segment in the [LSM store](docs/weaviate/concepts/storage.md#object-and-inverted-index-store). Set this to limit disk usage spikes during compaction to ~2x the segment size. Default: no limit | `string` | `4GiB` (IEC units), `4GB` (SI units), `4000000000` (bytes) | +| `PROMETHEUS_MONITORING_ENABLED` | If set, Weaviate collects [metrics in a Prometheus-compatible format](docs/deploy/config-guides/monitoring.md) | `boolean` | `false` | | `PROMETHEUS_MONITORING_GROUP` | If set, Weaviate groups metrics for the same class across all shards. | `boolean` | `true` | | `QUERY_CROSS_REFERENCE_DEPTH_LIMIT` | Sets the maximum depth of cross-references to be resolved in a query. Defaults to 5.
    Added in `v1.24.25`, `v1.25.18`, `v1.26.5`. | `string - number` | `3` | | `QUERY_DEFAULTS_LIMIT` | Sets the default number of objects to be returned in a query. | `string - number` | `25`
    Starting in v1.24, defaults to `10`| | `QUERY_MAXIMUM_RESULTS` | Sets the maximum total number of objects that can be retrieved. | `string - number` | `10000` | | `QUERY_SLOW_LOG_ENABLED` | Log slow queries for debugging. Requires a restart to update.
    (New in 1.24.16, 1.25.3) | `boolean` | `False` | | `QUERY_SLOW_LOG_THRESHOLD` | Set a threshold time for slow query logging. Requires a restart to update.
    (New in 1.24.16, 1.25.3) | `string` | `2s`
    Values are times: `3h`, `2s`, `100ms` | -| `REINDEX_SET_TO_ROARINGSET_AT_STARTUP` | Allow Weaviate to perform a one-off re-indexing to [use Roaring Bitmaps](../../concepts/filtering.md#indexFilterable).

    Available in versions `1.18` and higher. | `boolean` | `true` | +| `REINDEX_SET_TO_ROARINGSET_AT_STARTUP` | Allow Weaviate to perform a one-off re-indexing to [use Roaring Bitmaps](docs/weaviate/concepts/filtering.md#indexFilterable).

    Available in versions `1.18` and higher. | `boolean` | `true` | | `TOKENIZER_CONCURRENCY_COUNT` | Limit the combined number of GSE and Kagome tokenizers running at the same time. Default: `GOMAXPROCS` | `string - number` | `NUMBER_OF_CPU_CORES` | | `TOMBSTONE_DELETION_CONCURRENCY` | The maximum number of cores to use for tombstone deletion. Set this to limit the number of cores used for cleanup. Default: Half of the available cores. (New in `v1.24.0`) | `string - int` | `4` | | `TOMBSTONE_DELETION_MAX_PER_CYCLE` | Maximum number of tombstones to delete per cleanup cycle. Set this to limit cleanup cycles, as they are resource-intensive. As an example, set a maximum of 10000000 (10M) for a cluster with 300 million-object shards. Default: none | `string - int` (New in `v1.24.15` / `v1.25.2`) | `10000000` | | `TOMBSTONE_DELETION_MIN_PER_CYCLE` | Minimum number of tombstones to delete per cleanup cycle. Set this to prevent triggering unnecessary cleanup cycles below a threshold. As an example, set a minimum of 1000000 (1M) for a cluster with 300 million-object shards. Default: 0 (New in `v1.24.15`, `v1.25.2`) | `string - int` | `100000` | -| `USE_GSE` | Enable the [`GSE` tokenizer](../../config-refs/schema/index.md#gse-and-trigram-tokenization-methods) for use.
    (The same as `ENABLE_TOKENIZER_GSE`. We recommend using `ENABLE_TOKENIZER_GSE` for consistency in naming with other optional tokenizers.) | `boolean` | `true` | +| `USE_GSE` | Enable the [`GSE` tokenizer](docs/weaviate/config-refs/schema/index.md#gse-and-trigram-tokenization-methods) for use.
    (The same as `ENABLE_TOKENIZER_GSE`. We recommend using `ENABLE_TOKENIZER_GSE` for consistency in naming with other optional tokenizers.) | `boolean` | `true` | | `USE_INVERTED_SEARCHABLE` | Store searchable properties using a more efficient in-disk format, designed for the BlockMax WAND algorithm. Set as `true` together with `USE_BLOCKMAX_WAND` to enable BlockMax WAND at query time.

    Added in `v1.28` default: `false`
    From `v1.30` default: `true`
    Read more | `boolean` | `true` | | `USE_BLOCKMAX_WAND` | Use BlockMax WAND algorithm for BM25 and hybrid searches. Enable it together with `USE_INVERTED_SEARCHABLE` to get the performance benefits.

    Added in `v1.28` default: `false`
    From `v1.30` default: `true`
    Read more | `boolean` | `true` | @@ -102,7 +102,7 @@ import APITable from '@site/src/components/APITable'; | `OFFLOAD_S3_CONCURRENCY` | The maximum number of parts that will be uploaded/downloaded in parallel during offloading operations (default: `25`) | `string - number` | `10` | | `OFFLOAD_TIMEOUT` | The request timeout value, in seconds (default: `120`) | `string - number` | `60` | | `TRANSFORMERS_INFERENCE_API` | The endpoint where to reach the transformers module if enabled | `string` | `http://t2v-transformers:8080` | -| `USE_GOOGLE_AUTH` | Automatically look for Google Cloud credentials, and generate Vertex AI access tokens for Weaviate to use as needed ([read more](../../model-providers/google/index.md)). (default: `false`) | `boolean` | `true` | +| `USE_GOOGLE_AUTH` | Automatically look for Google Cloud credentials, and generate Vertex AI access tokens for Weaviate to use as needed ([read more](docs/weaviate/model-providers/google/index.md)). (default: `false`) | `boolean` | `true` | | `USE_SENTENCE_TRANSFORMERS_VECTORIZER` | (EXPERIMENTAL) Use the `sentence-transformer` vectorizer instead of the default vectorizer (from the `transformers` library). Applies to custom images only. | `boolean` | `true` | | `CLIP_WAIT_FOR_STARTUP` | If `true`, Weaviate waits for the `multi2vec-clip` module to start up before starting (default: `true`). | `boolean` | `true` | | `NER_WAIT_FOR_STARTUP` | If `true`, Weaviate waits for the `ner-transformers` module to start up before starting (default: `true`). (Available from `v1.25.27`, `v1.26.12`, `v1.27.7`) | `boolean` | `true` | @@ -119,7 +119,7 @@ import APITable from '@site/src/components/APITable'; ## Authentication and authorization :::info Authentication & Authorization documentation -For more information on authentication and authorization, see the [Authentication](../../configuration/authentication.md) and [Authorization](../../configuration/authorization.md) pages. +For more information on authentication and authorization, see the [Authentication](docs/deploy/config-guides/authentication.md) and [Authorization](docs/deploy/config-guides/authorization.md) pages. ::: ```mdx-code-block @@ -132,7 +132,7 @@ For more information on authentication and authorization, see the [Authenticatio | `AUTHENTICATION_APIKEY_ALLOWED_KEYS` | Allowed API keys.

    Each key corresponds to a specific user identity below. | `string - comma-separated list` | `jane-secret-key,ian-secret-key` | | `AUTHENTICATION_APIKEY_ENABLED` | Enable API key-based authentication | `boolean` | `false` | | `AUTHENTICATION_APIKEY_USERS` | API key-based identities.

    Each identity corresponds to a specific key above. | `string - comma-separated list` | `jane@doe.com,ian-smith` | -| `AUTHENTICATION_DB_USERS_ENABLED` | Allow runtime [user management](../../configuration/rbac/manage-users.mdx). Default: `false` | `boolean` | `true` | +| `AUTHENTICATION_DB_USERS_ENABLED` | Allow runtime [user management](docs/weaviate/configuration/rbac/manage-users.mdx). Default: `false` | `boolean` | `true` | | `AUTHENTICATION_OIDC_CLIENT_ID` | OIDC Client ID | `string` | `my-client-id` | | `AUTHENTICATION_OIDC_ENABLED` | Enable OIDC-based authentication | `boolean` | `false` | | `AUTHENTICATION_OIDC_GROUPS_CLAIM` | OIDC Groups Claim | `string` | `groups` | @@ -174,9 +174,9 @@ For more information on authentication and authorization, see the [Authenticatio | `CLUSTER_HOSTNAME` | Hostname of a node. Always set this value if the default OS hostname might change over time. | `string` | `node1` | | `CLUSTER_JOIN` | The service name of the "founding" member node in a cluster setup | `string` | `weaviate-node-1:7100` | | `HNSW_STARTUP_WAIT_FOR_VECTOR_CACHE` | If `true`, vector cache prefill is synchronous when a node starts. The node reports ready to serve when the cache is hot. Defaults to `false`. Added in 1.24.20 and 1.25.5. | `boolean` | `false` | -| `COLLECTION_RETRIEVAL_STRATEGY`| Set collection definition retrieval behavior for a data request.

    • `LeaderOnly` (default): Always requests the definition from the leader node.
    • `LocalOnly`: Always use the local definition
    • `LeaderOnMismatch`: Requests the definition if outdated.
    ([Read more](../../concepts/replication-architecture/consistency.md#collection-definition-requests-in-queries)) (Added in `v1.27.10`, `v1.28.4`) | `string` | `LeaderOnly` | -| `RAFT_ENABLE_FQDN_RESOLVER` | If `true`, use DNS lookup instead of memberlist lookup for Raft. Added in `v1.25.15` and removed in `v1.30`. ([Read more](../../concepts/cluster.md#node-discovery)) | `boolean` | `true` | -| `RAFT_FQDN_RESOLVER_TLD` | The top-level domain to use for DNS lookup, in `[node-id].[tld]` format. Added in `v1.25.15` and removed in `v1.30`. ([Read more](../../concepts/cluster.md#node-discovery)) | `string` | `example.com` | +| `COLLECTION_RETRIEVAL_STRATEGY`| Set collection definition retrieval behavior for a data request.

    • `LeaderOnly` (default): Always requests the definition from the leader node.
    • `LocalOnly`: Always use the local definition
    • `LeaderOnMismatch`: Requests the definition if outdated.
    ([Read more](docs/weaviate/concepts/replication-architecture/consistency.md#collection-definition-requests-in-queries)) (Added in `v1.27.10`, `v1.28.4`) | `string` | `LeaderOnly` | +| `RAFT_ENABLE_FQDN_RESOLVER` | If `true`, use DNS lookup instead of memberlist lookup for Raft. Added in `v1.25.15` and removed in `v1.30`. ([Read more](docs/weaviate/concepts/cluster.md#node-discovery)) | `boolean` | `true` | +| `RAFT_FQDN_RESOLVER_TLD` | The top-level domain to use for DNS lookup, in `[node-id].[tld]` format. Added in `v1.25.15` and removed in `v1.30`. ([Read more](docs/weaviate/concepts/cluster.md#node-discovery)) | `string` | `example.com` | | `RAFT_BOOTSTRAP_EXPECT` | The number of voter notes at bootstrapping time | `string - number` | `1` | | `RAFT_BOOTSTRAP_TIMEOUT` | The time in seconds to wait for the cluster to bootstrap | `string - number` | `90` | | `RAFT_GRPC_MESSAGE_MAX_SIZE` | The maximum internal raft gRPC message size in bytes. Defaults to 1073741824 | `string - number` | `1073741824` | diff --git a/docs/deploy/config-guides/env-vars/runtime-config.md b/docs/deploy/config-guides/env-vars/runtime-config.md index 57e3ffcc..de1bb940 100644 --- a/docs/deploy/config-guides/env-vars/runtime-config.md +++ b/docs/deploy/config-guides/env-vars/runtime-config.md @@ -73,7 +73,7 @@ If Weaviate attempts to start with an invalid runtime configuration file (e.g., When modifying the runtime configuration file for a running Weaviate instance, if the new configuration is invalid, Weaviate continues using the last valid configuration that is stored in memory. Error logs and metrics will indicate when configuration loading fails. -Weaviate provides the following [metrics to help you monitor](../../configuration/monitoring.md) runtime configuration status: +Weaviate provides the following [metrics to help you monitor](../monitoring.md) runtime configuration status: | Metric Name | Description | | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | @@ -85,3 +85,9 @@ Weaviate provides the following [metrics to help you monitor](../../configuratio It's important to set up proper alerting based on these metrics and logs to quickly identify configuration issues. If any Weaviate process is failing to load its runtime configuration, it won't be able to start until the configuration is fixed. ::: + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + \ No newline at end of file diff --git a/docs/deploy/config-guides/horizontal-scaling.mdx b/docs/deploy/config-guides/horizontal-scaling.mdx index d7356a9c..9595f7a7 100644 --- a/docs/deploy/config-guides/horizontal-scaling.mdx +++ b/docs/deploy/config-guides/horizontal-scaling.mdx @@ -304,7 +304,7 @@ import RaftRFChangeWarning from '/_includes/1-25-replication-factor.mdx'; -Configure replication settings, such as [async replication](/docs/weaviate/configuration/replication#async-replication-settings) and [deletion resolution strategy](../concepts/replication-architecture/consistency.md#deletion-resolution-strategies). +Configure replication settings, such as [async replication](/docs/weaviate/configuration/replication#async-replication-settings) and [deletion resolution strategy](docs/weaviate/concepts/replication-architecture/consistency.md#deletion-resolution-strategies). diff --git a/docs/deploy/config-guides/modules.md b/docs/deploy/config-guides/modules.md index 25d48bda..49f737f3 100644 --- a/docs/deploy/config-guides/modules.md +++ b/docs/deploy/config-guides/modules.md @@ -14,7 +14,7 @@ At the instance (i.e. Weaviate cluster) level, you can: - Configure the default vectorizer module - Configure module-specific variables (e.g. API keys), where applicable -This can be done by setting the appropriate [environment variables](/docs/weaviate/config-refs/env-vars.md) as shown below. +This can be done by setting the appropriate [environment variables](docs/deploy/config-guides/env-vars/index.md) as shown below. :::tip What about WCD? Weaviate Cloud (WCD) instances come with modules pre-configured. See [this page](/docs/cloud/manage-clusters/status#enabled-modules) for details. @@ -75,7 +75,7 @@ Note that enabling multiple vectorizer (e.g. `text2vec`, `multi2vec`) modules wi You may need to specify additional environment variables to configure each module where applicable. For example, the `backup-s3` module requires the backup S3 bucket to be set via `BACKUP_S3_BUCKET`, and the `text2vec-contextionary` module requires the inference API location via `TRANSFORMERS_INFERENCE_API`. -Refer to the individual [module documentation](../modules/index.md) for more details. +Refer to the individual [module documentation](docs/weaviate/modules/index.md) for more details. ## Vectorizer modules diff --git a/docs/deploy/config-guides/persistence.md b/docs/deploy/config-guides/persistence.md index 5649bf34..a1e023c3 100644 --- a/docs/deploy/config-guides/persistence.md +++ b/docs/deploy/config-guides/persistence.md @@ -103,7 +103,7 @@ In general, `mmap` may be a preferred option with memory management benefits. Ho ## Related pages -- [Configuration: Backups](docs/weaviate/configuration/backups.md) +- [Configuration: Backups](docs/deploy/config-guides/backups.md) ## Questions and feedback diff --git a/docs/deploy/config-guides/replication.md b/docs/deploy/config-guides/replication.md index 9d09615d..2d6ba1d6 100644 --- a/docs/deploy/config-guides/replication.md +++ b/docs/deploy/config-guides/replication.md @@ -43,12 +43,12 @@ import ReplicationConfigWithAsyncRepair from '/\_includes/code/configuration/rep ### Configure async replication settings {#async-replication-settings} :::info Added in `v1.29` -The [environment variables](/docs/weaviate/config-refs/env-vars#async-replication) for configuring async replication (`ASYNC_*`) have been introduced in `v1.29`. +The [environment variables](/docs/deploy/config-guides/env-vars/index.md#async-replication) for configuring async replication (`ASYNC_*`) have been introduced in `v1.29`. ::: Async replication helps achieve consistency for data replicated across multiple nodes. -Update the following [environment variables](/docs/weaviate/config-refs/env-vars#async-replication) to configure async replication for your particular use case. +Update the following [environment variables](/docs/deploy/config-guides/env-vars/index.md#async-replication) to configure async replication for your particular use case. #### Logging diff --git a/docs/deploy/faqs/troubleshooting.md b/docs/deploy/faqs/troubleshooting.md index 8a725b8d..239a691a 100644 --- a/docs/deploy/faqs/troubleshooting.md +++ b/docs/deploy/faqs/troubleshooting.md @@ -24,7 +24,7 @@ As a first step, you'll want to examine your cluster's logs to identify the prob #### Resolving the issue To solve this mystery, you'll need to increase the available disk space for your nodes. Once the disk space is increased, then you'll need to manually mark the affected shards or collections as writeable again. -You can also set the [`MEMORY_WARNING_PERCENTAGE`](/weaviate/config-refs/env-vars/index.md#MEMORY_WARNING_PERCENTAGE) environment variable to issue warnings when the memory limit is near. +You can also set the [`MEMORY_WARNING_PERCENTAGE`](docs/deploy/config-guides/env-vars/index.md#MEMORY_WARNING_PERCENTAGE) environment variable to issue warnings when the memory limit is near. ### You're receiving inconsistent query results. diff --git a/docs/deploy/installation-guides/docker-installation.md b/docs/deploy/installation-guides/docker-installation.md index 7191ec9f..498b9158 100644 --- a/docs/deploy/installation-guides/docker-installation.md +++ b/docs/deploy/installation-guides/docker-installation.md @@ -120,11 +120,11 @@ volumes: ... ``` -This setup enables API-key based [authentication](/docs/weaviate/configuration/authentication.md) and role-based access control [authorization](/docs/weaviate/configuration/authorization.md). +This setup enables API-key based [authentication](docs/deploy/config-guides/authentication.md) and role-based access control [authorization](docs/deploy/config-guides/authorization.md). It defines the users `user-a` and `user-b` and corresponding keys `user-a-key` and `user-b-key` which serve as authentication credentials for connecting to your Weaviate instance. -The user `user-a` is granted admin access rights using the **Role-based access control (RBAC)** method. A custom role can be assigned to the user `user-b` by following the [authorization and RBAC guide](/docs/weaviate/configuration/authorization.md). +The user `user-a` is granted admin access rights using the **Role-based access control (RBAC)** method. A custom role can be assigned to the user `user-b` by following the [authorization and RBAC guide](docs/deploy/config-guides/authorization.md). @@ -150,7 +150,7 @@ import DocsConfigGen from '@site/src/components/DockerConfigGen'; You can use environment variables to control your Weaviate setup, authentication and authorization, module settings, and data storage settings. :::info List of environment variables -A comprehensive of list environment variables [can be found on this page](/docs/weaviate/config-refs/env-vars.md). +A comprehensive of list environment variables [can be found on this page](/docs/deploy/config-guides/env-vars/index.md). ::: ## Example configurations diff --git a/docs/deploy/installation-guides/k8s-installation.md b/docs/deploy/installation-guides/k8s-installation.md index c9b43685..45ebbca7 100644 --- a/docs/deploy/installation-guides/k8s-installation.md +++ b/docs/deploy/installation-guides/k8s-installation.md @@ -122,8 +122,8 @@ In this example, the key `readonly-key` will authenticate a user as the `readonl OIDC authentication is also enabled, with WCD as the token issuer/identity provider. Thus, users with WCD accounts could be authenticated. This configuration sets `someuser@weaviate.io` as an admin user, so if `someuser@weaviate.io` were to authenticate, they will be given full (read and write) privileges. For further, general documentation on authentication and authorization configuration, see: -- [Authentication](../configuration/authentication.md) -- [Authorization](../configuration/authorization.md) +- [Authentication](../config-guides/authentication.md) +- [Authorization](../config-guides/authorization.md) #### Run as non-root user @@ -165,7 +165,7 @@ The above command (`helm upgrade...`) is idempotent. In other words, you can run To upgrade to `1.25` or higher from a pre-`1.25` version, you must delete the deployed `StatefulSet`, update the helm chart to version `17.0.0` or higher, and re-deploy Weaviate. -See the [1.25 migration guide for Kubernetes](../more-resources/migration/weaviate-1-25.md) for more details. +See the [1.25 migration guide for Kubernetes](../migration/weaviate-1-25.md) for more details. ## Additional Configuration Help diff --git a/docs/deploy/production/Kubernetes/k8s-poc.md b/docs/deploy/production/Kubernetes/k8s-poc.md index fabb9cfd..ebe68cfa 100644 --- a/docs/deploy/production/Kubernetes/k8s-poc.md +++ b/docs/deploy/production/Kubernetes/k8s-poc.md @@ -79,7 +79,7 @@ Check out the Academy course [“Run Weaviate on Kubernetes”](https://weaviate - readonly_user2 - api-key-user-readOnly ``` -[Admin List Configuration](/docs/weaviate/configuration/authorization.md#admin-list-kubernetes) +[Admin List Configuration](docs/deploy/config-guides/authorization.md#admin-list-kubernetes) diff --git a/docs/weaviate/api/grpc.md b/docs/weaviate/api/grpc.md index 9f0d48fb..40f6dc4e 100644 --- a/docs/weaviate/api/grpc.md +++ b/docs/weaviate/api/grpc.md @@ -29,7 +29,7 @@ This directory contains the following files: As an example, the snippet below maps `50051` as the host port so that it can be accessed from outside the container. The `50051` port is mapped to the `50051` port inside the container for gRPC calls, and the `8080` port is mapped to the `8080` port inside the container for REST calls. :::info -We suggest using the default port `50051` for gRPC calls. It can be modified through the `GRPC_PORT` [environment variable](../config-refs/env-vars/index.md). +We suggest using the default port `50051` for gRPC calls. It can be modified through the `GRPC_PORT` [environment variable](docs/deploy/config-guides/env-vars/index.md). Note that [Weaviate Cloud](https://console.weaviate.cloud/) uses port `443` for gRPC. ::: diff --git a/docs/weaviate/concepts/cluster.md b/docs/weaviate/concepts/cluster.md index b10b703b..db2886bc 100644 --- a/docs/weaviate/concepts/cluster.md +++ b/docs/weaviate/concepts/cluster.md @@ -83,7 +83,7 @@ This was an experimental feature. Use with caution. ::: -There can be a situation where IP-address based node discovery is not optimal. In such cases, you can set `RAFT_ENABLE_FQDN_RESOLVER` and `RAFT_FQDN_RESOLVER_TLD` [environment variables](../config-refs/env-vars/index.md#multi-node-instances) to enable fully qualified domain name (FQDN) based node discovery. +There can be a situation where IP-address based node discovery is not optimal. In such cases, you can set `RAFT_ENABLE_FQDN_RESOLVER` and `RAFT_FQDN_RESOLVER_TLD` [environment variables](docs/deploy/config-guides/env-vars/index.md#multi-node-instances) to enable fully qualified domain name (FQDN) based node discovery. If this feature is enabled, Weaviate uses the FQDN resolver to resolve the node name to the node IP address for metadata (e.g., Raft) communication. diff --git a/docs/weaviate/concepts/filtering.md b/docs/weaviate/concepts/filtering.md index 588d74d0..1920dff6 100644 --- a/docs/weaviate/concepts/filtering.md +++ b/docs/weaviate/concepts/filtering.md @@ -82,7 +82,7 @@ A roaring bitmap index for `text` properties is available from `1.19` and up, an If you are using Weaviate version `< 1.18.0`, you can take advantage of roaring bitmaps by migrating to `1.18.0` or higher, and going through a one-time process to create the new index. Once your Weaviate instance creates the Roaring Bitmap index, it will operate in the background to speed up your work. -This behavior is set through the REINDEX_SET_TO_ROARINGSET_AT_STARTUP [environment variable](../config-refs/env-vars/index.md). If you do not wish for reindexing to occur, you can set this to `false` prior to upgrading. +This behavior is set through the REINDEX_SET_TO_ROARINGSET_AT_STARTUP [environment variable](docs/deploy/config-guides/env-vars/index.md). If you do not wish for reindexing to occur, you can set this to `false` prior to upgrading. :::info Read more To learn more about Weaviate's roaring bitmaps implementation, see the [in-line documentation](https://pkg.go.dev/github.com/weaviate/weaviate/adapters/repos/db/lsmkv/roaringset). diff --git a/docs/weaviate/concepts/replication-architecture/cluster-architecture.md b/docs/weaviate/concepts/replication-architecture/cluster-architecture.md index 27f7ed91..cc6c17f7 100644 --- a/docs/weaviate/concepts/replication-architecture/cluster-architecture.md +++ b/docs/weaviate/concepts/replication-architecture/cluster-architecture.md @@ -25,7 +25,7 @@ This was an experimental feature. Use with caution. ::: -There can be a situation where IP-address based node discovery is not optimal. In such cases, you can set `RAFT_ENABLE_FQDN_RESOLVER` and `RAFT_FQDN_RESOLVER_TLD` [environment variables](../../config-refs/env-vars/index.md#multi-node-instances) to enable [fully qualified domain name (FQDN)](https://en.wikipedia.org/wiki/Fully_qualified_domain_name) based node discovery. +There can be a situation where IP-address based node discovery is not optimal. In such cases, you can set `RAFT_ENABLE_FQDN_RESOLVER` and `RAFT_FQDN_RESOLVER_TLD` [environment variables](docs/deploy/config-guides/env-vars/index.md#multi-node-instances) to enable [fully qualified domain name (FQDN)](https://en.wikipedia.org/wiki/Fully_qualified_domain_name) based node discovery. If this feature is enabled, Weaviate uses the FQDN resolver to resolve the node name to the node IP address for metadata (e.g., Raft) communication. diff --git a/docs/weaviate/concepts/replication-architecture/consistency.md b/docs/weaviate/concepts/replication-architecture/consistency.md index 8f20f99c..fe7f4666 100644 --- a/docs/weaviate/concepts/replication-architecture/consistency.md +++ b/docs/weaviate/concepts/replication-architecture/consistency.md @@ -59,7 +59,7 @@ A clean (without fails) execution has two phases: Some queries require the collection definition. Prior to the introduction of this feature, every such query led to the local (requesting) node to fetch the collection definition from the leader node. This meant that the definition was strongly consistent, but it could lead to additional traffic and load. -Where available, the `COLLECTION_RETRIEVAL_STRATEGY` [environment variable](../../config-refs/env-vars/index.md#multi-node-instances) can be set to `LeaderOnly`, `LocalOnly`, or `LeaderOnMismatch`. +Where available, the `COLLECTION_RETRIEVAL_STRATEGY` [environment variable](docs/deploy/config-guides/env-vars/index.md#multi-node-instances) can be set to `LeaderOnly`, `LocalOnly`, or `LeaderOnMismatch`. - `LeaderOnly` (default): Always requests the definition from the leader node. This is the most consistent behavior but can lead to higher intra-cluster traffic. - `LocalOnly`: Always use the local definition; leading to eventually consistent behavior while reducing intra-cluster traffic. diff --git a/docs/weaviate/concepts/resources.md b/docs/weaviate/concepts/resources.md index 0ef5730e..768e0069 100644 --- a/docs/weaviate/concepts/resources.md +++ b/docs/weaviate/concepts/resources.md @@ -10,7 +10,7 @@ Weaviate scales well for large projects. Smaller projects, less than 1M objects, ## Limit available resources -You can set [environment variables](../config-refs/env-vars/index.md) to manage Weaviate's resource usage, as to prevent Weaviate from using all available resources. The following environment variables are available: +You can set [environment variables](docs/deploy/config-guides/env-vars/index.md) to manage Weaviate's resource usage, as to prevent Weaviate from using all available resources. The following environment variables are available: - `LIMIT_RESOURCES`: When set to true, Weaviate automatically limits its resource usage. It sets memory usage to 80% of the total memory and uses all but one CPU core. It overrides any `GOMEMLIMIT` values but respects `GOMAXPROCS` settings. @@ -96,7 +96,7 @@ The memory calculation that includes `maxConnections` describes the system state In rare situations - typically on large machines with very high import speeds - Weaviate can allocate memory faster than the garbage collector can free it. When this happens, the system kernel can trigger an `out of memory kill (OOM-Kill)`. This is a known issue that Weaviate is actively working on. ### Data import -To avoid out-of-memory issues during imports, set `LIMIT_RESOURCES` to `True` or configure the `GOMEMLIMIT` environment variable. For details, see [Environment variables](../config-refs/env-vars/index.md). +To avoid out-of-memory issues during imports, set `LIMIT_RESOURCES` to `True` or configure the `GOMEMLIMIT` environment variable. For details, see [Environment variables](docs/deploy/config-guides/env-vars/index.md). ## Strategies to reduce memory usage @@ -144,7 +144,7 @@ Weaviate is optimized to work with Solid-State Disks (SSDs). However, spinning h ## File system -For optimal performance and reliability, avoid using `NFS` or similar file systems for the Weaviate persistent volume ([`PERSISTENCE_DATA_PATH`](../config-refs/env-vars/index.md)). +For optimal performance and reliability, avoid using `NFS` or similar file systems for the Weaviate persistent volume ([`PERSISTENCE_DATA_PATH`](docs/deploy/config-guides/env-vars/index.md)). Instead, use file systems like `Ext4` or `XFS` in combination with SAN storage (e.g. `EBS`) to ensure the best performance. diff --git a/docs/weaviate/concepts/search/vector-search.md b/docs/weaviate/concepts/search/vector-search.md index 20583b35..61bd542d 100644 --- a/docs/weaviate/concepts/search/vector-search.md +++ b/docs/weaviate/concepts/search/vector-search.md @@ -267,7 +267,7 @@ If you search a vector database containing vectors for colors "Red", "Crimson" a As a result, Weaviate provides multiple ways to limit the search results: - **Limit**: Specify the maximum number of results to return. - - If not provided, defaults to system-defined [`QUERY_DEFAULTS_LIMIT`](../../config-refs/env-vars/index.md#general) of 10. + - If not provided, defaults to system-defined [`QUERY_DEFAULTS_LIMIT`](docs/deploy/config-guides/env-vars/index.md#general) of 10. - **AutoCut**: Limit results based on discontinuities in result metrics such as vector distance or search score. - **Threshold**: Specify a minimum similarity score (e.g. maximum cosine distance) for the results. - **Apply filters**: Use [filters](../filtering.md) to exclude results based on other criteria, such as metadata or properties. diff --git a/docs/weaviate/configuration/authentication.md b/docs/weaviate/configuration/authentication.md index 0777f586..9f8615a4 100644 --- a/docs/weaviate/configuration/authentication.md +++ b/docs/weaviate/configuration/authentication.md @@ -219,7 +219,7 @@ curl https://localhost:8080/v1/objects -H "Authorization: Bearer ${WEAVIATE_API_ ## Further resources - [Configuration: Authorization and RBAC](./authorization.md) -- [References: Environment variables / Authentication and Authorization](../config-refs/env-vars/index.md#authentication-and-authorization) +- [References: Environment variables / Authentication and Authorization](docs/deploy/config-guides/env-vars/index.md#authentication-and-authorization) ## Questions and feedback diff --git a/docs/weaviate/configuration/index.mdx b/docs/weaviate/configuration/index.mdx index 31895ec6..fbb69e07 100644 --- a/docs/weaviate/configuration/index.mdx +++ b/docs/weaviate/configuration/index.mdx @@ -50,7 +50,7 @@ export const configOpsData = [ title: "Authorization", description: "Understand Weaviate's authorization schemes (RBAC, Admin List) to control user permissions.", - link: "/docs/weaviate/configuration/authorization", + link: "/docs/deploy/config-guides/authorization.md", icon: "fas fa-shield-alt", }, { diff --git a/docs/weaviate/configuration/modules.md b/docs/weaviate/configuration/modules.md index 3e4ec23d..f007c1ce 100644 --- a/docs/weaviate/configuration/modules.md +++ b/docs/weaviate/configuration/modules.md @@ -15,7 +15,7 @@ At the instance (i.e. Weaviate cluster) level, you can: - Configure the default vectorizer module - Configure module-specific variables (e.g. API keys), where applicable -This can be done by setting the appropriate [environment variables](../config-refs/env-vars/index.md) as shown below. +This can be done by setting the appropriate [environment variables](docs/deploy/config-guides/env-vars/index.md) as shown below. :::tip What about WCD? Weaviate Cloud (WCD) instances come with modules pre-configured. See [this page](/docs/cloud/manage-clusters/status#enabled-modules) for details. diff --git a/docs/weaviate/configuration/monitoring.md b/docs/weaviate/configuration/monitoring.md index f1cf0229..1c561fb7 100644 --- a/docs/weaviate/configuration/monitoring.md +++ b/docs/weaviate/configuration/monitoring.md @@ -55,7 +55,7 @@ command. In this setup the following components are used: ### Multi-tenancy -When using multi-tenancy, we suggest setting the `PROMETHEUS_MONITORING_GROUP` [environment variable](../config-refs/env-vars/index.md) as `true` so that data across all tenants are grouped together for monitoring. +When using multi-tenancy, we suggest setting the `PROMETHEUS_MONITORING_GROUP` [environment variable](docs/deploy/config-guides/env-vars/index.md) as `true` so that data across all tenants are grouped together for monitoring. ## Obtainable Metrics diff --git a/docs/weaviate/configuration/rbac/index.mdx b/docs/weaviate/configuration/rbac/index.mdx index b953360e..4ee13f1d 100644 --- a/docs/weaviate/configuration/rbac/index.mdx +++ b/docs/weaviate/configuration/rbac/index.mdx @@ -12,7 +12,7 @@ import SkipLink from '/src/components/SkipValidationLink' Role-based access control (RBAC) is generally available in Weaviate from version `v1.29`. ::: -Weaviate provides differentiated access through [authorization](/docs/weaviate/configuration/authorization) levels based on the [authenticated](/docs/weaviate/configuration/authentication) user identity. +Weaviate provides differentiated access through [authorization](docs/deploy/config-guides/authorization.md) levels based on the [authenticated](docs/deploy/config-guides/authentication.md) user identity. If **role-based access control (RBAC)** is enabled, access can be further restricted based on the roles of users. The diagram below illustrates the RBAC model in Weaviate, where access is governed by defining roles and assigning them specific permissions. These permissions determine which actions users can perform on designated resource types. @@ -100,7 +100,7 @@ Weaviate comes with a set of predefined roles. These roles are: - `root`: The root role has **full access** to all resources in Weaviate. - `viewer`: The viewer role has **read-only access** to all resources in Weaviate. -The `root` role can be assigned to a user through the Weaviate configuration file using the [`AUTHORIZATION_RBAC_ROOT_USERS`](/docs/weaviate/config-refs/env-vars#rbac-authorization) environment variable. A predefined role cannot be modified. The user can, however, be assigned additional roles through the Weaviate API. +The `root` role can be assigned to a user through the Weaviate configuration file using the [`AUTHORIZATION_RBAC_ROOT_USERS`](docs/deploy/config-guides/env-vars/index.md#rbac-authorization) environment variable. A predefined role cannot be modified. The user can, however, be assigned additional roles through the Weaviate API. All roles can also be assigned through the Weaviate API, including the predefined role. The predefined roles cannot be modified, but they can be assigned to or revoked from users. @@ -354,7 +354,7 @@ The [user management](./manage-users.mdx) API can be used to create, delete and ## Further resources -- [RBAC: Configuration](./configuration.md) +- [RBAC: Configuration](docs/deploy/config-guides/configuring-rbac.md) - [RBAC: Manage roles](./manage-roles.mdx) - [RBAC: Manage users](./manage-users.mdx) - [RBAC: Tutorial](../../tutorials/rbac.mdx) diff --git a/docs/weaviate/configuration/replication.md b/docs/weaviate/configuration/replication.md index 6e6c514f..ea3d13cc 100644 --- a/docs/weaviate/configuration/replication.md +++ b/docs/weaviate/configuration/replication.md @@ -55,12 +55,12 @@ import ReplicationConfigWithAsyncRepair from '/\_includes/code/configuration/rep ### Configure async replication settings {#async-replication-settings} :::info Added in `v1.29` -The [environment variables](/docs/weaviate/config-refs/env-vars#async-replication) for configuring async replication (`ASYNC_*`) have been introduced in `v1.29`. +The [environment variables](docs/deploy/config-guides/env-vars/index.md#async-replication) for configuring async replication (`ASYNC_*`) have been introduced in `v1.29`. ::: Async replication helps achieve consistency for data replicated across multiple nodes. -Update the following [environment variables](/docs/weaviate/config-refs/env-vars#async-replication) to configure async replication for your particular use case. +Update the following [environment variables](docs/deploy/config-guides/env-vars/index.md#async-replication) to configure async replication for your particular use case. #### Logging diff --git a/docs/weaviate/installation/docker-compose.md b/docs/weaviate/installation/docker-compose.md index f0df6de4..5aeab46e 100644 --- a/docs/weaviate/installation/docker-compose.md +++ b/docs/weaviate/installation/docker-compose.md @@ -121,11 +121,11 @@ volumes: ... ``` -This setup enables API-key based [authentication](../configuration/authentication.md) and role-based access control [authorization](../configuration/authorization.md). +This setup enables API-key based [authentication](docs/deploy/config-guides/authentication.md) and role-based access control [authorization](docs/deploy/config-guides/authorization.md). It defines the users `user-a` and `user-b` and corresponding keys `user-a-key` and `user-b-key` which serve as authentication credentials for connecting to your Weaviate instance. -The user `user-a` is granted admin access rights using the **Role-based access control (RBAC)** method. A custom role can be assigned to the user `user-b` by following the [authorization and RBAC guide](../configuration/authorization.md). +The user `user-a` is granted admin access rights using the **Role-based access control (RBAC)** method. A custom role can be assigned to the user `user-b` by following the [authorization and RBAC guide](docs/deploy/config-guides/authorization.md). @@ -151,7 +151,7 @@ import DocsConfigGen from '@site/src/components/DockerConfigGen'; You can use environment variables to control your Weaviate setup, authentication and authorization, module settings, and data storage settings. :::info List of environment variables -A comprehensive of list environment variables [can be found on this page](../config-refs/env-vars/index.md). +A comprehensive of list environment variables [can be found on this page](docs/deploy/config-guides/env-vars/index.md). ::: ## Example configurations diff --git a/docs/weaviate/installation/kubernetes.md b/docs/weaviate/installation/kubernetes.md index 46269b75..f9d0105a 100644 --- a/docs/weaviate/installation/kubernetes.md +++ b/docs/weaviate/installation/kubernetes.md @@ -125,8 +125,8 @@ In this example, the key `readonly-key` will authenticate a user as the `readonl OIDC authentication is also enabled, with WCD as the token issuer/identity provider. Thus, users with WCD accounts could be authenticated. This configuration sets `someuser@weaviate.io` as an admin user, so if `someuser@weaviate.io` were to authenticate, they will be given full (read and write) privileges. For further, general documentation on authentication and authorization configuration, see: -- [Authentication](../configuration/authentication.md) -- [Authorization](../configuration/authorization.md) +- [Authentication](docs/deploy/config-guides/authentication.md) +- [Authorization](docs/deploy/config-guides/authorization.md) #### Run as non-root user diff --git a/docs/weaviate/manage-collections/vector-config.mdx b/docs/weaviate/manage-collections/vector-config.mdx index 620fb0e0..874aa350 100644 --- a/docs/weaviate/manage-collections/vector-config.mdx +++ b/docs/weaviate/manage-collections/vector-config.mdx @@ -23,7 +23,7 @@ Specify a `vectorizer` for a collection.
    Additional information -Collection level settings override default values and general configuration parameters such as [environment variables](../config-refs/env-vars/index.md). +Collection level settings override default values and general configuration parameters such as [environment variables](docs/deploy/config-guides/env-vars/index.md). - [Available model integrations](../model-providers/index.md) - [Vectorizer configuration references](/docs/weaviate/config-refs/schema#vectorizer) diff --git a/docs/weaviate/manage-objects/delete.mdx b/docs/weaviate/manage-objects/delete.mdx index f70591aa..8d83680e 100644 --- a/docs/weaviate/manage-objects/delete.mdx +++ b/docs/weaviate/manage-objects/delete.mdx @@ -187,7 +187,7 @@ To delete objects that match a set of criteria, specify the collection and a [`w Additional information -- There is a configurable [maximum limit (QUERY_MAXIMUM_RESULTS)](../config-refs/env-vars/index.md#general) on the number of objects that can be deleted in a single query (default 10,000). To delete more objects than the limit, re-run the query. +- There is a configurable [maximum limit (QUERY_MAXIMUM_RESULTS)](docs/deploy/config-guides/env-vars/index.md#general) on the number of objects that can be deleted in a single query (default 10,000). To delete more objects than the limit, re-run the query.
    @@ -296,7 +296,7 @@ There is an upper limit (`QUERY_MAXIMUM_RESULTS`) to how many objects can be del Objects are deleted in the same order that they would be fetched, by order of UUID. To delete more objects than the limit, run the same query multiple times until no objects are matched anymore. -The default `QUERY_MAXIMUM_RESULTS` value is 10,000. This may be configurable, e.g. in [the environment variables](../config-refs/env-vars/index.md). +The default `QUERY_MAXIMUM_RESULTS` value is 10,000. This may be configurable, e.g. in [the environment variables](docs/deploy/config-guides/env-vars/index.md). diff --git a/docs/weaviate/model-providers/google/_includes/use_google_auth_instructions.mdx b/docs/weaviate/model-providers/google/_includes/use_google_auth_instructions.mdx index 3826f225..cdca2caf 100644 --- a/docs/weaviate/model-providers/google/_includes/use_google_auth_instructions.mdx +++ b/docs/weaviate/model-providers/google/_includes/use_google_auth_instructions.mdx @@ -10,7 +10,7 @@ You can save your Google Vertex AI credentials and have Weaviate generate the ne To do so: -- Set `USE_GOOGLE_AUTH` [environment variable](/docs/weaviate/config-refs/env-vars#module-specific) to `true`. +- Set `USE_GOOGLE_AUTH` [environment variable](docs/deploy/config-guides/env-vars/index.md#module-specific) to `true`. - Have the credentials available in one of the following locations. Once appropriate credentials are found, Weaviate uses them to generate an access token and authenticates itself against Vertex AI. Upon token expiry, Weaviate generates a replacement access token. diff --git a/docs/weaviate/more-resources/faq.md b/docs/weaviate/more-resources/faq.md index 1009c998..c5d17f75 100644 --- a/docs/weaviate/more-resources/faq.md +++ b/docs/weaviate/more-resources/faq.md @@ -473,7 +473,7 @@ More concretely: If you had to pick between a machine that has 16 GB of RAM and
    Answer -You can do this by sending a `SIGQUIT` signal to the process. This will print a stack trace to the console. The logging level and debugging variables can be set with `LOG_LEVEL` and `DEBUG` [environment variables](../config-refs/env-vars/index.md). +You can do this by sending a `SIGQUIT` signal to the process. This will print a stack trace to the console. The logging level and debugging variables can be set with `LOG_LEVEL` and `DEBUG` [environment variables](docs/deploy/config-guides/env-vars/index.md). Read more on SIGQUIT [here](https://en.wikipedia.org/wiki/Signal_(IPC)#SIGQUIT) and this [StackOverflow answer](https://stackoverflow.com/questions/19094099/how-to-dump-goroutine-stacktraces/35290196#35290196). diff --git a/docs/weaviate/starter-guides/managing-collections/collections-scaling-limits.mdx b/docs/weaviate/starter-guides/managing-collections/collections-scaling-limits.mdx index 1fbd0a87..2f48843c 100644 --- a/docs/weaviate/starter-guides/managing-collections/collections-scaling-limits.mdx +++ b/docs/weaviate/starter-guides/managing-collections/collections-scaling-limits.mdx @@ -11,7 +11,7 @@ image: og/docs/more-resources.jpg :::caution Have you hit the collections count limit? If you see an error that the collection count limit has been reached, it means you **can't create any more collections**. This limit aims to ensure Weaviate remains performant. If your instance already exceeds the limit, Weaviate will not allow the creation of any new collections. Existing collections will not be deleted.

    -**Instead of simply raising the limit, consider rethinking your architecture**. If you really need to change the limit, use the [`MAXIMUM_ALLOWED_COLLECTIONS_COUNT`](../../config-refs/env-vars/index.md) environment variable. +**Instead of simply raising the limit, consider rethinking your architecture**. If you really need to change the limit, use the [`MAXIMUM_ALLOWED_COLLECTIONS_COUNT`](docs/deploy/config-guides/env-vars/index.md) environment variable. ::: This guide offers an overview of the available architectural choices of using **multi-tenancy** or defining a **dedicated collection** for each subset of data. @@ -139,7 +139,7 @@ Use multi-tenancy when you need to support a large number of tenants and priorit #### Challenges -- **Access control complexity**: [Fine-grained access control](../../configuration/authorization.md) must be implemented to ensure data isolation between tenants. +- **Access control complexity**: [Fine-grained access control](docs/deploy/config-guides/authorization.md) must be implemented to ensure data isolation between tenants. - **Uniform collection definition**: All tenants must share the same collection schema and configuration. :::tip Reduce storage costs diff --git a/docs/weaviate/tutorials/import.md b/docs/weaviate/tutorials/import.md index 172cd002..5af21041 100644 --- a/docs/weaviate/tutorials/import.md +++ b/docs/weaviate/tutorials/import.md @@ -132,7 +132,7 @@ When importing large datasets, it may be worth planning out an optimized import 1. To use multiple CPUs efficiently, enable sharding when you import data. For the fastest imports, enable sharding even on a single node. 1. Use [parallelization](https://www.computerhope.com/jargon/p/parallelization.htm); if the CPUs are not maxed out, just add another import process. 1. Use `htop` when importing to see if all CPUs are maxed out. -1. To avoid out-of-memory issues during imports, set `LIMIT_RESOURCES` to `True` or configure the `GOMEMLIMIT` environment variable. For details, see [Environment variables](../config-refs/env-vars/index.md). +1. To avoid out-of-memory issues during imports, set `LIMIT_RESOURCES` to `True` or configure the `GOMEMLIMIT` environment variable. For details, see [Environment variables](docs/deploy/config-guides/env-vars/index.md). 1. For Kubernetes, a few large machines are faster than many small machines (due to network latency). Our rules of thumb are: From 16cab0df8e36452077036d7eb1bc8ed69454e391 Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Thu, 15 May 2025 21:54:28 -0400 Subject: [PATCH 36/39] broken link fixes --- _includes/dynamic-index-async-req.mdx | 2 +- docs/deploy/config-guides/backups.md | 2 +- docs/deploy/config-guides/modules.md | 4 ++-- docs/deploy/config-guides/monitoring.md | 2 +- docs/deploy/config-guides/replication.md | 16 ++++++++-------- .../installation-guides/docker-installation.md | 4 ++-- docs/deploy/migration/index.md | 8 ++++---- docs/deploy/migration/weaviate-1-25.md | 2 +- docs/deploy/tutorials/index.mdx | 2 +- docs/deploy/tutorials/rbac.mdx | 18 +++++++++++------- docs/weaviate/concepts/cluster.md | 2 +- .../concepts/indexing/inverted-index.md | 2 +- .../concepts/replication-architecture/index.md | 2 +- docs/weaviate/config-refs/schema/index.md | 2 +- .../config-refs/schema/vector-index.md | 4 ++-- docs/weaviate/config-refs/telemetry.md | 2 +- docs/weaviate/configuration/authentication.md | 4 ++-- docs/weaviate/configuration/index.md | 4 ++-- docs/weaviate/configuration/monitoring.md | 2 +- docs/weaviate/configuration/persistence.md | 4 ++-- docs/weaviate/configuration/rbac/index.mdx | 6 +++--- .../configuration/rbac/manage-roles.mdx | 4 ++-- .../configuration/rbac/manage-users.mdx | 2 +- docs/weaviate/installation/index.md | 2 +- docs/weaviate/installation/kubernetes.md | 2 +- docs/weaviate/modules/index.md | 8 ++++---- docs/weaviate/more-resources/faq.md | 2 +- docs/weaviate/more-resources/index.md | 2 +- docs/weaviate/release-notes/index.md | 2 +- docs/weaviate/tutorials/index.mdx | 2 +- 30 files changed, 62 insertions(+), 58 deletions(-) diff --git a/_includes/dynamic-index-async-req.mdx b/_includes/dynamic-index-async-req.mdx index 5a230a7d..45eda073 100644 --- a/_includes/dynamic-index-async-req.mdx +++ b/_includes/dynamic-index-async-req.mdx @@ -1,3 +1,3 @@ :::info Dynamic index requires `ASYNC_INDEXING` -Dynamic indexes require asynchronous indexing. To enable asynchronous indexing in a self-hosted Weaviate instance, set the `ASYNC_INDEXING` [environment variable](/docs/deploy/config-guides/env-vars/index.md#general) to `true`. If your instance is hosted in Weaviate Cloud, use the Weaviate Cloud console to enable asynchronous indexing. +Dynamic indexes require asynchronous indexing. To enable asynchronous indexing in a self-hosted Weaviate instance, set the `ASYNC_INDEXING` [environment variable](/docs/deploy/config-guides/env-vars#general) to `true`. If your instance is hosted in Weaviate Cloud, use the Weaviate Cloud console to enable asynchronous indexing. ::: \ No newline at end of file diff --git a/docs/deploy/config-guides/backups.md b/docs/deploy/config-guides/backups.md index 7ee6f17a..b1914eb0 100644 --- a/docs/deploy/config-guides/backups.md +++ b/docs/deploy/config-guides/backups.md @@ -498,7 +498,7 @@ As with backup creation, the `include` and `exclude` options are mutually exclus Note that a restore fails if any of the collections already exist on this instance. :::caution Restoring backups from `v1.23.12` and older -If you are running Weaviate `v1.23.12` or older, first **[update Weaviate](../more-resources/migration/index.md) to version 1.23.13** or higher before restoring a backup. +If you are running Weaviate `v1.23.12` or older, first **[update Weaviate](/docs/deploy/migration/index.md) to version 1.23.13** or higher before restoring a backup. Versions prior to `v1.23.13` had a bug that could lead to data not being stored correctly from a backup of your data. ::: diff --git a/docs/deploy/config-guides/modules.md b/docs/deploy/config-guides/modules.md index 49f737f3..5a6e9950 100644 --- a/docs/deploy/config-guides/modules.md +++ b/docs/deploy/config-guides/modules.md @@ -79,7 +79,7 @@ Refer to the individual [module documentation](docs/weaviate/modules/index.md) f ## Vectorizer modules -The [vectorization integration](../model-providers/index.md) enable Weaviate to vectorize data at import, and to perform [`near`](/docs/weaviate/search/similarity.md) searches such as `nearText` or `nearImage`. +The [vectorization integration](docs/weaviate/model-providers/index.md) enable Weaviate to vectorize data at import, and to perform [`near`](/docs/weaviate/search/similarity.md) searches such as `nearText` or `nearImage`. :::info List of available vectorizer integrations Can be found [in this section](/docs/weaviate/model-providers/index.md). @@ -134,7 +134,7 @@ Your choice of the `text2vec` module does not restrict your choice of `generativ Tenants can be offloaded to cold storage to reduce memory and disk usage, and onloaded back when needed. -See the [dedicated page on tenant offloading](/docs/weaviate/configuration/tenant-offloading.md) for more information on how to configure Weaviate for tenant offloading. For information on how to offload and onload tenants, see [How-to: manage tenant states](/docs/weaviate/manage-data/tenant-states.mdx). +See the [dedicated page on tenant offloading](/docs/weaviate/configuration/tenant-offloading.md) for more information on how to configure Weaviate for tenant offloading. For information on how to offload and onload tenants, see [How-to: manage tenant states](docs/weaviate/manage-collections/tenant-states.mdx). ## Custom modules diff --git a/docs/deploy/config-guides/monitoring.md b/docs/deploy/config-guides/monitoring.md index 6525945b..ae9d185b 100644 --- a/docs/deploy/config-guides/monitoring.md +++ b/docs/deploy/config-guides/monitoring.md @@ -127,7 +127,7 @@ your uses perfectly: ## `nodes` API Endpoint -To get collection details programmatically, use the [`nodes`](../config-refs/nodes.md) REST endpoint. +To get collection details programmatically, use the [`nodes`](docs/deploy/config-guides/nodes.md) REST endpoint. import APIOutputs from '/_includes/rest/node-endpoint-info.mdx'; diff --git a/docs/deploy/config-guides/replication.md b/docs/deploy/config-guides/replication.md index 2d6ba1d6..8aeeb901 100644 --- a/docs/deploy/config-guides/replication.md +++ b/docs/deploy/config-guides/replication.md @@ -6,7 +6,7 @@ image: og/docs/configuration.jpg Weaviate instances can be replicated. Replication can improve read throughput, improve availability, and enable zero-downtime upgrades. -For more details on how replication is designed and built in Weaviate, see [Replication Architecture](../concepts/replication-architecture/index.md). +For more details on how replication is designed and built in Weaviate, see [Replication Architecture](docs/weaviate/concepts/replication-architecture/index.md). ## How to configure @@ -14,7 +14,7 @@ import RaftRFChangeWarning from '/\_includes/1-25-replication-factor.mdx'; -Replication is disabled by default. It can be enabled per collection in the [collection configuration](../manage-collections/multi-node-setup.mdx#replication-settings). This means you can set different replication factors per class in your dataset. +Replication is disabled by default. It can be enabled per collection in the [collection configuration](docs/weaviate/manage-collections/multi-node-setup.mdx#replication-settings). This means you can set different replication factors per class in your dataset. To enable replication, you can set one or both of the following: @@ -25,14 +25,14 @@ To enable replication, you can set one or both of the following: The `REPLICATION_MINIMUM_FACTOR` environment variable sets the minimum replication factor for all collections in the Weaviate instance. -If you set the [replication factor for a collection](#replication-factor-for-a-collection), the collection's replication factor overrides the minimum replication factor. +If you set the [replication factor for a collection](/docs/weaviate/configuration/replication.md#replication-factor-for-a-collection), the collection's replication factor overrides the minimum replication factor. ## Data consistency When Weaviate detects inconsistent data across nodes, it attempts to repair the out of sync data. -Starting in v1.26, Weaviate adds [async replication](../concepts/replication-architecture/consistency.md#async-replication) to proactively detect inconsistencies. In earlier versions, Weaviate uses a [repair-on-read](../concepts/replication-architecture/consistency.md#repair-on-read) strategy to repair inconsistencies at read time. +Starting in v1.26, Weaviate adds [async replication](docs/weaviate/concepts/replication-architecture/consistency.md#async-replication) to proactively detect inconsistencies. In earlier versions, Weaviate uses a [repair-on-read](docs/weaviate/concepts/replication-architecture/consistency.md#repair-on-read) strategy to repair inconsistencies at read time. Repair-on-read is automatic. To activate async replication, set `asyncEnabled` to true in the `replicationConfig` section of your collection definition. @@ -64,7 +64,7 @@ Update the following [environment variables](/docs/deploy/config-guides/env-vars - **Monitor node availability:** `ASYNC_REPLICATION_ALIVE_NODES_CHECKING_FREQUENCY` Trigger comparisons whenever there’s a change in node availability. - **Configure hash tree height:** `ASYNC_REPLICATION_HASHTREE_HEIGHT` - Specify the size of the hash tree, which helps narrow down data differences by comparing hash digests at multiple levels instead of scanning entire datasets. See [this page](../concepts/replication-architecture/consistency.md#memory-and-performance-considerations-for-async-replication) for more information on the memory and performance considerations for async replication. + Specify the size of the hash tree, which helps narrow down data differences by comparing hash digests at multiple levels instead of scanning entire datasets. See [this page](docs/weaviate/concepts/replication-architecture/consistency.md#memory-and-performance-considerations-for-async-replication) for more information on the memory and performance considerations for async replication. - **Batch size for digest comparison:** `ASYNC_REPLICATION_DIFF_BATCH_SIZE` Define the number of objects whose digest (e.g., last update time) is compared between nodes before propagating actual objects. @@ -91,7 +91,7 @@ Tweak these settings based on your cluster size and network latency to achieve o ## How to use: Queries -When you add (write) or query (read) data, one or more replica nodes in the cluster will respond to the request. How many nodes need to send a successful response and acknowledgment to the coordinator node depends on the `consistency_level`. Available [consistency levels](../concepts/replication-architecture/consistency.md) are `ONE`, `QUORUM` (replication_factor / 2 + 1) and `ALL`. +When you add (write) or query (read) data, one or more replica nodes in the cluster will respond to the request. How many nodes need to send a successful response and acknowledgment to the coordinator node depends on the `consistency_level`. Available [consistency levels](docs/weaviate/concepts/replication-architecture/consistency.md) are `ONE`, `QUORUM` (replication_factor / 2 + 1) and `ALL`. The `consistency_level` can be specified at query time: @@ -101,7 +101,7 @@ curl "http://localhost:8080/v1/objects/{ClassName}/{id}?consistency_level=ONE" ``` :::note -In v1.17, only [read queries that get data by ID](../manage-objects/read.mdx#get-an-object-by-id) had a tunable consistency level. All other object-specific REST endpoints (read or write) used the consistency level `ALL`. Starting with v1.18, all write and read queries are tunable to either `ONE`, `QUORUM` (default) or `ALL`. GraphQL endpoints use the consistency level `ONE` (in both versions). +In v1.17, only [read queries that get data by ID](docs/weaviate/manage-objects/read.mdx#get-an-object-by-id) had a tunable consistency level. All other object-specific REST endpoints (read or write) used the consistency level `ALL`. Starting with v1.18, all write and read queries are tunable to either `ONE`, `QUORUM` (default) or `ALL`. GraphQL endpoints use the consistency level `ONE` (in both versions). ::: import QueryReplication from '/\_includes/code/replication.get.object.by.id.mdx'; @@ -110,7 +110,7 @@ import QueryReplication from '/\_includes/code/replication.get.object.by.id.mdx' ## Related pages -- [Concepts: Replication Architecture](../concepts/replication-architecture/index.md) +- [Concepts: Replication Architecture](docs/weaviate/concepts/replication-architecture/index.md) - [Configurinfg Async Replication](./async-rep.md) ## Questions and feedback diff --git a/docs/deploy/installation-guides/docker-installation.md b/docs/deploy/installation-guides/docker-installation.md index 498b9158..ebadaffa 100644 --- a/docs/deploy/installation-guides/docker-installation.md +++ b/docs/deploy/installation-guides/docker-installation.md @@ -36,8 +36,8 @@ You can customize your Weaviate configuration by creating a `docker-compose.yml` ## Sample Docker Compose file This starter Docker Compose file allows: -* Use of any [API-based model provider integrations](../model-providers/index.md) (e.g. `OpenAI`, `Cohere`, `Google`, and `Anthropic`). - * This includes the relevant embedding model, generative, and reranker [integrations](../model-providers/index.md). +* Use of any [API-based model provider integrations](docs/weaviate/model-providers/index.md) (e.g. `OpenAI`, `Cohere`, `Google`, and `Anthropic`). + * This includes the relevant embedding model, generative, and reranker [integrations](/docs/weaviate/model-providers/index.md). * Searching pre-vectorized data (without a vectorizer). * Mounts a persistent volume called `weaviate_data` to `/var/lib/weaviate` in the container to store data. diff --git a/docs/deploy/migration/index.md b/docs/deploy/migration/index.md index dd1c0b3e..2528385a 100644 --- a/docs/deploy/migration/index.md +++ b/docs/deploy/migration/index.md @@ -13,7 +13,7 @@ Weaviate is under active development, with new features and improvements being a When upgrading Weaviate, we recommend that you: -1. Create a complete [backup](../../configuration/backups.md) of your current Weaviate instance before beginning any upgrade process. +1. Create a complete [backup](docs/deploy/config-guides/backups.md) of your current Weaviate instance before beginning any upgrade process. 1. Plan to upgrade one minor version at a time, always using the latest patch version of each minor release. This approach of upgrading one minor version at a time helps to minimize the risk of issues during the upgrade process, by mirroring our testing and release process. Upgrading to the latest patch version of each minor release ensures that you have the latest bugfixes and improvements. @@ -41,11 +41,11 @@ Between `v1.25` and `v1.27`, there are two minor versions, `v1.26` and `v1.27`. ### Raft Migration (v1.25.0+) -Weaviate `v1.25.0` introduced Raft [as the consensus algorithm for cluster metadata](../../concepts/replication-architecture/cluster-architecture.md#metadata-replication-raft). This requires a one-time migration of the cluster metadata. +Weaviate `v1.25.0` introduced Raft [as the consensus algorithm for cluster metadata](/docs/weaviate/concepts/replication-architecture/cluster-architecture.md#metadata-replication-raft.). This requires a one-time migration of the cluster metadata. -In [Docker-based self-hosted instances](../../installation/docker-compose.md), the migration is automatic. +In [Docker-based self-hosted instances](docs/deploy/installation-guides/docker-installation.md), the migration is automatic. -In [Kubernetes-based self-hosted instances](../../installation/kubernetes.md), you must perform a manual migration step. For more information, see the [Weaviate `v1.25.0` migration guide](./weaviate-1-25.md). +In [Kubernetes-based self-hosted instances](docs/deploy/installation-guides/k8s-installation.md), you must perform a manual migration step. For more information, see the [Weaviate `v1.25.0` migration guide](./weaviate-1-25.md). This was a significant change to the Weaviate architecture. Accordingly, we suggest performing another backup after upgrading to `v1.25.latest`, before proceeding with further upgrades to ensure that you have a recent backup. diff --git a/docs/deploy/migration/weaviate-1-25.md b/docs/deploy/migration/weaviate-1-25.md index 2344fbeb..16763013 100644 --- a/docs/deploy/migration/weaviate-1-25.md +++ b/docs/deploy/migration/weaviate-1-25.md @@ -55,7 +55,7 @@ If your deployment is on another namespace, modify the instructions below accord ### (Optional) Backup -Before proceeding with the upgrade, we recommend making a [backup](/docs/weaviate/configuration/backups.md) of your Weaviate Database. If a backup is not possible, you can explore other options, such as manually [exporting your data](/docs/weaviate/manage-collections/migrate.mdx) +Before proceeding with the upgrade, we recommend making a [backup](docs/deploy/config-guides/backups.md) of your Weaviate Database. If a backup is not possible, you can explore other options, such as manually [exporting your data](/docs/weaviate/manage-collections/migrate.mdx) ### 1. Delete StatefulSet diff --git a/docs/deploy/tutorials/index.mdx b/docs/deploy/tutorials/index.mdx index 54266bad..51fe0b3e 100644 --- a/docs/deploy/tutorials/index.mdx +++ b/docs/deploy/tutorials/index.mdx @@ -21,7 +21,7 @@ export const advancedFeaturesData = [ title: "Set up Role-Based Access Control (RBAC)", description: "Configure roles, permissions, and user assignments for secure access control in Weaviate.", - link: "docs/deploy/tutorials/rbac.mdx", + link: "/docs/deploy/tutorials/rbac", icon: "fas fa-user-shield", }, ]; diff --git a/docs/deploy/tutorials/rbac.mdx b/docs/deploy/tutorials/rbac.mdx index 7868eaa2..aeb7c95c 100644 --- a/docs/deploy/tutorials/rbac.mdx +++ b/docs/deploy/tutorials/rbac.mdx @@ -79,7 +79,7 @@ We are going to create the following roles: Before starting this tutorial, ensure you have the following: - Docker for running a Weaviate instance locally. -- Your preferred Weaviate [client library](../client-libraries/index.mdx) installed. +- Your preferred Weaviate [client library](docs/weaviate/client-libraries/index.mdx) installed. ### Local instance - `root` user @@ -132,7 +132,7 @@ We will connect to Weaviate with `root-user`, and once we create a new role, we ### Step 1: Connect to Weaviate -Ensure you are connected to Weaviate with a user possessing sufficient permissions to manage roles. You can achieve this by either using the predefined `root` role during [Weaviate configuration](../configuration/rbac/configuration.md) or by granting a user the [`manage_roles` permission](../configuration/rbac/manage-roles.mdx#role-management-permissions). +Ensure you are connected to Weaviate with a user possessing sufficient permissions to manage roles. You can achieve this by either using the predefined `root` role during [Weaviate configuration](docs/deploy/config-guides/configuring-rbac.md) or by granting a user the [`manage_roles` permission](docs/weaviate/configuration/rbac/manage-roles.mdx#role-management-permissions). @@ -279,7 +279,9 @@ Now, you can assign the role `rw_role` to `custom-user`: ### Step 1: Connect to Weaviate -Ensure you are connected to Weaviate with a user possessing sufficient permissions to manage roles. You can achieve this by either using the predefined `root` role during [Weaviate configuration](../configuration/rbac/configuration.md) or by granting a user the [`manage_roles` permission](../configuration/rbac/manage-roles.mdx#role-management-permissions). +Ensure you are connected to Weaviate with a user possessing sufficient permissions to manage roles. +You can achieve this by either using the predefined `root` role during [Weaviate configuration](/docs/deploy/config-guides/configuring-rbac) +or by granting a user the [`manage_roles` permission](/docs/weaviate/configuration/rbac/manage-roles#role-management). @@ -426,7 +428,9 @@ Now, you can assign the role `viewer_role` to `custom-user`: ### Step 1: Connect to Weaviate -Ensure you are connected to Weaviate with a user possessing sufficient permissions to manage roles. You can achieve this by either using the predefined `root` role during [Weaviate configuration](../configuration/rbac/configuration.md) or by granting a user the [`manage_roles` permission](../configuration/rbac/manage-roles.mdx#role-management-permissions). +Ensure you are connected to Weaviate with a user possessing sufficient permissions to manage roles. +You can achieve this by either using the predefined `root` role during [Weaviate configuration](docs/deploy/config-guides/configuring-rbac.md) +or by granting a user the [`manage_roles` permission](docs/weaviate/configuration/rbac/manage-roles.mdx#role-management-permissions). @@ -579,9 +583,9 @@ It walks you through connecting to Weaviate using a user with role management ca ## Additional resources -- [RBAC: Configuration](../configuration/rbac/configuration.md) -- [RBAC: Manage roles](../configuration/rbac/manage-roles.mdx) -- [RBAC: Manage users](../configuration/rbac/manage-users.mdx) +- [RBAC: Configuration](docs/deploy/config-guides/configuring-rbac.md) +- [RBAC: Manage roles](docs/weaviate/configuration/rbac/manage-roles.mdx) +- [RBAC: Manage users](docs/weaviate/configuration/rbac/manage-users.mdx) ## Questions and feedback diff --git a/docs/weaviate/concepts/cluster.md b/docs/weaviate/concepts/cluster.md index db2886bc..4ec71ce4 100644 --- a/docs/weaviate/concepts/cluster.md +++ b/docs/weaviate/concepts/cluster.md @@ -124,7 +124,7 @@ Shards were assigned to 'live' nodes in a round-robin fashion starting with a ra ## Consistency and current limitations -* Starting with `v1.25.0`, Weaviate adopts the [Raft consensus algorithm](https://raft.github.io/) which is a log-based algorithm coordinated by an elected leader. This brings an additional benefit in that concurrent schema changes are now supported.
    If you are a Kubernetes user, see the [`1.25 migration guide`](/docs/weaviate/more-resources/migration/weaviate-1-25.md) before you upgrade. To upgrade, you have to delete your existing StatefulSet. +* Starting with `v1.25.0`, Weaviate adopts the [Raft consensus algorithm](https://raft.github.io/) which is a log-based algorithm coordinated by an elected leader. This brings an additional benefit in that concurrent schema changes are now supported.
    If you are a Kubernetes user, see the [`1.25 migration guide`](docs/deploy/migration/weaviate-1-25.md) before you upgrade. To upgrade, you have to delete your existing StatefulSet. * As of `v1.8.0`, the process of broadcasting schema changes across the cluster uses a form of two-phase transaction that as of now cannot tolerate node failures during the lifetime of the transaction. * As of `v1.8.0`, dynamically scaling a cluster is not fully supported yet. New nodes can be added to an existing cluster, however it does not affect the ownership of shards. Existing nodes can not yet be removed if data is present, as shards are not yet being moved to other nodes prior to a removal of a node. diff --git a/docs/weaviate/concepts/indexing/inverted-index.md b/docs/weaviate/concepts/indexing/inverted-index.md index 0fa74ffb..6b9d279d 100644 --- a/docs/weaviate/concepts/indexing/inverted-index.md +++ b/docs/weaviate/concepts/indexing/inverted-index.md @@ -27,7 +27,7 @@ As always, we recommend upgrading to the latest version of Weaviate to benefit f The BlockMax WAND algorithm is a variant of the WAND algorithm that is used to speed up BM25 and hybrid searches. It organizes the inverted index in blocks to enable skipping over blocks that are not relevant to the query. This can significantly reduce the number of documents that need to be scored, improving search performance. -If you are experiencing slow BM25 (or hybrid) searches and use a Weaviate version prior to `v1.30`, try migrating to a newer version that uses the BlockMax WAND algorithm to see if it improves performance. If you need to migrate existing data from a previous version of Weaviate, follow the [v1.30 migration guide](/docs/deploy/other/migration/weaviate-1-30.md). +If you are experiencing slow BM25 (or hybrid) searches and use a Weaviate version prior to `v1.30`, try migrating to a newer version that uses the BlockMax WAND algorithm to see if it improves performance. If you need to migrate existing data from a previous version of Weaviate, follow the [v1.30 migration guide](docs/deploy/migration/weaviate-1-30.md). :::note Scoring changes with BlockMax WAND diff --git a/docs/weaviate/concepts/replication-architecture/index.md b/docs/weaviate/concepts/replication-architecture/index.md index 3c4baac3..0fa4d690 100644 --- a/docs/weaviate/concepts/replication-architecture/index.md +++ b/docs/weaviate/concepts/replication-architecture/index.md @@ -147,7 +147,7 @@ Prior to Weaviate `v1.25`, each cluster metadata change was recorded via a distr This is a synchronous process, which means that the cluster metadata change is only committed when all nodes have acknowledged the change. In this architecture, any node downtime would temporarily prevent metadata operations. Additionally, only one such operation could be processed at a time. -If you are using Weaviate `v1.24` or earlier, you can [upgrade to `v1.25`](/docs/deploy/other/migration/weaviate-1-25.md) to benefit from the Raft consensus algorithm for cluster metadata changes. +If you are using Weaviate `v1.24` or earlier, you can [upgrade to `v1.25`](docs/deploy/migration/weaviate-1-25.md) to benefit from the Raft consensus algorithm for cluster metadata changes.
    diff --git a/docs/weaviate/config-refs/schema/index.md b/docs/weaviate/config-refs/schema/index.md index 1ceaf4b3..22b102e8 100644 --- a/docs/weaviate/config-refs/schema/index.md +++ b/docs/weaviate/config-refs/schema/index.md @@ -607,7 +607,7 @@ The `kagome_kr` tokenizer is not loaded by default to save resources. To use it, ### Limit the number of `gse` and `Kagome` tokenizers The `gse` and `Kagome` tokenizers can be resource intensive and affect Weaviate's performance. -You can limit the combined number of `gse` and `Kagome` tokenizers running at the same time using the [`TOKENIZER_CONCURRENCY_COUNT` environment variable](../env-vars/index.md). +You can limit the combined number of `gse` and `Kagome` tokenizers running at the same time using the [`TOKENIZER_CONCURRENCY_COUNT` environment variable](docs/deploy/config-guides/env-vars/index.md). ### Inverted index types diff --git a/docs/weaviate/config-refs/schema/vector-index.md b/docs/weaviate/config-refs/schema/vector-index.md index 2dc7f9f7..195e4ffd 100644 --- a/docs/weaviate/config-refs/schema/vector-index.md +++ b/docs/weaviate/config-refs/schema/vector-index.md @@ -54,7 +54,7 @@ Tombstones are records that mark deleted objects. In an HNSW index, tombstones a As the index grows in size, the cleanup process may take longer to complete and require more resources. For very large indexes, this may cause performance issues. -To control the number of tombstones deleted per cleanup cycle and prevent performance issues, set the [`TOMBSTONE_DELETION_MAX_PER_CYCLE` and `TOMBSTONE_DELETION_MIN_PER_CYCLE` environment variables](../env-vars/index.md#general). +To control the number of tombstones deleted per cleanup cycle and prevent performance issues, set the [`TOMBSTONE_DELETION_MAX_PER_CYCLE` and `TOMBSTONE_DELETION_MIN_PER_CYCLE` environment variables](docs/deploy/config-guides/env-vars/index.md#general). - Set `TOMBSTONE_DELETION_MIN_PER_CYCLE` to prevent occurrences of unnecessary cleanup cycles. - Set `TOMBSTONE_DELETION_MAX_PER_CYCLE` to prevent the cleanup process from taking too long and consuming too many resources. @@ -219,7 +219,7 @@ services: -To get the index status, check the [node status](/docs/weaviate/config-refs/nodes) endpoint. +To get the index status, check the [node status](docs/deploy/config-guides/nodes.md) endpoint.
    Node status example usage diff --git a/docs/weaviate/config-refs/telemetry.md b/docs/weaviate/config-refs/telemetry.md index 2512a0e7..4bc2b65b 100644 --- a/docs/weaviate/config-refs/telemetry.md +++ b/docs/weaviate/config-refs/telemetry.md @@ -22,7 +22,7 @@ Weaviate does not collect any other telemetry information. ## Disabling Telemetry Data -To disable telemetry data collection, add this line to your [system configuration](./env-vars/index.md) file: +To disable telemetry data collection, add this line to your [system configuration](docs/deploy/config-guides/env-vars/index.md) file: ```bash DISABLE_TELEMETRY=true diff --git a/docs/weaviate/configuration/authentication.md b/docs/weaviate/configuration/authentication.md index 9f8615a4..e47da4bc 100644 --- a/docs/weaviate/configuration/authentication.md +++ b/docs/weaviate/configuration/authentication.md @@ -9,7 +9,7 @@ image: og/docs/configuration.jpg Authentication and authorization are closely related concepts, and sometimes abbreviated as `AuthN` and `AuthZ`. Authentication (`AuthN`) is the process of verifying the identity of a user, while authorization (`AuthZ`) is the process of determining what permissions the user has. ::: -Weaviate controls access through user authentication via API keys or OpenID Connect (OIDC), with an option for anonymous access. Users can then be assigned different [authorization](./authorization.md) levels, as shown in the diagram below. +Weaviate controls access through user authentication via API keys or OpenID Connect (OIDC), with an option for anonymous access. Users can then be assigned different [authorization](docs/deploy/config-guides/authorization.md) levels, as shown in the diagram below. ```mermaid flowchart LR @@ -218,7 +218,7 @@ curl https://localhost:8080/v1/objects -H "Authorization: Bearer ${WEAVIATE_API_ ## Further resources -- [Configuration: Authorization and RBAC](./authorization.md) +- [Configuration: Authorization and RBAC](docs/deploy/config-guides/authorization.md) - [References: Environment variables / Authentication and Authorization](docs/deploy/config-guides/env-vars/index.md#authentication-and-authorization) ## Questions and feedback diff --git a/docs/weaviate/configuration/index.md b/docs/weaviate/configuration/index.md index 942faa08..bdfb4802 100644 --- a/docs/weaviate/configuration/index.md +++ b/docs/weaviate/configuration/index.md @@ -10,7 +10,7 @@ This section shows you how to configure Weaviate. - Extend Weaviate's functionality by adding vectorizers and other [modules](./modules.md) - Configure how Weaviate stores and indexes data - - [schema](../manage-data/collections.mdx) + - [schema](docs/weaviate/manage-collections/index.mdx) - [data types](../config-refs/datatypes.md) - [distance metrics](../config-refs/distances.md) @@ -18,5 +18,5 @@ This section shows you how to configure Weaviate. - [Back up](docs/deploy/config-guides/backups.md) your Weaviate instance - Control access - [authentication](./authentication.md) - - [authorization](./authorization.md) + - [authorization](docs/deploy/config-guides/authorization.md) - [Monitor](./monitoring.md) your Weaviate instance diff --git a/docs/weaviate/configuration/monitoring.md b/docs/weaviate/configuration/monitoring.md index 1c561fb7..c9a7bc0d 100644 --- a/docs/weaviate/configuration/monitoring.md +++ b/docs/weaviate/configuration/monitoring.md @@ -130,7 +130,7 @@ your uses perfectly: ## `nodes` API Endpoint -To get collection details programmatically, use the [`nodes`](../config-refs/nodes.md) REST endpoint. +To get collection details programmatically, use the [`nodes`](docs/deploy/config-guides/nodes.md) REST endpoint. import APIOutputs from '/\_includes/rest/node-endpoint-info.mdx'; diff --git a/docs/weaviate/configuration/persistence.md b/docs/weaviate/configuration/persistence.md index fe93ea2d..2d2b33eb 100644 --- a/docs/weaviate/configuration/persistence.md +++ b/docs/weaviate/configuration/persistence.md @@ -76,7 +76,7 @@ See [Backups](docs/deploy/config-guides/backups.md). ## Kubernetes -For Kubernetes setup, the only thing to bear in mind is that Weaviate needs a `PersistentVolumes` through `PersistentVolumeClaims` ([more info](/docs/weaviate/installation/kubernetes.md#requirements)) but the Helm chart is already configured to store the data on an external volume. +For Kubernetes setup, the only thing to bear in mind is that Weaviate needs a `PersistentVolumes` through `PersistentVolumeClaims` ([more info](/docs/deploy/installation-guides/k8s-installation.md#requirements)) but the Helm chart is already configured to store the data on an external volume. ## Disk Pressure Warnings and Limits @@ -104,7 +104,7 @@ In general, `mmap` may be a preferred option with memory management benefits. Ho ## Related pages -- [Configuration: Backups](./backups.md) +- [Configuration: Backups](docs/deploy/config-guides/backups.md) ## Questions and feedback diff --git a/docs/weaviate/configuration/rbac/index.mdx b/docs/weaviate/configuration/rbac/index.mdx index 4ee13f1d..a09a1d7e 100644 --- a/docs/weaviate/configuration/rbac/index.mdx +++ b/docs/weaviate/configuration/rbac/index.mdx @@ -104,7 +104,7 @@ The `root` role can be assigned to a user through the Weaviate configuration fil All roles can also be assigned through the Weaviate API, including the predefined role. The predefined roles cannot be modified, but they can be assigned to or revoked from users. -Refer to the [RBAC: Configuration](/docs/weaviate/configuration/rbac/configuration) page for more information on how to assign predefined roles to users. +Refer to the [RBAC: Configuration](docs/deploy/config-guides/configuring-rbac.md) page for more information on how to assign predefined roles to users. ### Custom roles @@ -112,7 +112,7 @@ Any authenticated user that is not assigned a predefined role has no roles or pe These users' permissions can be modified through Weaviate by those with the appropriate permissions for **managing roles**. This allows for the creation of custom roles, which can be assigned to users as needed. -Role management can be performed with a [predefined `root` role](/docs/weaviate/configuration/rbac/configuration) or a custom role with [`manage_roles` permissions](/docs/weaviate/configuration/rbac/manage-roles#role-management-permissions). +Role management can be performed with a [predefined `root` role](docs/deploy/config-guides/configuring-rbac.md) or a custom role with [`manage_roles` permissions](/docs/weaviate/configuration/rbac/manage-roles#role-management-permissions). :::caution Role Management Permissions Be careful when assigning permissions to roles that manage roles. These permissions can be used to escalate privileges by assigning additional roles to users. Only assign these permissions to trusted users. @@ -357,7 +357,7 @@ The [user management](./manage-users.mdx) API can be used to create, delete and - [RBAC: Configuration](docs/deploy/config-guides/configuring-rbac.md) - [RBAC: Manage roles](./manage-roles.mdx) - [RBAC: Manage users](./manage-users.mdx) -- [RBAC: Tutorial](../../tutorials/rbac.mdx) +- [RBAC: Tutorial](docs/deploy/tutorials/rbac.mdx) ## Questions and feedback diff --git a/docs/weaviate/configuration/rbac/manage-roles.mdx b/docs/weaviate/configuration/rbac/manage-roles.mdx index fc86285b..027d23e3 100644 --- a/docs/weaviate/configuration/rbac/manage-roles.mdx +++ b/docs/weaviate/configuration/rbac/manage-roles.mdx @@ -31,7 +31,7 @@ import ConfigureRbac from '/_includes/configuration/configure-rbac.mdx'; Role management requires appropriate `role` resource permissions that can be obtained through: -- A predefined `root` role when [configuring RBAC](/docs/weaviate/configuration/rbac/configuration). +- A predefined `root` role when [configuring RBAC](docs/deploy/config-guides/configuring-rbac.md). - A role with [`Role Management`](#role-management-permissions) permissions granted. @@ -638,7 +638,7 @@ Visit the [Manage users](./manage-users.mdx) page to learn more about assigning ## Further resources - [RBAC: Overview](./index.mdx) -- [RBAC: Configuration](./configuration.md) +- [RBAC: Configuration](docs/deploy/config-guides/configuring-rbac.md) - [RBAC: Manage users](./manage-users.mdx) ## Questions and feedback diff --git a/docs/weaviate/configuration/rbac/manage-users.mdx b/docs/weaviate/configuration/rbac/manage-users.mdx index fe719a9b..82787d07 100644 --- a/docs/weaviate/configuration/rbac/manage-users.mdx +++ b/docs/weaviate/configuration/rbac/manage-users.mdx @@ -480,7 +480,7 @@ viewer ## Further resources - [RBAC: Overview](./index.mdx) -- [RBAC: Configuration](./configuration.md) +- [RBAC: Configuration](docs/deploy/config-guides/configuring-rbac.md) - [RBAC: Manage roles](./manage-roles.mdx) ## Questions and feedback diff --git a/docs/weaviate/installation/index.md b/docs/weaviate/installation/index.md index 8c697cdf..00a88be1 100644 --- a/docs/weaviate/installation/index.md +++ b/docs/weaviate/installation/index.md @@ -7,7 +7,7 @@ image: og/docs/installation.jpg Weaviate is available as a hosted service, [Weaviate Cloud (WCD)](https://console.weaviate.cloud/), or as a self managed instance. If you manage your own instance, you can host it locally or with a cloud provider. Self-managed instances use the same Weaviate Database as WCD. -If you are upgrading from a previous version of Weaviate, see the [Migration Guide](../more-resources/migration/index.md) for any changes that may affect your installation. +If you are upgrading from a previous version of Weaviate, see the [Migration Guide](docs/deploy/migration/index.md) for any changes that may affect your installation. ## Installation methods diff --git a/docs/weaviate/installation/kubernetes.md b/docs/weaviate/installation/kubernetes.md index f9d0105a..a3ed2511 100644 --- a/docs/weaviate/installation/kubernetes.md +++ b/docs/weaviate/installation/kubernetes.md @@ -168,7 +168,7 @@ The above command (`helm upgrade...`) is idempotent. In other words, you can run To upgrade to `1.25` or higher from a pre-`1.25` version, you must delete the deployed `StatefulSet`, update the helm chart to version `17.0.0` or higher, and re-deploy Weaviate. -See the [1.25 migration guide for Kubernetes](../more-resources/migration/weaviate-1-25.md) for more details. +See the [1.25 migration guide for Kubernetes](docs/deploy/migration/weaviate-1-25.md) for more details. ### Using EFS with Weaviate diff --git a/docs/weaviate/modules/index.md b/docs/weaviate/modules/index.md index 61fbf8c0..4dd02383 100644 --- a/docs/weaviate/modules/index.md +++ b/docs/weaviate/modules/index.md @@ -88,9 +88,9 @@ This type of provider is ideal for production environments. This is because stor Additionally, multi-node Weaviate clusters _require_ the use of an external provider. Storing a multi-node backup on internally on a single node presents several issues, like significantly reducing the durability and availability of the backup, and is not supported. The supported external backup providers are: -- [S3](/docs/weaviate/configuration/backups.md#s3-aws-or-s3-compatible) -- [GCS](/docs/weaviate/configuration/backups.md#gcs-google-cloud-storage) -- [Azure](/docs/weaviate/configuration/backups.md#azure-storage) +- [S3](docs/deploy/config-guides/backups.md#s3-aws-or-s3-compatible) +- [GCS](docs/deploy/config-guides/backups.md#gcs-google-cloud-storage) +- [Azure](docs/deploy/config-guides/backups.md#azure-storage) Thanks to the extensibility of the module system, new providers can be readily added. If you are interested in an external provider other than the ones listed above, feel free to reach out via our [forum](https://forum.weaviate.io/), or open an issue on [GitHub](https://github.com/weaviate/weaviate). @@ -98,7 +98,7 @@ Thanks to the extensibility of the module system, new providers can be readily a Internal providers coordinate the storage and retrieval of backed-up Weaviate data within a Weaviate instance. This type of provider is intended for developmental or experimental use, and is not recommended for production. Internal Providers are not compatible for multi-node backups, which require the use of an external provider. -As of Weaviate `v1.16`, the only supported internal backup provider is the [filesystem](/docs/weaviate/configuration/backups.md#filesystem) provider. +As of Weaviate `v1.16`, the only supported internal backup provider is the [filesystem](docs/deploy/config-guides/backups.md#filesystem) provider. ## Offloading Modules diff --git a/docs/weaviate/more-resources/faq.md b/docs/weaviate/more-resources/faq.md index c5d17f75..30fdb4a0 100644 --- a/docs/weaviate/more-resources/faq.md +++ b/docs/weaviate/more-resources/faq.md @@ -73,7 +73,7 @@ image: og/docs/more-resources.jpg Answer > Role-based access control (RBAC) can be enabled when configuring Weaviate via the `AUTHORIZATION_RBAC_ENABLED` environment variable. -> For more info visit the [RBAC: Configuration](/docs/weaviate/configuration/rbac/configuration) guide. +> For more info visit the [RBAC: Configuration](docs/deploy/config-guides/configuring-rbac.md) guide.
    diff --git a/docs/weaviate/more-resources/index.md b/docs/weaviate/more-resources/index.md index fdd50eb6..71905fd1 100644 --- a/docs/weaviate/more-resources/index.md +++ b/docs/weaviate/more-resources/index.md @@ -17,7 +17,7 @@ These pages can help with common questions: - [Example datasets](./example-datasets.md) - [Example use cases](./example-use-cases.md) - [Index types and performance](./performance.md) -- [Migration Guide](./migration/index.md) +- [Migration Guide](docs/deploy/migration/index.md) ## (Even) more resources diff --git a/docs/weaviate/release-notes/index.md b/docs/weaviate/release-notes/index.md index daf948ea..93a2fdd2 100644 --- a/docs/weaviate/release-notes/index.md +++ b/docs/weaviate/release-notes/index.md @@ -42,7 +42,7 @@ export const pythonCardsData = [ This page lists [developer release notes](https://github.com/weaviate/weaviate/releases) for Weaviate Database. - To see the GitHub release notes for a particular version, click on the version number. -- For more information on upgrading Weaviate, see the [Migration Guide](../more-resources/migration/index.md). +- For more information on upgrading Weaviate, see the [Migration Guide](docs/deploy/migration/index.md). ### Weaviate Database and client releases diff --git a/docs/weaviate/tutorials/index.mdx b/docs/weaviate/tutorials/index.mdx index 3d45ec6a..5a2f88a4 100644 --- a/docs/weaviate/tutorials/index.mdx +++ b/docs/weaviate/tutorials/index.mdx @@ -21,7 +21,7 @@ export const advancedFeaturesData = [ title: "Set up Role-Based Access Control (RBAC)", description: "Configure roles, permissions, and user assignments for secure access control in Weaviate.", - link: "/docs/weaviate/tutorials/rbac", + link: "/docs/deploy/tutorials/rbac", icon: "fas fa-user-shield", }, { From 2a8166dd0430fc2775f32e7112c44c1541c05713 Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Thu, 15 May 2025 22:56:04 -0400 Subject: [PATCH 37/39] final phase 1 edits --- docs/deploy/installation-guides/aws-cli.md | 50 +++++++++++++++++++ docs/deploy/migration/weaviate-1-25.md | 2 + docs/deploy/migration/weaviate-1-30.md | 7 +++ docs/deploy/production/Kubernetes/index.mdx | 6 +++ docs/deploy/production/Kubernetes/k8s-poc.md | 8 ++- .../Kubernetes/production-readiness.md | 5 ++ docs/deploy/production/index.mdx | 8 ++- docs/deploy/tutorials/index.mdx | 5 ++ 8 files changed, 89 insertions(+), 2 deletions(-) diff --git a/docs/deploy/installation-guides/aws-cli.md b/docs/deploy/installation-guides/aws-cli.md index d4932de1..fda3564b 100644 --- a/docs/deploy/installation-guides/aws-cli.md +++ b/docs/deploy/installation-guides/aws-cli.md @@ -13,6 +13,39 @@ Weaviate can be deployed on an EKS cluster using the `eksctl` command-line tool - `eksctl` installed ::: +
    + AWS policies needed + +Ensure that you have adequate permissions to create and interact wth an EKS cluster. The following policies should provide you the adequate permissions to create your cluster: + +- eks:CreateCluster +- eks:DescribeCluster +- eks:ListClusters +- eks:UpdateClusterConfig +- eks:DeleteCluster +- iam:CreateRole +- iam:AttachRolePolicy +- iam:PutRolePolicy +- iam:GetRole +- iam:ListRolePolicies +- iam:ListAttachedRolePolicies +- ec2:DescribeSubnets +- ec2:DescribeVpcs +- ec2:DescribeSecurityGroups +- ec2:CreateSecurityGroup +- ec2:AuthorizeSecurityGroupIngress +- ec2:RevokeSecurityGroupIngress +- cloudformation:CreateStack +- cloudformation:DescribeStacks +- cloudformation:UpdateStack +- cloudformation:DeleteStack +- ec2:CreateTags +- ec2:DescribeInstances +- ec2:DescribeNetworkInterfaces +- ec2:DescribeAvailabilityZones + +
    + #### Verify your tools Before starting, ensure that your tools are installed: @@ -24,6 +57,8 @@ kubectl version eksctl version ``` + + ### Step 1: Create the Cluster To create your cluster, prepare a `yaml` file that with a name of your choosing (e.g. `eks-cluster.yaml`) @@ -130,6 +165,21 @@ helm repo update After you've added the Weaviate Helm chart, configure the `values.yaml` file before you deploy Weaviate on the cluster. +```bash +helm show values weaviate/weaviate > values.yaml +``` + +Before deploying Weaviate, change the `storgeclass` and ensure that you have replicas specified in your `values.yaml` file. + +```yaml +storage: + size: 32Gi + storageClassName: "" +``` + +```yaml +replicas: 3 +``` #### Deploy Weaviate on your cluster: diff --git a/docs/deploy/migration/weaviate-1-25.md b/docs/deploy/migration/weaviate-1-25.md index 16763013..c5268d4b 100644 --- a/docs/deploy/migration/weaviate-1-25.md +++ b/docs/deploy/migration/weaviate-1-25.md @@ -193,6 +193,8 @@ helm upgrade weaviate weaviate/weaviate \ This should bring the cluster back to your specified pre-`1.25` version. +## Questions and feedback + import DocsFeedback from '/_includes/docs-feedback.mdx'; diff --git a/docs/deploy/migration/weaviate-1-30.md b/docs/deploy/migration/weaviate-1-30.md index f26bbb46..56045215 100644 --- a/docs/deploy/migration/weaviate-1-30.md +++ b/docs/deploy/migration/weaviate-1-30.md @@ -323,3 +323,10 @@ BlockMax WAND algorithm is available in `v1.29` as a **technical preview**. **We Enable BlockMax WAND by setting the environment variables `USE_BLOCKMAX_WAND` and `USE_INVERTED_SEARCHABLE` to `true`. Now, all new data added to Weaviate will use BlockMax WAND for BM25 and hybrid searches. However, preexisting data will continue to use the default WAND algorithm. + + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/docs/deploy/production/Kubernetes/index.mdx b/docs/deploy/production/Kubernetes/index.mdx index d9d9bca9..2f09b810 100644 --- a/docs/deploy/production/Kubernetes/index.mdx +++ b/docs/deploy/production/Kubernetes/index.mdx @@ -23,3 +23,9 @@ Weaviate can use Kubernetes in a variety of deployments for your enterprise envi - Amazon EKS (Elastic Kubernetes Service) +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + + diff --git a/docs/deploy/production/Kubernetes/k8s-poc.md b/docs/deploy/production/Kubernetes/k8s-poc.md index ebe68cfa..d1215e9c 100644 --- a/docs/deploy/production/Kubernetes/k8s-poc.md +++ b/docs/deploy/production/Kubernetes/k8s-poc.md @@ -151,4 +151,10 @@ updateStrategy: Voila! You now have a deployment that is *somewhat* ready for production. Your next step will be to complete the self-assessment and identify any gaps. -### Next Steps: [Production Readiness Self-Assessment](./production-readiness.md) \ No newline at end of file +### Next Steps: [Production Readiness Self-Assessment](./production-readiness.md) + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/docs/deploy/production/Kubernetes/production-readiness.md b/docs/deploy/production/Kubernetes/production-readiness.md index 751338e1..7a7f828f 100644 --- a/docs/deploy/production/Kubernetes/production-readiness.md +++ b/docs/deploy/production/Kubernetes/production-readiness.md @@ -86,3 +86,8 @@ If you *do* identify gaps within your deployment, be sure to reach out to your S Evaluate these key areas to build a highly available, resilient, and efficient deployment that will scale to meet your business needs. By ensuring that these self-assessment questions have been addressed, you can proactively identify potential risks and maximize the reliability of your deployment. +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/docs/deploy/production/index.mdx b/docs/deploy/production/index.mdx index 4f2c75c0..73dce29a 100644 --- a/docs/deploy/production/index.mdx +++ b/docs/deploy/production/index.mdx @@ -35,4 +35,10 @@ Weaviate has different options for deploying in a production environment using: - **Serverless Cloud**: A Serverless Cloud instance is a robust cluster designed for production use. - **Enterprise Cloud**: Enterprise Cloud is a fully-managed deployment of dedicated resources within a secure, highly available environment. -- **Bring Your Own Cloud (BYOC)**: Using your own cloud environment, you are able to have a fully managed deployed. \ No newline at end of file +- **Bring Your Own Cloud (BYOC)**: Using your own cloud environment, you are able to have a fully managed deployed. + +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/docs/deploy/tutorials/index.mdx b/docs/deploy/tutorials/index.mdx index 51fe0b3e..d0468b8a 100644 --- a/docs/deploy/tutorials/index.mdx +++ b/docs/deploy/tutorials/index.mdx @@ -29,3 +29,8 @@ export const advancedFeaturesData = [

    +## Questions and feedback + +import DocsFeedback from '/_includes/docs-feedback.mdx'; + + From 30f33ad53c7e0203ab857d88276fa096062d21b5 Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Thu, 15 May 2025 23:00:46 -0400 Subject: [PATCH 38/39] updating metrics in the monitoring doc --- docs/deploy/config-guides/monitoring.md | 76 +++++++++++++++++-------- 1 file changed, 52 insertions(+), 24 deletions(-) diff --git a/docs/deploy/config-guides/monitoring.md b/docs/deploy/config-guides/monitoring.md index ae9d185b..0d11fe89 100644 --- a/docs/deploy/config-guides/monitoring.md +++ b/docs/deploy/config-guides/monitoring.md @@ -69,37 +69,65 @@ metrics of the same "class" to obtain a class metrics, or aggregate all metrics to obtain the metric for the entire Weaviate instance. | Metric | Description | Labels | Type | -| --- | --- | --- | --- | -| `batch_durations_ms` | Duration of a single batch operation in ms. The `operation` label further defines what operation as part of the batch (e.g. object, inverted, vector) is being used. Granularity is a shard of a class. | `operation`, `class_name`, `shard_name` | Histogram | -| `batch_delete_durations_ms` | Duration of a batch delete in ms. The `operation` label further defines what operation as part of the batch delete is being measured. Granularity is a shard of a class | `class_name`, `shard_name` | Histogram | -| `objects_durations_ms` | Duration of an individual object operation, such as `put`, `delete`, etc. as indicated by the `operation` label, also as part of a batch. The `step` label adds additional precisions to each `operation`. Granularity is a shard of a class. | `class_name`, `shard_name` | Histogram | -| `object_count` | Numbers of objects present. Granularity is a shard of a class | `class_name`, `shard_name` | Gauge | -| `async_operations_running` | Number of currently running async operations. The operation itself is defined through the `operation` label. | `operation`, `class_name`, `shard_name`, `path` | Gauge | -| `lsm_active_segments` | Number of currently present segments per shard. Granularity is shard of a class. Grouped by `strategy`.| `strategy`, `class_name`, `shard_name`, `path` | Gauge | -| `lsm_bloom_filter_duration_ms` | Duration of a bloom filter operation per shard in ms. Granularity is shard of a class. Grouped by `strategy`. | `operation`, `strategy`, `class_name`, `shard_name` | Histogram | -| `lsm_segment_objects` | Number of entries per LSM segment by level. Granularity is shard of a class. Grouped by `strategy` and `level`. | `operation`, `strategy`, `class_name`, `shard_name`, `path`, `level` | Gauge | -| `lsm_segment_size` | Size of LSM segment by level and unit. | `strategy`, `class_name`, `shard_name`, `path`, `level`, `unit` | Gauge | -| `lsm_segment_count` | Number of segments by level | `strategy`, `class_name`, `shard_name`, `path`, `level` | Gauge | -| `vector_index_tombstones` | Number of currently active tombstones in the vector index. Will go up on each incoming delete and go down after a completed repair operation. | `class_name`, `shard_name` | Gauge | -| `vector_index_tombstone_cleanup_threads` | Number of currently active threads for repairing/cleaning up the vector index after deletes have occurred. | `class_name`, `shard_name` | Gauge | -| `vector_index_tombstone_cleaned` | Total number of deleted and removed vectors after repair operations. | `class_name`, `shard_name` | Counter | -| `vector_index_operations` | Total number of mutating operations on the vector index. The operation itself is defined by the `operation` label. | `operation`, `class_name`, `shard_name` | Gauge | -| `vector_index_size` | The total capacity of the vector index. Typically larger than the number of vectors imported as it grows proactively. | `class_name`, `shard_name` | Gauge | -| `vector_index_maintenance_durations_ms` | Duration of a sync or async vector index maintenance operation. The operation itself is defined through the `operation` label. | `opeartion`, `class_name`, `shard_name` | Histogram | -| `vector_index_durations_ms` | Duration of regular vector index operation, such as insert or delete. The operation itself is defined through the `operation` label. The `step` label adds more granularity to each operation. | `operation`, `step`, `class_name`, `shard_name` | Histogram | -| `startup_durations_ms` | Duration of individual startup operations in ms. The operation itself is defined through the `operation` label. | `operation`, `class_name`, `shard_name` | Histogram | -| `startup_diskio_throughput` | Disk I/O throughput in bytes/s at startup operations, such as reading back the HNSW index or recovering LSM segments. The operation itself is defined by the `operation` label. | `operation`, `step`, `class_name`, `shard_name` | Histogram | -| `requests_total` | Metric that tracks all user requests to determine if it was successful or failed. | `api`, `query_type`, `class_name` | `GaugeVec` | -| `index_queue_push_duration_ms` | Duration of pushing one or more vectors to the index queue. | `class_name`, `shard_name`, `target_vector` | `Summary` | +|---|---|---|---| +| `async_operations_running` | Number of currently running async operations. The operation itself is defined through the `operation` label. | `operation`, `class_name`, `shard_name`, `path` | `Gauge` | +| `batch_delete_durations_ms` | Duration of a batch delete in ms. The `operation` label further defines what operation as part of the batch delete is being measured. Granularity is a shard of a class | `class_name`, `shard_name` | `Histogram` | +| `batch_durations_ms` | Duration of a single batch operation in ms. The `operation` label further defines what operation as part of the batch (e.g. object, inverted, vector) is being used. Granularity is a shard of a class. | `operation`, `class_name`, `shard_name` | `Histogram` | | `index_queue_delete_duration_ms` | Duration of deleting one or more vectors from the index queue and the underlying index. | `class_name`, `shard_name`, `target_vector` | `Summary` | -| `index_queue_preload_duration_ms` | Duration of preloading un-indexed vectors to the index queue. | `class_name`, `shard_name`, `target_vector` | `Summary` | +| `index_queue_paused` | Whether the index queue is paused. | `class_name`, `shard_name`, `target_vector` | `Gauge` | | `index_queue_preload_count` | Number of vectors preloaded to the index queue. | `class_name`, `shard_name`, `target_vector` | `Gauge` | +| `index_queue_preload_duration_ms` | Duration of preloading un-indexed vectors to the index queue. | `class_name`, `shard_name`, `target_vector` | `Summary` | +| `index_queue_push_duration_ms` | Duration of pushing one or more vectors to the index queue. | `class_name`, `shard_name`, `target_vector` | `Summary` | | `index_queue_search_duration_ms` | Duration of searching for vectors in the index queue and the underlying index. | `class_name`, `shard_name`, `target_vector` | `Summary` | -| `index_queue_paused` | Whether the index queue is paused. | `class_name`, `shard_name`, `target_vector` | `Gauge` | | `index_queue_size` | Number of vectors in the index queue. | `class_name`, `shard_name`, `target_vector` | `Gauge` | | `index_queue_stale_count` | Number of times the index queue has been marked as stale. | `class_name`, `shard_name`, `target_vector` | `Counter` | | `index_queue_vectors_dequeued` | Number of vectors sent to the workers per tick. | `class_name`, `shard_name`, `target_vector` | `Gauge` | | `index_queue_wait_duration_ms` | Duration of waiting for the workers to finish. | `class_name`, `shard_name`, `target_vector` | `Summary` | +| `lsm_active_segments` | Number of currently present segments per shard. Granularity is shard of a class. Grouped by `strategy`. | `strategy`, `class_name`, `shard_name`, `path` | `Gauge` | +| `lsm_bloom_filter_duration_ms` | Duration of a bloom filter operation per shard in ms. Granularity is shard of a class. Grouped by `strategy`. | `operation`, `strategy`, `class_name`, `shard_name` | `Histogram` | +| `lsm_segment_count` | Number of segments by level | `strategy`, `class_name`, `shard_name`, `path`, `level` | `Gauge` | +| `lsm_segment_objects` | Number of entries per LSM segment by level. Granularity is shard of a class. Grouped by `strategy` and `level`. | `operation`, `strategy`, `class_name`, `shard_name`, `path`, `level` | `Gauge` | +| `lsm_segment_size` | Size of LSM segment by level and unit. | `strategy`, `class_name`, `shard_name`, `path`, `level`, `unit` | `Gauge` | +| `object_count` | Numbers of objects present. Granularity is a shard of a class | `class_name`, `shard_name` | `Gauge` | +| `objects_durations_ms` | Duration of an individual object operation, such as `put`, `delete`, etc. as indicated by the `operation` label, also as part of a batch. The `step` label adds additional precisions to each `operation`. Granularity is a shard of a class. | `class_name`, `shard_name` | `Histogram` | +| `requests_total` | Metric that tracks all user requests to determine if it was successful or failed. | `api`, `query_type`, `class_name` | `GaugeVec` | +| `startup_diskio_throughput` | Disk I/O throughput in bytes/s at startup operations, such as reading back the HNSW index or recovering LSM segments. The operation itself is defined by the `operation` label. | `operation`, `step`, `class_name`, `shard_name` | `Histogram` | +| `startup_durations_ms` | Duration of individual startup operations in ms. The operation itself is defined through the `operation` label. | `operation`, `class_name`, `shard_name` | `Histogram` | +| `vector_index_durations_ms` | Duration of regular vector index operation, such as insert or delete. The operation itself is defined through the `operation` label. The `step` label adds more granularity to each operation. | `operation`, `step`, `class_name`, `shard_name` | `Histogram` | +| `vector_index_maintenance_durations_ms` | Duration of a sync or async vector index maintenance operation. The operation itself is defined through the `operation` label. | `opeartion`, `class_name`, `shard_name` | `Histogram` | +| `vector_index_operations` | Total number of mutating operations on the vector index. The operation itself is defined by the `operation` label. | `operation`, `class_name`, `shard_name` | `Gauge` | +| `vector_index_size` | The total capacity of the vector index. Typically larger than the number of vectors imported as it grows proactively. | `class_name`, `shard_name` | `Gauge` | +| `vector_index_tombstone_cleaned` | Total number of deleted and removed vectors after repair operations. | `class_name`, `shard_name` | `Counter` | +| `vector_index_tombstone_cleanup_threads` | Number of currently active threads for repairing/cleaning up the vector index after deletes have occurred. | `class_name`, `shard_name` | `Gauge` | +| `vector_index_tombstones` | Number of currently active tombstones in the vector index. Will go up on each incoming delete and go down after a completed repair operation. | `class_name`, `shard_name` | `Gauge` | +| `weaviate_build_info` | Provides general information about the build (What version is currently running? How long has this version been running, etc) | `version`, `revision`, `branch`, `goVersion` | | +| `weaviate_runtime_config_hash` | Hash value of the currently active runtime configuration, useful for tracking when new configurations take effect. | `sha256` | `GaugeVec` | +| `weaviate_runtime_config_last_load_success` | Indicates whether the last loading attempt was successful (`1` for success, `0` for failure). | | `Gauge` | +| `weaviate_schema_collections` | Shows the total number of collections at any given point. | | | +| `weaviate_schema_shards` | Shows the total number of shards at any given point. | `status(HOT, COLD, WARM, FROZEN)` | | +| `weaviate_internal_sample_memberlist_queue_broadcasts` | Shows the number of messages in the broadcast queue of Memberlist. | `quantile=0.5, 0.9, 0.99` | `Summary` | +| `weaviate_internal_timer_memberlist_gossip` | Shows the latency distribution of the each gossip made in Memberlist. | `quantile=0.5, 0.9, 0.99` | `Summary` | +| `weaviate_internal_counter_raft_apply` | Number of transactions in the configured interval. | | `counter` | +| `weaviate_internal_counter_raft_state_candidate` | Number of times the raft server initiated an election. | | `counter` | +| `weaviate_internal_counter_raft_state_follower` | Number of times in the configured interval that the raft server became a follower. | | `summary` | +| `weaviate_internal_counter_raft_state_leader` | Number of times the raft server became a leader. | | `counter` | +| `weaviate_internal_counter_raft_transition_heartbeat_timeout` | Number of times that the node transitioned to `candidate` state after not receiving a heartbeat message from the last known leader. | | `summary` | +| `weaviate_internal_gauge_raft_commitNumLogs` | Number of logs processed for application to the finite state machine in a single batch. | | `gauge` | +| `weaviate_internal_gauge_raft_leader_dispatchNumLogs` | Number of logs committed to disk in the most recent batch. | | `gauge` | +| `weaviate_internal_gauge_raft_leader_oldestLogAge` | | | `gauge` | +| `weaviate_internal_gauge_raft_peers` | The number of peers in the raft cluster configuration. | | `gauge` | +| `weaviate_internal_sample_raft_boltdb_logBatchSize` | | | | +| `weaviate_internal_sample_raft_boltdb_logSize` | | | | +| `weaviate_internal_sample_raft_boltdb_logsPerBatch` | | | | +| `weaviate_internal_sample_raft_boltdb_writeCapacity` | | | | +| `weaviate_internal_sample_raft_thread_fsm_saturation` | | | | +| `weaviate_internal_sample_raft_thread_main_saturation` | | | | +| `weaviate_internal_timer_raft_boltdb_getLog` | | | | +| `weaviate_internal_timer_raft_boltdb_storeLogs` | Time required to record any outstanding logs since the last request to append entries for the given node. | | `timer` | +| `weaviate_internal_timer_raft_commitTime` | Time required to commit a new entry to the raft log on the leader node. | | `summary` | +| `weaviate_internal_timer_raft_fsm_apply` | Number of logs committed by the finite state machine since the last interval. | | `summary` | +| `weaviate_internal_timer_raft_fsm_enqueue` | Time required to queue up a batch of logs for the finite state machine to apply. | | `summary` | +| `weaviate_internal_timer_raft_leader_dispatchLog` | Time required for the leader node to write a log entry to disk. | | `timer` | Extending Weaviate with new metrics is very easy. To suggest a new metric, see the [contributor guide](/docs/contributor-guide). From 02cf4e7fc11974d9717b5efd6d87139ce8e1832a Mon Sep 17 00:00:00 2001 From: DanielleWashington Date: Fri, 16 May 2025 14:22:14 -0400 Subject: [PATCH 39/39] final phase 1 changes --- docs/academy/deployment/k8s/90_next_steps.mdx | 4 +- .../academy/js/_snippets/intro_next_steps.mdx | 2 +- .../js/_snippets/intro_next_steps_js.mdx | 2 +- .../academy/py/_snippets/intro_next_steps.mdx | 2 +- docs/academy/py/multitenancy/200_setup.mdx | 2 +- .../101_hello_weaviate/40_set_up.mdx | 2 +- .../103_schema_and_imports/20_schema.mdx | 2 +- .../101_hello_weaviate/90_next_steps.mdx | 2 +- docs/cloud/manage-clusters/create.mdx | 2 +- docs/contributor-guide/weaviate-core/setup.md | 2 +- docs/deploy/config-guides/async-rep.md | 2 +- docs/deploy/config-guides/env-vars/index.md | 8 +- .../config-guides/horizontal-scaling.mdx | 2 +- docs/deploy/config-guides/index.mdx | 84 +++- .../config-guides}/meta.md | 0 docs/deploy/config-guides/modules.md | 152 ------ .../config-guides}/oidc.md | 0 docs/deploy/config-guides/replication.md | 2 +- .../config-guides}/status.md | 0 .../config-guides}/telemetry.md | 0 .../docker-installation.md | 2 +- docs/weaviate/concepts/cluster.md | 2 +- .../concepts/indexing/vector-index.md | 2 +- .../cluster-architecture.md | 2 +- .../replication-architecture/consistency.md | 2 +- .../replication-architecture/index.md | 4 +- docs/weaviate/config-refs/index.mdx | 47 -- docs/weaviate/config-refs/schema/index.md | 2 +- .../_enterprise-usage-collector.md | 2 +- docs/weaviate/configuration/index.md | 2 +- docs/weaviate/configuration/index.mdx | 2 +- docs/weaviate/configuration/monitoring.md | 143 ------ docs/weaviate/configuration/persistence.md | 113 ----- .../configuration/rbac/manage-users.mdx | 2 +- docs/weaviate/configuration/replication.md | 131 ------ docs/weaviate/index.mdx | 4 +- docs/weaviate/installation/docker-compose.md | 439 ------------------ docs/weaviate/installation/index.md | 6 +- docs/weaviate/installation/kubernetes.md | 265 ----------- .../manage-collections/multi-node-setup.mdx | 4 +- .../model-providers/anthropic/generative.md | 2 +- .../model-providers/anyscale/generative.md | 2 +- .../model-providers/aws/embeddings.md | 2 +- .../model-providers/aws/generative.md | 2 +- .../cohere/embeddings-multimodal.md | 2 +- .../model-providers/cohere/embeddings.md | 2 +- .../model-providers/cohere/generative.md | 2 +- .../model-providers/cohere/reranker.md | 2 +- .../model-providers/databricks/embeddings.md | 2 +- .../model-providers/databricks/generative.md | 2 +- .../model-providers/friendliai/generative.md | 2 +- .../google/embeddings-multimodal.md | 2 +- .../model-providers/google/embeddings.md | 2 +- .../model-providers/google/generative.md | 2 +- .../model-providers/gpt4all/embeddings.md | 4 +- .../model-providers/huggingface/embeddings.md | 2 +- .../imagebind/embeddings-multimodal.md | 4 +- .../jinaai/embeddings-colbert.md | 2 +- .../jinaai/embeddings-multimodal.md | 2 +- .../model-providers/jinaai/embeddings.md | 2 +- .../model-providers/jinaai/reranker.md | 2 +- .../model-providers/kubeai/embeddings.md | 2 +- .../model-providers/kubeai/generative.md | 2 +- .../model-providers/mistral/embeddings.md | 2 +- .../model-providers/mistral/generative.md | 2 +- .../nvidia/embeddings-multimodal.md | 2 +- .../model-providers/nvidia/embeddings.md | 2 +- .../model-providers/nvidia/generative.md | 2 +- .../model-providers/nvidia/reranker.md | 2 +- .../model-providers/octoai/embeddings.md | 2 +- .../model-providers/octoai/generative.md | 2 +- .../model-providers/ollama/embeddings.md | 2 +- .../model-providers/ollama/generative.md | 2 +- .../openai-azure/embeddings.md | 2 +- .../openai-azure/generative.md | 2 +- .../model-providers/openai/embeddings.md | 2 +- .../model-providers/openai/generative.md | 2 +- .../transformers/embeddings-multimodal.md | 4 +- .../transformers/embeddings.md | 4 +- .../model-providers/transformers/reranker.md | 4 +- .../voyageai/embeddings-multimodal.md | 2 +- .../model-providers/voyageai/embeddings.md | 2 +- .../model-providers/voyageai/reranker.md | 2 +- .../model-providers/xai/generative.md | 2 +- docs/weaviate/modules/custom-modules.md | 2 +- docs/weaviate/modules/img2vec-neural.md | 2 +- docs/weaviate/modules/index.md | 2 +- .../modules/text2vec-contextionary.md | 2 +- .../recipes/generative_search_nvidia.md | 2 +- .../weaviate/recipes/hybrid_search_mistral.md | 2 +- docs/weaviate/starter-guides/generative.md | 2 +- .../weaviate/starter-guides/which-weaviate.md | 8 +- secondaryNavbar.js | 2 +- sidebars.js | 150 ++++-- 94 files changed, 283 insertions(+), 1437 deletions(-) rename docs/{weaviate/config-refs => deploy/config-guides}/meta.md (100%) delete mode 100644 docs/deploy/config-guides/modules.md rename docs/{weaviate/config-refs => deploy/config-guides}/oidc.md (100%) rename docs/{weaviate/config-refs => deploy/config-guides}/status.md (100%) rename docs/{weaviate/config-refs => deploy/config-guides}/telemetry.md (100%) delete mode 100644 docs/weaviate/configuration/monitoring.md delete mode 100644 docs/weaviate/configuration/persistence.md delete mode 100644 docs/weaviate/configuration/replication.md delete mode 100644 docs/weaviate/installation/docker-compose.md delete mode 100644 docs/weaviate/installation/kubernetes.md diff --git a/docs/academy/deployment/k8s/90_next_steps.mdx b/docs/academy/deployment/k8s/90_next_steps.mdx index beded78a..43847199 100644 --- a/docs/academy/deployment/k8s/90_next_steps.mdx +++ b/docs/academy/deployment/k8s/90_next_steps.mdx @@ -24,14 +24,14 @@ If you are interested in the architecture behind replication and sharding, pleas Then, check out the section on [resource planning](/docs/weaviate/concepts/resources.md) to estimate how much resources each node of a particular size might be able to handle, and how to plan your cluster accordingly. -If you have replication configured, you can apply [tunable consistency](/docs/weaviate/configuration/replication.md) concepts to read/write operations as well as queries. +If you have replication configured, you can apply [tunable consistency](docs/deploy/config-guides/replication.md) concepts to read/write operations as well as queries. ### Further reading - How-to guides - - The [How-to: Manage collections](/docs/weaviate/manage-collections/index.mdx) and [How-to: Manage objects](/docs/weaviate/manage-objects/index.mdx) guides show how to perform data operations (i.e. create, read, update, delete collections and objects within them).. - [How-to: search](/docs/weaviate/search/index.mdx): Code examples for all types of search operations. - - [How-to: configure Weaviate](/docs/weaviate/configuration/index.mdx): Guides for configuring Weaviate, such as [PQ](/docs/weaviate/configuration/compression/pq-compression.md) and [BQ](/docs/weaviate/configuration/compression/bq-compression.md) compression, [backups](docs/deploy/config-guides/backups.md) and [replication](/docs/weaviate/configuration/replication.md). + - [How-to: configure Weaviate](/docs/weaviate/configuration/index.mdx): Guides for configuring Weaviate, such as [PQ](/docs/weaviate/configuration/compression/pq-compression.md) and [BQ](/docs/weaviate/configuration/compression/bq-compression.md) compression, [backups](docs/deploy/config-guides/backups.md) and [replication](docs/deploy/config-guides/replication.md). - [Concepts guides](/docs/weaviate/concepts/index.md): Guides for understanding Weaviate's architecture and concepts. - [API reference](/docs/weaviate/api/index.mdx): Detailed information about Weaviate's APIs. diff --git a/docs/academy/js/_snippets/intro_next_steps.mdx b/docs/academy/js/_snippets/intro_next_steps.mdx index 0fb1baad..38652e4e 100644 --- a/docs/academy/js/_snippets/intro_next_steps.mdx +++ b/docs/academy/js/_snippets/intro_next_steps.mdx @@ -9,7 +9,7 @@ Some of our more popular resources include: - How-to guides - The [How-to: Manage collections](/docs/weaviate/manage-collections/index.mdx) and [How-to: Manage objects](/docs/weaviate/manage-objects/index.mdx) guides show how to perform data operations (i.e. create, read, update, delete collections and objects within them).. - [How-to: search](/docs/weaviate/search/index.mdx): Code examples for all types of search operations. - - [How-to: configure Weaviate](/docs/weaviate/configuration/index.mdx): Guides for configuring Weaviate, such as [PQ](/docs/weaviate/configuration/compression/pq-compression.md) and [BQ](/docs/weaviate/configuration/compression/bq-compression.md) compression, [backups](docs/deploy/config-guides/backups.md) and [replication](/docs/weaviate/configuration/replication.md). + - [How-to: configure Weaviate](/docs/weaviate/configuration/index.mdx): Guides for configuring Weaviate, such as [PQ](/docs/weaviate/configuration/compression/pq-compression.md) and [BQ](/docs/weaviate/configuration/compression/bq-compression.md) compression, [backups](docs/deploy/config-guides/backups.md) and [replication](docs/deploy/config-guides/replication.md). - [Concepts guides](/docs/weaviate/concepts/index.md): Guides for understanding Weaviate's architecture and concepts. - [API reference](/docs/weaviate/api/index.mdx): Detailed information about Weaviate's APIs. diff --git a/docs/academy/js/_snippets/intro_next_steps_js.mdx b/docs/academy/js/_snippets/intro_next_steps_js.mdx index aed9bb8e..88969c59 100644 --- a/docs/academy/js/_snippets/intro_next_steps_js.mdx +++ b/docs/academy/js/_snippets/intro_next_steps_js.mdx @@ -9,7 +9,7 @@ Some of our more popular resources include: - How-to guides - The [How-to: Manage collections](/docs/weaviate/manage-collections/index.mdx) and [How-to: Manage objects](/docs/weaviate/manage-objects/index.mdx) guides show how to perform data operations (i.e. create, read, update, delete collections and objects within them).. - [How-to: search](/docs/weaviate/search/index.mdx): Code examples for all types of search operations. - - [How-to: configure Weaviate](/docs/weaviate/configuration/index.mdx): Guides for configuring Weaviate, such as [PQ](/docs/weaviate/configuration/compression/pq-compression.md) and [BQ](/docs/weaviate/configuration/compression/bq-compression.md) compression, [backups](docs/deploy/config-guides/backups.md) and [replication](/docs/weaviate/configuration/replication.md). + - [How-to: configure Weaviate](/docs/weaviate/configuration/index.mdx): Guides for configuring Weaviate, such as [PQ](/docs/weaviate/configuration/compression/pq-compression.md) and [BQ](/docs/weaviate/configuration/compression/bq-compression.md) compression, [backups](docs/deploy/config-guides/backups.md) and [replication](docs/deploy/config-guides/replication.md). - [Concepts guides](/docs/weaviate/concepts/index.md): Guides for understanding Weaviate's architecture and concepts. - [API reference](/docs/weaviate/api/index.mdx): Detailed information about Weaviate's APIs. diff --git a/docs/academy/py/_snippets/intro_next_steps.mdx b/docs/academy/py/_snippets/intro_next_steps.mdx index 4c52713b..6e6ad0b9 100644 --- a/docs/academy/py/_snippets/intro_next_steps.mdx +++ b/docs/academy/py/_snippets/intro_next_steps.mdx @@ -9,7 +9,7 @@ Some of our more popular resources include: - How-to guides - The [How-to: Manage collections](/docs/weaviate/manage-collections/index.mdx) and [How-to: Manage objects](/docs/weaviate/manage-objects/index.mdx) guides show how to perform data operations (i.e. create, read, update, delete collections and objects within them).. - [How-to: search](/docs/weaviate/search/index.mdx): Code examples for all types of search operations. - - [How-to: configure Weaviate](/docs/weaviate/configuration/index.mdx): Guides for configuring Weaviate, such as [PQ](/docs/weaviate/configuration/compression/pq-compression.md) and [BQ](/docs/weaviate/configuration/compression/bq-compression.md) compression, [backups](docs/deploy/config-guides/backups.md) and [replication](/docs/weaviate/configuration/replication.md). + - [How-to: configure Weaviate](/docs/weaviate/configuration/index.mdx): Guides for configuring Weaviate, such as [PQ](/docs/weaviate/configuration/compression/pq-compression.md) and [BQ](/docs/weaviate/configuration/compression/bq-compression.md) compression, [backups](docs/deploy/config-guides/backups.md) and [replication](docs/deploy/config-guides/replication.md). - [Concepts guides](/docs/weaviate/concepts/index.md): Guides for understanding Weaviate's architecture and concepts. - [API reference](/docs/weaviate/api/index.mdx): Detailed information about Weaviate's APIs. diff --git a/docs/academy/py/multitenancy/200_setup.mdx b/docs/academy/py/multitenancy/200_setup.mdx index e4350e1f..1e447969 100644 --- a/docs/academy/py/multitenancy/200_setup.mdx +++ b/docs/academy/py/multitenancy/200_setup.mdx @@ -178,7 +178,7 @@ services: ### Configuration highlights -You may have seen Docker configurations elsewhere ([e.g. Docs](../../../weaviate/installation/docker-compose.md), [Academy](../starter_text_data/101_setup_weaviate/20_create_instance/20_create_docker.mdx)). But these highlighted configurations may be new to you: +You may have seen Docker configurations elsewhere ([e.g. Docs](docs/deploy/installation-guides/docker-installation.md), [Academy](../starter_text_data/101_setup_weaviate/20_create_instance/20_create_docker.mdx)). But these highlighted configurations may be new to you: - `ASYNC_INDEXING`: This will enable asynchronous indexing. This is useful for high-volume data insertion, and enables us to use the `dynamic` index type, which you will learn about later on. - `ENABLE_MODULES`: We enable `offload-s3` to demonstrate tenant offloading later on. Offloading helps us to manage inactive users' data efficiently. diff --git a/docs/academy/py/zero_to_mvp/101_hello_weaviate/40_set_up.mdx b/docs/academy/py/zero_to_mvp/101_hello_weaviate/40_set_up.mdx index 528c751d..d7d25daf 100644 --- a/docs/academy/py/zero_to_mvp/101_hello_weaviate/40_set_up.mdx +++ b/docs/academy/py/zero_to_mvp/101_hello_weaviate/40_set_up.mdx @@ -39,7 +39,7 @@ Running your own instance provides you with the same Weaviate code base as a WCD This course doesn't cover self-managed instances. We will cover Docker and Kubernetes in separate course units in the future. -If you are familiar with either solution and want to use them to install Weaviate now, see the documentation for [Docker-Compose](/docs/weaviate/installation/docker-compose.md) or [Kubernetes](/docs/weaviate/installation/kubernetes.md). +If you are familiar with either solution and want to use them to install Weaviate now, see the documentation for [Docker-Compose](docs/deploy/installation-guides/docker-installation.md) or [Kubernetes](docs/deploy/installation-guides/k8s-installation.md). ### Embedded Weaviate diff --git a/docs/academy/py/zero_to_mvp/103_schema_and_imports/20_schema.mdx b/docs/academy/py/zero_to_mvp/103_schema_and_imports/20_schema.mdx index bc295f92..b847bb8e 100644 --- a/docs/academy/py/zero_to_mvp/103_schema_and_imports/20_schema.mdx +++ b/docs/academy/py/zero_to_mvp/103_schema_and_imports/20_schema.mdx @@ -122,7 +122,7 @@ Modules are enabled at the instance level through its configuration. You can see :::info What is a `module`, exactly? By now, you've probably seen mentions of Weaviate `modules` here and there. Modules are optional Weaviate components used to enhance and customize its capabilities.


    -Weaviate Academy units will generally assume WCD usage, which is pre-configured with a set of modules. We will cover how to enable modules for local instances in another unit, or you can see our [Docker installation page](/docs/weaviate/installation/docker-compose.md). +Weaviate Academy units will generally assume WCD usage, which is pre-configured with a set of modules. We will cover how to enable modules for local instances in another unit, or you can see our [Docker installation page](docs/deploy/installation-guides/docker-installation.md). ::: WCD instances come pre-configured with a number of modules. For example, the response below shows that the `text2vec-openai` module is available, so we can use it in our schema. diff --git a/docs/academy/theory/101_hello_weaviate/90_next_steps.mdx b/docs/academy/theory/101_hello_weaviate/90_next_steps.mdx index 6ddc7d52..af611ca1 100644 --- a/docs/academy/theory/101_hello_weaviate/90_next_steps.mdx +++ b/docs/academy/theory/101_hello_weaviate/90_next_steps.mdx @@ -23,7 +23,7 @@ And for TypeScript/JavaScript: - How-to guides - The [How-to: Manage collections](/docs/weaviate/manage-collections/index.mdx) and [How-to: Manage objects](/docs/weaviate/manage-objects/index.mdx) guides show how to perform data operations (i.e. create, read, update, delete collections and objects within them).. - [How-to: search](/docs/weaviate/search/index.mdx): Code examples for all types of search operations. - - [How-to: configure Weaviate](/docs/weaviate/configuration/index.mdx): Guides for configuring Weaviate, such as [PQ](/docs/weaviate/configuration/compression/pq-compression.md) and [BQ](/docs/weaviate/configuration/compression/bq-compression.md) compression, [backups](docs/deploy/config-guides/backups.md) and [replication](/docs/weaviate/configuration/replication.md). + - [How-to: configure Weaviate](/docs/weaviate/configuration/index.mdx): Guides for configuring Weaviate, such as [PQ](/docs/weaviate/configuration/compression/pq-compression.md) and [BQ](/docs/weaviate/configuration/compression/bq-compression.md) compression, [backups](docs/deploy/config-guides/backups.md) and [replication](docs/deploy/config-guides/replication.md). - [Concepts guides](/docs/weaviate/concepts/index.md): Guides for understanding Weaviate's architecture and concepts. - [API reference](/docs/weaviate/api/index.mdx): Detailed information about Weaviate's APIs. diff --git a/docs/cloud/manage-clusters/create.mdx b/docs/cloud/manage-clusters/create.mdx index e66eb4d7..3af981a1 100644 --- a/docs/cloud/manage-clusters/create.mdx +++ b/docs/cloud/manage-clusters/create.mdx @@ -130,7 +130,7 @@ The following advanced configuration settings are available: Enable async indexing
  1. - Enable async replication + Enable async replication
  2. Allow all CORS origins diff --git a/docs/contributor-guide/weaviate-core/setup.md b/docs/contributor-guide/weaviate-core/setup.md index fe625c50..db171ea2 100644 --- a/docs/contributor-guide/weaviate-core/setup.md +++ b/docs/contributor-guide/weaviate-core/setup.md @@ -53,7 +53,7 @@ tools/dev/restart_dev_environment.sh --prometheus && tools/dev/run_dev_server.sh ``` :::info -This setup is for contributors to the Weaviate code base. If you are an end-user of Weaviate looking for a Prometheus-enabled example, please see [this documentation page](/docs/weaviate/configuration/monitoring.md) or this [example](https://github.com/weaviate/weaviate-examples/tree/main/monitoring-prometheus-grafana). +This setup is for contributors to the Weaviate code base. If you are an end-user of Weaviate looking for a Prometheus-enabled example, please see [this documentation page](/docs/deploy/config-guides/monitoring.md) or this [example](https://github.com/weaviate/weaviate-examples/tree/main/monitoring-prometheus-grafana). ::: Below are more examples of running Weaviate with Docker. diff --git a/docs/deploy/config-guides/async-rep.md b/docs/deploy/config-guides/async-rep.md index 34ac5ffb..2743c863 100644 --- a/docs/deploy/config-guides/async-rep.md +++ b/docs/deploy/config-guides/async-rep.md @@ -168,7 +168,7 @@ Sets the maximum time allowed for a single propagation request (sending actual o - [Concepts: Replication](https://weaviate.io/developers/weaviate/concepts/replication-architecture/consistency) -- [Replication How-To](https://weaviate.io/developers/weaviate/configuration/replication#async-replication-settings) +- [Replication How-To](docs/deploy/config-guides/replication.md#async-replication-settings) - [Environment Variables](docs/deploy/config-guides/env-vars/index.md#async-replication) diff --git a/docs/deploy/config-guides/env-vars/index.md b/docs/deploy/config-guides/env-vars/index.md index 0b31a99c..8a02ae3c 100644 --- a/docs/deploy/config-guides/env-vars/index.md +++ b/docs/deploy/config-guides/env-vars/index.md @@ -35,9 +35,9 @@ import APITable from '@site/src/components/APITable'; | `RAFT_ENABLE_ONE_NODE_RECOVERY` | Enable running the single node recovery routine on restart. This is useful if the default hostname has changed and a single node cluster believes there are supposed to be two nodes. | `boolean` | `false` | | `DEFAULT_VECTORIZER_MODULE` | Default vectorizer module - will be overridden by any class-level value defined in the schema | `string` | `text2vec-contextionary` | | `DISABLE_LAZY_LOAD_SHARDS` | New in v1.23. When `false`, enable lazy shard loading to improve mean time to recovery in multi-tenant deployments. | `string` | `false` | -| `DISABLE_TELEMETRY` | Disable [telemetry](docs/weaviate/config-refs/telemetry.md) data collection | boolean | `false` | -| `DISK_USE_READONLY_PERCENTAGE` | If disk usage is higher than the given percentage all shards on the affected node will be marked as `READONLY`, meaning all future write requests will fail. See [Disk Pressure Warnings and Limits for details](/docs/weaviate/configuration/persistence.md#disk-pressure-warnings-and-limits). | `string - number` | `90` | -| `DISK_USE_WARNING_PERCENTAGE` | If disk usage is higher than the given percentage a warning will be logged by all shards on the affected node's disk. See [Disk Pressure Warnings and Limits for details](/docs/weaviate/configuration/persistence.md#disk-pressure-warnings-and-limits). | `string - number` | `80` | +| `DISABLE_TELEMETRY` | Disable [telemetry](docs/deploy/config-guides/telemetry.md) data collection | boolean | `false` | +| `DISK_USE_READONLY_PERCENTAGE` | If disk usage is higher than the given percentage all shards on the affected node will be marked as `READONLY`, meaning all future write requests will fail. See [Disk Pressure Warnings and Limits for details](docs/deploy/config-guides/persistence.md#disk-pressure-warnings-and-limits). | `string - number` | `90` | +| `DISK_USE_WARNING_PERCENTAGE` | If disk usage is higher than the given percentage a warning will be logged by all shards on the affected node's disk. See [Disk Pressure Warnings and Limits for details](docs/deploy/config-guides/persistence.md#disk-pressure-warnings-and-limits). | `string - number` | `80` | | `ENABLE_API_BASED_MODULES` | Enable all API-based modules. (Experimental as of `v1.26.0`) | `boolean` | `true` | | `ENABLE_MODULES` | Specify Weaviate modules to enable | `string - comma separated names` | `text2vec-openai,generative-openai` | | `ENABLE_TOKENIZER_GSE` | Enable the [`GSE` tokenizer](/docs/weaviate/config-refs/schema/index.md#gse-and-trigram-tokenization-methods) for use | `boolean` | `true` | @@ -192,7 +192,7 @@ For more information on authentication and authorization, see the [Authenticatio :::info Added in `v1.29` The environment variables for configuring async replication have been introduced in `v1.29`. -To learn more about their usage, visit the **[replication how-to guide](/docs/weaviate/configuration/replication#async-replication-settings)**. +To learn more about their usage, visit the **[replication how-to guide](docs/deploy/config-guides/replication.md#async-replication-settings)**. ::: ```mdx-code-block diff --git a/docs/deploy/config-guides/horizontal-scaling.mdx b/docs/deploy/config-guides/horizontal-scaling.mdx index 9595f7a7..09173050 100644 --- a/docs/deploy/config-guides/horizontal-scaling.mdx +++ b/docs/deploy/config-guides/horizontal-scaling.mdx @@ -304,7 +304,7 @@ import RaftRFChangeWarning from '/_includes/1-25-replication-factor.mdx'; -Configure replication settings, such as [async replication](/docs/weaviate/configuration/replication#async-replication-settings) and [deletion resolution strategy](docs/weaviate/concepts/replication-architecture/consistency.md#deletion-resolution-strategies). +Configure replication settings, such as [async replication](docs/deploy/config-guides/replication.md#async-replication-settings) and [deletion resolution strategy](docs/weaviate/concepts/replication-architecture/consistency.md#deletion-resolution-strategies). diff --git a/docs/deploy/config-guides/index.mdx b/docs/deploy/config-guides/index.mdx index 8d9ba052..38e16444 100644 --- a/docs/deploy/config-guides/index.mdx +++ b/docs/deploy/config-guides/index.mdx @@ -9,26 +9,82 @@ Whether you are setting up a new environment or optimizing an existing one, conf ### Configuring your deployment -#### Environment Variables and Secrets Management -- Configure environment variables for connection strings, ports, and security credentials. +import CardsSection from "/src/components/CardsSection"; -#### Resource Limits and Autoscaling -- Set CPU and memory requests and limits for each service. +export const mainReferencesData = [ -#### Persistence and Storage Configuration -- Define volumes for persistent data. -- Enable backups and configure retention policies. + { + title: "Environment variables", + description: "Configure your environment variables for connection strings, ports, and security credentials", + link: "/docs/deploy/config-guides/env-vars", + icon: "fas fa-cog", + }, + { + title: "Scaling", + description: "Scale your deployment for high availability.", + link: "/docs/deploy/config-guides/horizontal-scaling", + icon: "fas fa-arrow-up-right-dots", + }, + { + title: "Persistence", + description: "Enable backups and configure retention policies.", + link: "/docs/deploy/config-guides/persistence", + icon: "fas fa-floppy-disk", + }, + { + title: "Monitoring, metrics, and logging", + description: "Monitor the status and health of your Weaviate instance.", + link: "/docs/deploy/config-guides/monitoring", + icon: "fas fa-chart-bar", + }, + { + title: "Access Management", + description: "Configure access management of your deployment.", + link: "/docs/deploy/config-guides/authentication", + icon: "fas fa-shield-halved", + }, + { + title: "Status", + description: "Monitor the status and health of your Weaviate instance.", + link: "/docs/deploy/config-guides/status", + icon: "fas fa-heartbeat", + }, + { + title: "Telemetry", + description: + "Understand how Weaviate telemetry works and how to configure it.", + link: "/docs/deploy/config-guides/telemetry", + icon: "fas fa-chart-line", + }, + { + title: "Cluster metadata", + description: "Access and manage metadata about your Weaviate cluster.", + link: "/docs/deploy/config-guides/meta", + icon: "fas fa-info-circle", + }, + { + title: "Cluster node data", + description: "View and manage data about individual nodes in your cluster.", + link: "/docs/deploy/config-guides/nodes", + icon: "fas fa-server", + }, + { + title: "OIDC Configuration", + description: + "Configure OpenID Connect for secure authentication with Weaviate.", + link: "/docs/deploy/config-guides/oidc", + icon: "fas fa-lock", + }, +] -#### Security Hardening -- Configure TLS/SSL certificates for encrypted communication. -- Use RBAC to restrict access to configuration endpoints and dashboards. - -#### Monitoring, Metrics, and Logging -- Set up metrics exporters and logging targets. -- Define alert thresholds based on config misalignment or performance drops. +
    + +
    ## Questions and feedback import DocsFeedback from '/_includes/docs-feedback.mdx'; + + diff --git a/docs/weaviate/config-refs/meta.md b/docs/deploy/config-guides/meta.md similarity index 100% rename from docs/weaviate/config-refs/meta.md rename to docs/deploy/config-guides/meta.md diff --git a/docs/deploy/config-guides/modules.md b/docs/deploy/config-guides/modules.md deleted file mode 100644 index 5a6e9950..00000000 --- a/docs/deploy/config-guides/modules.md +++ /dev/null @@ -1,152 +0,0 @@ ---- -title: Modules -image: og/docs/configuration.jpg -# tags: ['configuration', 'modules'] ---- - -Weaviate's functionality can be customized by using [modules](/docs/weaviate/modules/index.md). This page explains how to enable and configure modules. - -## Instance-level configuration - -At the instance (i.e. Weaviate cluster) level, you can: - -- Enable modules -- Configure the default vectorizer module -- Configure module-specific variables (e.g. API keys), where applicable - -This can be done by setting the appropriate [environment variables](docs/deploy/config-guides/env-vars/index.md) as shown below. - -:::tip What about WCD? -Weaviate Cloud (WCD) instances come with modules pre-configured. See [this page](/docs/cloud/manage-clusters/status#enabled-modules) for details. -::: - -### Enable individual modules - -You can enable modules by specifying the list of modules in the `ENABLE_MODULES` variable. For example, this code enables the `text2vec-transformers` module. - -```yaml -services: - weaviate: - environment: - ENABLE_MODULES: 'text2vec-transformers' -``` - -To enable multiple modules, add them in a comma-separated list. - -This example code enables the `'text2vec-huggingface`, `generative-cohere`, and `qna-openai` modules. - -```yaml -services: - weaviate: - environment: - ENABLE_MODULES: 'text2vec-huggingface,generative-cohere,qna-openai' -``` - -### Enable all API-based modules - -:::caution Experimental feature -Available starting in `v1.26.0`. This is an experimental feature. Use with caution. -::: - -You can enable all API-based modules by setting the `ENABLE_API_BASED_MODULES` variable to `true`. This will enable all API-based [model integrations](/docs/weaviate/model-providers/index.md), such as those for Anthropic, Cohere, OpenAI and so on by enabling the relevant modules. These modules are lightweight, so enabling them all will not significantly increase resource usage. - -```yaml -services: - weaviate: - environment: - ENABLE_API_BASED_MODULES: 'true' -``` - -The list of API-based modules can be found on the [model provider integrations page](/docs/weaviate/model-providers/index.md#api-based). You can also inspect the [source code](https://github.com/weaviate/weaviate/blob/main/adapters/handlers/rest/configure_api.go) where the list is defined. - -This can be combined with enabling individual modules. For example, the example below enables all API-based modules, Ollama modules and the `backup-s3` module. - -```yaml -services: - weaviate: - environment: - ENABLE_API_BASED_MODULES: 'true' - ENABLE_MODULES: 'text2vec-ollama,generative-ollama,backup-s3' -``` - -Note that enabling multiple vectorizer (e.g. `text2vec`, `multi2vec`) modules will disable the [`Explore` functionality](/docs/weaviate/api/graphql/explore.md). If you need to use `Explore`, you should only enable one vectorizer module. - -### Module-specific variables - -You may need to specify additional environment variables to configure each module where applicable. For example, the `backup-s3` module requires the backup S3 bucket to be set via `BACKUP_S3_BUCKET`, and the `text2vec-contextionary` module requires the inference API location via `TRANSFORMERS_INFERENCE_API`. - -Refer to the individual [module documentation](docs/weaviate/modules/index.md) for more details. - -## Vectorizer modules - -The [vectorization integration](docs/weaviate/model-providers/index.md) enable Weaviate to vectorize data at import, and to perform [`near`](/docs/weaviate/search/similarity.md) searches such as `nearText` or `nearImage`. - -:::info List of available vectorizer integrations -Can be found [in this section](/docs/weaviate/model-providers/index.md). -::: - -### Enable vectorizer modules - -You can enable vectorizer modules by adding them to the `ENABLE_MODULES` environment variable. For example, this code enables the `text2vec-cohere`, `text2vec-huggingface`, and `text2vec-openai` vectorizer modules. - -```yaml -services: - weaviate: - environment: - ENABLE_MODULES: 'text2vec-cohere,text2vec-huggingface,text2vec-openai' -``` - -### Default vectorizer module - -You can specify a default vectorization module with the `DEFAULT_VECTORIZER_MODULE` variable as below. - -If a default vectorizer module is not set, you must set a vectorizer in the schema before you can use `near` or vectorization at import time. - -This code sets `text2vec-huggingface` as the default vectorizer. Thus, `text2vec-huggingface` module will be used unless another vectorizer is specified for that class. - -``` yaml -services: - weaviate: - environment: - DEFAULT_VECTORIZER_MODULE: text2vec-huggingface -``` - -## Generative model integrations - -The [generative model integrations](/docs/weaviate/model-providers/index.md) enable [retrieval augmented generation](/docs/weaviate/search/generative.md) functions. - -### Enable a generative module - -You can enable generative modules by adding the desired module to the `ENABLE_MODULES` environment variable. For example, this code enables the `generative-cohere` module and the `text2vec-huggingface` vectorizer module. - -```yaml -services: - weaviate: - environment: - ENABLE_MODULES: 'text2vec-huggingface,generative-cohere' -``` - -:::tip `generative` module selection unrelated to `text2vec` module selection -Your choice of the `text2vec` module does not restrict your choice of `generative` module, or vice versa. -::: - -## Tenant offload modules - -Tenants can be offloaded to cold storage to reduce memory and disk usage, and onloaded back when needed. - -See the [dedicated page on tenant offloading](/docs/weaviate/configuration/tenant-offloading.md) for more information on how to configure Weaviate for tenant offloading. For information on how to offload and onload tenants, see [How-to: manage tenant states](docs/weaviate/manage-collections/tenant-states.mdx). - -## Custom modules - -See [here](/docs/weaviate/concepts/modules.md) how you can create and use your own modules. - -## Related pages - -- [Concepts: Modules](/docs/weaviate/concepts/modules.md) -- [References: Modules](/docs/weaviate/modules/index.md) - -## Questions and feedback - -import DocsFeedback from '/_includes/docs-feedback.mdx'; - - diff --git a/docs/weaviate/config-refs/oidc.md b/docs/deploy/config-guides/oidc.md similarity index 100% rename from docs/weaviate/config-refs/oidc.md rename to docs/deploy/config-guides/oidc.md diff --git a/docs/deploy/config-guides/replication.md b/docs/deploy/config-guides/replication.md index 8aeeb901..a3091817 100644 --- a/docs/deploy/config-guides/replication.md +++ b/docs/deploy/config-guides/replication.md @@ -25,7 +25,7 @@ To enable replication, you can set one or both of the following: The `REPLICATION_MINIMUM_FACTOR` environment variable sets the minimum replication factor for all collections in the Weaviate instance. -If you set the [replication factor for a collection](/docs/weaviate/configuration/replication.md#replication-factor-for-a-collection), the collection's replication factor overrides the minimum replication factor. +If you set the [replication factor for a collection](docs/deploy/config-guides/persistence.md#replication-factor-for-a-collection), the collection's replication factor overrides the minimum replication factor. ## Data consistency diff --git a/docs/weaviate/config-refs/status.md b/docs/deploy/config-guides/status.md similarity index 100% rename from docs/weaviate/config-refs/status.md rename to docs/deploy/config-guides/status.md diff --git a/docs/weaviate/config-refs/telemetry.md b/docs/deploy/config-guides/telemetry.md similarity index 100% rename from docs/weaviate/config-refs/telemetry.md rename to docs/deploy/config-guides/telemetry.md diff --git a/docs/deploy/installation-guides/docker-installation.md b/docs/deploy/installation-guides/docker-installation.md index ebadaffa..1577bb51 100644 --- a/docs/deploy/installation-guides/docker-installation.md +++ b/docs/deploy/installation-guides/docker-installation.md @@ -289,7 +289,7 @@ And the other members' configurations may look like this: RAFT_BOOTSTRAP_EXPECT: 3 ``` -Below is an example configuration for a 3-node setup. You may be able to test [replication](/docs/weaviate/configuration/replication.md) examples locally using this configuration. +Below is an example configuration for a 3-node setup. You may be able to test [replication](docs/deploy/config-guides/replication.md) examples locally using this configuration.
    diff --git a/docs/weaviate/concepts/cluster.md b/docs/weaviate/concepts/cluster.md index 4ec71ce4..17837042 100644 --- a/docs/weaviate/concepts/cluster.md +++ b/docs/weaviate/concepts/cluster.md @@ -72,7 +72,7 @@ Example - assume the following scenario: A class is comprised of 4 shards and ta By default, Weaviate nodes in a cluster use a gossip-like protocol through [Hashicorp's Memberlist](https://github.com/hashicorp/memberlist) to communicate node state and failure scenarios. -Weaviate - especially when running as a cluster - is optimized to run on Kubernetes. The [Weaviate Helm chart](/docs/weaviate/installation/kubernetes.md#weaviate-helm-chart) makes use of a `StatefulSet` and a headless `Service` that automatically configures node discovery. All you have to do is specify the desired node count. +Weaviate - especially when running as a cluster - is optimized to run on Kubernetes. The [Weaviate Helm chart](docs/deploy/installation-guides/k8s-installation.md#weaviate-helm-chart) makes use of a `StatefulSet` and a headless `Service` that automatically configures node discovery. All you have to do is specify the desired node count.
    FQDN for node discovery diff --git a/docs/weaviate/concepts/indexing/vector-index.md b/docs/weaviate/concepts/indexing/vector-index.md index 5299115d..d1a68c02 100644 --- a/docs/weaviate/concepts/indexing/vector-index.md +++ b/docs/weaviate/concepts/indexing/vector-index.md @@ -136,7 +136,7 @@ The resulting search list has these characteristics. - A maximum length of 25 objects ("dynamicEfMax": 25). - An actual size of 5 to 25 objects. -If you use the [`docker-compose.yml` file from Weaviate](../../installation/docker-compose.md) to run your local instance, the `QUERY_DEFAULTS_LIMIT` environment variable sets a reasonable default query limit. To prevent out of memory errors,`QUERY_DEFAULTS_LIMIT` is significantly lower than `QUERY_MAXIMUM_RESULTS`. +If you use the [`docker-compose.yml` file from Weaviate](docs/deploy/installation-guides/docker-installation.md) to run your local instance, the `QUERY_DEFAULTS_LIMIT` environment variable sets a reasonable default query limit. To prevent out of memory errors,`QUERY_DEFAULTS_LIMIT` is significantly lower than `QUERY_MAXIMUM_RESULTS`. To change the default limit, edit the value for `QUERY_DEFAULTS_LIMIT` when you configure your Weaviate instance. diff --git a/docs/weaviate/concepts/replication-architecture/cluster-architecture.md b/docs/weaviate/concepts/replication-architecture/cluster-architecture.md index cc6c17f7..21e8e972 100644 --- a/docs/weaviate/concepts/replication-architecture/cluster-architecture.md +++ b/docs/weaviate/concepts/replication-architecture/cluster-architecture.md @@ -14,7 +14,7 @@ In Weaviate, metadata replication and data replication are separate. For the met By default, Weaviate nodes in a cluster use a gossip-like protocol through [Hashicorp's Memberlist](https://github.com/hashicorp/memberlist) to communicate node state and failure scenarios. -Weaviate is optimized to run on Kubernetes, especially when operating as a cluster. The [Weaviate Helm chart](/docs/weaviate/installation/kubernetes.md#weaviate-helm-chart) makes use of a `StatefulSet` and a headless `Service` that automatically configures node discovery. +Weaviate is optimized to run on Kubernetes, especially when operating as a cluster. The [Weaviate Helm chart](docs/deploy/installation-guides/k8s-installation.md#weaviate-helm-chart) makes use of a `StatefulSet` and a headless `Service` that automatically configures node discovery.
    FQDN for node discovery diff --git a/docs/weaviate/concepts/replication-architecture/consistency.md b/docs/weaviate/concepts/replication-architecture/consistency.md index fe7f4666..b7f4d633 100644 --- a/docs/weaviate/concepts/replication-architecture/consistency.md +++ b/docs/weaviate/concepts/replication-architecture/consistency.md @@ -195,7 +195,7 @@ Repair-on-read works well with one or two isolated repairs. Async replication is Async replication supplements the repair-on-read mechanism. If a node becomes inconsistent between sync checks, the repair-on-read mechanism catches the problem at read time. -To activate async replication, set `asyncEnabled` to true in the [`replicationConfig` section of your collection definition](../../manage-collections/multi-node-setup.mdx#replication-settings). Visit the [How-to: Replication](/docs/weaviate/configuration/replication#async-replication-settings) page to learn more about the available async replication settings. +To activate async replication, set `asyncEnabled` to true in the [`replicationConfig` section of your collection definition](../../manage-collections/multi-node-setup.mdx#replication-settings). Visit the [How-to: Replication](docs/deploy/config-guides/replication.md#async-replication-settings) page to learn more about the available async replication settings. #### Memory and performance considerations for async replication diff --git a/docs/weaviate/concepts/replication-architecture/index.md b/docs/weaviate/concepts/replication-architecture/index.md index 0fa4d690..e7a03745 100644 --- a/docs/weaviate/concepts/replication-architecture/index.md +++ b/docs/weaviate/concepts/replication-architecture/index.md @@ -163,7 +163,7 @@ Read more about how replication works in Weaviate in [Philosophy](./philosophy.m ## How do I use replication in Weaviate? -See [how to configure replication](../../configuration/replication.md). You can enable replication in the collection definition. In queries, you can [specify the desired consistency level](../../search/basics.md#replication). +See [how to configure replication](docs/deploy/config-guides/replication.md). You can enable replication in the collection definition. In queries, you can [specify the desired consistency level](../../search/basics.md#replication). ## Roadmap @@ -172,7 +172,7 @@ See [how to configure replication](../../configuration/replication.md). You can ## Related pages -- [Configuration: Replication](../../configuration/replication.md) +- [Configuration: Replication](docs/deploy/config-guides/replication.md) ## Questions and feedback diff --git a/docs/weaviate/config-refs/index.mdx b/docs/weaviate/config-refs/index.mdx index 870cbac0..7d33ec77 100644 --- a/docs/weaviate/config-refs/index.mdx +++ b/docs/weaviate/config-refs/index.mdx @@ -44,56 +44,9 @@ export const mainReferencesData = [ link: "/docs/weaviate/config-refs/distances", icon: "fas fa-ruler", }, - { - title: "Environment variables", - description: - "Configure Weaviate through environment variables and runtime settings.", - link: "/docs/deploy/config-guides/env-vars", - icon: "fas fa-cogs", - }, -]; -export const otherReferencesData = [ - { - title: "Status", - description: "Monitor the status and health of your Weaviate instance.", - link: "/docs/weaviate/config-refs/status", - icon: "fas fa-heartbeat", - }, - { - title: "Telemetry", - description: - "Understand how Weaviate telemetry works and how to configure it.", - link: "/docs/weaviate/config-refs/telemetry", - icon: "fas fa-chart-line", - }, - { - title: "Cluster metadata", - description: "Access and manage metadata about your Weaviate cluster.", - link: "/docs/weaviate/config-refs/meta", - icon: "fas fa-info-circle", - }, - { - title: "Cluster node data", - description: "View and manage data about individual nodes in your cluster.", - link: "/docs/deploy/config-guides/nodes", - icon: "fas fa-server", - }, - { - title: "OIDC Configuration", - description: - "Configure OpenID Connect for secure authentication with Weaviate.", - link: "/docs/weaviate/config-refs/oidc", - icon: "fas fa-lock", - }, ];

    - -## Other references - -
    - -
    diff --git a/docs/weaviate/config-refs/schema/index.md b/docs/weaviate/config-refs/schema/index.md index 22b102e8..f9408f57 100644 --- a/docs/weaviate/config-refs/schema/index.md +++ b/docs/weaviate/config-refs/schema/index.md @@ -385,7 +385,7 @@ These parameters are explained below: -[Replication](../../configuration/replication.md) configurations can be set using the definition, through the `replicationConfig` parameter. +[Replication](docs/deploy/config-guides/replication.md) configurations can be set using the definition, through the `replicationConfig` parameter. The `factor` parameter sets the number of copies of to be stored for objects in this collection. diff --git a/docs/weaviate/configuration/_enterprise-usage-collector.md b/docs/weaviate/configuration/_enterprise-usage-collector.md index fd407ed3..deb3b143 100644 --- a/docs/weaviate/configuration/_enterprise-usage-collector.md +++ b/docs/weaviate/configuration/_enterprise-usage-collector.md @@ -51,7 +51,7 @@ services: ## Using the Docker Compose configurator -You can also use the Docker compose [configurator](/docs/weaviate/installation/docker-compose.md#configurator). Make sure to select `Enabled` for the Enterprise Usage Collector option. +You can also use the Docker compose [configurator](docs/deploy/installation-guides/docker-installation.md#configurator). Make sure to select `Enabled` for the Enterprise Usage Collector option. ## Collector proxy on Kubernetes using Helm diff --git a/docs/weaviate/configuration/index.md b/docs/weaviate/configuration/index.md index bdfb4802..13ec6e8b 100644 --- a/docs/weaviate/configuration/index.md +++ b/docs/weaviate/configuration/index.md @@ -19,4 +19,4 @@ This section shows you how to configure Weaviate. - Control access - [authentication](./authentication.md) - [authorization](docs/deploy/config-guides/authorization.md) -- [Monitor](./monitoring.md) your Weaviate instance +- [Monitor](docs/deploy/config-guides/monitoring.md) your Weaviate instance diff --git a/docs/weaviate/configuration/index.mdx b/docs/weaviate/configuration/index.mdx index fbb69e07..55ab4ebd 100644 --- a/docs/weaviate/configuration/index.mdx +++ b/docs/weaviate/configuration/index.mdx @@ -71,7 +71,7 @@ export const configOpsData = [ title: "Monitoring", description: "Enable and configure Prometheus-compatible metrics for observing instance health.", - link: "/docs/weaviate/configuration/monitoring", + link: "/docs/deploy/config-guides/monitoring", icon: "fas fa-chart-line", }, { diff --git a/docs/weaviate/configuration/monitoring.md b/docs/weaviate/configuration/monitoring.md deleted file mode 100644 index c9a7bc0d..00000000 --- a/docs/weaviate/configuration/monitoring.md +++ /dev/null @@ -1,143 +0,0 @@ ---- -title: Monitoring -sidebar_position: 50 -image: og/docs/configuration.jpg -# tags: ['configuration', 'operations', 'monitoring', 'observability'] ---- - -Weaviate can expose Prometheus-compatible metrics for monitoring. A standard -Prometheus/Grafana setup can be used to visualize metrics on various -dashboards. - -Metrics can be used to measure request latencies, import -speed, time spent on vector vs object storage, memory usage, application usage, -and more. - -## Configure Monitoring - -### Enable within Weaviate - -To tell Weaviate to collect metrics and expose them in a Prometheus-compatible -format, all that's required is to set the following environment variable: - -```sh -PROMETHEUS_MONITORING_ENABLED=true -``` - -By default, Weaviate will expose the metrics at `:2112/metrics`. You -can optionally change the port to a custom port using the following environment -variable: - -```sh -PROMETHEUS_MONITORING_PORT=3456 -``` - -### Scrape metrics from Weaviate - -Metrics are typically scraped into a time-series database, such as Prometheus. -How you consume metrics depends on your setup and environment. - -The [Weaviate examples repo contains a fully pre-configured setup using -Prometheus, Grafana and some example -dashboards](https://github.com/weaviate/weaviate-examples/tree/main/monitoring-prometheus-grafana). -You can start up a full-setup including monitoring and dashboards with a single -command. In this setup the following components are used: - -- Docker Compose is used to provide a fully-configured setup that can be - started with a single command. -- Weaviate is configured to expose Prometheus metrics as outlined in the - section above. -- A Prometheus instance is started with the setup and configured to scrape - metrics from Weaviate every 15s. -- A Grafana instance is started with the setup and configured to use the - Prometheus instance as a metrics provider. Additionally, it runs a dashboard - provider that contains a few sample dashboards. - -### Multi-tenancy - -When using multi-tenancy, we suggest setting the `PROMETHEUS_MONITORING_GROUP` [environment variable](docs/deploy/config-guides/env-vars/index.md) as `true` so that data across all tenants are grouped together for monitoring. - -## Obtainable Metrics - -The list of metrics that are obtainable through Weaviate's metric system is -constantly being expanded. The complete list is in the [`prometheus.go`](https://github.com/weaviate/weaviate/blob/main/usecases/monitoring/prometheus.go) source code file. - -This page describes some noteworthy metrics and their uses. - -Typically metrics are quite granular, as they can always be aggregated later -on. For example if the granularity is "shard", you could aggregate all "shard" -metrics of the same "class" to obtain a class metrics, or aggregate all metrics -to obtain the metric for the entire Weaviate instance. - -| Metric | Description | Labels | Type | -| ------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- | ----------- | -| `async_operations_running` | Number of currently running async operations. The operation itself is defined through the `operation` label. | `operation`, `class_name`, `shard_name`, `path` | `Gauge` | -| `batch_delete_durations_ms` | Duration of a batch delete in ms. The `operation` label further defines what operation as part of the batch delete is being measured. Granularity is a shard of a class | `class_name`, `shard_name` | `Histogram` | -| `batch_durations_ms` | Duration of a single batch operation in ms. The `operation` label further defines what operation as part of the batch (e.g. object, inverted, vector) is being used. Granularity is a shard of a class. | `operation`, `class_name`, `shard_name` | `Histogram` | -| `index_queue_delete_duration_ms` | Duration of deleting one or more vectors from the index queue and the underlying index. | `class_name`, `shard_name`, `target_vector` | `Summary` | -| `index_queue_paused` | Whether the index queue is paused. | `class_name`, `shard_name`, `target_vector` | `Gauge` | -| `index_queue_preload_count` | Number of vectors preloaded to the index queue. | `class_name`, `shard_name`, `target_vector` | `Gauge` | -| `index_queue_preload_duration_ms` | Duration of preloading un-indexed vectors to the index queue. | `class_name`, `shard_name`, `target_vector` | `Summary` | -| `index_queue_push_duration_ms` | Duration of pushing one or more vectors to the index queue. | `class_name`, `shard_name`, `target_vector` | `Summary` | -| `index_queue_search_duration_ms` | Duration of searching for vectors in the index queue and the underlying index. | `class_name`, `shard_name`, `target_vector` | `Summary` | -| `index_queue_size` | Number of vectors in the index queue. | `class_name`, `shard_name`, `target_vector` | `Gauge` | -| `index_queue_stale_count` | Number of times the index queue has been marked as stale. | `class_name`, `shard_name`, `target_vector` | `Counter` | -| `index_queue_vectors_dequeued` | Number of vectors sent to the workers per tick. | `class_name`, `shard_name`, `target_vector` | `Gauge` | -| `index_queue_wait_duration_ms` | Duration of waiting for the workers to finish. | `class_name`, `shard_name`, `target_vector` | `Summary` | -| `lsm_active_segments` | Number of currently present segments per shard. Granularity is shard of a class. Grouped by `strategy`. | `strategy`, `class_name`, `shard_name`, `path` | `Gauge` | -| `lsm_bloom_filter_duration_ms` | Duration of a bloom filter operation per shard in ms. Granularity is shard of a class. Grouped by `strategy`. | `operation`, `strategy`, `class_name`, `shard_name` | `Histogram` | -| `lsm_segment_count` | Number of segments by level | `strategy`, `class_name`, `shard_name`, `path`, `level` | `Gauge` | -| `lsm_segment_objects` | Number of entries per LSM segment by level. Granularity is shard of a class. Grouped by `strategy` and `level`. | `operation`, `strategy`, `class_name`, `shard_name`, `path`, `level` | `Gauge` | -| `lsm_segment_size` | Size of LSM segment by level and unit. | `strategy`, `class_name`, `shard_name`, `path`, `level`, `unit` | `Gauge` | -| `object_count` | Numbers of objects present. Granularity is a shard of a class | `class_name`, `shard_name` | `Gauge` | -| `objects_durations_ms` | Duration of an individual object operation, such as `put`, `delete`, etc. as indicated by the `operation` label, also as part of a batch. The `step` label adds additional precisions to each `operation`. Granularity is a shard of a class. | `class_name`, `shard_name` | `Histogram` | -| `requests_total` | Metric that tracks all user requests to determine if it was successful or failed. | `api`, `query_type`, `class_name` | `GaugeVec` | -| `startup_diskio_throughput` | Disk I/O throughput in bytes/s at startup operations, such as reading back the HNSW index or recovering LSM segments. The operation itself is defined by the `operation` label. | `operation`, `step`, `class_name`, `shard_name` | `Histogram` | -| `startup_durations_ms` | Duration of individual startup operations in ms. The operation itself is defined through the `operation` label. | `operation`, `class_name`, `shard_name` | `Histogram` | -| `vector_index_durations_ms` | Duration of regular vector index operation, such as insert or delete. The operation itself is defined through the `operation` label. The `step` label adds more granularity to each operation. | `operation`, `step`, `class_name`, `shard_name` | `Histogram` | -| `vector_index_maintenance_durations_ms` | Duration of a sync or async vector index maintenance operation. The operation itself is defined through the `operation` label. | `opeartion`, `class_name`, `shard_name` | `Histogram` | -| `vector_index_operations` | Total number of mutating operations on the vector index. The operation itself is defined by the `operation` label. | `operation`, `class_name`, `shard_name` | `Gauge` | -| `vector_index_size` | The total capacity of the vector index. Typically larger than the number of vectors imported as it grows proactively. | `class_name`, `shard_name` | `Gauge` | -| `vector_index_tombstone_cleaned` | Total number of deleted and removed vectors after repair operations. | `class_name`, `shard_name` | `Counter` | -| `vector_index_tombstone_cleanup_threads` | Number of currently active threads for repairing/cleaning up the vector index after deletes have occurred. | `class_name`, `shard_name` | `Gauge` | -| `vector_index_tombstones` | Number of currently active tombstones in the vector index. Will go up on each incoming delete and go down after a completed repair operation. | `class_name`, `shard_name` | `Gauge` | -| `weaviate_runtime_config_hash` | Hash value of the currently active runtime configuration, useful for tracking when new configurations take effect. | `sha256` | `GaugeVec` | -| `weaviate_runtime_config_last_load_success` | Indicates whether the last loading attempt was successful (`1` for success, `0` for failure). | | `Gauge` | - -Extending Weaviate with new metrics is very easy. To suggest a new metric, see the [contributor guide](/docs/contributor-guide). - -### Versioning - -Be aware that metrics do not follow the semantic versioning guidelines of other Weaviate features. Weaviate's main APIs are stable and breaking changes are extremely rare. Metrics, however, have shorter feature lifecycles. It can sometimes be necessary to introduce an incompatible change or entirely remove a metric, for example, because the cost of observing a specific metric in production has grown too high. As a result, it is possible that a Weaviate minor release contains a breaking change for the Monitoring system. If so, it will be clearly highlighted in the release notes. - -## Sample Dashboards - -Weaviate does not ship with any dashboards by default, but here is a list of -dashboards being used by the various Weaviate teams, both during development, -and when helping users. These do not come with any support, but may still be -helpful. Treat them as inspiration to design your own dashboards which fit -your uses perfectly: - -| Dashboard | Purpose | Preview | -| ---------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------- | -| [Importing Data Into Weaviate](https://github.com/weaviate/weaviate/blob/master/tools/dev/grafana/dashboards/importing.json) | Visualize speed of import operations (including its components, such as object store, inverted index, and vector index). | ![Importing Data into Weaviate](./img/weaviate-sample-dashboard-importing.png 'Importing Data Into Weaviate') | -| [Object Operations](https://github.com/weaviate/weaviate/blob/master/tools/dev/grafana/dashboards/objects.json) | Visualize speed of whole object operations, such as GET, PUT, etc. | ![Objects](./img/weaviate-sample-dashboard-objects.png 'Objects') | -| [Vector Index](https://github.com/weaviate/weaviate/blob/master/tools/dev/grafana/dashboards/vectorindex.json) | Visualize the current state, as well as operations on the HNSW vector index | ![Vector Index](./img/weaviate-sample-dashboard-vector.png 'Vector Index') | -| [LSM Stores](https://github.com/weaviate/weaviate/blob/master/tools/dev/grafana/dashboards/lsm.json) | Get insights into the internals (including segments) of the various LSM stores within Weaviate. | ![LSM Store](./img/weaviate-sample-dashboard-lsm.png 'LSM Store') | -| [Startup](https://github.com/weaviate/weaviate/blob/master/tools/dev/grafana/dashboards/startup.json) | Visualize the startup process, including recovery operations | ![Startup](./img/weaviate-sample-dashboard-startup.png 'Vector Index') | -| [Usage](https://github.com/weaviate/weaviate/blob/master/tools/dev/grafana/dashboards/usage.json) | Obtain usage metrics, such as number of objects imported, etc. | ![Usage](./img/weaviate-sample-dashboard-usage.png 'Usage') | -| [Aysnc index queue](https://github.com/weaviate/weaviate/blob/main/tools/dev/grafana/dashboards/index_queue.json) | Observe index queue activity | ![Async index queue](./img/weaviate-sample-dashboard-async-queue.png 'Async index queue') | - -## `nodes` API Endpoint - -To get collection details programmatically, use the [`nodes`](docs/deploy/config-guides/nodes.md) REST endpoint. - -import APIOutputs from '/\_includes/rest/node-endpoint-info.mdx'; - - - -## Questions and feedback - -import DocsFeedback from '/\_includes/docs-feedback.mdx'; - - diff --git a/docs/weaviate/configuration/persistence.md b/docs/weaviate/configuration/persistence.md deleted file mode 100644 index 2d2b33eb..00000000 --- a/docs/weaviate/configuration/persistence.md +++ /dev/null @@ -1,113 +0,0 @@ ---- -title: Persistence -sidebar_position: 45 -image: og/docs/configuration.jpg ---- - -import SkipLink from '/src/components/SkipValidationLink' - -When running Weaviate with Docker or Kubernetes, you can persist its data by mounting a volume to store the data outside of the containers. Doing so will cause the Weaviate instance to also load the data from the mounted volume when it is restarted. - -Note that Weaviate now offers native backup modules starting with `v1.15` for single-node instances, and `v1.16` for multi-node instances. For older versions of Weaviate, persisting data as described here will allow you to back up Weaviate. - -## Docker Compose - -### Persistence - -When running Weaviate with Docker Compose, you can set the `volumes` variable under the `weaviate` service and a unique cluster hostname as an environment variable. - -```yaml -services: - weaviate: - volumes: - - /var/weaviate:/var/lib/weaviate - environment: - CLUSTER_HOSTNAME: 'node1' - PERSISTENCE_DATA_PATH: '/var/lib/weaviate' -``` - -* About the volumes - * `/var/weaviate` is the location where you want to store the data on the local machine - * `/var/lib/weaviate` The value after the colon (:) is the storage location inside the container. This value must match the PERSISTENCE_DATA_PATH variable. -* About the hostname - * `CLUSTER_HOSTNAME` can be any name - -In the case you want a more verbose output, you can change the environment variable for the `LOG_LEVEL` - -```yaml -services: - weaviate: - environment: - LOG_LEVEL: 'debug' -``` - -A complete example of a Weaviate without modules but with an externally mounted volume and more verbose output: - -```yaml ---- -services: - weaviate: - command: - - --host - - 0.0.0.0 - - --port - - '8080' - - --scheme - - http - image: cr.weaviate.io/semitechnologies/weaviate:||site.weaviate_version|| - ports: - - 8080:8080 - - 50051:50051 - restart: on-failure:0 - volumes: - - /var/weaviate:/var/lib/weaviate # <== set a volume here - environment: - QUERY_DEFAULTS_LIMIT: 25 - AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' - PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - ENABLE_API_BASED_MODULES: 'true' - CLUSTER_HOSTNAME: 'node1' # <== this can be set to an arbitrary name -... -``` - -### Backups - -See [Backups](docs/deploy/config-guides/backups.md). - -## Kubernetes - -For Kubernetes setup, the only thing to bear in mind is that Weaviate needs a `PersistentVolumes` through `PersistentVolumeClaims` ([more info](/docs/deploy/installation-guides/k8s-installation.md#requirements)) but the Helm chart is already configured to store the data on an external volume. - -## Disk Pressure Warnings and Limits - -Starting with `v1.12.0` there are two levels of disk usage notifications and actions configured through environment variables. Both variables are optional. If not set they default to the values outlined below: - -| Variable | Default Value | Description | -| --- | --- | --- | -| `DISK_USE_WARNING_PERCENTAGE` | `80` | If disk usage is higher than the given percentage a warning will be logged by all shards on the affected node's disk | -| `DISK_USE_READONLY_PERCENTAGE` | `90` | If disk usage is higher than the given percentage all shards on the affected node will be marked as `READONLY`, meaning all future write requests will fail. | - -If a shard was marked `READONLY` due to disk pressure and you want to mark the -shard as ready again (either because you have made more space available or -changed the thresholds) you can use the Shards API to do so. - -## Disk access method - -:::info Added in `v1.21` -::: - -Weaviate maps data on disk to memory. To configure how Weaviate uses virtual memory, set the `PERSISTENCE_LSM_ACCESS_STRATEGY` environment variable. The default value is `mmap`. Use `pread` to as an alternative. - -The two functions reflect different under-the-hood memory management behaviors. `mmap` uses a memory-mapped file, which means that the file is mapped into the virtual memory of the process. `pread` is a function that reads data from a file descriptor at a given offset. - -In general, `mmap` may be a preferred option with memory management benefits. However, if you experience stalling situations under heavy memory load, we suggest trying `pread` instead. - - -## Related pages -- [Configuration: Backups](docs/deploy/config-guides/backups.md) - -## Questions and feedback - -import DocsFeedback from '/_includes/docs-feedback.mdx'; - - diff --git a/docs/weaviate/configuration/rbac/manage-users.mdx b/docs/weaviate/configuration/rbac/manage-users.mdx index 82787d07..7bc5597e 100644 --- a/docs/weaviate/configuration/rbac/manage-users.mdx +++ b/docs/weaviate/configuration/rbac/manage-users.mdx @@ -350,7 +350,7 @@ viewer ## OIDC users: Permissions management {#oidc-user-permissions-management} -When using [OIDC](../../config-refs/oidc.md), an identity provider authenticates the user and issues tokens, which are then validated by Weaviate. These users can be assigned roles with custom permissions using RBAC. +When using [OIDC](docs/deploy/config-guides/oidc.md), an identity provider authenticates the user and issues tokens, which are then validated by Weaviate. These users can be assigned roles with custom permissions using RBAC. ### Assign a role to an OIDC user diff --git a/docs/weaviate/configuration/replication.md b/docs/weaviate/configuration/replication.md deleted file mode 100644 index ea3d13cc..00000000 --- a/docs/weaviate/configuration/replication.md +++ /dev/null @@ -1,131 +0,0 @@ ---- -title: Replication -sidebar_position: 60 -image: og/docs/configuration.jpg -# tags: ['configuration', 'operations', 'monitoring', 'observability'] ---- - -Weaviate instances can be replicated. Replication can improve read throughput, improve availability, and enable zero-downtime upgrades. - -For more details on how replication is designed and built in Weaviate, see [Replication Architecture](../concepts/replication-architecture/index.md). - -## How to configure - -import RaftRFChangeWarning from '/\_includes/1-25-replication-factor.mdx'; - - - -Replication is disabled by default. It can be enabled per collection in the [collection configuration](../manage-collections/multi-node-setup.mdx#replication-settings). This means you can set different replication factors per class in your dataset. - -To enable replication, you can set one or both of the following: - -- `REPLICATION_MINIMUM_FACTOR` environment variable for the entire Weaviate instance, or -- `replicationFactor` parameter for a collection. - -### Weaviate-wide minimum replication factor - -The `REPLICATION_MINIMUM_FACTOR` environment variable sets the minimum replication factor for all collections in the Weaviate instance. - -If you set the [replication factor for a collection](#replication-factor-for-a-collection), the collection's replication factor overrides the minimum replication factor. - -### Replication factor for a collection - -import SchemaReplication from '/\_includes/code/schema.things.create.replication.mdx'; - - - -In this example, there are three replicas. If you set the replication factor before you import data, all of the data is replicated three times. - -The replication factor can be modified after you add data to a collection. If you modify the replication factor afterwards, new data is copied across the new and pre-existing replica nodes. - -The example data schema has a [write consistency](../concepts/replication-architecture/consistency.md#tunable-write-consistency) level of `ALL`. When you upload or update a schema, the changes are sent to `ALL` nodes (via a coordinator node). The coordinator node waits for a successful acknowledgment from `ALL` nodes before sending a success message back to the client. This ensures a highly consistent schema in your distributed Weaviate setup. - -## Data consistency - -When Weaviate detects inconsistent data across nodes, it attempts to repair the out of sync data. - -Starting in v1.26, Weaviate adds [async replication](../concepts/replication-architecture/consistency.md#async-replication) to proactively detect inconsistencies. In earlier versions, Weaviate uses a [repair-on-read](../concepts/replication-architecture/consistency.md#repair-on-read) strategy to repair inconsistencies at read time. - -Repair-on-read is automatic. To activate async replication, set `asyncEnabled` to true in the `replicationConfig` section of your collection definition. - -import ReplicationConfigWithAsyncRepair from '/\_includes/code/configuration/replication-consistency.mdx'; - - - -### Configure async replication settings {#async-replication-settings} - -:::info Added in `v1.29` -The [environment variables](docs/deploy/config-guides/env-vars/index.md#async-replication) for configuring async replication (`ASYNC_*`) have been introduced in `v1.29`. -::: - -Async replication helps achieve consistency for data replicated across multiple nodes. - -Update the following [environment variables](docs/deploy/config-guides/env-vars/index.md#async-replication) to configure async replication for your particular use case. - -#### Logging - -- **Set the frequency of the logger:** `ASYNC_REPLICATION_LOGGING_FREQUENCY` - Define how often the async replication background process will log events. - -#### Data comparison - -- **Set the frequency of comparisons:** `ASYNC_REPLICATION_FREQUENCY` - Define how often each node compares its local data with other nodes. -- **Set comparison timeout:** `ASYNC_REPLICATION_DIFF_PER_NODE_TIMEOUT` - Optionally configure a timeout for how long to wait during comparison when a node is unresponsive. -- **Monitor node availability:** `ASYNC_REPLICATION_ALIVE_NODES_CHECKING_FREQUENCY` - Trigger comparisons whenever there’s a change in node availability. -- **Configure hash tree height:** `ASYNC_REPLICATION_HASHTREE_HEIGHT` - Specify the size of the hash tree, which helps narrow down data differences by comparing hash digests at multiple levels instead of scanning entire datasets. See [this page](../concepts/replication-architecture/consistency.md#memory-and-performance-considerations-for-async-replication) for more information on the memory and performance considerations for async replication. -- **Batch size for digest comparison:** `ASYNC_REPLICATION_DIFF_BATCH_SIZE` - Define the number of objects whose digest (e.g., last update time) is compared between nodes before propagating actual objects. - -#### Data synchronization - -Once differences between nodes are detected, Weaviate propagates outdated or missing data. Configure synchronization as follows: - -- **Set the frequency of propagation:** `ASYNC_REPLICATION_FREQUENCY_WHILE_PROPAGATING` - After synchronization is completed on a node, temporarily adjust the data comparison frequency to the set value. -- **Set propagation timeout:** `ASYNC_REPLICATION_PROPAGATION_TIMEOUT` - Optionally configure a timeout for how long to wait during propagation when a node is unresponsive. -- **Set propagation delay:** `ASYNC_REPLICATION_PROPAGATION_DELAY` - Define a delay period to allow asynchronous write operations to reach all nodes before propagating new or updated objects. -- **Batch size for data propagation:** `ASYNC_REPLICATION_PROPAGATION_BATCH_SIZE` - Define the number of objects that are sent in each synchronization batch during the propagation phase. -- **Set propagation limits:** `ASYNC_REPLICATION_PROPAGATION_LIMIT` - Enforce a limit on the number of out-of-sync objects to be propagated per replication iteration. -- **Set propagation concurrency:** `ASYNC_REPLICATION_PROPAGATION_CONCURRENCY` - Specify the number of concurrent workers that can send batches of objects to other nodes, allowing multiple propagation batches to be sent simultaneously. - -:::tip -Tweak these settings based on your cluster size and network latency to achieve optimal performance. Smaller batch sizes and shorter timeouts may be beneficial for high-traffic clusters, while larger clusters might require more conservative settings. -::: - -## How to use: Queries - -When you add (write) or query (read) data, one or more replica nodes in the cluster will respond to the request. How many nodes need to send a successful response and acknowledgment to the coordinator node depends on the `consistency_level`. Available [consistency levels](../concepts/replication-architecture/consistency.md) are `ONE`, `QUORUM` (replication_factor / 2 + 1) and `ALL`. - -The `consistency_level` can be specified at query time: - -```bash -# Get an object by ID, with consistency level ONE -curl "http://localhost:8080/v1/objects/{ClassName}/{id}?consistency_level=ONE" -``` - -:::note -In v1.17, only [read queries that get data by ID](../manage-objects/read.mdx#get-an-object-by-id) had a tunable consistency level. All other object-specific REST endpoints (read or write) used the consistency level `ALL`. Starting with v1.18, all write and read queries are tunable to either `ONE`, `QUORUM` (default) or `ALL`. GraphQL endpoints use the consistency level `ONE` (in both versions). -::: - -import QueryReplication from '/\_includes/code/replication.get.object.by.id.mdx'; - - - -## Related pages - -- [Concepts: Replication Architecture](../concepts/replication-architecture/index.md) - -## Questions and feedback - -import DocsFeedback from '/\_includes/docs-feedback.mdx'; - - diff --git a/docs/weaviate/index.mdx b/docs/weaviate/index.mdx index a066ee67..e916c738 100644 --- a/docs/weaviate/index.mdx +++ b/docs/weaviate/index.mdx @@ -124,7 +124,7 @@ export const deploymentCardsData = [ ], button: { text: "Run Weaviate with Docker", - link: "/docs/weaviate/installation/docker-compose", + link: "/docs/deploy/installation-guides/docker-installation", }, }, { @@ -146,7 +146,7 @@ export const deploymentCardsData = [ ], button: { text: "Run Weaviate with Kubernetes", - link: "/docs/weaviate/installation/kubernetes", + link: "/docs/deploy/installation-guides/k8s-installation", }, }, { diff --git a/docs/weaviate/installation/docker-compose.md b/docs/weaviate/installation/docker-compose.md deleted file mode 100644 index 5aeab46e..00000000 --- a/docs/weaviate/installation/docker-compose.md +++ /dev/null @@ -1,439 +0,0 @@ ---- -title: Docker -sidebar_position: 2 -image: og/docs/installation.jpg -# tags: ['installation', 'Docker'] ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -Weaviate supports deployment with Docker. - -You can [run Weaviate with default settings from a command line](#run-weaviate-with-default-settings), or [customize your configuration](#customize-your-weaviate-configuration) by creating your own `docker-compose.yml` file. - -## Run Weaviate with default settings - -:::info Added in v1.24.1 - -::: - -To run Weaviate with Docker using default settings, run this command from from your shell: - -```bash -docker run -p 8080:8080 -p 50051:50051 cr.weaviate.io/semitechnologies/weaviate:||site.weaviate_version|| -``` - -The command sets the following default [environment variables](#environment-variables) in the container: - -- `PERSISTENCE_DATA_PATH` defaults to `./data` -- `AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED` defaults to `true`. -- `QUERY_DEFAULTS_LIMIT` defaults to `10`. - -## Customize your Weaviate configuration - -You can customize your Weaviate configuration by creating a `docker-compose.yml` file. Start from our [sample Docker Compose file](#sample-docker-compose-file), or use the interactive [Configurator](#configurator) to generate a `docker-compose.yml` file. - -## Sample Docker Compose file - -This starter Docker Compose file allows: -* Use of any [API-based model provider integrations](../model-providers/index.md) (e.g. `OpenAI`, `Cohere`, `Google`, and `Anthropic`). - * This includes the relevant embedding model, generative, and reranker [integrations](../model-providers/index.md). -* Searching pre-vectorized data (without a vectorizer). -* Mounts a persistent volume called `weaviate_data` to `/var/lib/weaviate` in the container to store data. - -### Download and run - - - - -Save the code below as `docker-compose.yml` to download and run Weaviate with anonymous access enabled: - -```yaml ---- -services: - weaviate: - command: - - --host - - 0.0.0.0 - - --port - - '8080' - - --scheme - - http - image: cr.weaviate.io/semitechnologies/weaviate:||site.weaviate_version|| - ports: - - 8080:8080 - - 50051:50051 - volumes: - - weaviate_data:/var/lib/weaviate - restart: on-failure:0 - environment: - QUERY_DEFAULTS_LIMIT: 25 - AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' - PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - ENABLE_API_BASED_MODULES: 'true' - CLUSTER_HOSTNAME: 'node1' -volumes: - weaviate_data: -... -``` - -:::caution -Anonymous access is strongly discouraged except for development or evaluation purposes. -::: - - - - -Save the code below as `docker-compose.yml` to download and run Weaviate with authentication (non-anonymous access) and authorization enabled: - -```yaml ---- -services: - weaviate: - command: - - --host - - 0.0.0.0 - - --port - - '8080' - - --scheme - - http - image: cr.weaviate.io/semitechnologies/weaviate:||site.weaviate_version|| - ports: - - 8080:8080 - - 50051:50051 - volumes: - - weaviate_data:/var/lib/weaviate - restart: on-failure:0 - environment: - QUERY_DEFAULTS_LIMIT: 25 - PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - ENABLE_API_BASED_MODULES: 'true' - CLUSTER_HOSTNAME: 'node1' - AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'false' - AUTHENTICATION_APIKEY_ENABLED: 'true' - AUTHENTICATION_APIKEY_ALLOWED_KEYS: 'user-a-key,user-b-key' - AUTHENTICATION_APIKEY_USERS: 'user-a,user-b' - AUTHORIZATION_ENABLE_RBAC: 'true' - AUTHORIZATION_RBAC_ROOT_USERS: 'user-a' -volumes: - weaviate_data: -... -``` - -This setup enables API-key based [authentication](docs/deploy/config-guides/authentication.md) and role-based access control [authorization](docs/deploy/config-guides/authorization.md). - -It defines the users `user-a` and `user-b` and corresponding keys `user-a-key` and `user-b-key` which serve as authentication credentials for connecting to your Weaviate instance. - -The user `user-a` is granted admin access rights using the **Role-based access control (RBAC)** method. A custom role can be assigned to the user `user-b` by following the [authorization and RBAC guide](docs/deploy/config-guides/authorization.md). - - - - -Edit the `docker-compose.yml` file to suit your needs. You can add or remove [environment variables](#environment-variables), change the port mappings, or add additional [model provider integrations](../model-providers/index.md), such as [Ollama](../model-providers/ollama/index.md), or [Hugging Face Transformers](../model-providers/transformers/index.md). - -To start your Weaviate instance, run this command from your shell: - -```bash -docker compose up -d -``` - -## Configurator - -The Configurator can generate a `docker-compose.yml` file for you. Use the Configurator to select specific Weaviate modules, including vectorizers that run locally (i.e. `text2vec-transformers`, or `multi2vec-clip`) - -import DocsConfigGen from '@site/src/components/DockerConfigGen'; - - - -## Environment variables - -You can use environment variables to control your Weaviate setup, authentication and authorization, module settings, and data storage settings. - -:::info List of environment variables -A comprehensive of list environment variables [can be found on this page](docs/deploy/config-guides/env-vars/index.md). -::: - -## Example configurations - -Here are some examples of how to configure `docker-compose.yml`. - -### Persistent volume - -We recommended setting a persistent volume to avoid data loss as well as to improve reading and writing speeds. - -Make sure to run `docker compose down` when shutting down. This writes all the files from memory to disk. - -**With named volume** -```yaml -services: - weaviate: - volumes: - - weaviate_data:/var/lib/weaviate - # etc - -volumes: - weaviate_data: -``` - -After running a `docker compose up -d`, Docker will create a named volume `weaviate_data` and mount it to the `PERSISTENCE_DATA_PATH` inside the container. - -**With host binding** -```yaml -services: - weaviate: - volumes: - - /var/weaviate:/var/lib/weaviate - # etc -``` - -After running a `docker compose up -d`, Docker will mount `/var/weaviate` on the host to the `PERSISTENCE_DATA_PATH` inside the container. - -### Weaviate without any modules - -An example Docker Compose setup for Weaviate without any modules can be found below. In this case, no model inference is performed at either import or search time. You will need to provide your own vectors (e.g. from an outside ML model) at import and search time: - -```yaml -services: - weaviate: - image: cr.weaviate.io/semitechnologies/weaviate:||site.weaviate_version|| - ports: - - 8080:8080 - - 50051:50051 - restart: on-failure:0 - environment: - QUERY_DEFAULTS_LIMIT: 25 - AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' - PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - CLUSTER_HOSTNAME: 'node1' -``` - -### Weaviate with the `text2vec-transformers` module - -An example Docker Compose file with the transformers model [`sentence-transformers/multi-qa-MiniLM-L6-cos-v1`](https://huggingface.co/sentence-transformers/multi-qa-MiniLM-L6-cos-v1) is: - -```yaml -services: - weaviate: - image: cr.weaviate.io/semitechnologies/weaviate:||site.weaviate_version|| - restart: on-failure:0 - ports: - - 8080:8080 - - 50051:50051 - environment: - QUERY_DEFAULTS_LIMIT: 20 - AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' - PERSISTENCE_DATA_PATH: "./data" - DEFAULT_VECTORIZER_MODULE: text2vec-transformers - ENABLE_MODULES: text2vec-transformers - TRANSFORMERS_INFERENCE_API: http://t2v-transformers:8080 - CLUSTER_HOSTNAME: 'node1' - t2v-transformers: - image: cr.weaviate.io/semitechnologies/transformers-inference:sentence-transformers-multi-qa-MiniLM-L6-cos-v1 - environment: - ENABLE_CUDA: 0 # set to 1 to enable - # NVIDIA_VISIBLE_DEVICES: all # enable if running with CUDA -``` - -Note that transformer models are neural networks built to run on GPUs. Running Weaviate with the `text2vec-transformers` module and without GPU is possible, but it will be slower. Enable CUDA with `ENABLE_CUDA=1` if you have a GPU available. - -For more information on how to set up the environment with the -`text2vec-transformers` integration, see [this -page](/docs/weaviate/model-providers/transformers/embeddings.md). - -The `text2vec-transformers` module requires at least Weaviate version `v1.2.0`. - -### Unreleased versions - -import RunUnreleasedImages from '/_includes/configuration/run-unreleased.mdx' - - - -## Multi-node configuration - -To configure Weaviate to use multiple host nodes, follow these steps: - -- Configure one node as a "founding" member -- Set the `CLUSTER_JOIN` variable for the other nodes in the cluster. -- Set the `CLUSTER_GOSSIP_BIND_PORT` for each node. -- Set the `CLUSTER_DATA_BIND_PORT` for each node. -- Set the `RAFT_JOIN` each node. -- Set the `RAFT_BOOTSTRAP_EXPECT` for each node with the number of voters. -- Optionally, set the hostname for each node using `CLUSTER_HOSTNAME`. - -(Read more about [horizontal replication in Weaviate](../concepts/cluster.md).) - -So, the Docker Compose file includes environment variables for the "founding" member that look like this: - -```yaml - weaviate-node-1: # Founding member service name - ... # truncated for brevity - environment: - CLUSTER_HOSTNAME: 'node1' - CLUSTER_GOSSIP_BIND_PORT: '7100' - CLUSTER_DATA_BIND_PORT: '7101' - RAFT_JOIN: 'node1,node2,node3' - RAFT_BOOTSTRAP_EXPECT: 3 -``` - -And the other members' configurations may look like this: - -```yaml - weaviate-node-2: - ... # truncated for brevity - environment: - CLUSTER_HOSTNAME: 'node2' - CLUSTER_GOSSIP_BIND_PORT: '7102' - CLUSTER_DATA_BIND_PORT: '7103' - CLUSTER_JOIN: 'weaviate-node-1:7100' # This must be the service name of the "founding" member node. - RAFT_JOIN: 'node1,node2,node3' - RAFT_BOOTSTRAP_EXPECT: 3 -``` - -Below is an example configuration for a 3-node setup. You may be able to test [replication](../configuration/replication.md) examples locally using this configuration. - - -
    - Docker Compose file for a replication setup with 3 nodes - -```yaml -services: - weaviate-node-1: - init: true - command: - - --host - - 0.0.0.0 - - --port - - '8080' - - --scheme - - http - image: cr.weaviate.io/semitechnologies/weaviate:||site.weaviate_version|| - ports: - - 8080:8080 - - 6060:6060 - - 50051:50051 - restart: on-failure:0 - volumes: - - ./data-node-1:/var/lib/weaviate - environment: - LOG_LEVEL: 'debug' - QUERY_DEFAULTS_LIMIT: 25 - AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' - PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - ENABLE_API_BASED_MODULES: 'true' - CLUSTER_HOSTNAME: 'node1' - CLUSTER_GOSSIP_BIND_PORT: '7100' - CLUSTER_DATA_BIND_PORT: '7101' - RAFT_JOIN: 'node1,node2,node3' - RAFT_BOOTSTRAP_EXPECT: 3 - - weaviate-node-2: - init: true - command: - - --host - - 0.0.0.0 - - --port - - '8080' - - --scheme - - http - image: cr.weaviate.io/semitechnologies/weaviate:||site.weaviate_version|| - ports: - - 8081:8080 - - 6061:6060 - - 50052:50051 - restart: on-failure:0 - volumes: - - ./data-node-2:/var/lib/weaviate - environment: - LOG_LEVEL: 'debug' - QUERY_DEFAULTS_LIMIT: 25 - AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' - PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - ENABLE_API_BASED_MODULES: 'true' - CLUSTER_HOSTNAME: 'node2' - CLUSTER_GOSSIP_BIND_PORT: '7102' - CLUSTER_DATA_BIND_PORT: '7103' - CLUSTER_JOIN: 'weaviate-node-1:7100' - RAFT_JOIN: 'node1,node2,node3' - RAFT_BOOTSTRAP_EXPECT: 3 - - weaviate-node-3: - init: true - command: - - --host - - 0.0.0.0 - - --port - - '8080' - - --scheme - - http - image: cr.weaviate.io/semitechnologies/weaviate:||site.weaviate_version|| - ports: - - 8082:8080 - - 6062:6060 - - 50053:50051 - restart: on-failure:0 - volumes: - - ./data-node-3:/var/lib/weaviate - environment: - LOG_LEVEL: 'debug' - QUERY_DEFAULTS_LIMIT: 25 - AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true' - PERSISTENCE_DATA_PATH: '/var/lib/weaviate' - ENABLE_API_BASED_MODULES: 'true' - CLUSTER_HOSTNAME: 'node3' - CLUSTER_GOSSIP_BIND_PORT: '7104' - CLUSTER_DATA_BIND_PORT: '7105' - CLUSTER_JOIN: 'weaviate-node-1:7100' - RAFT_JOIN: 'node1,node2,node3' - RAFT_BOOTSTRAP_EXPECT: 3 -``` - -
    - -:::note Port number conventions -It is a Weaviate convention to set the `CLUSTER_DATA_BIND_PORT` to 1 higher than `CLUSTER_GOSSIP_BIND_PORT`. -::: - - -## Shell attachment options - -The output of `docker compose up` is quite verbose as it attaches to the logs of all containers. - -You can attach the logs only to Weaviate itself, for example, by running the following command instead of `docker compose up`: - -```bash -# Run Docker Compose -docker compose up -d && docker compose logs -f weaviate -``` - -Alternatively you can run docker compose entirely detached with `docker compose up -d` _and_ then poll `{bindaddress}:{port}/v1/meta` until you receive a status `200 OK`. - - - -## Troubleshooting - -### Set `CLUSTER_HOSTNAME` if it may change over time - -In some systems, the cluster hostname may change over time. This is known to create issues with a single-node Weaviate deployment. To avoid this, set the `CLUSTER_HOSTNAME` environment variable in the `values.yaml` file to the cluster hostname. - -```yaml ---- -services: - weaviate: - # ... - environment: - CLUSTER_HOSTNAME: 'node1' -... -``` - -## Related pages - -- If you are new to Docker, see [Docker Introduction for Weaviate Users](https://weaviate.io/blog/docker-and-containers-with-weaviate). - -## Questions and feedback - -import DocsFeedback from '/_includes/docs-feedback.mdx'; - - diff --git a/docs/weaviate/installation/index.md b/docs/weaviate/installation/index.md index 00a88be1..ad5815ab 100644 --- a/docs/weaviate/installation/index.md +++ b/docs/weaviate/installation/index.md @@ -14,14 +14,14 @@ If you are upgrading from a previous version of Weaviate, see the [Migration Gui To install and configure Weaviate, see the following: - **[Weaviate Cloud](../../cloud/quickstart.mdx)**: Managed services for development and production environments. -- **[Docker Compose](./docker-compose.md)**: Docker containers are well suited for development and testing. -- **[Kubernetes](./kubernetes.md)**: Kubernetes is ideal for scalable, production deployments. +- **[Docker Compose](docs/deploy/installation-guides/docker-installation.md)**: Docker containers are well suited for development and testing. +- **[Kubernetes](docs/deploy/installation-guides/k8s-installation.md)**: Kubernetes is ideal for scalable, production deployments. - **[Snowpark Container Services](./spcs-integration.mdx)** Deploy Weaviate in Snowflake's Snowpark environment. - **[Embedded Weaviate](./embedded.md)**: Experimental. Embedded Weaviate is a client based tool. ## Configuration files -Docker Compose and Kubernetes use yaml files to configure Weaviate instances. Docker uses the [`docker-compose.yml`](./docker-compose.md) file. Kubernetes relies on [Helm charts](./kubernetes.md#weaviate-helm-chart) and the `values.yaml` file. The Weaviate documentation also calls these files `configuration yaml files`. +Docker Compose and Kubernetes use yaml files to configure Weaviate instances. Docker uses the [`docker-compose.yml`](docs/deploy/installation-guides/docker-installation.md) file. Kubernetes relies on [Helm charts](docs/deploy/installation-guides/k8s-installation.md#weaviate-helm-chart) and the `values.yaml` file. The Weaviate documentation also calls these files `configuration yaml files`. If you are self-hosting, consider experimenting on a small scale with Docker and then transferring your configuration to Kubernetes Helm charts when you are more familiar with Weaviate. diff --git a/docs/weaviate/installation/kubernetes.md b/docs/weaviate/installation/kubernetes.md deleted file mode 100644 index a3ed2511..00000000 --- a/docs/weaviate/installation/kubernetes.md +++ /dev/null @@ -1,265 +0,0 @@ ---- -title: Installing Kubernetes -sidebar_position: 3 -image: og/docs/installation.jpg -# tags: ['installation', 'Kubernetes'] ---- - -:::tip End-to-end guide -For a tutorial on how to use [minikube](https://minikube.sigs.k8s.io/docs/) to deploy Weaviate on Kubernetes, see the Weaviate Academy course, [Weaviate on Kubernetes](../../academy/deployment/k8s/index.md). -::: - -:::info Deploying to Production -If looking for details and best practices for deploying Weaviate in production, see [Weaviate in Production](docs/deploy/production/Kubernetes/k8s-poc.md) -::: - -## Prerequisites - -* A recent Kubernetes Cluster (at least version 1.23). If you are in a development environment, consider using the kubernetes cluster that is built into Docker desktop. For more information, see the [Docker documentation](https://docs.docker.com/desktop/kubernetes/). -* The cluster needs to be able to provision `PersistentVolumes` using Kubernetes' `PersistentVolumeClaims`. -* A file system that can be mounted read-write by a single node to allow Kubernetes' `ReadWriteOnce` access mode. -* Helm version v3 or higher. The current Helm chart is version `||site.helm_version||`. - -## Weaviate Helm chart - -:::note Important: Set the correct Weaviate version -As a best practice, explicitly set the Weaviate version in the Helm chart.

    - -Set the version in your `values.yaml` file or [overwrite the default value](#deploy-install-the-helm-chart) during deployment. -::: - -To install the Weaviate chart on your Kubernetes cluster, follow these steps: - -### Verify tool setup and cluster access - -```bash -# Check if helm is installed -helm version -# Make sure `kubectl` is configured correctly and you can access the cluster. -# For example, try listing the pods in the currently configured namespace. -kubectl get pods -``` - -### Get the Helm Chart - -Add the Weaviate helm repo that contains the Weaviate helm chart. - -```bash -helm repo add weaviate https://weaviate.github.io/weaviate-helm -helm repo update -``` - -Get the default `values.yaml` configuration file from the Weaviate helm chart: -```bash -helm show values weaviate/weaviate > values.yaml -``` - -### Modify values.yaml - -To customize the Helm chart for your environment, edit the [`values.yaml`](https://github.com/weaviate/weaviate-helm/blob/master/weaviate/values.yaml) -file. The default `yaml` file is extensively documented to help you configure your system. - -#### Replication - -The default configuration defines one Weaviate replica cluster. - -#### Local models - -Local models, such as `text2vec-transformers`, `qna-transformers`, and `img2vec-neural` are disabled by default. To enable a model, set the model's -`enabled` flag to `true`. - -#### Resource limits - -In an effort to improve performance, constraints on module resources are commented out. To constrain resources for specific modules, add the constraints in your `values.yaml` file. - -#### gRPC service configuration - -gRPC service is enabled by default. If using an older Helm chart, edit your `values.yaml` file to enable gRPC. -Check that the `enabled` field is set to `true` and the `type` field to `LoadBalancer`. These settings allow you to access the [gRPC API](https://weaviate.io/blog/grpc-performance-improvements) from outside the Kubernetes cluster. - -```yaml -grpcService: - enabled: true # ⬅️ Make sure this is set to true - name: weaviate-grpc - ports: - - name: grpc - protocol: TCP - port: 50051 - type: LoadBalancer # ⬅️ Set this to LoadBalancer (from NodePort) -``` - -#### Authentication and authorization - -An example configuration for authentication is shown below: - -```yaml -authentication: - apikey: - enabled: true - allowed_keys: - - readonly-key - - secr3tk3y - users: - - readonly@example.com - - admin@example.com - anonymous_access: - enabled: false - oidc: - enabled: true - issuer: https://auth.wcs.api.weaviate.io/auth/realms/SeMI - username_claim: email - groups_claim: groups - client_id: wcs -authorization: - admin_list: - enabled: true - users: - - someuser@weaviate.io - - admin@example.com - readonly_users: - - readonly@example.com -``` - -In this example, the key `readonly-key` will authenticate a user as the `readonly@example.com` identity, and `secr3tk3y` will authenticate a user as `admin@example.com`. - -OIDC authentication is also enabled, with WCD as the token issuer/identity provider. Thus, users with WCD accounts could be authenticated. This configuration sets `someuser@weaviate.io` as an admin user, so if `someuser@weaviate.io` were to authenticate, they will be given full (read and write) privileges. - -For further, general documentation on authentication and authorization configuration, see: -- [Authentication](docs/deploy/config-guides/authentication.md) -- [Authorization](docs/deploy/config-guides/authorization.md) - -#### Run as non-root user - -By default, weaviate runs as the root user. To run as a non-privileged user, edit the settings in the `containerSecurityContext` section. - -The `init` container always runs as root to configure the node. Once the system is started, it run a non-privileged user if you have one configured. - -### Deploy (install the Helm chart) - -You can deploy the helm charts as follows: - -```bash -# Create a Weaviate namespace -kubectl create namespace weaviate - -# Deploy -helm upgrade --install \ - "weaviate" \ - weaviate/weaviate \ - --namespace "weaviate" \ - --values ./values.yaml -``` - -The above assumes that you have permissions to create a new namespace. If you -have only namespace-level permissions, you can skip creating a new -namespace and adjust the namespace argument on `helm upgrade` according to the -name of your pre-configured namespace. - -Optionally, you can provide the `--create-namespace` parameter which will create the namespace if not present. - -### Updating the installation after the initial deployment - -The above command (`helm upgrade...`) is idempotent. In other words, you can run it multiple times after adjusting your desired configuration without causing any unintended changes or side effects. - -### Upgrading to `1.25` or higher from pre-`1.25` - -:::caution Important -::: - -To upgrade to `1.25` or higher from a pre-`1.25` version, you must delete the deployed `StatefulSet`, update the helm chart to version `17.0.0` or higher, and re-deploy Weaviate. - -See the [1.25 migration guide for Kubernetes](docs/deploy/migration/weaviate-1-25.md) for more details. - -### Using EFS with Weaviate - -In some circumstances, you may wish, or need, to use EFS (Amazon Elastic File System) with Weaviate. And we note in the case of AWS Fargate, you must create the [PV (persistent volume)](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) manually, as the PVC will NOT create a PV for you. - -To use EFS with Weaviate, you need to: - -1. Create an EFS file system. -1. Create an EFS access point for every Weaviate replica. - 1. All of the Access Points must have a different root-directory so that Pods do not share the data, otherwise it will fail. -1. Create EFS mount targets for each subnet of the VPC where Weaviate is deployed. -1. Create StorageClass in Kubernetes using EFS. -1. Create Weaviate Volumes, where each volume has a different AccessPoint for VolumeHandle(as mentioned above). -1. Deploy Weaviate. - -This code is an example of a PV for `weaviate-0` Pod: - -```yaml -apiVersion: v1 -kind: PersistentVolume -metadata: - name: weaviate-0 -spec: - capacity: - storage: 8Gi - volumeMode: Filesystem - accessModes: - - ReadWriteOnce - persistentVolumeReclaimPolicy: Delete - storageClassName: "efs-sc" - csi: - driver: efs.csi.aws.com - volumeHandle: :: - claimRef: - namespace: - name: weaviate-data-weaviate-0 -``` - -For more, general information on running EFS with Fargate, we recommend reading [this AWS blog](https://aws.amazon.com/blogs/containers/running-stateful-workloads-with-amazon-eks-on-aws-fargate-using-amazon-efs/). - -### Using Azure file CSI with Weaviate - -:::danger Important - -The provisioner `file.csi.azure.com` is **not supported** and will lead to file corruptions. - -::: - -Instead, make sure the storage class defined in values.yaml is from provisioner `disk.csi.azure.com`, for example: - -```yaml -storage: - size: 32Gi - storageClassName: managed -``` - -you can get the list of available storage classes in your cluster with: - -``` -kubectl get storageclasses -``` - -## Troubleshooting - -- If you see `No private IP address found, and explicit IP not provided`, set the pod subnet to be in an valid ip address range of the following: - - ``` - 10.0.0.0/8 - 100.64.0.0/10 - 172.16.0.0/12 - 192.168.0.0/16 - 198.19.0.0/16 - ``` - -### Set `CLUSTER_HOSTNAME` if it may change over time - -In some systems, the cluster hostname may change over time. This is known to create issues with a single-node Weaviate deployment. To avoid this, set the `CLUSTER_HOSTNAME` environment variable in the `values.yaml` file to the cluster hostname. - -```yaml -env: - - CLUSTER_HOSTNAME: "node-1" -``` - -## Additional Configuration Help - -- [Cannot list resource "configmaps" in API group when deploying Weaviate k8s setup on GCP](https://stackoverflow.com/questions/58501558/cannot-list-resource-configmaps-in-api-group-when-deploying-weaviate-k8s-setup) - -- [Error: UPGRADE FAILED: configmaps is forbidden](https://stackoverflow.com/questions/58501558/cannot-list-resource-configmaps-in-api-group-when-deploying-weaviate-k8s-setup) - -## Questions and feedback - -import DocsFeedback from '/_includes/docs-feedback.mdx'; - - diff --git a/docs/weaviate/manage-collections/multi-node-setup.mdx b/docs/weaviate/manage-collections/multi-node-setup.mdx index 6321be86..08226252 100644 --- a/docs/weaviate/manage-collections/multi-node-setup.mdx +++ b/docs/weaviate/manage-collections/multi-node-setup.mdx @@ -21,7 +21,7 @@ import RaftRFChangeWarning from "/_includes/1-25-replication-factor.mdx"; -Configure replication settings, such as [async replication](/docs/weaviate/configuration/replication#async-replication-settings) and [deletion resolution strategy](../concepts/replication-architecture/consistency.md#deletion-resolution-strategies). +Configure replication settings, such as [async replication](docs/deploy/config-guides/replication.md#async-replication-settings) and [deletion resolution strategy](../concepts/replication-architecture/consistency.md#deletion-resolution-strategies). @@ -96,7 +96,7 @@ http://localhost:8080/v1/schema Additional information -To use replication factors greater than one, use a [multi-node deployment](../installation/docker-compose.md#multi-node-configuration). +To use replication factors greater than one, use a [multi-node deployment](docs/deploy/installation-guides/docker-installation.md#multi-node-configuration). For details on the configuration parameters, see the following: diff --git a/docs/weaviate/model-providers/anthropic/generative.md b/docs/weaviate/model-providers/anthropic/generative.md index 32a63464..889a407f 100644 --- a/docs/weaviate/model-providers/anthropic/generative.md +++ b/docs/weaviate/model-providers/anthropic/generative.md @@ -40,7 +40,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/anyscale/generative.md b/docs/weaviate/model-providers/anyscale/generative.md index 709932e9..09cc2579 100644 --- a/docs/weaviate/model-providers/anyscale/generative.md +++ b/docs/weaviate/model-providers/anyscale/generative.md @@ -40,7 +40,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/aws/embeddings.md b/docs/weaviate/model-providers/aws/embeddings.md index 47bf89b0..d075021e 100644 --- a/docs/weaviate/model-providers/aws/embeddings.md +++ b/docs/weaviate/model-providers/aws/embeddings.md @@ -43,7 +43,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/aws/generative.md b/docs/weaviate/model-providers/aws/generative.md index 621cad52..fb889450 100644 --- a/docs/weaviate/model-providers/aws/generative.md +++ b/docs/weaviate/model-providers/aws/generative.md @@ -41,7 +41,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/cohere/embeddings-multimodal.md b/docs/weaviate/model-providers/cohere/embeddings-multimodal.md index 16037165..b2119dce 100644 --- a/docs/weaviate/model-providers/cohere/embeddings-multimodal.md +++ b/docs/weaviate/model-providers/cohere/embeddings-multimodal.md @@ -43,7 +43,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/cohere/embeddings.md b/docs/weaviate/model-providers/cohere/embeddings.md index 230c250d..0b9f6f0e 100644 --- a/docs/weaviate/model-providers/cohere/embeddings.md +++ b/docs/weaviate/model-providers/cohere/embeddings.md @@ -46,7 +46,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/cohere/generative.md b/docs/weaviate/model-providers/cohere/generative.md index c69b6f06..d0b182ab 100644 --- a/docs/weaviate/model-providers/cohere/generative.md +++ b/docs/weaviate/model-providers/cohere/generative.md @@ -41,7 +41,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/cohere/reranker.md b/docs/weaviate/model-providers/cohere/reranker.md index f214b14a..732825cd 100644 --- a/docs/weaviate/model-providers/cohere/reranker.md +++ b/docs/weaviate/model-providers/cohere/reranker.md @@ -41,7 +41,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/databricks/embeddings.md b/docs/weaviate/model-providers/databricks/embeddings.md index e03f6213..cfcd5f3a 100644 --- a/docs/weaviate/model-providers/databricks/embeddings.md +++ b/docs/weaviate/model-providers/databricks/embeddings.md @@ -44,7 +44,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/databricks/generative.md b/docs/weaviate/model-providers/databricks/generative.md index a6d17923..4988b639 100644 --- a/docs/weaviate/model-providers/databricks/generative.md +++ b/docs/weaviate/model-providers/databricks/generative.md @@ -42,7 +42,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/friendliai/generative.md b/docs/weaviate/model-providers/friendliai/generative.md index 70e14460..87590981 100644 --- a/docs/weaviate/model-providers/friendliai/generative.md +++ b/docs/weaviate/model-providers/friendliai/generative.md @@ -43,7 +43,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/google/embeddings-multimodal.md b/docs/weaviate/model-providers/google/embeddings-multimodal.md index 9760e39b..6a635d55 100644 --- a/docs/weaviate/model-providers/google/embeddings-multimodal.md +++ b/docs/weaviate/model-providers/google/embeddings-multimodal.md @@ -48,7 +48,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/google/embeddings.md b/docs/weaviate/model-providers/google/embeddings.md index a93c1607..9fa2e66a 100644 --- a/docs/weaviate/model-providers/google/embeddings.md +++ b/docs/weaviate/model-providers/google/embeddings.md @@ -51,7 +51,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/google/generative.md b/docs/weaviate/model-providers/google/generative.md index f06a4c37..befb2f94 100644 --- a/docs/weaviate/model-providers/google/generative.md +++ b/docs/weaviate/model-providers/google/generative.md @@ -49,7 +49,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/gpt4all/embeddings.md b/docs/weaviate/model-providers/gpt4all/embeddings.md index 03708419..bc2e5591 100644 --- a/docs/weaviate/model-providers/gpt4all/embeddings.md +++ b/docs/weaviate/model-providers/gpt4all/embeddings.md @@ -44,7 +44,7 @@ This integration is not available for Weaviate Cloud (WCD) serverless instances,
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    @@ -60,7 +60,7 @@ The following example shows how to configure the GPT4All integration in Weaviate #### Docker Option 1: Use a pre-configured `docker-compose.yml` file -Follow the instructions on the [Weaviate Docker installation configurator](../../installation/docker-compose.md#configurator) to download a pre-configured `docker-compose.yml` file with a selected model +Follow the instructions on the [Weaviate Docker installation configurator](docs/deploy/installation-guides/docker-installation.md#configurator) to download a pre-configured `docker-compose.yml` file with a selected model
    #### Docker Option 2: Add the configuration manually diff --git a/docs/weaviate/model-providers/huggingface/embeddings.md b/docs/weaviate/model-providers/huggingface/embeddings.md index 827fd696..ccc2bff6 100644 --- a/docs/weaviate/model-providers/huggingface/embeddings.md +++ b/docs/weaviate/model-providers/huggingface/embeddings.md @@ -42,7 +42,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/imagebind/embeddings-multimodal.md b/docs/weaviate/model-providers/imagebind/embeddings-multimodal.md index de4c655e..0e47763b 100644 --- a/docs/weaviate/model-providers/imagebind/embeddings-multimodal.md +++ b/docs/weaviate/model-providers/imagebind/embeddings-multimodal.md @@ -39,7 +39,7 @@ This integration is not available for Weaviate Cloud (WCD) serverless instances, #### Enable the integration module -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate. #### Configure the integration @@ -53,7 +53,7 @@ The following example shows how to configure the ImageBind integration in Weavia #### Docker Option 1: Use a pre-configured `docker-compose.yml` file -Follow the instructions on the [Weaviate Docker installation configurator](../../installation/docker-compose.md#configurator) to download a pre-configured `docker-compose.yml` file with a selected model +Follow the instructions on the [Weaviate Docker installation configurator](docs/deploy/installation-guides/docker-installation.md#configurator) to download a pre-configured `docker-compose.yml` file with a selected model
    #### Docker Option 2: Add the configuration manually diff --git a/docs/weaviate/model-providers/jinaai/embeddings-colbert.md b/docs/weaviate/model-providers/jinaai/embeddings-colbert.md index 0e66d70a..697707b8 100644 --- a/docs/weaviate/model-providers/jinaai/embeddings-colbert.md +++ b/docs/weaviate/model-providers/jinaai/embeddings-colbert.md @@ -44,7 +44,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/jinaai/embeddings-multimodal.md b/docs/weaviate/model-providers/jinaai/embeddings-multimodal.md index c1810955..6743fdd9 100644 --- a/docs/weaviate/model-providers/jinaai/embeddings-multimodal.md +++ b/docs/weaviate/model-providers/jinaai/embeddings-multimodal.md @@ -42,7 +42,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/jinaai/embeddings.md b/docs/weaviate/model-providers/jinaai/embeddings.md index db50c10f..2afa6228 100644 --- a/docs/weaviate/model-providers/jinaai/embeddings.md +++ b/docs/weaviate/model-providers/jinaai/embeddings.md @@ -42,7 +42,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/jinaai/reranker.md b/docs/weaviate/model-providers/jinaai/reranker.md index 9f358bda..8ee9b451 100644 --- a/docs/weaviate/model-providers/jinaai/reranker.md +++ b/docs/weaviate/model-providers/jinaai/reranker.md @@ -42,7 +42,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/kubeai/embeddings.md b/docs/weaviate/model-providers/kubeai/embeddings.md index f37f5711..64ecfc42 100644 --- a/docs/weaviate/model-providers/kubeai/embeddings.md +++ b/docs/weaviate/model-providers/kubeai/embeddings.md @@ -44,7 +44,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/kubeai/generative.md b/docs/weaviate/model-providers/kubeai/generative.md index 4c6352f1..985f0730 100644 --- a/docs/weaviate/model-providers/kubeai/generative.md +++ b/docs/weaviate/model-providers/kubeai/generative.md @@ -44,7 +44,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/mistral/embeddings.md b/docs/weaviate/model-providers/mistral/embeddings.md index 258642ef..7108af85 100644 --- a/docs/weaviate/model-providers/mistral/embeddings.md +++ b/docs/weaviate/model-providers/mistral/embeddings.md @@ -42,7 +42,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/mistral/generative.md b/docs/weaviate/model-providers/mistral/generative.md index f2a1111c..3c51c42b 100644 --- a/docs/weaviate/model-providers/mistral/generative.md +++ b/docs/weaviate/model-providers/mistral/generative.md @@ -41,7 +41,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/nvidia/embeddings-multimodal.md b/docs/weaviate/model-providers/nvidia/embeddings-multimodal.md index 4d546a05..053261d1 100644 --- a/docs/weaviate/model-providers/nvidia/embeddings-multimodal.md +++ b/docs/weaviate/model-providers/nvidia/embeddings-multimodal.md @@ -43,7 +43,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/nvidia/embeddings.md b/docs/weaviate/model-providers/nvidia/embeddings.md index 48d40715..6764ade6 100644 --- a/docs/weaviate/model-providers/nvidia/embeddings.md +++ b/docs/weaviate/model-providers/nvidia/embeddings.md @@ -45,7 +45,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/nvidia/generative.md b/docs/weaviate/model-providers/nvidia/generative.md index bede2466..00bd6ff4 100644 --- a/docs/weaviate/model-providers/nvidia/generative.md +++ b/docs/weaviate/model-providers/nvidia/generative.md @@ -42,7 +42,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/nvidia/reranker.md b/docs/weaviate/model-providers/nvidia/reranker.md index b7c2723b..5fcd2b79 100644 --- a/docs/weaviate/model-providers/nvidia/reranker.md +++ b/docs/weaviate/model-providers/nvidia/reranker.md @@ -43,7 +43,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/octoai/embeddings.md b/docs/weaviate/model-providers/octoai/embeddings.md index 3616c919..c4def7a2 100644 --- a/docs/weaviate/model-providers/octoai/embeddings.md +++ b/docs/weaviate/model-providers/octoai/embeddings.md @@ -46,7 +46,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/octoai/generative.md b/docs/weaviate/model-providers/octoai/generative.md index 6cfb99b1..7558faa5 100644 --- a/docs/weaviate/model-providers/octoai/generative.md +++ b/docs/weaviate/model-providers/octoai/generative.md @@ -47,7 +47,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/ollama/embeddings.md b/docs/weaviate/model-providers/ollama/embeddings.md index 1a2d6daf..4d9a1c57 100644 --- a/docs/weaviate/model-providers/ollama/embeddings.md +++ b/docs/weaviate/model-providers/ollama/embeddings.md @@ -51,7 +51,7 @@ For use cases such as this, consider using a self-hosted Weaviate instance, or a
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/ollama/generative.md b/docs/weaviate/model-providers/ollama/generative.md index 49883819..da705574 100644 --- a/docs/weaviate/model-providers/ollama/generative.md +++ b/docs/weaviate/model-providers/ollama/generative.md @@ -51,7 +51,7 @@ For use cases such as this, consider using a self-hosted Weaviate instance, or a
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/openai-azure/embeddings.md b/docs/weaviate/model-providers/openai-azure/embeddings.md index 779e633f..e4873883 100644 --- a/docs/weaviate/model-providers/openai-azure/embeddings.md +++ b/docs/weaviate/model-providers/openai-azure/embeddings.md @@ -43,7 +43,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/openai-azure/generative.md b/docs/weaviate/model-providers/openai-azure/generative.md index d5a25d79..1e75f187 100644 --- a/docs/weaviate/model-providers/openai-azure/generative.md +++ b/docs/weaviate/model-providers/openai-azure/generative.md @@ -41,7 +41,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/openai/embeddings.md b/docs/weaviate/model-providers/openai/embeddings.md index f5a325dc..041fb42a 100644 --- a/docs/weaviate/model-providers/openai/embeddings.md +++ b/docs/weaviate/model-providers/openai/embeddings.md @@ -46,7 +46,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/openai/generative.md b/docs/weaviate/model-providers/openai/generative.md index 96a232ef..6f63fce8 100644 --- a/docs/weaviate/model-providers/openai/generative.md +++ b/docs/weaviate/model-providers/openai/generative.md @@ -44,7 +44,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/transformers/embeddings-multimodal.md b/docs/weaviate/model-providers/transformers/embeddings-multimodal.md index e4bae13b..fd033c03 100644 --- a/docs/weaviate/model-providers/transformers/embeddings-multimodal.md +++ b/docs/weaviate/model-providers/transformers/embeddings-multimodal.md @@ -40,7 +40,7 @@ This integration is not available for Weaviate Cloud (WCD) serverless instances, #### Enable the integration module -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate. #### Configure the integration @@ -54,7 +54,7 @@ The following example shows how to configure the CLIP integration in Weaviate: #### Docker Option 1: Use a pre-configured `docker-compose.yml` file -Follow the instructions on the [Weaviate Docker installation configurator](../../installation/docker-compose.md#configurator) to download a pre-configured `docker-compose.yml` file with a selected model +Follow the instructions on the [Weaviate Docker installation configurator](docs/deploy/installation-guides/docker-installation.md#configurator) to download a pre-configured `docker-compose.yml` file with a selected model
    #### Docker Option 2: Add the configuration manually diff --git a/docs/weaviate/model-providers/transformers/embeddings.md b/docs/weaviate/model-providers/transformers/embeddings.md index bb34ee1f..ccfa40fb 100644 --- a/docs/weaviate/model-providers/transformers/embeddings.md +++ b/docs/weaviate/model-providers/transformers/embeddings.md @@ -40,7 +40,7 @@ This integration is not available for Weaviate Cloud (WCD) serverless instances, #### Enable the integration module -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate. #### Configure the integration @@ -54,7 +54,7 @@ The following example shows how to configure the Hugging Face Transformers integ #### Docker Option 1: Use a pre-configured `docker-compose.yml` file -Follow the instructions on the [Weaviate Docker installation configurator](../../installation/docker-compose.md#configurator) to download a pre-configured `docker-compose.yml` file with a selected model +Follow the instructions on the [Weaviate Docker installation configurator](docs/deploy/installation-guides/docker-installation.md#configurator) to download a pre-configured `docker-compose.yml` file with a selected model
    #### Docker Option 2: Add the configuration manually diff --git a/docs/weaviate/model-providers/transformers/reranker.md b/docs/weaviate/model-providers/transformers/reranker.md index 22730da3..9f43d111 100644 --- a/docs/weaviate/model-providers/transformers/reranker.md +++ b/docs/weaviate/model-providers/transformers/reranker.md @@ -40,7 +40,7 @@ This integration is not available for Weaviate Cloud (WCD) serverless instances, #### Enable the integration module -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate. #### Configure the integration @@ -54,7 +54,7 @@ The following example shows how to configure the Hugging Face Transformers integ #### Docker Option 1: Use a pre-configured `docker-compose.yml` file -Follow the instructions on the [Weaviate Docker installation configurator](../../installation/docker-compose.md#configurator) to download a pre-configured `docker-compose.yml` file with a selected model +Follow the instructions on the [Weaviate Docker installation configurator](docs/deploy/installation-guides/docker-installation.md#configurator) to download a pre-configured `docker-compose.yml` file with a selected model
    #### Docker Option 2: Add the configuration manually diff --git a/docs/weaviate/model-providers/voyageai/embeddings-multimodal.md b/docs/weaviate/model-providers/voyageai/embeddings-multimodal.md index a6b21f61..dd994ee4 100644 --- a/docs/weaviate/model-providers/voyageai/embeddings-multimodal.md +++ b/docs/weaviate/model-providers/voyageai/embeddings-multimodal.md @@ -45,7 +45,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/voyageai/embeddings.md b/docs/weaviate/model-providers/voyageai/embeddings.md index ec178092..08ceb57f 100644 --- a/docs/weaviate/model-providers/voyageai/embeddings.md +++ b/docs/weaviate/model-providers/voyageai/embeddings.md @@ -43,7 +43,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/voyageai/reranker.md b/docs/weaviate/model-providers/voyageai/reranker.md index 12db608f..8bdedc5a 100644 --- a/docs/weaviate/model-providers/voyageai/reranker.md +++ b/docs/weaviate/model-providers/voyageai/reranker.md @@ -41,7 +41,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/model-providers/xai/generative.md b/docs/weaviate/model-providers/xai/generative.md index 114607a8..db46a676 100644 --- a/docs/weaviate/model-providers/xai/generative.md +++ b/docs/weaviate/model-providers/xai/generative.md @@ -42,7 +42,7 @@ This integration is enabled by default on Weaviate Cloud (WCD) serverless instan
    For self-hosted users -- Check the [cluster metadata](../../config-refs/meta.md) to verify if the module is enabled. +- Check the [cluster metadata](docs/deploy/config-guides/meta.md) to verify if the module is enabled. - Follow the [how-to configure modules](../../configuration/modules.md) guide to enable the module in Weaviate.
    diff --git a/docs/weaviate/modules/custom-modules.md b/docs/weaviate/modules/custom-modules.md index dbfcb6e3..50d5d49a 100644 --- a/docs/weaviate/modules/custom-modules.md +++ b/docs/weaviate/modules/custom-modules.md @@ -95,7 +95,7 @@ Because you are not touching the Go Weaviate interface code, you don't have the _Note that Weaviate APIs are not guaranteed to be stable. Even on a non-breaking Weaviate release, 'internal' APIS could always change._ To use a new inference model (part 2) with an existing Weaviate interface (part 1), you could reuse all the Go-code from the existing module and simply point it to a different inference container. As an example, here's how to use a custom inference module using the `text2vec-transformers` Go-code: -1. In a valid `docker-compose.yml` that's configured to use transformers (e.g. for example configure one via the [configuration configurator](/docs/weaviate/installation/docker-compose.md#configurator)), you will find an env var like this: `TRANSFORMERS_INFERENCE_API: 'http://t2v-transformers:8080'`, you can point that to any app you like. You should keep the variable name `TRANSFORMERS_INFERENCE_API`. +1. In a valid `docker-compose.yml` that's configured to use transformers (e.g. for example configure one via the [configuration configurator](docs/deploy/installation-guides/docker-installation.md#configurator)), you will find an env var like this: `TRANSFORMERS_INFERENCE_API: 'http://t2v-transformers:8080'`, you can point that to any app you like. You should keep the variable name `TRANSFORMERS_INFERENCE_API`. 2. Build a small HTTP API wrapper around your model, it should at the minimum have the endpoints listed below (which is in this example entirely specific to the `text2vec-transformers` module and fully in its control): 1. `GET /.well-known/live` -> respond `204` when the app is alive 2. `GET /.well-known/ready` -> respond `204` when the app is ready to serve traffic diff --git a/docs/weaviate/modules/img2vec-neural.md b/docs/weaviate/modules/img2vec-neural.md index edb0e8d5..dbdb881f 100644 --- a/docs/weaviate/modules/img2vec-neural.md +++ b/docs/weaviate/modules/img2vec-neural.md @@ -32,7 +32,7 @@ This module is not available on Weaviate Cloud. To use `img2vec-neural`, you must enable it in your Docker Compose file (e.g. `docker-compose.yml`). :::tip Use the configuration tool -While you can do so manually, we recommend using the [Weaviate configuration tool](/docs/weaviate/installation/docker-compose.md#configurator) to generate the `Docker Compose` file. +While you can do so manually, we recommend using the [Weaviate configuration tool](docs/deploy/installation-guides/docker-installation.md#configurator) to generate the `Docker Compose` file. ::: #### Parameters diff --git a/docs/weaviate/modules/index.md b/docs/weaviate/modules/index.md index 4dd02383..946166e8 100644 --- a/docs/weaviate/modules/index.md +++ b/docs/weaviate/modules/index.md @@ -68,7 +68,7 @@ For example: - A module name must be url-safe, meaning it must not contain any characters which would require url-encoding. - A module name is not case-sensitive. `text2vec-bert` would be the same module as `text2vec-BERT`. - Module information is accessible through the `v1/modules//` RESTful endpoint. -- General module information (which modules are attached, version, etc.) is accessible through Weaviate's [`v1/meta` endpoint](../config-refs/meta.md). +- General module information (which modules are attached, version, etc.) is accessible through Weaviate's [`v1/meta` endpoint](docs/deploy/config-guides/meta.md). - Modules can add `additional` properties in the RESTful API and [`_additional` properties in the GraphQL API](../api/graphql/additional-properties.md). - A module can add [filters](../api/graphql/filters.md) in GraphQL queries. - Which vectorizer and other modules are applied to which data collection is configured in the [schema](../manage-collections/vector-config.mdx#specify-a-vectorizer). diff --git a/docs/weaviate/modules/text2vec-contextionary.md b/docs/weaviate/modules/text2vec-contextionary.md index 4aa28d06..0f83827e 100644 --- a/docs/weaviate/modules/text2vec-contextionary.md +++ b/docs/weaviate/modules/text2vec-contextionary.md @@ -32,7 +32,7 @@ This module is not available on Weaviate Cloud. To use `text2vec-contextionary`, you must enable it in your Docker Compose file (e.g. `docker-compose.yml`). :::tip Use the configuration tool -While you can do so manually, we recommend using the [Weaviate configuration tool](/docs/weaviate/installation/docker-compose.md#configurator) to generate the `Docker Compose` file. +While you can do so manually, we recommend using the [Weaviate configuration tool](docs/deploy/installation-guides/docker-installation.md#configurator) to generate the `Docker Compose` file. ::: #### Parameters diff --git a/docs/weaviate/recipes/generative_search_nvidia.md b/docs/weaviate/recipes/generative_search_nvidia.md index 0c530059..522bbe84 100644 --- a/docs/weaviate/recipes/generative_search_nvidia.md +++ b/docs/weaviate/recipes/generative_search_nvidia.md @@ -19,7 +19,7 @@ In this demo, we will use an embedding and generative model on NVIDIA to generat 1. Weaviate cluster 1. You can create a 14-day free sandbox on [WCD](https://console.weaviate.cloud/) 2. [Embedded Weaviate](https://weaviate.io/developers/weaviate/installation/embedded) - 3. [Local deployment](https://weaviate.io/developers/weaviate/installation/docker-compose#starter-docker-compose-file) + 3. [Local deployment](docs/deploy/installation-guides/docker-installation.md#starter-docker-compose-file) 4. [Other options](https://weaviate.io/developers/weaviate/installation) 2. NVIDIA NIM API key. Grab one [here](https://build.nvidia.com/models). diff --git a/docs/weaviate/recipes/hybrid_search_mistral.md b/docs/weaviate/recipes/hybrid_search_mistral.md index 7b6b92da..d4eb1f91 100644 --- a/docs/weaviate/recipes/hybrid_search_mistral.md +++ b/docs/weaviate/recipes/hybrid_search_mistral.md @@ -19,7 +19,7 @@ This recipe will show you how to run hybrid search with embeddings from Mistral. 1. Weaviate cluster 1. You can create a 14-day free sandbox on [WCD](https://console.weaviate.cloud/) 2. [Embedded Weaviate](https://weaviate.io/developers/weaviate/installation/embedded) - 3. [Local deployment](https://weaviate.io/developers/weaviate/installation/docker-compose#starter-docker-compose-file) + 3. [Local deployment](docs/deploy/installation-guides/docker-installation.md#starter-docker-compose-file) 4. [Other options](https://weaviate.io/developers/weaviate/installation) 2. Mistral API key. Grab one [here](https://docs.mistral.ai/api/). diff --git a/docs/weaviate/starter-guides/generative.md b/docs/weaviate/starter-guides/generative.md index c4db0ce4..e8876d28 100644 --- a/docs/weaviate/starter-guides/generative.md +++ b/docs/weaviate/starter-guides/generative.md @@ -388,7 +388,7 @@ services: ENABLE_MODULES: 'text2vec-cohere,text2vec-huggingface,text2vec-openai,text2vec-google,generative-cohere,generative-openai,generative-googles' ``` -Check the specific documentation for your deployment method ([Docker](../installation/docker-compose.md), [Kubernetes](../installation/kubernetes.md), [Embedded Weaviate](../installation/embedded.md)) for more information on how to configure it. +Check the specific documentation for your deployment method ([Docker](docs/deploy/installation-guides/docker-installation.md), [Kubernetes](docs/deploy/installation-guides/k8s-installation.md), [Embedded Weaviate](../installation/embedded.md)) for more information on how to configure it.
    diff --git a/docs/weaviate/starter-guides/which-weaviate.md b/docs/weaviate/starter-guides/which-weaviate.md index f49cf780..1ebf33ac 100644 --- a/docs/weaviate/starter-guides/which-weaviate.md +++ b/docs/weaviate/starter-guides/which-weaviate.md @@ -16,9 +16,9 @@ This page helps you to find the right combination for your project. Weaviate can be deployed in the following ways: - [Embedded Weaviate](../installation/embedded.md) -- [Docker-Compose](../installation/docker-compose.md) +- [Docker-Compose](docs/deploy/installation-guides/docker-installation.md) - [Weaviate Cloud (WCD)](../installation/weaviate-cloud-services.md) -- [Self-managed Kubernetes](../installation/kubernetes.md) +- [Self-managed Kubernetes](docs/deploy/installation-guides/k8s-installation.md) - [Hybrid SaaS](https://weaviate.io/pricing) ## Vectorization options @@ -52,7 +52,7 @@ The [Quickstart guide](/docs/weaviate/quickstart) uses a WCD sandbox and an API For development, we recommend using -- [Weaviate Cloud (WCD)](https://console.weaviate.cloud/) or [Docker Compose](/docs/weaviate/installation/docker-compose). +- [Weaviate Cloud (WCD)](https://console.weaviate.cloud/) or [Docker Compose](docs/deploy/installation-guides/docker-installation.md). - A vectorization strategy that matches your production vectorization strategy. #### Docker-Compose vs. Weaviate Cloud (WCD) @@ -82,7 +82,7 @@ Keep in mind two other factors, which are cost, and their footprint. For production deployments, consider one of these hosting models: - [Weaviate Cloud (WCD)](/docs/cloud) -- [Self-managed Kubernetes](/docs/weaviate/installation/kubernetes) +- [Self-managed Kubernetes](/docs/deploy/installation-guides/k8s-installation.md) - [Hybrid SaaS](/docs/cloud) All of these options are scalable. Kubernetes and Hybrid SaaS offer the most configuration flexibility. diff --git a/secondaryNavbar.js b/secondaryNavbar.js index 880d3494..117c2844 100644 --- a/secondaryNavbar.js +++ b/secondaryNavbar.js @@ -67,7 +67,7 @@ const secondaryNavbarItems = { { label: "Configuration Guides", link: "/docs/deploy/config-guides", sidebar: "deployConfigSidebar"}, /*{ label: "Kubernetes", link: "/docs/deploy/k8s", sidebar: "deployK8sSidebar" },*/ { label: "Production Guides", link: "/docs/deploy/production", sidebar: "deployProductionSidebar"}, - { label: "Tutorials", link: "/docs/deploy/tutorials", sidebar: "deployTutorialSidebar"}, + { label: "Tutorials", link: "/docs/deploy/tutorials/rbac", sidebar: "deployTutorialSidebar"}, /*{ label: "AWS", link: "/docs/deploy/aws", sidebar: "deployAwsSidebar" },*/ /*{ label: "Scaling Strategies", link: "/docs/deploy/scaling-strategies", sidebar: "deployScalingSidebar"},*/ /*{ label: "Monitoring and Observability", link: "/docs/deploy/monitoring-obs", sidebar: "deployObservabilitySidebar"},*/ diff --git a/sidebars.js b/sidebars.js index b7d97a97..224fb64f 100644 --- a/sidebars.js +++ b/sidebars.js @@ -26,8 +26,6 @@ const sidebars = { }, items: [ "weaviate/installation/weaviate-cloud-services", - "weaviate/installation/docker-compose", - "weaviate/installation/kubernetes", "weaviate/installation/embedded", "weaviate/installation/spcs-integration", ], @@ -441,9 +439,6 @@ const sidebars = { "weaviate/configuration/rbac/manage-users", ], }, - "weaviate/configuration/persistence", - "weaviate/configuration/monitoring", - "weaviate/configuration/replication", ], }, { @@ -560,26 +555,6 @@ const sidebars = { id: "weaviate/config-refs/distances", className: "sidebar-item", }, - { - type: "doc", - id: "weaviate/config-refs/status", - className: "sidebar-item", - }, - { - type: "doc", - id: "weaviate/config-refs/telemetry", - className: "sidebar-item", - }, - { - type: "doc", - id: "weaviate/config-refs/meta", - className: "sidebar-item", - }, - { - type: "doc", - id: "weaviate/config-refs/oidc", - className: "sidebar-item", - }, ], }, { @@ -774,12 +749,110 @@ const sidebars = { ], }, ], - deployConfigSidebar: [ - { - type: "autogenerated", - dirName: "deploy/config-guides", +deployConfigSidebar: [ + { + type: "category", + label: "Configuration Guides", + className: "sidebar-main-category", + collapsible: false, + link: { + type: "doc", + id: "deploy/config-guides/index", }, - ], + items: [ + { + type: "doc", + id: "deploy/config-guides/backups", + className: "sidebar-item", + }, + { + type: "doc", + id: "deploy/config-guides/horizontal-scaling", + className: "sidebar-item", + }, + { + type: "doc", + id: "deploy/config-guides/meta", + className: "sidebar-item", + }, + { + type: "doc", + id: "deploy/config-guides/monitoring", + className: "sidebar-item", + }, + { + type: "doc", + id: "deploy/config-guides/nodes", + className: "sidebar-item", + }, + { + type: "doc", + id: "deploy/config-guides/persistence", + className: "sidebar-item", + }, + { + type: "doc", + id: "deploy/config-guides/replication", + className: "sidebar-item", + }, + { + type: "doc", + id: "deploy/config-guides/status", + className: "sidebar-item", + }, + { + type: "doc", + id: "deploy/config-guides/telemetry", + className: "sidebar-item", + }, + { + type: "html", + value: "", + }, + { + type: "category", + label: "Authorization and Authentication", + className: "sidebar-item", + link: { + type: "doc", + id: "deploy/config-guides/authentication", + }, + items: [ + "deploy/config-guides/authentication", + "deploy/config-guides/authorization", + "deploy/config-guides/oidc", + "deploy/config-guides/configuring-rbac", + ], + }, + { + type: "html", + value: "", + }, + { + type: "category", + label: "Replication", + className: "sidebar-item", + items: [ + "deploy/config-guides/replication", + "deploy/config-guides/async-rep", + ], + }, + { + type: "html", + value: "", + }, + { + type: "category", + label: "Environment Variables", + className: "sidebar-item", + items: [ + "deploy/config-guides/env-vars/index", + "deploy/config-guides/env-vars/runtime-config", + ], + }, + ], + }, +], /*deployAwsSidebar: [ { type: "autogenerated", @@ -799,12 +872,19 @@ const sidebars = { }, ], - deployTutorialSidebar: [ - { - type: "autogenerated", - dirName: "deploy/tutorials", +deployTutorialSidebar: [ + { + type: "category", + label: "Tutorials", + className: "sidebar-main-category", + collapsible: false, + link: { + type: "doc", + id: "deploy/tutorials/rbac", }, - ], + items: [], + }, +], deployFaqsSidebar: [ { type: "autogenerated",