1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7841],{13615:(e,s,i)=>{"use strict";i.d(s,{P:()=>r});var n=i(23798);function r(e){let{children:s}=e;return(0,n.jsx)("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 pt-12",children:s})}},20554:(e,s,i)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/clustering/high-availability/setup-ha-cluster-k8s",function(){return i(29643)}])},29643:(e,s,i)=>{"use strict";i.r(s),i.d(s,{default:()=>x,useTOC:()=>o});var n=i(23798),r=i(28293),h=i(67106),t=i(19935),a=i(66863),l=i(63288),d=i(63279),c=i(86665);function o(e){let s={code:"code",...(0,t.R)()};return[{value:"Install Memgraph HA on Kubernetes",id:"install-memgraph-ha-on-kubernetes",depth:2},{value:"Add the Helm repository",id:"add-the-helm-repository",depth:3},{value:"Install Memgraph HA",id:"install-memgraph-ha",depth:3},{value:(0,n.jsxs)(n.Fragment,{children:["Install Memgraph HA with ",(0,n.jsx)(s.code,{children:"kind"})]}),id:"install-memgraph-ha-with-kind",depth:3},{value:(0,n.jsxs)(n.Fragment,{children:["Install Memgraph HA with ",(0,n.jsx)(s.code,{children:"minikube"})]}),id:"install-memgraph-ha-with-minikube",depth:3},{value:"Configure the Helm chart",id:"configure-the-helm-chart",depth:2},{value:"Override default chart values",id:"override-default-chart-values",depth:3},{value:"Upgrade Helm chart",id:"upgrade-helm-chart",depth:3},{value:"Uninstall Helm chart",id:"uninstall-helm-chart",depth:3},{value:"Runtime environment & security",id:"runtime-environment--security",depth:2},{value:"Security context",id:"security-context",depth:3},{value:"High availability storage",id:"high-availability-storage",depth:3},{value:"Extra volumes",id:"extra-volumes",depth:3},{value:"Network configuration",id:"network-configuration",depth:3},{value:"Node affinity",id:"node-affinity",depth:3},{value:"Sysctl options",id:"sysctl-options",depth:3},{value:"Manual ownership fix",id:"manual-ownership-fix",depth:3},{value:"Authentication",id:"authentication",depth:3},{value:"Bolt SSL/TLS",id:"bolt-ssltls",depth:3},{value:"Intra-cluster SSL/TLS",id:"intra-cluster-ssltls",depth:3},{value:"Setting up the cluster",id:"setting-up-the-cluster",depth:2},{value:"Customize the cluster-setup Job",id:"customize-the-cluster-setup-job",depth:3},{value:"Scale the cluster up and down",id:"scale-the-cluster-up-and-down",depth:3},{value:"Update bolt server",id:"update-bolt-server",depth:3},{value:"Use Memgraph HA chart with Gateway API",id:"use-memgraph-ha-chart-with-gateway-api",depth:3},{value:"Prerequisites",id:"prerequisites",depth:4},{value:"Option 1: Chart-managed Gateway",id:"option-1-chart-managed-gateway",depth:4},{value:"Option 2: Existing (external) Gateway",id:"option-2-existing-external-gateway",depth:4},{value:"Deploy with Envoy Gateway",id:"deploy-with-envoy-gateway",depth:4},{value:"Deploy with Traefik",id:"deploy-with-traefik",depth:4},{value:"Use Istio as the Gateway API controller",id:"use-istio-as-the-gateway-api-controller",depth:4},{value:"Use Memgraph HA chart with IngressNginx",id:"use-memgraph-ha-chart-with-ingressnginx",depth:3},{value:"Probes",id:"probes",depth:2},{value:"Debugging",id:"debugging",depth:2},{value:"Graceful termination",id:"graceful-termination",depth:2},{value:(0,n.jsxs)(n.Fragment,{children:["Using ",(0,n.jsx)(s.code,{children:"--storage-snapshot-on-exit"})," with HA"]}),id:"using---storage-snapshot-on-exit-with-ha",depth:3},{value:"Monitoring",id:"monitoring",depth:2},{value:"Enable monitoring in the Memgraph HA chart",id:"enable-monitoring-in-the-memgraph-ha-chart",depth:3},{value:"mg-exporter TLS",id:"mg-exporter-tls",depth:4},{value:"Scrape Memgraph directly (without mg-exporter)",id:"scrape-memgraph-directly-without-mg-exporter",depth:3},{value:"Grafana dashboard for direct scraping",id:"grafana-dashboard-for-direct-scraping",depth:4},{value:"Uninstall kube-prometheus-stack",id:"uninstall-kube-prometheus-stack",depth:3},{value:"Remote metrics and logs",id:"remote-metrics-and-logs",depth:3},{value:"Kubernetes infrastructure metrics",id:"kubernetes-infrastructure-metrics",depth:4},{value:"Grafana dashboards",id:"grafana-dashboards",depth:4},{value:"Configuration options",id:"configuration-options",depth:2},{value:"In-Service Software Upgrade (ISSU)",id:"in-service-software-upgrade-issu",depth:2}]}let x=(0,r.e)(function(e){let{toc:s=o(e)}=e,i={a:"a",br:"br",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",span:"span",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(i.h1,{children:["Set up HA cluster with K8s ",(0,n.jsx)("sup",{style:{fontSize:"0.6em",color:"#888"},children:"Enterprise"})]}),"\n",(0,n.jsx)(a.P,{children:(0,n.jsxs)(i.p,{children:["Users are advised to first read the guide on ",(0,n.jsx)(i.a,{href:"/clustering/replication/how-replication-works",children:"how replication\nworks"}),", followed by the guide on\n",(0,n.jsx)(i.a,{href:"/clustering/high-availability/how-high-availability-works",children:"how high availability\nworks"}),", and how to ",(0,n.jsx)(i.a,{href:"/clustering/high-availability/querying-the-cluster-in-high-availability",children:"query\nthe cluster"}),"."]})}),"\n",(0,n.jsx)(i.h2,{id:s[0].id,children:s[0].value}),"\n",(0,n.jsxs)(i.p,{children:["To deploy a Memgraph High Availability (HA) cluster on Kubernetes, you must\nfirst ",(0,n.jsx)(i.a,{href:"#add-the-helm-repository",children:"add the Memgraph Helm repository"})," and then\n",(0,n.jsx)(i.a,{href:"#install-memgraph-ha",children:"install the HA Helm chart"}),"."]}),"\n",(0,n.jsx)(i.h3,{id:s[1].id,children:s[1].value}),"\n",(0,n.jsx)(i.p,{children:"Add the Memgraph Helm chart repository to your local Helm setup by running the\nfollowing command:"}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"plaintext","data-word-wrap":"","data-copy":"",children:(0,n.jsx)(i.co
1de,{children:(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{children:"helm repo add memgraph https://memgraph.github.io/helm-charts"})})})}),"\n",(0,n.jsx)(i.p,{children:"Make sure to update the repository to fetch the latest Helm charts available:"}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"plaintext","data-word-wrap":"","data-copy":"",children:(0,n.jsx)(i.code,{children:(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{children:"helm repo update"})})})}),"\n",(0,n.jsx)(i.h3,{id:s[2].id,children:s[2].value}),"\n",(0,n.jsxs)(i.p,{children:["Since Memgraph HA requires an ",(0,n.jsx)(i.a,{href:"/database-management/enabling-memgraph-enterprise",children:"Enterprise\nlicense"}),", you must provide\nthe license and organization name to the chart through a Kubernetes ",(0,n.jsx)(i.code,{children:"Secret"}),"."]}),"\n",(0,n.jsx)(a.P,{type:"warning",children:(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"Breaking change"}),": Starting with Memgraph HA chart version 1.0.0, the HA chart no longer accepts\nthe license and organization name as plaintext values via ",(0,n.jsx)(i.code,{children:"env.MEMGRAPH_ENTERPRISE_LICENSE"}),"\nand ",(0,n.jsx)(i.code,{children:"env.MEMGRAPH_ORGANIZATION_NAME"}),". Both values are now read from a Kubernetes\n",(0,n.jsx)(i.code,{children:"Secret"})," referenced via ",(0,n.jsx)(i.code,{children:"secretKeyRef"}),", and the secret ",(0,n.jsxs)(i.strong,{children:["must exist before you run\n",(0,n.jsx)(i.code,{children:"helm install"})]})," â the StatefulSets will fail to start otherwise. The previous\n",(0,n.jsx)(i.code,{children:"env.*"})," values have been removed from ",(0,n.jsx)(i.code,{children:"values.yaml"}),"."]})}),"\n",(0,n.jsx)(i.p,{children:"Create the secret first, then install the chart:"}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"plaintext","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{children:"kubectl create secret generic memgraph-secrets \\"})}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{children:" --from-literal=MEMGRAPH_ENTERPRISE_LICENSE=<your-license> \\"})}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{children:" --from-literal=MEMGRAPH_ORGANIZATION_NAME=<your-organization-name>"})}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{})}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{children:"helm install <release-name> memgraph/memgraph-high-availability"})})]})}),"\n",(0,n.jsxs)(i.p,{children:["Replace ",(0,n.jsx)(i.code,{children:"<release-name>"})," with a name of your choice for the release. The\nsecret name and keys are configurable via ",(0,n.jsx)(i.code,{children:"secrets.name"}),", ",(0,n.jsx)(i.code,{children:"secrets.licenseKey"}),"\nand ",(0,n.jsx)(i.code,{children:"secrets.organizationKey"})," (defaults: ",(0,n.jsx)(i.code,{children:"memgraph-secrets"}),",\n",(0,n.jsx)(i.code,{children:"MEMGRAPH_ENTERPRISE_LICENSE"}),", ",(0,n.jsx)(i.code,{children:"MEMGRAPH_ORGANIZATION_NAME"}),")."]}),"\n",(0,n.jsx)(i.p,{children:"The cluster will be fully connected once installation completes. Note that the\ninstall command may take a moment while instances establish connections. If\nclients connect from outside the cluster, update the Bolt server address on\neach instance to use its external IP as explained in the section on setting up\nthe cluster."}),"\n",(0,n.jsxs)(a.P,{type:"info",children:[" ",(0,n.jsx)(i.strong,{children:"Tip:"})," Always install a specific chart version. Using\nthe ",(0,n.jsx)(i.code,{children:"latest"})," tag can lead to unexpected behavior if pods restart and pull newer,\nincompatible images. "]}),"\n",(0,n.jsx)(i.h3,{id:s[3].id,children:s[3].value}),"\n",(0,n.jsxs)(i.p,{children:["For local development, we suggest using ",(0,n.jsx)(i.code,{children:"kind"}),". Running:"]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"plaintext","data-word-wrap":"","data-copy":"",children:(0,n.jsx)(i.code,{children:(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{children:"kind create cluster"})})})}),"\n",(0,n.jsx)(i.p,{children:"gives you a fully initialized environment that is sufficient for running the HA chart."}),"\n",(0,n.jsx)(i.h3,{id:s[4].id,children:s[4].value}),"\n",(0,n.jsxs)(i.p,{children:["If you are installing Memgraph HA chart locally with ",(0,n.jsx)(i.co
1de,{children:"minikube"}),", we are strongly\nrecommending to enable ",(0,n.jsx)(i.code,{children:"csi-hostpath-driver"})," and use its storage class.\nOtherwise,\nyou could have problems with attaching PVCs to pods."]}),"\n",(0,n.jsxs)(l.g,{children:[(0,n.jsx)("h4",{className:"custom-header",children:" Enable csi-hostpath-driver "}),(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"plaintext","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{children:"minikube addons disable storage-provisioner"})}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{children:"minikube addons disable default-storageclass"})}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{children:"minikube addons enable volumesnapshots"})}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{children:"minikube addons enable csi-hostpath-driver"})})]})}),(0,n.jsx)("h4",{className:"custom-header",children:"Create a StorageClass (save as sc.yaml) "}),(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"plaintext","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{children:"apiVersion: storage.k8s.io/v1"})}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{children:"kind: StorageClass"})}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{children:"metadata:"})}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{children:" name: csi-hostpath-delayed"})}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{children:"provisioner: hostpath.
1csi.k8s.io"})}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{children:"volumeBindingMode: WaitForFirstConsumer"})}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{children:"reclaimPolicy: Delete"})})]})}),(0,n.jsx)("h4",{className:"custom-header",children:" Apply the StorageClass "}),(0,n.jsx)(i.p,{children:(0,n.jsx)(i.code,{children:"kubectl apply -f sc.yaml"})}),(0,n.jsx)("h4",{className:"custom-header",children:" Configure the Helm chart "}),(0,n.jsxs)(i.p,{children:["In your ",(0,n.jsx)(i.code,{children:"values.yaml"}),", set:"]}),(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"storage"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" libStorageClassName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"csi-hostpath-delayed"})]})]})})]}),"\n",(0,n.jsx)(i.h2,{id:s[5].id,children:s[5].value}),"\n",(0,n.jsx)(i.h3,{id:s[6].id,children:s[6].value}),"\n",(0,n.jsxs)(i.p,{children:["You can customize the Memgraph HA Helm chart either inline with ",(0,n.jsx)(i.code,{children:"--set"})," flags or\nby using a ",(0,n.jsx)(i.code,{children:"values.yaml"})," file."]}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.strong,{children:"Option 1: Override values inline"})}),"\n",(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"helm"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" install"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" <"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"release-nam"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"e"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:">"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" memgraph/memgraph-high-availability"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --set"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" <"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"flag"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"1>"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"="}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"<"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"value"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"1>"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:","}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"<"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"flag"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"2>"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"="}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"<"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"value"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"2>"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:",..."})]})]})}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.strong,{children:"Option 2: Use a values file"})}),"\n",(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"helm"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" install"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" <"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"release-nam"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"e"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:">"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" memgraph/memgraph-high-availability"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" -f"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" values.yaml"})]})]})}),"\n",(0,n.jsxs)(i.p,{children:["You can also combine both approaches. Values specified with ",(0,n.jsx)(i.co
1de,{children:"--set"})," override\nthose in ",(0,n.jsx)(i.code,{children:"values.yaml"}),"."]}),"\n",(0,n.jsx)(i.h3,{id:s[7].id,children:s[7].value}),"\n",(0,n.jsx)(i.p,{children:"To upgrade the helm chart you can use:"}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"plaintext","data-word-wrap":"","data-copy":"",children:(0,n.jsx)(i.code,{children:(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{children:"helm upgrade <release-name> memgraph/memgraph-high-availability --set <flag1>=<value1>,<flag2>=<value2>"})})})}),"\n",(0,n.jsxs)(i.p,{children:["Again it is possible use both ",(0,n.jsx)(i.code,{children:"--set"})," and values.yaml to set configuration\noptions."]}),"\n",(0,n.jsxs)(i.p,{children:["If youâre using ",(0,n.jsx)(i.code,{children:"IngressNginx"})," and performing an upgrade, the attached public IP\nshould remain the same. It will only change if the release includes specific\nupdates that modify itâand such changes will be documented."]}),"\n",(0,n.jsx)(i.h3,{id:s[8].id,children:s[8].value}),"\n",(0,n.jsx)(i.p,{children:"Uninstallation is done with:"}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"plaintext","data-word-wrap":"","data-copy":"",children:(0,n.jsx)(i.code,{children:(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{children:"helm uninstall <release-name>"})})})}),"\n",(0,n.jsxs)(i.p,{children:["Uninstalling the chart does ",(0,n.jsx)(i.strong,{children:"not"})," delete PersistentVolumeClaims (PVCs). Even\nif the default StorageClass reclaim policy is ",(0,n.jsx)(i.code,{children:"Delete"}),", data on the underlying\nPersistentVolumes (PVs) will not be removed automatically when uninstalling the\nchart."]}),"\n",(0,n.jsxs)(i.p,{children:["However, we still recommend configuring the reclaim policy to ",(0,n.jsx)(i.code,{children:"Retain"}),", as\ndescribed in the ",(0,n.jsx)(i.a,{href:"#high-availability-storage",children:"High availability storage"}),"\nsection."]}),"\n",(0,n.jsx)(i.h2,{id:s[9].id,children:s[9].value}),"\n",(0,n.jsx)(i.h3,{id:s[10].id,children:s[10].value}),"\n",(0,n.jsxs)(i.p,{children:["All Memgraph HA instances run as Kubernetes ",(0,n.jsx)(i.code,{children:"StatefulSet"})," workloads, each with a\nsingle pod. Depending on configuration, the pod contains two or three\ncontainers:"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"memgraph-coordinator"})," - runs the Memgraph binary."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Optional sysctl init container"})," - enabled when ",(0,n.jsx)(i.code,{children:"sysctlInitContainer.enabled"})," is set."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Optional fix-ownership init container"})," - enabled when ",(0,n.jsx)(i.code,{children:"fixOwnershipInitContainer.enabled"})," is set. See ",(0,n.jsx)(i.a,{href:"#manual-ownership-fix",children:"Manual ownership fix"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["Memgraph processes run as the non-root ",(0,n.jsx)(i.strong,{children:"memgraph"})," user with ",(0,n.jsx)(i.strong,{children:"no Linux capabilities\nand no privilege escalation"}),". The security context is especially important when deploying the HA chart to Red Hat OpenShift. In a\nsandboxed environment, you will have to disable the ",(0,n.jsx)(i.code,{children:"init-sysctl"})," init container. You will most likely also need to change ",(0,n.jsx)(i.code,{children:"memgraphUserId"}),"\nand ",(0,n.jsx)(i.code,{children:"memgraphGroupId"})," so that they fall within OpenShiftâs allowed UID/GID range."]}),"\n",(0,n.jsx)(i.h3,{id:s[11].id,children:s[11].value}),"\n",(0,n.jsx)(i.p,{children:"Memgraph HA always uses PersistentVolumeClaims (PVCs) to store database files\nand logs."}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["Default storage size: ",(0,n.jsx)(i.strong,{children:"1Gi"})," (you will likely need to increase this)."]}),"\n",(0,n.jsxs)(i.li,{children:["Default access mode: ",(0,n.jsx)(i.code,{children:"ReadWriteOnce"})," (can be set to ",(0,n.jsx)(i.code,{children:"ReadOnlyMany"}),",\n",(0,n.jsx)(i.code,{children:"ReadWriteMany"}
1),", or ",(0,n.jsx)(i.code,{children:"ReadWriteOncePod"}),")."]}),"\n",(0,n.jsxs)(i.li,{children:["PVCs use the clusterâs ",(0,n.jsx)(i.strong,{children:"default StorageClass"}),", unless overridden."]}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:"You can explicitly set storage classes using:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"storage.libStorageClassName"})," - for data volumes"]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"storage.logStorageClassName"})," - for log volumes"]}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["Most default StorageClasses use a ",(0,n.jsx)(i.code,{children:"Delete"})," reclaim policy, meaning deleting the\nPVC deletes the underlying PersistentVolume (PV). We recommend switching to\n",(0,n.jsx)(i.code,{children:"Retain"}),"."]}),"\n",(0,n.jsx)(i.hr,{}),"\n",(0,n.jsx)(i.p,{children:"After your cluster is running, you can patch all PVs:"}),"\n",(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:"#!/bin/bash"})}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"PVS"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"="}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"$("}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" get"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" pv"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --no-headers"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" -o"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:' custom-columns=":metadata.name"'}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:")"})]}),"\n",(0,n.jsx)(i.span,{children:" "}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"for"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" pv "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"in"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" $PVS; "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"do"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" echo"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:' "Patching PV: '}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"$pv"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:" kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" patch"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" pv"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" $pv "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"-p"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:' \'{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}\''})]}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"done"})}),"\n",(0,n.jsx)(i.span,{children:" "}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"echo"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:' "All PVs have been patched."'})]})]})}),"\n",(0,n.jsxs)(a.P,{type:"info",children:[(0,n.jsxs)(i.p,{children:["Kubernetes uses ",(0,n.jsx)(i.strong,{children:"Storage Object in Use Protection"}
1),", preventing deletion of\nPVCs while still attached to pods.",(0,n.jsx)(i.br,{}),"\n","Similarly, PVs will remain until their PVCs are fully removed."]}),(0,n.jsx)(i.p,{children:"If a PVC is stuck terminating, you can remove its finalizers:"}),(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsx)(i.code,{children:(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" patch"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" pvc"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" PVC_NAME"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" -p"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:' \'{"metadata":{"finalizers": []}}\''}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --type=merge"})]})})})]}),"\n",(0,n.jsx)(i.h3,{id:s[12].id,children:s[12].value}),"\n",(0,n.jsx)(i.p,{children:"Besides the PVCs the chart creates for database files and logs, you can attach\nyour own volumes to Memgraph pods at two levels:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Per role"})," â ",(0,n.jsx)(i.code,{children:"storage.data.extraVolumes"})," / ",(0,n.jsx)(i.code,{children:"storage.data.extraVolumeMounts"}),"\napply to every data instance, and ",(0,n.jsx)(i.code,{children:"storage.coordinators.extraVolumes"})," /\n",(0,n.jsx)(i.code,{children:"storage.coordinators.extraVolumeMounts"})," apply to every coordinator."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Per instance"})," â ",(0,n.jsx)(i.code,{children:"extraVolumes"})," / ",(0,n.jsx)(i.code,{children:"extraVolumeMounts"})," on an individual entry\nin ",(0,n.jsx)(i.code,{children:"data[]"})," or ",(0,n.jsx)(i.code,{children:"coordinators[]"})," apply only to that one instance."]}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["The two levels are additive: a pod gets the volumes defined for its role plus\nthe ones defined on its own instance entry. Volume names must be unique across\nboth levels, otherwise Kubernetes rejects the pod spec because of duplicate\nvolume names. Both levels are rendered through ",(0,n.jsx)(i.code,{children:"tpl"}),", so Helm templating such as\n",(0,n.jsx)(i.code,{children:"{{ .Release.Name }}"})," works inside the volume definitions."]}),"\n",(0,n.jsx)(i.p,{children:"A typical use case for per-instance volumes is mounting a dataset that only one\ninstance needs, for example a PVC holding CSV files to import. First create the\nclaim:"}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"apiVersion"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"v1"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"kind"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"PersistentVolumeClaim"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"metadata"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" name"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"pvc-csv-import"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" namespace"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"memgraph"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" annotations"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" helm.sh/resource-policy"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"keep"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"spec"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" accessModes"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"ReadWriteOnce"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" resources"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" requests"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" storage"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"1Gi"})]})]})}
1),"\n",(0,n.jsx)(i.p,{children:"Then mount it on a single data instance:"}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"data"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"id"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"0"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" extraVolumes"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"name"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"csv-import"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" persistentVolumeClaim"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" claimName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"pvc-csv-import"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" extraVolumeMounts"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"name"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"csv-import"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" mountPath"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"/import"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" readOnly"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"id"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"1"'})]})]})}),"\n",(0,n.jsx)(a.P,{type:"info",children:(0,n.jsxs)(i.p,{children:["With the ",(0,n.jsx)(i.code,{children:"ReadWriteOnce"})," access mode, only one pod can mount the claim at a\ntime, so attach it to a single instance. If several instances need the same\ndata, use a claim with the ",(0,n.jsx)(i.co
1de,{children:"ReadWriteMany"})," access mode, or define the volume at\nthe role level instead."]})}),"\n",(0,n.jsx)(i.h3,{id:s[13].id,children:s[13].value}),"\n",(0,n.jsx)(i.p,{children:"All Memgraph HA components communicate internally using ClusterIP network for\ncommunicating between themselves."}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.strong,{children:"Default ports:"})}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["Management: ",(0,n.jsx)(i.strong,{children:"10000"})]}),"\n",(0,n.jsxs)(i.li,{children:["Replication (data instances): ",(0,n.jsx)(i.strong,{children:"20000"})]}),"\n",(0,n.jsxs)(i.li,{children:["Coordinator communication: ",(0,n.jsx)(i.strong,{children:"12000"})]}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:"You can change this configuration by specifying:"}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"ports"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" managementPort"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"<value>"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" replicationPort"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"<value>"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" coordinatorPort"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"<value>"})]})]})}),"\n",(0,n.jsx)("h4",{className:"custom-header",children:" External network configuration "}),"\n",(0,n.jsxs)(i.p,{children:["Memgraph HA uses ",(0,n.jsx)(i.strong,{children:"client-side routing"}),", so DNS resolution happens on the driver. Because of that, we need\none more type of network which will be used for clients accessing instances\nfrom outside the cluster. Our HA supports out of the box following K8s resources used to setup external access:"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"IngressNginx"})," - one LoadBalancer for all instances. TCP port bases are configured under ",(0,n.jsx)(i.code,{children:"externalAccessConfig.ingress"}),"."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"NodePort"})," - exposes ports on each node (requires public node IPs)."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"LoadBalancer"})," - one LoadBalancer per instance (highest cost)."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"CommonLoadBalancer (coordinators only)"})," - single LB for all coordinators."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Gateway API"})," - uses Kubernetes Gateway API resources (Gateway + TCPRoute), with one listener per data instance and a single shared listener load balancing across all coordinators. Configured under ",(0,n.jsx)(i.code,{children:"externalAccessConfig.gateway"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["For coordinators, there is an additional option of using ",(0,n.jsx)(i.code,{children:"CommonLoadBalancer"}),".\nIn this scenario, there is one load balancer sitting in front of coordinators.\nYou can save the cost of two load balancers compared to ",(0,n.jsx)(i.code,{children:"LoadBalancer"})," option\nsince usually you donât need to distinguish specific coordinators while using\nMemgraph capabilities. Note that if you will be connecting to the coordinator directly for some reason (e.g to run ",(0,n.jsx)(i.co
1de,{children:"show instances"})," query),\nyou can run ",(0,n.jsx)(i.code,{children:"show instance"})," query to see which coordinator you got routed to.\nThe default Bolt port is opened on 7687 but you can change it by setting ",(0,n.jsx)(i.code,{children:"ports.boltPort"}),"."]}),"\n",(0,n.jsxs)(i.p,{children:["For more detailed IngressNginx setup, see ",(0,n.jsx)(i.a,{href:"#use-memgraph-ha-chart-with-ingressnginx",children:"Use Memgraph HA chart with\nIngressNginx"}),"."]}),"\n",(0,n.jsxs)(i.p,{children:["Note however that Ingress Nginx is getting retired and one of the alternatives is using the ",(0,n.jsx)(i.a,{href:"https://gateway-api.sigs.k8s.io/",children:"Kubernetes Gateway API"})," with\ncontrollers like Envoy Gateway, Istio, Cilium, Traefik, or Kong. The HA chart has native Gateway API support â see ",(0,n.jsx)(i.a,{href:"#use-memgraph-ha-chart-with-gateway-api",children:"Use Memgraph HA chart with Gateway API"}),"."]}),"\n",(0,n.jsxs)(i.p,{children:["By default, the chart does ",(0,n.jsx)(i.strong,{children:"not"})," expose any external network services."]}),"\n",(0,n.jsx)("h4",{className:"custom-header",id:"recommended-external-access-setup",children:" Recommended external access setup "}),"\n",(0,n.jsxs)(i.p,{children:["External access methods can be ",(0,n.jsx)(i.strong,{children:"mixed per tier"}),": coordinators and data\ninstances each pick their own method independently. Our recommendation is to\nexpose ",(0,n.jsxs)(i.strong,{children:["coordinators through a ",(0,n.jsx)(i.code,{children:"CommonLoadBalancer"})]})," and ",(0,n.jsx)(i.strong,{children:"data instances\nthrough IngressNginx or the Gateway API"}),". This splits external access across\ntwo independent load balancers, so routing stays available even if a single\nload balancer goes down: if the load balancer in front of the data instances\nfails, clients can still reach the coordinators and get routing information,\nand if the coordinatorsâ load balancer fails, connections to the data\ninstances keep working. If everything sits behind one shared load balancer,\nthat load balancer is a single point of failure for all external access."]}),"\n",(0,n.jsxs)(i.p,{children:["To set up the recommended combination with the Gateway API, leave\n",(0,n.jsx)(i.code,{children:"externalAccessConfig.dataInstance.serviceType"})," empty â the Gateway only\nexposes tiers whose ",(0,n.jsx)(i.code,{children:"serviceType"})," is empty, so it will expose the data\ninstances only:"]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"externalAccessConfig"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" coordinator"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" serviceType"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"CommonLoadBalancer"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" annotations"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" external-dns.alpha.kubernetes.io/hostname"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"memgraph.coordinators.example.com"'})]}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:" # dataInstance.serviceType stays empty, so the Gateway exposes only the data instances"})}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" gateway"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" gatewayClassName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"eg"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" annotations"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" external-dns.alpha.kubernetes.io/hostname"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"memgraph.data.example.com"'})]})]})}),"\n",(0,n.jsx)(i.p,{children:"Or with IngressNginx for the data instances:"}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"externalAccessConfig"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" dataInstance"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" serviceType"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"IngressNginx"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" annotations"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" external-dns.alpha.kubernetes.io/hostname"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"memgraph.data.example.com"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" coordinator"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" serviceType"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"CommonLoadBalancer"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" annotations"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" external-dns.alpha.kubernetes.io/hostname"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"memgraph.coordinators.example.com"'})]})]})}),"\n",(0,n.jsxs)(i.p,{children:["In both cases every coordinator is reachable at the shared\n",(0,n.jsx)(i.co
1de,{children:"memgraph.coordinators.example.com:<boltPort>"})," address, and each data instance\nat ",(0,n.jsx)(i.code,{children:"memgraph.data.example.com:<dataPortBase + id>"}),". With the ",(0,n.jsx)(i.code,{children:"external-dns"}),"\nhostnames set, the ",(0,n.jsx)(i.code,{children:"cluster-setup"})," Job registers the external ",(0,n.jsx)(i.code,{children:"bolt_server"}),"\naddresses automatically (see ",(0,n.jsx)(i.a,{href:"#update-bolt-server",children:"Update bolt server"}),")."]}),"\n",(0,n.jsx)(i.p,{children:"All other combinations are valid as well â for coordinators + data instances,\nfor example:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"CommonLoadBalancer"})," + ",(0,n.jsx)(i.code,{children:"LoadBalancer"})]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"LoadBalancer"})," + ",(0,n.jsx)(i.code,{children:"LoadBalancer"})]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"IngressNginx"})," + ",(0,n.jsx)(i.code,{children:"IngressNginx"})," (everything behind the single ingress-nginx load balancer)"]}),"\n",(0,n.jsxs)(i.li,{children:["Gateway API for everything (leave both ",(0,n.jsx)(i.code,{children:"serviceType"})," fields empty and enable the gateway) â data instances get a port each, all coordinators share the Bolt port"]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"NodePort"})," for either tier, combined with any of the above"]}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["The only invalid combination is enabling the Gateway API\n(",(0,n.jsx)(i.code,{children:"externalAccessConfig.gateway.enabled: true"}),") while ",(0,n.jsx)(i.strong,{children:"both"})," tiers have a\n",(0,n.jsx)(i.code,{children:"serviceType"})," set: a tier with a ",(0,n.jsx)(i.code,{children:"serviceType"})," is excluded from the Gateway,\nso the Gateway would apply to nothing and chart rendering fails."]}),"\n",(0,n.jsx)("h4",{className:"custom-header",children:" Per-instance external access annotations "}),"\n",(0,n.jsxs)(i.p,{children:["When using ",(0,n.jsx)(i.code,{children:"LoadBalancer"})," or ",(0,n.jsx)(i.code,{children:"NodePort"})," external access, you can set annotations\nglobally via ",(0,n.jsx)(i.code,{children:"externalAccessConfig.dataInstance.annotations"})," and\n",(0,n.jsx)(i.code,{children:"externalAccessConfig.coordinator.annotations"}),". These apply to every external\nService of that type."]}),"\n",(0,n.jsxs)(i.p,{children:["If you need different annotations per instance â for example, to assign unique\nDNS hostnames via ",(0,n.jsx)(i.code,{children:"external-dns"})," â use the ",(0,n.jsx)(i.code,{children:"externalAccessAnnotations"})," field on\nindividual entries in ",(0,n.jsx)(i.code,{children:"data[]"})," or ",(0,n.jsx)(i.code,{children:"coordinators[]"}),". Per-instance annotations are\nmerged with the global annotations, and ",(0,n.jsx)(i.strong,{children:"per-instance values take precedence"}),"\nwhen the same key appears in both."]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"externalAccessConfig"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" dataInstance"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" serviceType"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"LoadBalancer"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" annotations"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" service.beta.kubernetes.io/aws-load-balancer-scheme"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"internet-facing"'})]}),"\n",(0,n.jsx)(i.span,{children:" "}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"data"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"id"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"0"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" externalAccessAnnotations"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" external-dns.alpha.kubernetes.io/hostname"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"data-0.memgraph.example.com"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"id"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"1"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" externalAccessAnnotations"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" external-dns.alpha.kubernetes.io/hostname"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"data-1.memgraph.example.com"'})]})]})}),"\n",(0,n.jsxs)(i.p,{children:["In this example, each data instanceâs external Service gets the shared\n",(0,n.jsx)(i.co
1de,{children:"aws-load-balancer-scheme"})," annotation plus its own unique ",(0,n.jsx)(i.code,{children:"external-dns"}),"\nhostname. Bolt and management ports are not set per-instance â they come from\n",(0,n.jsx)(i.code,{children:"ports.boltPort"})," and ",(0,n.jsx)(i.code,{children:"ports.managementPort"}),"."]}),"\n",(0,n.jsxs)(i.p,{children:["With ",(0,n.jsx)(i.code,{children:"serviceType: LoadBalancer"})," and a per-instance ",(0,n.jsx)(i.code,{children:"external-dns"})," hostname\nset like above, the ",(0,n.jsx)(i.code,{children:"cluster-setup"})," Job automatically registers each\ninstanceâs routing ",(0,n.jsx)(i.code,{children:"bolt_server"})," as ",(0,n.jsx)(i.code,{children:"<hostname>:<boltPort>"})," (see ",(0,n.jsx)(i.a,{href:"#update-bolt-server",children:"Update bolt\nserver"}),"). Do ",(0,n.jsx)(i.strong,{children:"not"})," set the ",(0,n.jsx)(i.code,{children:"external-dns"})," hostname at\nthe tier level (",(0,n.jsx)(i.code,{children:"externalAccessConfig.dataInstance.annotations"})," /\n",(0,n.jsx)(i.code,{children:"externalAccessConfig.coordinator.annotations"}),") when using ",(0,n.jsx)(i.code,{children:"LoadBalancer"}),":\neach instance gets its own LoadBalancer Service, so a tier-level hostname\nwould put one DNS record in front of every load balancer and register the\nsame ",(0,n.jsx)(i.code,{children:"bolt_server"})," for all instances."]}),"\n",(0,n.jsx)("h4",{className:"custom-header",children:" Per-instance internal access annotations "}),"\n",(0,n.jsxs)(i.p,{children:["Each data instance and coordinator also has an internal ClusterIP Service used\nfor in-cluster communication. You can set per-instance annotations on these\ninternal Services using the ",(0,n.jsx)(i.code,{children:"internalAccessAnnotations"})," field on individual\nentries in ",(0,n.jsx)(i.code,{children:"data[]"})," or ",(0,n.jsx)(i.code,{children:"coordinators[]"}),". This is useful for integrations or other tooling that consumes annotations on the internal\nServices."]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"data"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"id"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"0"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" internalAccessAnnotations"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" mycompany.io/service-mesh"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"enabled"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"id"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"1"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" internalAccessAnnotations"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" mycompany.io/service-mesh"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"enabled"'})]}),"\n",(0,n.jsx)(i.span,{children:" "}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"coordinators"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"id"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"1"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" internalAccessAnnotations"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" mycompany.io/service-mesh"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"enabled"'})]})]})}),"\n",(0,n.jsx)(i.h3,{id:s[14].id,children:s[14].value}),"\n",(0,n.jsx)(i.p,{children:"Memgraph HA deploys multiple pods, and
1you can control pod placement with\naffinity settings."}),"\n",(0,n.jsx)(i.p,{children:"Supported strategies:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"default"})," Attempts to to schedule the data pods and coordinator pods on the\nnodes where there is no other pod with the same role. If there is no such node,\nthe pods will still be scheduled on the same node, and deployment will not\nfail."]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"unique"})," (",(0,n.jsx)(i.code,{children:"affinity.unique = true"}),")\nEach coordinator and data pod must be placed on separate nodes. If not enough\nnodes exist, deployment fails. Coordinators get scheduled first. After that,\ndata pods are looking for the nodes with coordinators."]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"parity"})," (",(0,n.jsx)(i.code,{children:"affinity.parity = true"}),")\nSchedules at most ",(0,n.jsx)(i.strong,{children:"one coordinator + one data pod per node"}),".\nCoordinators schedule first; data pods follow."]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"nodeSelection"})," (",(0,n.jsx)(i.code,{children:"affinity.nodeSelection = true"}),")\nPods are scheduled onto explicitly labeled nodes using\n",(0,n.jsx)(i.code,{children:"affinity.dataNodeLabelValue"})," and ",(0,n.jsx)(i.code,{children:"affinity.coordinatorNodeLabelValue"}),". If all\nthe nodes with labels are occupied by the pods with the same role, the\ndeployment will fail."]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(a.P,{type:"info",children:[(0,n.jsxs)(i.p,{children:["When using ",(0,n.jsx)(i.code,{children:"nodeSelection"}),", ensure that nodes are labeled correctly.",(0,n.jsx)(i.br,{}),"\n","Default role label key: ",(0,n.jsx)(i.code,{children:"role"}),(0,n.jsx)(i.br,{}),"\n","Default values: ",(0,n.jsx)(i.code,{children:"data-node"}),", ",(0,n.jsx)(i.code,{children:"coordinator-node"})]}),(0,n.jsx)(i.p,{children:"Example:"}),(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsx)(i.code,{children:(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" label"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" nodes"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" <"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"node-nam"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"e"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:">"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" role=data-node"})]})})}),(0,n.jsxs)(i.p,{children:["A full AKS example is available in the ",(0,n.jsx)(i.a,{href:"(https://github.com/memgraph/helm-charts/tree/main/charts/memgraph-high-availability/aks)",children:"chart\nrepository"}),"."]})]}),"\n",(0,n.jsxs)(i.p,{children:["All strategies above spread pods across a topology domain defined by\n",(0,n.jsx)(i.code,{children:"affinity.topologyKey"}),". The default, ",(0,n.jsx)(i.code,{children:"kubernetes.io/hostname"}),", treats every\nnode as its own domain. Set it to a different node label to spread pods across\na wider domain, for example across availability zones:"]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"affinity"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" topologyKey"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"topology.kubernetes.io/zone"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" unique"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]})]})}),"\n",(0,n.jsx)(i.p,{children:"The same topology key is applied to both coordinator and data pod rules, so the\nlabel must be present on every node that should take part in scheduling."}),"\n",(0,n.jsx)(i.h3,{id:s[15].id,children:s[15].value}
1),"\n",(0,n.jsxs)(i.p,{children:["Use the ",(0,n.jsx)(i.code,{children:"sysctlInitContainer"})," to configure kernel parameters required for\nhigh-memory workloads, such as increasing:"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"/database-management/system-configuration#increasing-memory-map-areas",children:(0,n.jsx)(i.code,{children:"vm.max_map_count"})})}),"\n"]}),"\n",(0,n.jsx)(i.h3,{id:s[16].id,children:s[16].value}),"\n",(0,n.jsxs)(i.p,{children:["Some storage drivers (notably ",(0,n.jsx)(i.code,{children:"rancher.io/local-path"}),") do not honor pod-level\n",(0,n.jsx)(i.code,{children:"fsGroup"}),", leaving the volume root owned by ",(0,n.jsx)(i.code,{children:"root:root"}),". Because Memgraph runs\nas a non-root user, its storage directory ownership assertion (process euid ==\ndata directory owner uid) fails on startup."]}),"\n",(0,n.jsxs)(i.p,{children:["When ",(0,n.jsx)(i.code,{children:"fixOwnershipInitContainer.enabled"})," is set to ",(0,n.jsx)(i.code,{children:"true"}),", an init container\nruns as root before Memgraph starts and ",(0,n.jsx)(i.code,{children:"chown"}),"s the lib, log, and core-dumps\nmount points to ",(0,n.jsx)(i.code,{children:"memgraphUserId:memgraphGroupId"}),". The container drops all Linux\ncapabilities except ",(0,n.jsx)(i.code,{children:"CHOWN"}),", uses a read-only root filesystem, and disables\nprivilege escalation."]}),"\n",(0,n.jsx)(i.p,{children:"To enable it:"}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"fixOwnershipInitContainer"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" image"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" repository"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"docker.io/library/busybox"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" tag"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"1.37.0"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" pullPolicy"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"IfNotPresent"})]})]})}),"\n",(0,n.jsxs)(i.p,{children:["The container only chowns the mount paths that exist for the role â ",(0,n.jsx)(i.code,{children:"/var/log/memgraph"}),"\nis included when ",(0,n.jsx)(i.code,{children:"storage.<role>.createLogStorageClaim"})," is ",(0,n.jsx)(i.code,{children:"true"}),", and\n",(0,n.jsx)(i.code,{children:"storage.<role>.coreDumpsMountPath"})," is included when ",(0,n.jsx)(i.code,{children:"storage.<role>.createCoreDumpsClaim"}),"\nis ",(0,n.jsx)(i.code,{children:"true"}),"."]}),"\n",(0,n.jsx)(i.h3,{id:s[17].id,children:s[17].value}),"\n",(0,n.jsxs)(i.p,{children:["By default, Memgraph HA starts ",(0,n.jsx)(i.strong,{children:"without authentication"})," enabled."]}),"\n",(0,n.jsx)(a.P,{type:"warning",children:(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"Breaking change"}),": The HA chart no longer creates a Memgraph user from the\n",(0,n.jsx)(i.co
1de,{children:"USER"}),"/",(0,n.jsx)(i.code,{children:"PASSWORD"})," keys of the ",(0,n.jsx)(i.code,{children:"memgraph-secrets"})," Secret. The ",(0,n.jsx)(i.code,{children:"secrets.enabled"}),",\n",(0,n.jsx)(i.code,{children:"secrets.userKey"})," and ",(0,n.jsx)(i.code,{children:"secrets.passwordKey"})," values have been removed because\nthe previous implementation also applied these env variables to coordinators,\nwhich run without auth. The ",(0,n.jsx)(i.code,{children:"memgraph-secrets"})," Secret is now reserved for the\nlicense and organization name."]})}),"\n",(0,n.jsx)(i.p,{children:"To configure credentials, connect to a data instance after installation and\ncreate users with Cypher, for example:"}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"cypher","data-word-wrap":"","data-copy":"",children:(0,n.jsx)(i.code,{children:(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"CREATE"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" USER memgraph IDENTIFIED BY "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"'memgraph'"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:";"})]})})}),"\n",(0,n.jsx)(i.p,{children:"Run the same statements on every data instance you want the user to exist on.\nCoordinators run without authentication and do not need user setup."}),"\n",(0,n.jsx)(i.h3,{id:s[18].id,children:s[18].value}),"\n",(0,n.jsxs)(i.p,{children:["Each data instance and coordinator can independently terminate Bolt\nconnections over TLS. When enabled, the chart mounts a pre-existing\nKubernetes Secret containing the certificate and private key at\n",(0,n.jsx)(i.code,{children:"/etc/memgraph/ssl/"})," and auto-appends ",(0,n.jsx)(i.code,{children:"--bolt-cert-file=/etc/memgraph/ssl/tls.crt"}),"\nand ",(0,n.jsx)(i.code,{children:"--bolt-key-file=/etc/memgraph/ssl/tls.key"})," to the instanceâs args."]}),"\n",(0,n.jsx)(a.P,{type:"warning",children:(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"Breaking change in HA chart version with TLS config"}),": The previous way of\nenabling Bolt TLS â passing ",(0,n.jsx)(i.code,{children:"--bolt-cert-file"})," / ",(0,n.jsx)(i.code,{children:"--bolt-key-file"})," through\n",(0,n.jsx)(i.code,{children:"data[].args"})," / ",(0,n.jsx)(i.code,{children:"coordinators[].args"})," and mounting the certificate Secret\nthrough ",(0,n.jsx)(i.code,{children:"storage.{data,coordinators}.extraVolumes"})," / ",(0,n.jsx)(i.code,{children:"extraVolumeMounts"})," â is\nno longer supported. Setting ",(0,n.jsx)(i.code,{children:"--bolt-cert-file"})," or ",(0,n.jsx)(i.code,{children:"--bolt-key-file"})," in ",(0,n.jsx)(i.code,{children:"args"}),"\nnow causes ",(0,n.jsx)(i.code,{children:"helm install"})," to fail with a template error. Migrate to the\n",(0,n.jsx)(i.code,{children:"tls.bolt"})," block on each instance instead."]})}),"\n",(0,n.jsx)(i.p,{children:"To enable Bolt TLS, first create a Kubernetes Secret holding the certificate\nand private key in the release namespace:"}),"\n",(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" create"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" secret"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" tls"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" bolt-tls-secret"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --cert=path/to/tls.crt"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --key=path/to/tls.key"})})]})}
1),"\n",(0,n.jsxs)(i.p,{children:["Then enable ",(0,n.jsx)(i.code,{children:"tls.bolt"})," on each instance that should terminate TLS:"]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"data"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"id"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"0"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" tls"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" bolt"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" secretName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"bolt-tls-secret"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" certSecretPath"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"tls.crt"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" keySecretPath"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"tls.key"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"id"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"1"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" tls"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" bolt"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" secretName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"bolt-tls-secret"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" certSecretPath"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"tls.crt"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" keySecretPath"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"tls.key"})]}),"\n",(0,n.jsx)(i.span,{children:" "}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"coordinators"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"id"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"1"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" tls"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" bolt"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" secretName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"bolt-tls-secret"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"id"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"2"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" tls"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" bolt"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" secretName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"bolt-tls-secret"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"id"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"3"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" tls"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" bolt"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" secretName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"bolt-tls-secret"})]})]})}
1),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.code,{children:"certSecretPath"})," and ",(0,n.jsx)(i.code,{children:"keySecretPath"})," are the keys inside the Secret holding\nthe certificate and key respectively (default ",(0,n.jsx)(i.code,{children:"tls.crt"})," and ",(0,n.jsx)(i.code,{children:"tls.key"}),").\nThe chart fails the install if ",(0,n.jsx)(i.code,{children:"tls.bolt.enabled"})," is ",(0,n.jsx)(i.code,{children:"true"})," but\n",(0,n.jsx)(i.code,{children:"tls.bolt.secretName"})," is empty."]}),"\n",(0,n.jsxs)(i.p,{children:["When a coordinator has ",(0,n.jsx)(i.code,{children:"tls.bolt.enabled: true"}),", the cluster-setup job\nthat registers coordinators and data instances automatically uses\n",(0,n.jsx)(i.code,{children:"--use-ssl"})," when connecting to coordinator 1."]}),"\n",(0,n.jsx)(i.h3,{id:s[19].id,children:s[19].value}),"\n",(0,n.jsxs)(i.p,{children:["Independently of Bolt TLS, each data instance and coordinator can encrypt the\ninternal communication between cluster members (coordinator-to-coordinator and\ncoordinator-to-data traffic). When ",(0,n.jsx)(i.code,{children:"tls.intraCluster.enabled"})," is ",(0,n.jsx)(i.code,{children:"true"}),", the\nchart mounts a pre-existing Kubernetes Secret containing the certificate,\nprivate key and CA bundle at ",(0,n.jsx)(i.code,{children:"/etc/memgraph/intra_cluster_tls/"})," and\nauto-appends ",(0,n.jsx)(i.code,{children:"--cluster-cert-file=/etc/memgraph/intra_cluster_tls/tls.crt"}),",\n",(0,n.jsx)(i.code,{children:"--cluster-key-file=/etc/memgraph/intra_cluster_tls/tls.key"})," and\n",(0,n.jsx)(i.code,{children:"--cluster-ca-file=/etc/memgraph/intra_cluster_tls/ca.crt"})," to the instanceâs\nargs."]}),"\n",(0,n.jsxs)(i.p,{children:["To enable intra-cluster TLS, first create a Kubernetes Secret holding the\ncertificate, private key and CA bundle for each instance in the release\nnamespace. For example, for ",(0,n.jsx)(i.code,{children:"data-0"}),":"]}),"\n",(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" create"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" secret"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" generic"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" intra-tls-data-0-secret"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --from-file=tls.crt=path/to/tls.crt"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --from-file=tls.key=path/to/tls.key"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --from-file=ca.crt=path/to/ca.crt"})})]})}),"\n",(0,n.jsxs)(i.p,{children:["Then enable ",(0,n.jsx)(i.code,{children:"tls.intraCluster"})," on each instance that should encrypt internal\ntraffic:"]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"data"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"id"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"0"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" tls"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" intraCluster"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" secretName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"intra-tls-data-0-secret"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" certSecretPath"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"tls.crt"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" keySecretPath"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"tls.key"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" caSecretPath"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"ca.crt"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"id"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"1"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" tls"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" intraCluster"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" secretName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"intra-tls-data-1-secret"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" certSecretPath"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"tls.crt"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" keySecretPath"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"tls.key"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" caSecretPath"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"ca.crt"})]}),"\n",(0,n.jsx)(i.span,{children:" "}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"coordinators"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"id"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"1"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" tls"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" intraCluster"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" secretName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"intra-tls-coord-1-secret"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"id"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"2"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" tls"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" intraCluster"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" secretName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"intra-tls-coord-2-secret"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"id"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"3"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" tls"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" intraCluster"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" secretName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"intra-tls-coord-3-secret"})]})]})}
1),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.code,{children:"certSecretPath"}),", ",(0,n.jsx)(i.code,{children:"keySecretPath"})," and ",(0,n.jsx)(i.code,{children:"caSecretPath"})," are the keys inside the\nSecret holding the certificate, private key and CA bundle respectively\n(default ",(0,n.jsx)(i.code,{children:"tls.crt"}),", ",(0,n.jsx)(i.code,{children:"tls.key"})," and ",(0,n.jsx)(i.code,{children:"ca.crt"}),"). The chart fails the install if\n",(0,n.jsx)(i.code,{children:"tls.intraCluster.enabled"})," is ",(0,n.jsx)(i.code,{children:"true"})," but ",(0,n.jsx)(i.code,{children:"tls.intraCluster.secretName"})," is\nempty. Enable it on every instance that participates in encrypted intra-cluster\ncommunication."]}),"\n",(0,n.jsx)(i.h2,{id:s[20].id,children:s[20].value}),"\n",(0,n.jsx)(i.p,{children:"Although many configuration options exist, especially for networking, the workflow for creating a Memgraph HA cluster follows these steps:"}),"\n",(0,n.jsxs)(i.ol,{children:["\n",(0,n.jsx)(i.li,{children:"Provision the Kubernetes cluster. Ensure your nodes, storage, and networking are ready."}),"\n",(0,n.jsxs)(i.li,{children:["Label nodes according to your chosen affinity strategy (optional). For example, when using ",(0,n.jsx)(i.code,{children:"nodeSelection"}),", label nodes as ",(0,n.jsx)(i.code,{children:"data-node"})," or ",(0,n.jsx)(i.code,{children:"coordinator-node"}),"."]}),"\n",(0,n.jsxs)(i.li,{children:["Create the ",(0,n.jsx)(i.code,{children:"memgraph-secrets"})," Kubernetes secret holding ",(0,n.jsx)(i.code,{children:"MEMGRAPH_ENTERPRISE_LICENSE"})," and ",(0,n.jsx)(i.code,{children:"MEMGRAPH_ORGANIZATION_NAME"})," (required â the chart reads these via ",(0,n.jsx)(i.code,{children:"secretKeyRef"}),")."]}),"\n",(0,n.jsxs)(i.li,{children:["Install the Memgraph HA Helm chart using ",(0,n.jsx)(i.code,{children:"helm install"}),". This creates a fully connected cluster."]}),"\n",(0,n.jsxs)(i.li,{children:["Install auxiliary components for external access, such as ",(0,n.jsx)(i.code,{children:"ingress-nginx"})," (optional)."]}),"\n",(0,n.jsx)(i.li,{children:"Update Bolt server addresses if clients will connect from outside the cluster (optional)."}),"\n"]}),"\n",(0,n.jsx)(i.h3,{id:s[21].id,children:s[21].value}),"\n",(0,n.jsxs)(i.p,{children:["After ",(0,n.jsx)(i.code,{children:"helm install"}),", the chart runs a ",(0,n.jsx)(i.code,{children:"cluster-setup"})," Job as a Helm\n",(0,n.jsx)(i.code,{children:"post-install"})," and ",(0,n.jsx)(i.code,{children:"post-upgrade"})," hook. This Job registers all coordinators and\ndata instances via ",(0,n.jsx)(i.code,{children:"mgconsole"}),", producing a fully connected cluster, and re-runs\non every ",(0,n.jsx)(i.code,{children:"helm upgrade"})," to reconcile cluster membership (see ",(0,n.jsx)(i.a,{href:"#scale-the-cluster-up-and-down",children:"Scale the cluster\nup and down"}),")."]}),"\n",(0,n.jsxs)(i.p,{children:["You can customize the labels and security context applied to this Job through\nthe ",(0,n.jsx)(i.code,{children:"clusterSetup"})," block:"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"clusterSetup.labels"})," - custom labels applied to both the Job and its pod\ntemplate. Useful for matching network policies, cost-allocation, or\nobservability selectors that target the setup Job."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"clusterSetup.podSecurityContext"})," - pod-level security context for the\n",(0,n.jsx)(i.code,{children:"cluster-setup"})," pod."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"clusterSetup.containerSecurityContext"})," - container-level security context for\nthe ",(0,n.jsx)(i.code,{children:"cluster-setup"})," container."]}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["By default the Job runs hardened: as the non-root ",(0,n.jsx)(i.code,{children:"memgraph"})," user\n(",(0,n.jsx)(i.code,{children:"runAsUser: 101"}),", ",(0,n.jsx)(i.code,{children:"runAsGroup: 103"}),"), with a read-only root filesystem, all\nLinux capabilities dropped, no privilege escalation, and the ",(0,n.jsx)(i.co
1de,{children:"RuntimeDefault"}),"\nseccomp profile. Override these values when deploying to a restricted\nenvironment such as Red Hat OpenShift, where the allowed UID/GID range differs:"]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"clusterSetup"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" labels"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" app.kubernetes.io/component"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"cluster-setup"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" podSecurityContext"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" runAsUser"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"1000680000"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" runAsGroup"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"1000680000"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" runAsNonRoot"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" seccompProfile"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" type"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"RuntimeDefault"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" containerSecurityContext"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" allowPrivilegeEscalation"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"false"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" capabilities"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" drop"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": ["}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"ALL"'}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"]"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" readOnlyRootFilesystem"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" runAsNonRoot"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" seccompProfile"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" type"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"RuntimeDefault"})]})]})}),"\n",(0,n.jsx)(i.h3,{id:s[22].id,children:s[22].value}
1),"\n",(0,n.jsxs)(i.p,{children:["The ",(0,n.jsx)(i.code,{children:"cluster-setup"})," Job runs as both a ",(0,n.jsx)(i.code,{children:"post-install"})," and a ",(0,n.jsx)(i.code,{children:"post-upgrade"})," hook,\nso it re-runs on every ",(0,n.jsx)(i.code,{children:"helm upgrade"})," and reconciles the registered cluster with\nyour chart values. All operations are idempotent â existing coordinators and data\ninstances are left untouched:"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Scale out"}),": add an entry to ",(0,n.jsx)(i.code,{children:"coordinators[]"})," or ",(0,n.jsx)(i.code,{children:"data[]"})," and run ",(0,n.jsx)(i.code,{children:"helm upgrade"}),". The new coordinator is registered with ",(0,n.jsx)(i.code,{children:"ADD COORDINATOR"})," and the new\ndata instance with ",(0,n.jsx)(i.code,{children:"REGISTER INSTANCE"}),"."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Scale down"}),": remove an entry from ",(0,n.jsx)(i.code,{children:"coordinators[]"})," or ",(0,n.jsx)(i.code,{children:"data[]"})," and run ",(0,n.jsx)(i.code,{children:"helm upgrade"}),". Members that are registered in the cluster but no longer present in\nthe values are removed with ",(0,n.jsx)(i.code,{children:"REMOVE COORDINATOR"})," / ",(0,n.jsx)(i.code,{children:"UNREGISTER INSTANCE"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["Instance names are keyed by their stable ",(0,n.jsx)(i.code,{children:"id"}),", not by their position in the\narray, so removal is position-independent: dropping a middle entry unregisters\nexactly that member and leaves the othersâ names and endpoints intact. Data\ninstance names are derived as ",(0,n.jsx)(i.code,{children:"instance_<id+1>"})," (so ids ",(0,n.jsx)(i.code,{children:"0, 1, 2"})," map to\n",(0,n.jsx)(i.code,{children:"instance_1, instance_2, instance_3"}),"), and coordinator names as\n",(0,n.jsx)(i.code,{children:"coordinator_<id>"}),"."]}),"\n",(0,n.jsx)(a.P,{type:"info",children:(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"Scale-down safety"}),": the Job never removes the current MAIN data instance or\nthe leader coordinator, because unregistering either can corrupt cluster state.\nWhen you scale one of those down, its pod is deleted and the cluster fails over /\nre-elects; on a later ",(0,n.jsx)(i.code,{children:"helm upgrade"})," the removed member is no longer MAIN/leader\nand is cleaned up then. To remove it immediately, first promote/elect a different\nmember, then upgrade â or run ",(0,n.jsx)(i.code,{children:"UNREGISTER INSTANCE"})," / ",(0,n.jsx)(i.code,{children:"REMOVE COORDINATOR"}),"\nmanually on the leader coordinator."]})}),"\n",(0,n.jsxs)(a.P,{type:"warning",children:[(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"Breaking change for non-default data instance IDs"}),": data instance names are\nnow derived from each entryâs ",(0,n.jsx)(i.code,{children:"id"})," (",(0,n.jsx)(i.code,{children:"instance_<id+1>"}),") instead of its position in\nthe ",(0,n.jsx)(i.code,{children:"data"})," array. For the shipped default ids (",(0,n.jsx)(i.code,{children:"0, 1, 2"}),") the names are unchanged\n(",(0,n.jsx)(i.code,{children:"instance_1, instance_2, instance_3"}),"), so those deployments upgrade safely."]}),(0,n.jsxs)(i.p,{children:["If you use ",(0,n.jsx)(i.strong,{children:"non-sequential or non-zero-based ids"})," (e.g. ",(0,n.jsx)(i.code,{children:"5, 6, 7"}),"), the\nregistered instance names change on upgrade: the ",(0,n.jsx)(i.code,{children:"cluster-setup"})," Job will\n",(0,n.jsx)(i.code,{children:"REGISTER"})," the new names and ",(0,n.jsx)(i.code,{children:"UNREGISTER"})," the old ones during reconciliation. The\ncurrent MAIN is protected, but replicas are torn down and re-registered under\ntheir new names. Review your ",(0,n.jsx)(i.code,{children:"data[].id"})," values before upgrading, and expect a\nbrief replica re-registration if they donât follow the default ",(0,n.jsx)(i.code,{children:"0"}),"-based\nsequential scheme. In that case you may need to run ",(0,n.jsx)(i.code,{children:"UNREGISTER INSTANCE"}
1)," and\n",(0,n.jsx)(i.code,{children:"REMOVE COORDINATOR"})," manually to consolidate the cluster state."]}),(0,n.jsxs)(i.p,{children:["Each ",(0,n.jsx)(i.code,{children:"data[].id"})," must be a unique, non-negative integer given as a string (e.g.\n",(0,n.jsx)(i.code,{children:'"0"'}),", ",(0,n.jsx)(i.code,{children:'"1"'}),", ",(0,n.jsx)(i.code,{children:'"2"'}),"). Non-numeric ids are not supported, as they would all\ncollapse to the same instance name."]})]}),"\n",(0,n.jsx)(i.h3,{id:s[23].id,children:s[23].value}),"\n",(0,n.jsx)(i.p,{children:"This step is required only when:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"Clients access the database from outside the cluster, and"}),"\n",(0,n.jsx)(i.li,{children:"Youâre using bolt+routing for client-side routing"}),"\n"]}),"\n",(0,n.jsx)(a.P,{type:"info",children:(0,n.jsxs)(i.p,{children:["When you expose the cluster through ",(0,n.jsx)(i.strong,{children:"IngressNginx"}),", ",(0,n.jsx)(i.strong,{children:"Gateway API"}),", the\ncoordinator ",(0,n.jsx)(i.strong,{children:"CommonLoadBalancer"}),", or per-instance ",(0,n.jsx)(i.strong,{children:"LoadBalancer"})," Services\nand set an ",(0,n.jsx)(i.code,{children:"external-dns"})," hostname via annotations, the ",(0,n.jsx)(i.code,{children:"cluster-setup"})," Job\nsets each instanceâs routing ",(0,n.jsx)(i.code,{children:"bolt_server"})," to the external hostname and port\nautomatically, and reconciles it on every ",(0,n.jsx)(i.code,{children:"helm upgrade"})," (including reverting\nto the internal address when external access is turned off). In that case you\ndonât need to run the queries below manually. For ",(0,n.jsx)(i.code,{children:"LoadBalancer"}),", set the\nhostname ",(0,n.jsx)(i.strong,{children:"per instance"})," via ",(0,n.jsx)(i.code,{children:"data[].externalAccessAnnotations"})," /\n",(0,n.jsx)(i.code,{children:"coordinators[].externalAccessAnnotations"})," â each instance has its own\nLoadBalancer Service, so a tier-level hostname would register the same\n",(0,n.jsx)(i.code,{children:"bolt_server"})," for every instance. This does not apply to ",(0,n.jsx)(i.code,{children:"NodePort"})," (or to\ninstances without a hostname annotation), where the internal ",(0,n.jsx)(i.code,{children:"bolt_server"})," is\nkept and you update it manually."]})}),"\n",(0,n.jsx)(i.p,{children:"Each instance must know its external address for routing to work correctly. Run the following queries on the leader coordinator:"}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"cypher","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"UPDATE CONFIG FOR COORDINATOR "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"1"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" WITH"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" CONFIG "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"{"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"bolt_server"'}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:":"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:' "<bolt-server-coord1>"'}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"}"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:";"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"UPDATE CONFIG FOR COORDINATOR "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"2"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" WITH"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" CONFIG "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"{"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"bolt_server"'}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:":"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:' "<bolt-server-coord2>"'}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"}"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:";"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"UPDATE CONFIG FOR COORDINATOR "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"3"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" WITH"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" CONFIG "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"{"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"bolt_server"'}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:":"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:' "<bolt-server-coord3>"'}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"}"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:";"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"UPDATE CONFIG FOR INSTANCE instance_0 "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"WITH"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" CONFIG "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"{"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"bolt_server"'}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:":"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:' "<bolt-server-instance0>"'}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"}"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:";"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"UPDATE CONFIG FOR INSTANCE instance_1 "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"WITH"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" CONFIG "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"{"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"bolt_server"'}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:":"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:' "<bolt-server-instance1>"'}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"}"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:";"})]})]})}),"\n",(0,n.jsxs)(i.p,{children:["Note that the only the ",(0,n.jsx)(i.co
1de,{children:"bolt_server"})," values are provided. The correct\nvalue depends on the type of external access you configured (LoadBalancer IP,\nIngress host/port, NodePort, etc.)."]}),"\n",(0,n.jsxs)(i.p,{children:["Refer to the Memgraph HA ",(0,n.jsx)(i.a,{href:"/clustering/high-availability#user-api",children:"User API docs"}),"\nfor the full set of commands and usage patterns."]}),"\n",(0,n.jsx)(i.h3,{id:s[24].id,children:s[24].value}),"\n",(0,n.jsxs)(i.p,{children:["The Memgraph HA Helm chart has native support for the ",(0,n.jsx)(i.a,{href:"https://gateway-api.sigs.k8s.io/",children:"Kubernetes Gateway API"}),". When enabled, the chart automatically creates a TCPRoute for each data instance and a single TCPRoute shared by all coordinators. You can either let the chart create its own Gateway or attach routes to a pre-existing one."]}),"\n",(0,n.jsx)(a.P,{type:"warning",children:(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"Breaking change in HA chart versions after 1.3.3"}),": coordinators are no\nlonger exposed on one Gateway listener each. They now share a single listener\nand a single TCPRoute on ",(0,n.jsx)(i.code,{children:"ports.boltPort"}),", so\n",(0,n.jsx)(i.code,{children:"externalAccessConfig.gateway.coordinatorPortBase"})," no longer exists and chart\nrendering fails if you still set it. Remove the value from your ",(0,n.jsx)(i.code,{children:"values.yaml"}),",\npoint clients at ",(0,n.jsx)(i.code,{children:"<gateway-host>:<boltPort>"})," instead of the old per-coordinator\nports, and if you use an existing Gateway, replace the ",(0,n.jsx)(i.code,{children:"coordinator-{id}-bolt"}),"\nlisteners with a single ",(0,n.jsx)(i.code,{children:"coordinators-bolt"})," listener on ",(0,n.jsx)(i.code,{children:"ports.boltPort"}),". Change\n",(0,n.jsx)(i.code,{children:"ports.boltPort"})," if you need the coordinators on a different port."]})}),"\n",(0,n.jsx)(a.P,{type:"info",children:(0,n.jsxs)(i.p,{children:["The Gateway only exposes tiers whose ",(0,n.jsx)(i.code,{children:"serviceType"})," is ",(0,n.jsx)(i.strong,{children:"empty"}),": a tier with\n",(0,n.jsx)(i.code,{children:"externalAccessConfig.dataInstance.serviceType"})," or\n",(0,n.jsx)(i.code,{children:"externalAccessConfig.coordinator.serviceType"})," set gets its external access\nfrom that service type instead and is excluded from the Gateway (no listeners\nor TCPRoutes are created for it). This lets you mix methods per tier â for\nexample, coordinators via ",(0,n.jsx)(i.code,{children:"CommonLoadBalancer"})," and data instances via the\nGateway, which is our ",(0,n.jsx)(i.a,{href:"#recommended-external-access-setup",children:"recommended setup"}),".\nEnabling the gateway while ",(0,n.jsx)(i.strong,{children:"both"})," tiers have a ",(0,n.jsx)(i.code,{children:"serviceType"})," set fails chart\nrendering, since the Gateway would then apply to nothing."]})}),"\n",(0,n.jsx)(i.h4,{id:s[25].id,children:s[25].value}),"\n",(0,n.jsx)(i.p,{children:"Before enabling Gateway API in the chart, you need:"}),"\n",(0,n.jsxs)(i.ol,{children:["\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"The Gateway API CRDs"})," installed in your cluster. Some controllers ship them\nwith their own Helm chart (Envoy Gateway does), while others expect you to\ninstall them yourself (Traefik does). The controller-specific guides below\ncover both cases."]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"A Gateway API controller"})," installed in your cluster. Examples include\n",(0,n.jsx)(i.a,{href:"https://gateway.envoyproxy.io/",children:"Envoy Gateway"}),", ",(0,n.jsx)(i.a,{href:"https://istio.io/",children:"Istio"}),"\n(see also: ",(0,n.jsx)(i.a,{href:"#use-istio-as-the-gateway-api-controller",children:"Use Istio as the Gateway API controller"}),"),\n",(0,n.jsx)(i.a,{href:"https://cilium.io/",children:"Cilium"}),", ",(0,n.jsx)(i.a,{href:"https://traefik.io/",children:"Traefik"}),", and\n",(0,n.jsx)(i.a,{href:"https://konghq.com/",children:"Kong"}),". Step-by-step guides are available for two of\nthem: ",(0,n.jsx)(i.a,{href:"#deploy-with-envoy-gateway",children:"Envoy Gateway"})," and\n",(0,n.jsx)(i.a,{href:"#deploy-with-traefik",children:"Traefik"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"A GatewayClass resource"})," that references your controller. A GatewayClass is\na cluster-scoped resource that defines which controller manages Gateways â\neach Gateway references a GatewayClass by name. The Memgraph Helm chart does\n",(0,n.jsx)(i.strong,{children:"not"})," create a GatewayClass; you must create one yourself or use one\nprovided by your controller installation (the Envoy Gateway chart does not\ncreate one, the Traefik chart does)."]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(a.P,{type:"warning",children:(0,n.jsxs)(i.p,{children:["The chart exposes Bolt through ",(0,n.jsx)(i.co
1de,{children:"TCPRoute"}),", which is part of the Gateway API\n",(0,n.jsx)(i.strong,{children:"experimental"})," channel. A standard-channel CRD bundle is not enough â whatever\nyou install must include ",(0,n.jsx)(i.code,{children:"tcproutes.gateway.networking.k8s.io"}),", and the\ncontroller itself may need experimental support turned on (Traefik does, see\n",(0,n.jsx)(i.a,{href:"#deploy-with-traefik",children:"Deploy with Traefik"}),")."]})}),"\n",(0,n.jsx)(a.P,{type:"warning",children:(0,n.jsxs)(i.p,{children:["You must ensure the GatewayClass exists before enabling the gateway feature in the chart. If you create your own Gateway (Option 1 below), the chart requires ",(0,n.jsx)(i.code,{children:"gatewayClassName"})," to reference an existing GatewayClass, and will fail with an error if it is not set."]})}),"\n",(0,n.jsx)(i.h4,{id:s[26].id,children:s[26].value}),"\n",(0,n.jsxs)(i.p,{children:["When you want the chart to create its own Gateway along with TCPRoute resources, set ",(0,n.jsx)(i.code,{children:"externalAccessConfig.gateway.enabled"})," to ",(0,n.jsx)(i.code,{children:"true"})," and provide the ",(0,n.jsx)(i.code,{children:"gatewayClassName"}),":"]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"externalAccessConfig"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" gateway"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" gatewayClassName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"eg"'})]})]})}),"\n",(0,n.jsxs)(i.p,{children:["The chart will create, for every tier whose ",(0,n.jsx)(i.code,{children:"serviceType"})," is empty:"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["A ",(0,n.jsx)(i.strong,{children:"Gateway"})," (",(0,n.jsx)(i.code,{children:"gateway.networking.k8s.io/v1"}),") with one TCP listener per data instance, plus a single shared listener for all coordinators."]}),"\n",(0,n.jsxs)(i.li,{children:["A ",(0,n.jsx)(i.strong,{children:"TCPRoute"})," (",(0,n.jsx)(i.code,{children:"gateway.networking.k8s.io/v1alpha2"}),") per data instance, plus one TCPRoute for the whole coordinator tier that lists every coordinator Service as a backend."]}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["Each data instance gets its own port, assigned as ",(0,n.jsx)(i.code,{children:"dataPortBase + data instance id"})," (default: 9000, 9001, â¦), because clients must be able to reach a\nspecific data instance. Coordinators instead share ",(0,n.jsx)(i.strong,{children:"one"})," listener on\n",(0,n.jsx)(i.code,{children:"ports.boltPort"})," (default 7687): the single coordinator TCPRoute has every\ncoordinator Service as an equally weighted backend, so the Gateway distributes\nnew connections round-robin across them. Clients therefore need only one\ncoordinator address, connections keep working when the coordinator they landed\non goes away, and scaling the coordinator tier does not add a listener or a\nport. When an ",(0,n.jsx)(i.code,{children:"external-dns"})," hostname is set on the Gateway, the\n",(0,n.jsx)(i.code,{children:"cluster-setup"})," Job registers that shared ",(0,n.jsx)(i.code,{children:"<hostname>:<boltPort>"}
1)," as the routing\n",(0,n.jsx)(i.code,{children:"bolt_server"})," of every coordinator, the same way it does for a coordinator\n",(0,n.jsx)(i.code,{children:"CommonLoadBalancer"})," (see ",(0,n.jsx)(i.a,{href:"#update-bolt-server",children:"Update bolt server"}),")."]}),"\n",(0,n.jsx)(i.p,{children:"You can customize the data instance base port:"}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"externalAccessConfig"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" gateway"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" gatewayClassName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"eg"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" dataPortBase"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"9000"})]})]})}),"\n",(0,n.jsxs)(i.p,{children:["Keep the resulting data instance ports away from ",(0,n.jsx)(i.code,{children:"ports.boltPort"}),": when both\ntiers are exposed through the Gateway and ",(0,n.jsx)(i.code,{children:"dataPortBase + id"})," of some data\ninstance equals ",(0,n.jsx)(i.code,{children:"ports.boltPort"}),", that listener would collide with the shared\ncoordinator listener and chart rendering fails."]}),"\n",(0,n.jsx)(i.p,{children:"You can also set annotations and labels on the Gateway resource:"}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"externalAccessConfig"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" gateway"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" gatewayClassName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"eg"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" annotations"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" example.io/owner"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"memgraph"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" labels"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" app"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"memgraph-ha"})]})]})}),"\n",(0,n.jsxs)(i.p,{children:["To install with a chart-managed Gateway (assuming the ",(0,n.jsx)(i.co
1de,{children:"memgraph-secrets"}),"\nSecret with the license and organization name already exists, see ",(0,n.jsx)(i.a,{href:"#install-memgraph-ha",children:"Install\nMemgraph HA"}),"):"]}),"\n",(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"helm"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" install"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" memgraph-ha"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" memgraph/memgraph-high-availability"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --set"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" externalAccessConfig.gateway.enabled="}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --set"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" externalAccessConfig.gateway.gatewayClassName=eg"})]})]})}),"\n",(0,n.jsx)(i.h4,{id:s[27].id,children:s[27].value}),"\n",(0,n.jsx)(i.p,{children:"When you already have a Gateway resource in your cluster (for example, a shared Gateway serving multiple services including Memgraph Lab), you can have the chart create only TCPRoute resources that attach to it:"}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"externalAccessConfig"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" gateway"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" existingGatewayName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"memgraph-gateway"'})]})]})}),"\n",(0,n.jsxs)(i.p,{children:["In this mode, the chart skips Gateway creation and only creates TCPRoute resources. The ",(0,n.jsx)(i.code,{children:"gatewayClassName"})," is not required."]}),"\n",(0,n.jsx)(i.p,{children:"If the existing Gateway is in a different namespace, specify it:"}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"externalAccessConfig"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" gateway"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" existingGatewayName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"memgraph-gateway"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" existingGatewayNamespace"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"gateway-system"'})]})]})}),"\n",(0,n.jsxs)(i.p,{children:["To install with an existing Gateway (assuming the ",(0,n.jsx)(i.co
1de,{children:"memgraph-secrets"})," Secret\nwith the license and organization name already exists, see ",(0,n.jsx)(i.a,{href:"#install-memgraph-ha",children:"Install Memgraph\nHA"}),"):"]}),"\n",(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"helm"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" install"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" memgraph-ha"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" memgraph/memgraph-high-availability"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --set"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" externalAccessConfig.gateway.enabled="}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --set"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" externalAccessConfig.gateway.existingGatewayName=memgraph-gateway"})]})]})}),"\n",(0,n.jsxs)(a.P,{type:"warning",children:[(0,n.jsxs)(i.p,{children:["When using an existing Gateway, ensure it has listeners whose ",(0,n.jsx)(i.strong,{children:"names"})," match the\nTCPRoute ",(0,n.jsx)(i.code,{children:"sectionName"})," references. The chart expects listener names in the format\n",(0,n.jsx)(i.code,{children:"data-{id}-bolt"})," for data instances and ",(0,n.jsx)(i.code,{children:"coordinator-{id}-bolt"}),"\nfor coordinators. The listener ports are your choice in this mode,\nbut keeping them aligned with the chart defaults avoids surprises. For example,\nthe default HA setup (2 data instances, 3 coordinators) needs these listeners:"]}),(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"data-0-bolt"})," on port 9000"]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"data-1-bolt"})," on port 9001"]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"coordinator-1-bolt"})," on port 10001"]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"coordinator-2-bolt"})," on port 10002"]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"coordinator-3-bolt"})," on port 10003"]}),"\n"]}),(0,n.jsxs)(i.p,{children:["A standalone Gateway manifest with these pre-configured listeners is available in the ",(0,n.jsx)(i.a,{href:"https://github.com/memgraph/helm-charts/blob/main/examples/gateway/gateway.yaml",children:"Helm charts repository"}),"."]})]}),"\n",(0,n.jsx)(a.P,{type:"info",children:(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"TCPRoute API version"}),": TCPRoute uses ",(0,n.jsx)(i.code,{children:"v1alpha2"}),", which is the latest available API version. It is supported by Envoy Gateway and other major implementations but is not yet GA. Gateway and HTTPRoute are both GA (",(0,n.jsx)(i.code,{children:"v1"}),")."]})}),"\n",(0,n.jsx)(i.h4,{id:s[28].id,children:s[28].value}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://gateway.envoyproxy.io/",children:"Envoy Gateway"})," is the controller used in the\nexamples above. Its Helm chart bundles the Gateway API CRDs, so no separate CRD\ninstallation is needed, and it programs listener ports dynamically â the Bolt\nports only have to be configured in the Memgraph chart."]}),"\n",(0,n.jsxs)(l.g,{children:[(0,n.jsx)("h4",{className:"custom-header",children:" Install Envoy Gateway "}),(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"helm"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" install"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" eg"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" oci://docker.io/envoyproxy/gateway-helm"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --version"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" v1.2.4"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" -n"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" envoy-gateway-system"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --create-namespace"})]})]})}
1),(0,n.jsxs)(i.p,{children:["Chart version ",(0,n.jsx)(i.code,{children:"v1.2.4"})," ships Gateway API bundle version ",(0,n.jsx)(i.code,{children:"v1.2.1"}),", which includes\nthe ",(0,n.jsx)(i.code,{children:"TCPRoute"})," CRD."]}),(0,n.jsx)("h4",{className:"custom-header",children:" Create the GatewayClass "}),(0,n.jsx)(i.p,{children:"The Envoy Gateway chart does not create a GatewayClass, so create one that points\nat its controller:"}),(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"apiVersion"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"gateway.networking.k8s.io/v1"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"kind"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"GatewayClass"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"metadata"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" name"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"eg"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"spec"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" controllerName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"gateway.envoyproxy.io/gatewayclass-controller"})]})]})}),(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsx)(i.code,{children:(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" apply"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" -f"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" gatewayclass.yaml"})]})})}),(0,n.jsx)("h4",{className:"custom-header",children:" Install the Memgraph HA chart "}),(0,n.jsxs)(i.p,{children:["Assuming the ",(0,n.jsx)(i.code,{children:"memgraph-secrets"})," Secret with the license and organization name\nalready exists (see ",(0,n.jsx)(i.a,{href:"#install-memgraph-ha",children:"Install Memgraph HA"}),"):"]}),(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"helm"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" install"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" memgraph-ha"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" memgraph/memgraph-high-availability"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --set"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" externalAccessConfig.gateway.enabled="}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --set"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" externalAccessConfig.gateway.gatewayClassName=eg"})]})]})}),(0,n.jsx)("h4",{className:"custom-header",children:" Verify the setup "}),(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" get"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" gatewayclass"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" eg"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" get"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" gateway"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" -o"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" wide"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" get"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" tcproute"})]})]})}),(0,n.jsxs)(i.p,{children:["The GatewayClass should be ",(0,n.jsx)(i.co
1de,{children:"ACCEPTED=True"})," and the Gateway ",(0,n.jsx)(i.code,{children:"PROGRAMMED=True"})," with\nan external address. Envoy Gateway provisions a separate Envoy deployment and\nLoadBalancer Service for the Gateway."]})]}),"\n",(0,n.jsx)(i.h4,{id:s[29].id,children:s[29].value}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://traefik.io/",children:"Traefik"})," can serve the same setup, but its Gateway API\nsupport differs from Envoy Gateway in two ways that affect the Memgraph chart:"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["Its Helm chart ships ",(0,n.jsx)(i.strong,{children:"no Gateway API CRDs"}),", so you install them yourself, and\n",(0,n.jsx)(i.code,{children:"TCPRoute"})," support has to be explicitly enabled."]}),"\n",(0,n.jsxs)(i.li,{children:["Traefik does ",(0,n.jsx)(i.strong,{children:"not"})," open arbitrary listener ports. Every port used by a Gateway\nlistener must also be declared as a Traefik entryPoint, otherwise the listener\nis silently ignored."]}),"\n"]}),"\n",(0,n.jsxs)(l.g,{children:[(0,n.jsx)("h4",{className:"custom-header",children:" Install the Gateway API CRDs "}),(0,n.jsxs)(i.p,{children:["Install the experimental channel, which is where ",(0,n.jsx)(i.code,{children:"TCPRoute"})," lives:"]}),(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" apply"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --server-side"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --force-conflicts"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" -f"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.5.1/experimental-install.yaml"})]})]})}),(0,n.jsx)(a.P,{type:"info",children:(0,n.jsxs)(i.p,{children:["Use ",(0,n.jsx)(i.code,{children:"--server-side"}),". A plain ",(0,n.jsx)(i.code,{children:"kubectl apply"})," stores the whole manifest in the\n",(0,n.jsx)(i.code,{children:"kubectl.kubernetes.io/last-applied-configuration"})," annotation and the HTTPRoute\nCRD exceeds the 256 KB annotation limit, failing with\n",(0,n.jsx)(i.code,{children:"metadata.annotations: Too long: may not be more than 262144 bytes"}),".\n",(0,n.jsx)(i.code,{children:"--force-conflicts"})," is needed only when the CRDs were previously created with a\nclient-side apply."]})}),(0,n.jsx)("h4",{className:"custom-header",children:" Configure Traefik "}),(0,n.jsxs)(i.p,{children:["Create a ",(0,n.jsx)(i.code,{children:"traefik-values.yaml"})," file. The ",(0,n.jsx)(i.code,{children:"ports"})," entries are the entryPoints\nbacking the Gateway listeners the Memgraph chart creates â data instances on\n",(0,n.jsx)(i.code,{children:"dataPortBase + data instance id"}),", coordinators on\n",(0,n.jsx)(i.code,{children:"coordinatorPortBase + coordinator id"}),":"]}),(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"providers"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" kubernetesGateway"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:" # Required for TCPRoute support."})}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" experimentalChannel"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" statusAddress"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" service"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:" # Copies the Traefik LoadBalancer address into Gateway .status.addresses,"})}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:" # which is what external-dns reads."})}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsx)(i.span,{children:" "}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:"# The Memgraph chart creates its own Gateway, so Traefik's default one is not needed."})}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"gateway"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"false"})]}),"\n",(0,n.jsx)(i.span,{children:" "}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:'# Creates the GatewayClass "traefik" (controller traefik.io/gateway-controller).'})}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"gatewayClass"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsx)(i.span,{children:" "}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"service"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" type"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"LoadBalancer"})]}),"\n",(0,n.jsx)(i.span,{children:" "}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"ports"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" data-0"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" port"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"9000"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" exposedPort"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"9000"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" protocol"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"TCP"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" expose"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" default"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" data-1"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" port"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"9001"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" exposedPort"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"9001"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" protocol"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"TCP"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" expose"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" default"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]})]})}),(0,n.jsxs)(i.p,{children:["A ready-to-use version of this file is available in the ",(0,n.jsx)(i.a,{href:"https://github.com/memgraph/helm-charts/blob/main/examples/gateway/traefik-values.yaml",children:"Helm charts\nrepository"}),"."]}),(0,n.jsx)(a.P,{type:"warning",children:(0,n.jsxs)(i.p,{children:["Declare one entryPoint per Gateway listener, and remember to add new ones when\nyou ",(0,n.jsx)(i.a,{href:"#scale-the-cluster-up-and-down",children:"scale the cluster"})," â a third data instance\nneeds port 9002, a fourth coordinator needs port 10004. If a tier is exposed\nthrough a ",(0,n.jsx)(i.co
1de,{children:"serviceType"})," instead of the Gateway, it has no listeners and needs no\nentryPoints; with the ",(0,n.jsx)(i.a,{href:"#recommended-external-access-setup",children:"recommended setup"}),"\n(coordinators via ",(0,n.jsx)(i.code,{children:"CommonLoadBalancer"}),", data instances via the Gateway) only the\n",(0,n.jsx)(i.code,{children:"data-*"})," entryPoints are required."]})}),(0,n.jsx)("h4",{className:"custom-header",children:" Install Traefik "}),(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"helm"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" repo"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" add"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" traefik"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" https://traefik.github.io/charts"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"helm"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" repo"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" update"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"helm"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" install"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" traefik"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" traefik/traefik"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" -n"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" traefik"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --create-namespace"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" -f"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" traefik-values.yaml"})]})]})}),(0,n.jsxs)(i.p,{children:["The values above were verified against Traefik chart ",(0,n.jsx)(i.code,{children:"41.0.2"})," (Traefik ",(0,n.jsx)(i.code,{children:"v3.7.6"}),").\nThe ",(0,n.jsx)(i.code,{children:"providers.kubernetesGateway.*"})," options require Traefik 3.x."]}),(0,n.jsx)("h4",{className:"custom-header",children:" Install the Memgraph HA chart "}),(0,n.jsxs)(i.p,{children:["Point ",(0,n.jsx)(i.code,{children:"gatewayClassName"})," at the GatewayClass created by the Traefik chart.\nAssuming the ",(0,n.jsx)(i.code,{children:"memgraph-secrets"})," Secret with the license and organization name\nalready exists (see ",(0,n.jsx)(i.a,{href:"#install-memgraph-ha",children:"Install Memgraph HA"}),"):"]}),(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"helm"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" install"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" memgraph-ha"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" memgraph/memgraph-high-availability"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --set"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" externalAccessConfig.gateway.enabled="}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --set"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" externalAccessConfig.gateway.gatewayClassName=traefik"})]})]})}),(0,n.jsx)("h4",{className:"custom-header",children:" Verify the setup "}),(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" get"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" gatewayclass"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" traefik"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" get"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" gateway"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" -o"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" wide"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" get"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" tcproute"})]}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:"# The chart names the Gateway <release-name>-memgraph-high-availability-gateway"})}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" describe"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" gateway"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" memgraph-ha-memgraph-high-availability-gateway"})]})]})}),(0,n.jsxs)(i.p,{children:["If a listener reports ",(0,n.jsx)(i.co
1de,{children:"Detached"})," or ",(0,n.jsx)(i.code,{children:"UnsupportedProtocol"}),", the matching entryPoint\nis missing from the Traefik values. Unlike Envoy Gateway, Traefik routes all\nGateways through the single Traefik Service, so the external address comes from\nthe ",(0,n.jsx)(i.code,{children:"traefik"})," Service in the ",(0,n.jsx)(i.code,{children:"traefik"})," namespace."]})]}),"\n",(0,n.jsx)(i.h4,{id:s[30].id,children:s[30].value}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"https://istio.io/",children:"Istio"})," implements the Gateway API and works with the HA\nchart out of the box â only Istioâs ",(0,n.jsx)(i.code,{children:"base"})," and ",(0,n.jsx)(i.code,{children:"istiod"})," Helm charts are needed,\nbecause istiod deploys a gateway for every Gateway resource automatically (the\n",(0,n.jsx)(i.code,{children:"istio/gateway"})," chart is not used), and the installation creates the ",(0,n.jsx)(i.code,{children:"istio"}),"\nGatewayClass for you."]}),"\n",(0,n.jsxs)(i.p,{children:["Since the chart exposes Bolt through TCPRoute, which is an ",(0,n.jsx)(i.strong,{children:"alpha"})," Gateway\nAPI resource, two extra steps are required compared to a plain Istio\ninstallation: the Gateway API CRDs must come from the ",(0,n.jsx)(i.strong,{children:"experimental"})," channel,\nand istiod must run with ",(0,n.jsx)(i.code,{children:"PILOT_ENABLE_ALPHA_GATEWAY_API=true"}),"."]}),"\n",(0,n.jsxs)(i.p,{children:["Install the experimental Gateway API CRDs first â istiod detects the alpha CRDs\nat startup, so if it is already running, restart it afterwards with ",(0,n.jsx)(i.code,{children:"kubectl rollout restart deploy/istiod -n istio-system"}),":"]}),"\n",(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsx)(i.code,{children:(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" apply"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" -f"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.5.1/experimental-install.yaml"})]})})}),"\n",(0,n.jsx)(i.p,{children:"Then install Istio with the alpha Gateway API flag enabled:"}),"\n",(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"helm"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" repo"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" add"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" istio"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" https://istio-release.storage.googleapis.com/charts"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"helm"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" repo"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" update"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"helm"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" install"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" istio-base"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" istio/base"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" -n"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" istio-system"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --create-namespace"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"helm"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" install"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" istiod"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" istio/istiod"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" -n"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" istio-system"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --wait"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --set"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" pilot.env.PILOT_ENABLE_ALPHA_GATEWAY_API="}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]})]})}),"\n",(0,n.jsx)(a.P,{type:"warning",children:(0,n.jsxs)(i.p,{children:["Without ",(0,n.jsx)(i.co
1de,{children:"PILOT_ENABLE_ALPHA_GATEWAY_API=true"}),", istiod rejects the chartâs TCP\nlisteners (",(0,n.jsx)(i.code,{children:'protocol "TCP" is supported, but only when PILOT_ENABLE_ALPHA_GATEWAY_API=true is configured'}),") and the failure is easy to\nmisread: the Gateway still shows ",(0,n.jsx)(i.code,{children:"Programmed=True"})," and its LoadBalancer Service\nstill lists all the ports, but the TCPRoutes get ",(0,n.jsx)(i.strong,{children:"no status at all"})," and every\nconnection times out. If you hit this, set the flag with ",(0,n.jsx)(i.code,{children:"helm upgrade istiod istio/istiod -n istio-system --reuse-values --set pilot.env.PILOT_ENABLE_ALPHA_GATEWAY_API=true --wait"})," and check that the\nTCPRoutes report ",(0,n.jsx)(i.code,{children:"Accepted"}),"."]})}),"\n",(0,n.jsxs)(i.p,{children:["Finally, install the HA chart with the ",(0,n.jsx)(i.code,{children:"istio"})," GatewayClass:"]}),"\n",(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"helm"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" install"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" memgraph-ha"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" memgraph/memgraph-high-availability"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --set"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" externalAccessConfig.gateway.enabled="}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --set"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" externalAccessConfig.gateway.gatewayClassName=istio"})]})]})}),"\n",(0,n.jsxs)(i.p,{children:["Istio provisions a Deployment and a LoadBalancer Service named\n",(0,n.jsx)(i.code,{children:"<gateway-name>-istio"})," carrying every listener port: clients reach all\ncoordinators through the shared listener at ",(0,n.jsx)(i.code,{children:"<external-ip>:<boltPort>"})," (default\n7687) and each data instance at ",(0,n.jsx)(i.code,{children:"<external-ip>:<dataPortBase + id>"})," (default\n9000, 9001, â¦). Unlike some controllers (for example Traefik, which requires\nevery listener port to be declared as an entryPoint), Istio programs listener\nports automatically, so scaling the data tier needs no controller\nconfiguration."]}),"\n",(0,n.jsxs)(i.p,{children:["Drivers should connect with ",(0,n.jsx)(i.code,{children:"bolt://"})," directly to the port they want, or, when\nusing ",(0,n.jsx)(i.code,{children:"neo4j://"})," routing mode, set an ",(0,n.jsx)(i.code,{children:"external-dns"})," hostname on the Gateway so\nthe coordinators register the external ",(0,n.jsx)(i.code,{children:"<hostname>:<boltPort>"})," as their routing\n",(0,n.jsx)(i.code,{children:"bolt_server"})," (see ",(0,n.jsx)(i.a,{href:"#update-bolt-server",children:"Update bolt server"}),"):"]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"externalAccessConfig"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" gateway"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" gatewayClassName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"istio"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" annotations"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" external-dns.alpha.kubernetes.io/hostname"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"memgraph.example.com"'})]})]})}),"\n",(0,n.jsxs)(i.p,{children:["Istio copies the LoadBalancer address into the Gatewayâs ",(0,n.jsx)(i.co
1de,{children:".status.addresses"}),",\nwhich is where ",(0,n.jsx)(i.code,{children:"external-dns"})," reads it from, so no extra Istio configuration is\nneeded."]}),"\n",(0,n.jsx)(a.P,{type:"info",children:(0,n.jsxs)(i.p,{children:["Using Istio as the Gateway API controller does ",(0,n.jsx)(i.strong,{children:"not"})," require adding the\nMemgraph pods to the Istio service mesh. If you do sidecar-inject them\n(namespace label ",(0,n.jsx)(i.code,{children:"istio-injection=enabled"}),"), use native sidecars (Kubernetes >=\n1.28 and ",(0,n.jsx)(i.code,{children:"--set pilot.env.ENABLE_NATIVE_SIDECARS=true"})," on istiod) â a classic\n",(0,n.jsx)(i.code,{children:"istio-proxy"})," sidecar keeps the ",(0,n.jsx)(i.code,{children:"cluster-setup"})," Job pod running forever, which\nhangs the chartâs post-install hook, and native sidecars also start the proxy\nbefore Memgraph so coordinators donât fail their initial connections to each\nother. On older clusters, exclude the Job from the mesh instead with ",(0,n.jsx)(i.code,{children:'--set clusterSetup.labels."sidecar\\.istio\\.io/inject"=false'}),"."]})}),"\n",(0,n.jsxs)(i.p,{children:["A ready-made istiod values file with these settings is available in the ",(0,n.jsx)(i.a,{href:"https://github.com/memgraph/helm-charts/blob/main/examples/gateway/istio-values.yaml",children:"Helm\ncharts repository"}),"."]}),"\n",(0,n.jsx)(i.h3,{id:s[31].id,children:s[31].value}),"\n",(0,n.jsxs)(i.p,{children:["One of the most cost-efficient ways to expose a Memgraph HA cluster is by using\n",(0,n.jsx)(i.strong,{children:"IngressNginx"}),". The controller supports TCP routing (including the Bolt\nprotocol), allowing all Memgraph instances to share:"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["a ",(0,n.jsx)(i.strong,{children:"single LoadBalancer"}),", and"]}),"\n",(0,n.jsxs)(i.li,{children:["a ",(0,n.jsx)(i.strong,{children:"single external IP address"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["Clients connect to any coordinator or data instance by using ",(0,n.jsx)(i.strong,{children:"different Bolt\nports"}),"."]}),"\n",(0,n.jsxs)(i.p,{children:["To install Memgraph HA with IngressNginx enabled (assuming the\n",(0,n.jsx)(i.code,{children:"memgraph-secrets"})," Secret with the license and organization name already\nexists, see ",(0,n.jsx)(i.a,{href:"#install-memgraph-ha",children:"Install Memgraph HA"}),"):"]}),"\n",(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"helm"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" install"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" mem-ha-test"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" ./charts/memgraph-high-availability"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --set"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" affinity.nodeSelection="}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:","}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"\\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" externalAccessConfig.dataInstance.serviceType=IngressNginx,"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"\\"})]}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" externalAccessConfig.coordinator.serviceType=IngressNginx"})})]})}),"\n",(0,n.jsxs)(i.p,{children:["When using these settings, the chart will automatically install and configure\n",(0,n.jsx)(i.strong,{children:"IngressNginx"}),", including all required TCP routing setup for Memgraph."]}),"\n",(0,n.jsx)(a.P,{type:"warning",children:(0,n.jsxs)(i.p,{children:["The ",(0,n.jsx)(i.co
1de,{children:"IngressNginx"})," service type can be combined with the Gateway API\n(",(0,n.jsx)(i.code,{children:"externalAccessConfig.gateway.enabled"}),") as long as at least one tier keeps an\nempty ",(0,n.jsx)(i.code,{children:"serviceType"})," â the Gateway only exposes tiers whose ",(0,n.jsx)(i.code,{children:"serviceType"})," is\nempty, so a tier using ",(0,n.jsx)(i.code,{children:"IngressNginx"})," is simply excluded from the Gateway.\nEnabling the gateway while ",(0,n.jsx)(i.strong,{children:"both"})," tiers have a ",(0,n.jsx)(i.code,{children:"serviceType"})," set fails chart\nrendering."]})}),"\n",(0,n.jsxs)(i.p,{children:["All ",(0,n.jsx)(i.code,{children:"IngressNginx"})," tiers share a single ingress-nginx controller Service (one\nLoadBalancer, one external IP). When you set an ",(0,n.jsx)(i.code,{children:"external-dns"})," hostname via\nannotations, the data instance and coordinator annotations are merged onto that\nshared Service (the coordinator value wins on a key collision), so set the ",(0,n.jsx)(i.strong,{children:"same\nhostname"})," on both tiers. Instances behind the shared Service are told apart by\nport, not host: data instances are reachable at ",(0,n.jsx)(i.code,{children:"ingress.dataPortBase + data instance id"})," and coordinators at ",(0,n.jsx)(i.code,{children:"ingress.coordinatorPortBase + coordinator id"}),"."]}),"\n",(0,n.jsx)(i.h2,{id:s[32].id,children:s[32].value}),"\n",(0,n.jsxs)(i.p,{children:["Memgraph HA uses standard Kubernetes ",(0,n.jsx)(i.strong,{children:"startup"}),", ",(0,n.jsx)(i.strong,{children:"readiness"}),", and\n",(0,n.jsx)(i.strong,{children:"liveness"})," probes to ensure correct container operation."]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"Startup probe"}),"\nDetermines when Memgraph has fully started.\nIt succeeds ",(0,n.jsx)(i.strong,{children:"only after database recovery completes"}),".\nLiveness and readiness probes do not run until startup succeeds."]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"Readiness probe"}),"\nIndicates when the instance is ready to accept client traffic."]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"Liveness probe"}),"\nDetermines when the container should be restarted if it becomes unresponsive."]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(i.hr,{}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.strong,{children:"Default timing"})}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:["On ",(0,n.jsx)(i.strong,{children:"data instances"}),", the startup probe must succeed within ",(0,n.jsx)(i.strong,{children:"2 hours"}),".\nIf recovery (e.g., from backup) may take longer, increase the timeout."]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:["Liveness and readiness probes must succeed ",(0,n.jsx)(i.strong,{children:"at least once every 5 minutes"}),"\nfor the pod to be considered healthy."]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(i.hr,{}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.strong,{children:"Probe endpoints"})}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Coordinators"}),": probed on the ",(0,n.jsx)(i.strong,{children:"NuRaft server"})]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Data instances"}),": probed on the ",(0,n.jsx)(i.strong,{children:"Bolt server"})]}),"\n"]}),"\n",(0,n.jsx)(a.P,{type:"warning",children:(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"Breaking change (HA Helm chart 1.0.0)"}),": The probe target port is no longer configurable through\n",(0,n.jsx)(i.code,{children:"container.data.{readinessProbe,livenessProbe,startupProbe}.tcpSocket.port"})," or\n",(0,n.jsx)(i.code,{children:"container.coordinators.{readinessProbe,livenessProbe,startupProbe}.tcpSocket.port"}),".\nProbes are now hard-coded to a ",(0,n.jsx)(i.code,{children:"tcpSocket"})," check against ",(0,n.jsx)(i.code,{children:"ports.boltPort"}
1)," for data\ninstances and ",(0,n.jsx)(i.code,{children:"ports.coordinatorPort"})," for coordinators. Only the probe timings\n(",(0,n.jsx)(i.code,{children:"failureThreshold"}),", ",(0,n.jsx)(i.code,{children:"timeoutSeconds"}),", ",(0,n.jsx)(i.code,{children:"periodSeconds"}),") remain configurable.\nRemove any ",(0,n.jsx)(i.code,{children:"tcpSocket"})," overrides from your ",(0,n.jsx)(i.code,{children:"values.yaml"})," and change the bolt or\ncoordinator port via ",(0,n.jsx)(i.code,{children:"ports.boltPort"})," / ",(0,n.jsx)(i.code,{children:"ports.coordinatorPort"})," instead."]})}),"\n",(0,n.jsx)(i.h2,{id:s[33].id,children:s[33].value}),"\n",(0,n.jsxs)(i.p,{children:["There are different ways in which you can debug Memgraphâs HA cluster in\nproduction. One way is to send us logs from all instances if you notice some\nissue. Thatâs why we advise users to set the log level to ",(0,n.jsx)(i.code,{children:"TRACE"})," if possible.\nNote however that running ",(0,n.jsx)(i.code,{children:"TRACE"})," log level has some performance costs,\nespecially when logging to stderr in addition to files. If performance is your\nconcern, first set ",(0,n.jsx)(i.code,{children:"commonArgs.data.logging.also_log_to_stderr"})," and\n",(0,n.jsx)(i.code,{children:"commonArgs.coordinators.logging.also_log_to_stderr"})," to ",(0,n.jsx)(i.code,{children:"false"})," since logging\nto files is cheaper. If youâre still unhappy with the performance overhead of\nlogging, set ",(0,n.jsx)(i.code,{children:"commonArgs.{data,coordinators}.logging.log_level"})," to ",(0,n.jsx)(i.code,{children:"DEBUG"}),"\n(higher log levels like ",(0,n.jsx)(i.code,{children:"INFO"})," or ",(0,n.jsx)(i.code,{children:"CRITICAL"})," are also fine) and keep\n",(0,n.jsx)(i.code,{children:"also_log_to_stderr: true"}),". These settings replace the ",(0,n.jsx)(i.code,{children:"--log-level"}),",\n",(0,n.jsx)(i.code,{children:"--also-log-to-stderr"}),", ",(0,n.jsx)(i.code,{children:"--log-file"})," and ",(0,n.jsx)(i.code,{children:"--log-retention-days"})," flags that the\nchart now appends to instance args automatically â setting them directly in\n",(0,n.jsx)(i.code,{children:"data[].args"})," or ",(0,n.jsx)(i.code,{children:"coordinators[].args"})," is rejected. Configure log retention via\n",(0,n.jsx)(i.code,{children:"commonArgs.{data,coordinators}.logging.log_retention_days"})," (defaults to ",(0,n.jsx)(i.code,{children:"35"}),")."]}),"\n",(0,n.jsxs)(i.p,{children:["By default, the chart provisions a dedicated log PVC for every data and\ncoordinator pod. If you only log to stderr and donât need a persistent log\nvolume, you can disable the log PVC by setting\n",(0,n.jsx)(i.code,{children:"storage.data.createLogStorageClaim"})," and/or\n",(0,n.jsx)(i.code,{children:"storage.coordinators.createLogStorageClaim"})," to ",(0,n.jsx)(i.code,{children:"false"}),". When you do this you\nmust also set the corresponding ",(0,n.jsx)(i.code,{children:"commonArgs.{data,coordinators}.logging.log_file"}),"\nto ",(0,n.jsx)(i.code,{children:'""'})," to disable file logging â installing the chart with file logging\nenabled but no log volume is rejected."]}),"\n",(0,n.jsxs)(i.p,{children:["If you notice your application is crashing, you will be able to collect core\ndumps by setting ",(0,n.jsx)(i.code,{children:"storage.data.createCoreDumpsClaim"})," and\n",(0,n.jsx)(i.code,{children:"storage.coordinators.createCoreDumpsClaim"})," to ",(0,n.jsx)(i.code,{children:"true"}),". That will trigger the\ncreation of an init container which will be run in privileged mode as the root user\nto set up all the necessary things on your nodes to be able to collect core\ndumps. You can then create the debug pod and attach the PVC containing core dumps to\nthat pod to be able to extract core dumps outside of the K8s nodes. The example\nof such a debug pod is the following YAML file:"]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"apiVersion"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"v1"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"kind"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"Pod"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"metadata"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" name"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"debug-coredump"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"spec"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" containers"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"name"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"debug"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" image"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"ubuntu:22.04"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" command"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": ["}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"sleep"'}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:", "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"infinity"'}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"]"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" volumeMounts"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"name"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"coredumps"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" mountPath"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"/var/core/memgraph"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" volumes"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"name"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"coredumps"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" persistentVolumeClaim"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" claimName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"memgraph-data-0-core-dumps-storage-memgraph-data-0-0"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" restartPolicy"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"Never"})]})]})}),"\n",(0,n.jsxs)(i.p,{children:["There is also a possibility of automatically uploading core dumps to S3. To do that, set ",(0,n.jsx)(i.co
1de,{children:"coreDumpUploader.enabled"})," to ",(0,n.jsx)(i.code,{children:"true"})," and configure the S3 bucket,\nAWS region, and credentials secret in the ",(0,n.jsx)(i.code,{children:"coreDumpUploader"})," section. Note that the ",(0,n.jsx)(i.code,{children:"createCoreDumpsClaim"})," flag for the relevant role (data/coordinators)\nmust also be set to ",(0,n.jsx)(i.code,{children:"true"}),", as the uploader sidecar mounts the same PVC used for core dump storage. Core dumps are uploaded to\n",(0,n.jsx)(i.code,{children:"s3://<s3BucketName>/<s3Prefix>/<pod-hostname>/<core-dump-filename>"}),"."]}),"\n",(0,n.jsx)(i.h2,{id:s[34].id,children:s[34].value}),"\n",(0,n.jsxs)(i.p,{children:["When a pod is stopped (e.g., during upgrades, rescheduling, or scale-down),\nKubernetes sends ",(0,n.jsx)(i.code,{children:"SIGTERM"})," and waits up to ",(0,n.jsx)(i.code,{children:"terminationGracePeriodSeconds"}),"\nfor the container to exit cleanly before forcefully killing it with ",(0,n.jsx)(i.code,{children:"SIGKILL"}),".\nThe HA chart defaults this value to ",(0,n.jsx)(i.strong,{children:"30 seconds"})," for both data\nand coordinator pods, configurable via:"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.code,{children:"container.data.terminationGracePeriodSeconds"})}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.code,{children:"container.coordinators.terminationGracePeriodSeconds"})}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["since ",(0,n.jsx)(i.code,{children:"--storage-snapshot-on-exit"})," is explicitly set to false by default."]}),"\n",(0,n.jsx)(i.h3,{id:s[35].id,children:s[35].value}),"\n",(0,n.jsxs)(i.p,{children:["If you enable the ",(0,n.jsx)(i.a,{href:"/database-management/configuration",children:(0,n.jsx)(i.code,{children:"--storage-snapshot-on-exit"})}),"\nflag on data instances, Memgraph will attempt to create a full snapshot of the\ndatabase during shutdown. Snapshot creation time scales with dataset size and\ncan easily exceed the default grace period on larger deployments."]}),"\n",(0,n.jsxs)(a.P,{type:"warning",children:[(0,n.jsxs)(i.p,{children:["If ",(0,n.jsx)(i.code,{children:"terminationGracePeriodSeconds"})," is shorter than the time needed to write the\non-exit snapshot, Kubernetes will ",(0,n.jsx)(i.code,{children:"SIGKILL"})," the Memgraph process mid-write,\nleaving the snapshot incomplete and defeating the purpose of the flag."]}),(0,n.jsxs)(i.p,{children:["When enabling ",(0,n.jsx)(i.code,{children:"--storage-snapshot-on-exit"}),", set\n",(0,n.jsx)(i.code,{children:"container.data.terminationGracePeriodSeconds"})," to a value that comfortably\ncovers the expected snapshot duration for your dataset. Benchmark the snapshot\ntime on a representative dataset and add a safety margin."]})]}),"\n",(0,n.jsx)(i.h2,{id:s[36].id,children:s[36].value}),"\n",(0,n.jsx)(i.p,{children:"Memgraph HA integrates with Kubernetes monitoring tools through:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["The ",(0,n.jsx)(i.a,{href:"https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack",children:"kube-prometheus-stack"})," Helm chart"]}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://github.com/memgraph/prometheus-exporter",children:"Memgraphâs Prometheus exporter"})}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["The chart ",(0,n.jsx)(i.code,{children:"kube-prometheus-stack"})," should be installed independently from the HA\nchart. Add the ",(0,n.jsx)(i.code,{children:"prometheus-community"})," Helm repository and install (or upgrade) the\nrelease into the ",(0,n.jsx)(i.code,{children:"monitoring"})," namespace:"]}),"\n",(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"helm"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" repo"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" add"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" prometheus-community"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" https://prometheus-community.github.io/helm-charts"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"helm"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" repo"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" update"})]}),"\n",(0,n.jsx)(i.span,{children:" "}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"helm"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" upgrade"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --install"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" kube-prometheus-stack"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" prometheus-community/kube-prometheus-stack"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --namespace"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" monitoring"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --create-namespace"})]})]})}),"\n",(0,n.jsxs)(i.p,{children:["Remember the release name (",(0,n.jsx)(i.co
1de,{children:"kube-prometheus-stack"}),") and the namespace (",(0,n.jsx)(i.code,{children:"monitoring"}),"):\nthe HA chart needs both to wire its ",(0,n.jsx)(i.code,{children:"ServiceMonitor"})," and Grafana dashboard to this\nstack (see ",(0,n.jsx)(i.a,{href:"#configuration-options",children:(0,n.jsx)(i.code,{children:"prometheus.serviceMonitor.kubePrometheusStackReleaseName"})}),"\nand ",(0,n.jsx)(i.code,{children:"prometheus.namespace"})," below)."]}),"\n",(0,n.jsxs)(i.p,{children:["To customize the stack, pass your own values file with ",(0,n.jsx)(i.code,{children:"-f kube_prometheus_stack_values.yaml"}),".\nA template is available in the upstream ",(0,n.jsx)(i.a,{href:"https://github.com/prometheus-community/helm-charts/blob/main/charts/kube-prometheus-stack/values.yaml",children:"chartâs\nrepository"}),"."]}),"\n",(0,n.jsxs)(i.p,{children:["If you scrape through ",(0,n.jsx)(i.code,{children:"mg-exporter"})," (see the next section) you can additionally pass\n",(0,n.jsx)(i.code,{children:"-f kube_prometheus_stack_memgraph_dashboard.yaml"}),", a generic dashboard which shows the metrics\nthat the exporter exposes for both standalone and HA deployments. The dashboard file can be downloaded from\n",(0,n.jsx)(i.a,{href:"https://github.com/memgraph/prometheus-exporter/blob/main/kube_prometheus_stack_memgraph_dashboard.yaml",children:"here"}),".\nWhen scraping Memgraph directly, use the bundled ",(0,n.jsx)(i.strong,{children:"Memgraph OpenMetrics"})," dashboard\ninstead (see ",(0,n.jsx)(i.a,{href:"#grafana-dashboard-for-direct-scraping",children:"Grafana dashboard for direct scraping"}),")."]}),"\n",(0,n.jsxs)(i.p,{children:["If you install the ",(0,n.jsx)(i.code,{children:"kube-prometheus-stack"})," in a ",(0,n.jsx)(i.strong,{children:"non-default namespace"}),", allow\ncross-namespace scraping. You can allow this by adding the following\nconfiguration to your ",(0,n.jsx)(i.code,{children:"kube_prometheus_stack_values.yaml"})," file:"]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"prometheus"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" prometheusSpec"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" serviceMonitorSelectorNilUsesHelmValues"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"false"})]})]})}),"\n",(0,n.jsx)(i.h3,{id:s[37].id,children:s[37].value}),"\n",(0,n.jsx)(i.p,{children:"To enable the Memgraph Prometheus exporter and ServiceMonitor:"}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"prometheus"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" namespace"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"monitoring"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" memgraphExporter"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" port"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"9115"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" pullFrequencySeconds"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"5"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" repository"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"memgraph/mg-exporter"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" tag"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"0.2.3"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" serviceMonitor"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" kubePrometheusStackReleaseName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"kube-prometheus-stack"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" interval"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"15s"})]})]})}
1),"\n",(0,n.jsxs)(i.p,{children:["If you set ",(0,n.jsx)(i.code,{children:"prometheus.enabled"})," to ",(0,n.jsx)(i.code,{children:"false"}),", resources from\n",(0,n.jsx)(i.code,{children:"charts/memgraph-high-availability/templates/mg-exporter.yaml"})," will still be\ninstalled into the ",(0,n.jsx)(i.code,{children:"monitoring"})," namespace."]}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.code,{children:"prometheus.serviceMonitor.enabled"})," defaults to ",(0,n.jsx)(i.code,{children:"false"}),"; set it to ",(0,n.jsx)(i.code,{children:"true"})," only\nwhen you have ",(0,n.jsx)(i.code,{children:"kube-prometheus-stack"})," (or another Prometheus Operator) in the\ncluster to consume the ",(0,n.jsx)(i.code,{children:"ServiceMonitor"})," resource."]}),"\n",(0,n.jsx)(i.p,{children:"Refer to the configuration table later in the document for details on all\nparameters."}),"\n",(0,n.jsx)(i.h4,{id:s[38].id,children:s[38].value}),"\n",(0,n.jsxs)(i.p,{children:["When any data instance or coordinator has ",(0,n.jsx)(i.code,{children:"tls.bolt.enabled: true"}),", the\nchart automatically configures the mg-exporter to scrape that instance over\n",(0,n.jsx)(i.code,{children:"https://"})," instead of ",(0,n.jsx)(i.code,{children:"http://"}),". Each instance entry in the exporter config\nalso gets ",(0,n.jsx)(i.code,{children:"skip_tls_verify"})," and (optionally) ",(0,n.jsx)(i.code,{children:"ca_file"})," derived from\n",(0,n.jsx)(i.code,{children:"prometheus.memgraphExporter.tls"}),":"]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"prometheus"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" memgraphExporter"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" tls"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" skipVerify"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" caSecretName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'""'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" caSecretKey"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"ca.crt"})]})]})}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"skipVerify"})," â when ",(0,n.jsx)(i.code,{children:"true"})," (default), the exporter does not verify the\nMemgraph server certificate. Convenient for self-signed certs but not\nsuitable for production."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"caSecretName"})," â name of a pre-created Secret holding the CA bundle that\nsigned Memgraphâs certificate. When set and ",(0,n.jsx)(i.code,{children:"skipVerify"})," is ",(0,n.jsx)(i.code,{children:"false"}),", the\nchart mounts the Secret at ",(0,n.jsx)(i.code,{children:"/etc/mg-exporter/ssl"})," and passes\n",(0,n.jsx)(i.code,{children:"ca_file=/etc/mg-exporter/ssl/<caSecretKey>"})," to the exporter."]}
1),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"caSecretKey"})," â key inside the Secret holding the CA certificate\n(default ",(0,n.jsx)(i.code,{children:"ca.crt"}),")."]}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:"Example with strict CA verification:"}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"prometheus"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" memgraphExporter"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" tls"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" skipVerify"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"false"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" caSecretName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"bolt-ca-bundle"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" caSecretKey"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"ca.crt"})]})]})}),"\n",(0,n.jsx)(i.h3,{id:s[39].id,children:s[39].value}),"\n",(0,n.jsxs)(i.p,{children:["From Memgraph 3.11, Memgraph can serve metrics in Prometheus\n",(0,n.jsx)(i.a,{href:"https://prometheus.io/docs/specs/om/open_metrics_spec/",children:"OpenMetrics"})," format on its\nHTTP monitoring port, so the cluster can be scraped directly and ",(0,n.jsx)(i.code,{children:"mg-exporter"})," can be\nskipped entirely."]}),"\n",(0,n.jsx)(i.p,{children:"To start the HA chart with direct scraping you need:"}),"\n",(0,n.jsxs)(i.ol,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"A Prometheus Operator in the cluster"})," â for example ",(0,n.jsx)(i.code,{children:"kube-prometheus-stack"}),"\ninstalled as shown ",(0,n.jsx)(i.a,{href:"#monitoring",children:"above"}),". The HA chart only creates a\n",(0,n.jsx)(i.code,{children:"ServiceMonitor"}),"; something must consume it."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:(0,n.jsx)(i.code,{children:"scrapeMemgraphDirectly: true"})})," â the chart appends ",(0,n.jsx)(i.code,{children:"--metrics-format=OpenMetrics"}),"\nto every coordinator and data instance and adds a ",(0,n.jsx)(i.code,{children:"tcp-metrics-port"})," to each\ninstance ",(0,n.jsx)(i.code,{children:"Service"})," so it can be discovered."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:(0,n.jsx)(i.code,{children:"prometheus.enabled: false"})})," â no ",(0,n.jsx)(i.code,{children:"mg-exporter"})," is deployed."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:(0,n.jsx)(i.code,{children:"prometheus.serviceMonitor.enabled: true"})})," â provisions the ",(0,n.jsx)(i.code,{children:"ServiceMonitor"}),"\nthat targets each instance ",(0,n.jsx)(i.code,{children:"Service"})," directly."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Matching release name and namespace"})," â the ",(0,n.jsx)(i.code,{children:"ServiceMonitor"})," is labelled\n",(0,n.jsx)(i.code,{children:"release: <prometheus.serviceMonitor.kubePrometheusStackReleaseName>"}
1),", which is how\n",(0,n.jsx)(i.code,{children:"kube-prometheus-stack"})," selects it, and it is created in ",(0,n.jsx)(i.code,{children:"prometheus.namespace"}),"\n(falls back to the release namespace). Both must match the ",(0,n.jsx)(i.code,{children:"kube-prometheus-stack"}),"\nHelm release name and namespace you used when installing the stack."]}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["A minimal values file for the default installation of ",(0,n.jsx)(i.code,{children:"kube-prometheus-stack"}),"\n(release ",(0,n.jsx)(i.code,{children:"kube-prometheus-stack"})," in namespace ",(0,n.jsx)(i.code,{children:"monitoring"}),") looks like this:"]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:"# Every coordinator and data instance serves OpenMetrics; the chart exposes their"})}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:"# monitoring ports automatically."})}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"scrapeMemgraphDirectly"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsx)(i.span,{children:" "}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"prometheus"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"false"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:" # no mg-exporter is deployed"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" namespace"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"monitoring"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:" # where kube-prometheus-stack lives; the ServiceMonitor is created here"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" serviceMonitor"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:" # in-cluster: kube-prometheus-stack scrapes each instance directly"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" kubePrometheusStackReleaseName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"kube-prometheus-stack"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:" # must equal the Helm release name"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" interval"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"15s"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" grafanaDashboard"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:' # optional: ship the "Memgraph OpenMetrics" dashboard'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" namespace"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"monitoring"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:" # a namespace the Grafana sidecar watches"})]})]})}
1),"\n",(0,n.jsxs)(i.p,{children:["The ",(0,n.jsx)(i.code,{children:"ServiceMonitor"})," selects the instance ",(0,n.jsx)(i.code,{children:"Services"})," in the HA chartâs release\nnamespace through its ",(0,n.jsx)(i.code,{children:"namespaceSelector"}),", so the HA chart and ",(0,n.jsx)(i.code,{children:"kube-prometheus-stack"}),"\ncan live in different namespaces without any extra configuration."]}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.code,{children:"scrapeMemgraphDirectly"})," only selects the metrics ",(0,n.jsx)(i.em,{children:"format and target"})," â on its own it\ndoes not scrape anything. You still enable a scraper:"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"In-cluster"}),": ",(0,n.jsx)(i.code,{children:"prometheus.serviceMonitor.enabled: true"})," provisions a ",(0,n.jsx)(i.code,{children:"ServiceMonitor"}),"\nthat ",(0,n.jsx)(i.code,{children:"kube-prometheus-stack"})," uses to scrape each Memgraph instance directly."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"Remote"}),": ",(0,n.jsx)(i.code,{children:"vmagentRemote.enabled: true"})," makes vmagent scrape the instances directly\nand remote-write the metrics (see ",(0,n.jsx)(i.a,{href:"#remote-metrics-and-logs",children:"Remote metrics and logs"}),")."]}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["The same switch governs both paths. When it is ",(0,n.jsx)(i.code,{children:"false"}),", those scrapers read the\n",(0,n.jsx)(i.code,{children:"mg-exporter"})," instead, which requires ",(0,n.jsx)(i.code,{children:"prometheus.enabled: true"}),"."]}),"\n",(0,n.jsx)(a.P,{type:"info",children:(0,n.jsxs)(i.p,{children:["Direct scraping requires Memgraph >= 3.11. When ",(0,n.jsx)(i.code,{children:"scrapeMemgraphDirectly: true"}),", the\nchart runs every coordinator and data instance with ",(0,n.jsx)(i.code,{children:"--metrics-format=OpenMetrics"})," and\nexposes their monitoring ports automatically. The metric names differ from the legacy\nJSON exporter, so use the bundled ",(0,n.jsx)(i.strong,{children:"Memgraph OpenMetrics"})," dashboard."]})}),"\n",(0,n.jsxs)(i.p,{children:["After installing the HA chart, verify that the ",(0,n.jsx)(i.code,{children:"ServiceMonitor"})," exists and that\nPrometheus picked up the targets:"]}),"\n",(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" get"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" servicemonitor"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" -n"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" monitoring"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" port-forward"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" -n"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" monitoring"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" svc/kube-prometheus-stack-prometheus"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" 9090:9090"})]})]})}),"\n",(0,n.jsxs)(i.p,{children:["Open ",(0,n.jsx)(i.code,{children:"http://localhost:9090/targets"})," and look for the\n",(0,n.jsx)(i.code,{children:"serviceMonitor/monitoring/<release-name>-memgraph/0"})," job; every coordinator and data\ninstance should be listed as ",(0,n.jsx)(i.code,{children:"UP"}),". If the job is missing, the ",(0,n.jsx)(i.code,{children:"release"})," label or\nnamespace does not match your ",(0,n.jsx)(i.code,{children:"kube-prometheus-stack"})," installation."]}),"\n",(0,n.jsx)(i.h4,{id:s[40].id,children:s[40].value}
1),"\n",(0,n.jsxs)(i.p,{children:["Set ",(0,n.jsx)(i.code,{children:"prometheus.grafanaDashboard.enabled: true"})," to ship the bundled âMemgraph\nOpenMetricsâ Grafana dashboard as a ",(0,n.jsx)(i.code,{children:"ConfigMap"})," (labelled ",(0,n.jsx)(i.code,{children:"grafana_dashboard"}),") for a\nGrafana sidecar (e.g. the one bundled with ",(0,n.jsx)(i.code,{children:"kube-prometheus-stack"}),") to auto-load. The\ndashboard uses a datasource template variable, so it binds to Grafanaâs default\nPrometheus. The ",(0,n.jsx)(i.code,{children:"ConfigMap"})," must live in a namespace the sidecar watches â set\n",(0,n.jsx)(i.code,{children:"prometheus.grafanaDashboard.namespace"})," to Grafanaâs namespace (or run the sidecar with\n",(0,n.jsx)(i.code,{children:"searchNamespace: ALL"}),")."]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"prometheus"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" grafanaDashboard"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" namespace"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"monitoring"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" label"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"grafana_dashboard"})]})]})}),"\n",(0,n.jsxs)(i.p,{children:["A second dashboard, ",(0,n.jsx)(i.strong,{children:"Memgraph Logs"}),", covers the logs shipped by ",(0,n.jsx)(i.code,{children:"vectorRemote"})," and is\nenabled with ",(0,n.jsx)(i.code,{children:"vectorRemote.grafanaDashboard.enabled: true"})," â see\n",(0,n.jsx)(i.a,{href:"#grafana-dashboards",children:"Grafana dashboards"}),"."]}),"\n",(0,n.jsx)(i.h3,{id:s[41].id,children:s[41].value}),"\n",(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsx)(i.code,{children:(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"helm"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" uninstall"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" kube-prometheus-stack"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --namespace"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" monitoring"})]})})}),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"Note:"}),"\nThe stackâs CRDs are ",(0,n.jsx)(i.strong,{children:"not"})," deleted automatically and must be removed manually:"]}),"\n",(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" delete"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" crd"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" alertmanagerconfigs.monitoring.coreos.com"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" delete"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" crd"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" alertmanagers.monitoring.coreos.com"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" delete"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" crd"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" podmonitors.monitoring.coreos.com"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" delete"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" crd"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" probes.monitoring.coreos.com"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" delete"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" crd"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" prometheusagents.monitoring.coreos.com"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" delete"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" crd"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" prometheuses.monitoring.coreos.com"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" delete"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" crd"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" prometheusrules.monitoring.coreos.com"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" delete"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" crd"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" scrapeconfigs.monitoring.coreos.com"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" delete"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" crd"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" servicemonitors.monitoring.coreos.com"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" delete"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" crd"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" thanosrulers.monitoring.coreos.com"})]})]})}),"\n",(0,n.jsx)(i.h3,{id:s[42].id,children:s[42].value}),"\n",(0,n.jsx)(i.p,{children:"The HA chart supports optional remote observability:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.co
1de,{children:"vmagentRemote"})," for shipping metrics with Prometheus ",(0,n.jsx)(i.code,{children:"remote_write"})]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"vectorRemote"})," sidecars for shipping Memgraph logs to Loki-compatible endpoints"]}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:"Prerequisites:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["keep ",(0,n.jsx)(i.code,{children:"prometheus.enabled: true"})," so ",(0,n.jsx)(i.code,{children:"mg-exporter"})," is deployed â or set ",(0,n.jsx)(i.code,{children:"scrapeMemgraphDirectly: true"})," with ",(0,n.jsx)(i.code,{children:"prometheus.enabled: false"})," to have vmagent scrape Memgraphâs OpenMetrics endpoint directly (no exporter; see ",(0,n.jsx)(i.a,{href:"#scrape-memgraph-directly-without-mg-exporter",children:"Scrape Memgraph directly"}),")"]}),"\n",(0,n.jsxs)(i.li,{children:["if you only need remote shipping and not local scraping, set ",(0,n.jsx)(i.code,{children:"prometheus.serviceMonitor.enabled: false"})," to avoid duplicate scraping"]}),"\n",(0,n.jsxs)(i.li,{children:["configure ",(0,n.jsx)(i.code,{children:"vectorRemote.data"})," and/or ",(0,n.jsx)(i.code,{children:"vectorRemote.coordinators"})," depending on which pod roles should ship logs"]}),"\n",(0,n.jsxs)(i.li,{children:["when ",(0,n.jsx)(i.code,{children:"vectorRemote.enabled: true"}),", add ",(0,n.jsx)(i.code,{children:"--monitoring-port=<vectorRemote.websocketPort>"})," and ",(0,n.jsx)(i.code,{children:"--monitoring-address=0.0.0.0"})," to each instance ",(0,n.jsx)(i.code,{children:"args"})]}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["Example ",(0,n.jsx)(i.code,{children:"values.yaml"}),":"]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"prometheus"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" namespace"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"monitoring"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" serviceMonitor"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"false"})]}),"\n",(0,n.jsx)(i.span,{children:" "}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"vmagentRemote"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" namespace"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"monitoring"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" remoteWrite"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" url"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"https://<prom-remote-write>/api/v1/write"'})]}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:" # Optional: only set basicAuth when your remote_write endpoint requires basic auth."})}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" basicAuth"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" secretName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"monitoring-basic-auth"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" usernameKey"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"username"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" passwordKey"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"password"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" externalLabels"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" cluster_id"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"memgraph-testing-cluster-53"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" service_name"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"memgraph-ha"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" cluster_env"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"self-hosted-large-01"'})]}),"\n",(0,n.jsx)(i.span,{children:" "}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"vectorRemote"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" data"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" coordinators"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" websocketPort"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"7444"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" logsEndpoint"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"https://<loki-endpoint>"'})]}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:" # Optional: only set auth when your endpoint requires basic auth."})}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" auth"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" secretName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"monitoring-basic-auth"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" usernameKey"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"username"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" passwordKey"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"password"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" extraLabels"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" cluster_id"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"memgraph-testing-cluster-53"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" service_name"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"memgraph-ha"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" cluster_env"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"self-hosted-large-01"'})]}),"\n",(0,n.jsx)(i.span,{children:" "}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"data"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"id"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"0"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" args"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"--monitoring-port=7444"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"--monitoring-address=0.0.0.0"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"id"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"1"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" args"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"--monitoring-port=7444"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"--monitoring-address=0.0.0.0"'})]}),"\n",(0,n.jsx)(i.span,{children:" "}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"coordinators"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"id"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"1"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" args"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"--monitoring-port=7444"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"--monitoring-address=0.0.0.0"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"id"}),(0,n.jsx)(i
1.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"2"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" args"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"--monitoring-port=7444"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"--monitoring-address=0.0.0.0"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"id"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"3"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" args"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"--monitoring-port=7444"'})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:'"--monitoring-address=0.0.0.0"'})]})]})}),"\n",(0,n.jsx)(a.P,{type:"info",children:(0,n.jsxs)(i.p,{children:["The chart auto-appends ",(0,n.jsx)(i.code,{children:"--bolt-port"}),", ",(0,n.jsx)(i.code,{children:"--management-port"}),", ",(0,n.jsx)(i.code,{children:"--coordinator-port"}),",\n",(0,n.jsx)(i.code,{children:"--coordinator-id"}),", ",(0,n.jsx)(i.code,{children:"--coordinator-hostname"}),", ",(0,n.jsx)(i.code,{children:"--data-directory"}),", ",(0,n.jsx)(i.code,{children:"--log-level"}),",\n",(0,n.jsx)(i.code,{children:"--also-log-to-stderr"}),", ",(0,n.jsx)(i.code,{children:"--log-file"}),", ",(0,n.jsx)(i.code,{children:"--bolt-cert-file"}),", ",(0,n.jsx)(i.code,{children:"--bolt-key-file"}),",\n",(0,n.jsx)(i.code,{children:"--cluster-cert-file"}),", ",(0,n.jsx)(i.code,{children:"--cluster-key-file"})," and ",(0,n.jsx)(i.code,{children:"--cluster-ca-file"}),"\nfrom ",(0,n.jsx)(i.code,{children:"ports.*"}),", ",(0,n.jsx)(i.code,{children:"commonArgs.{data,coordinators}.logging.*"})," and the per-instance\n",(0,n.jsx)(i.code,{children:"tls.bolt.*"})," / ",(0,n.jsx)(i.code,{children:"tls.intraCluster.*"})," blocks. Setting any of these in ",(0,n.jsx)(i.code,{children:"data[].args"})," or\n",(0,n.jsx)(i.code,{children:"coordinators[].args"})," causes ",(0,n.jsx)(i.code,{children:"helm install"})," to fail with a template error."]})}),"\n",(0,n.jsxs)(i.p,{children:["Create credentials secret in the namespace where vmagent runs (usually ",(0,n.jsx)(i.code,{children:"monitoring"}),"):"]}),"\n",(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" create"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" secret"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" generic"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" monitoring-basic-auth"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" -n"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" monitoring"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --from-literal=username="}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"'<username>'"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --from-literal=password="}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"'<password>'"})]})]})}),"\n",(0,n.jsx)(i.p,{children:"For HA Vector sidecars, create the same secret in the Memgraph release namespace as well:"}),"\n",(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" create"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" secret"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" generic"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" monitoring-basic-auth"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" -n"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" <"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"memgraph-namespac"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"e"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:">"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --from-literal=username="}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"'<username>'"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" \\"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --from-literal=password="}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"'<password>'"})]})]})}),"\n",(0,n.jsx)(i.h4,{id:s[43].id,children:s[43].value}
1),"\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.code,{children:"vmagentRemote"})," can additionally scrape Kubernetes infrastructure metrics\n(",(0,n.jsx)(i.code,{children:"kube-state-metrics"}),", ",(0,n.jsx)(i.code,{children:"node-exporter"}),", ",(0,n.jsx)(i.code,{children:"kubelet"}),") required by\n",(0,n.jsx)(i.code,{children:"kube-prometheus-stack"})," Kubernetes and Node dashboards, and remote-write them\nto your centralized monitoring cluster."]}),"\n",(0,n.jsxs)(i.p,{children:["Enable Kubernetes scraping by extending your existing ",(0,n.jsx)(i.code,{children:"vmagentRemote"})," values:"]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"vmagentRemote"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:" # ... existing fields (enabled, remoteWrite, externalLabels) ..."})}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" kubernetes"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" kubeStateMetrics"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" jobName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"kube-state-metrics"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" targets"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"kube-prometheus-stack-kube-state-metrics.monitoring.svc.cluster.local:8080"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" nodeExporter"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" jobName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"node-exporter"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" targets"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" - "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"kube-prometheus-stack-prometheus-node-exporter.monitoring.svc.cluster.local:9100"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" kubelet"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" jobName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"kubelet"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" metricsPath"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"/metrics/cadvisor"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" apiServerAddress"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"kubernetes.default.svc:443"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" insecureSkipVerify"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"false"})]})]})}),"\n",(0,n.jsx)(i.p,{children:"Notes:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["RBAC and ",(0,n.jsx)(i.co
1de,{children:"ServiceAccount"})," resources are created only when an enabled scrape\njob requires Kubernetes API access (for example ",(0,n.jsx)(i.code,{children:"kubelet.enabled=true"})," or\n",(0,n.jsx)(i.code,{children:"nodeExporter.useKubernetesDiscovery=true"}),")."]}),"\n",(0,n.jsxs)(i.li,{children:["Keep ",(0,n.jsx)(i.code,{children:"jobName"})," values aligned with dashboard and recording-rule expectations\nunless you also update those queries."]}),"\n",(0,n.jsx)(i.li,{children:"Dashboards that rely on precomputed recording-rule series still require\nrule evaluation in your monitoring stack."}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["A ready-to-use example values file is available in the Helm charts repository:\n",(0,n.jsx)(i.a,{href:"https://github.com/memgraph/helm-charts/blob/main/examples/remote-monitoring/values-ha-k8s-metrics.yaml",children:(0,n.jsx)(i.code,{children:"examples/remote-monitoring/values-ha-k8s-metrics.yaml"})}),"."]}),"\n",(0,n.jsx)(i.h4,{id:s[44].id,children:s[44].value}),"\n",(0,n.jsxs)(i.p,{children:["The chart bundles two dashboards, each shipped as its own ",(0,n.jsx)(i.code,{children:"ConfigMap"})," (labelled\n",(0,n.jsx)(i.code,{children:"grafana_dashboard"}),") for a Grafana sidecar to auto-load, and each behind its own flag:"]}),"\n",(0,n.jsxs)(i.table,{children:[(0,n.jsx)(i.thead,{children:(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.th,{children:"Dashboard"}),(0,n.jsx)(i.th,{children:"Enable with"}),(0,n.jsx)(i.th,{children:"Shows"})]})}),(0,n.jsxs)(i.tbody,{children:[(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.strong,{children:"Memgraph OpenMetrics"})}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"prometheus.grafanaDashboard.enabled: true"})}),(0,n.jsxs)(i.td,{children:["The metrics ",(0,n.jsx)(i.code,{children:"vmagentRemote"})," scrapes and remote-writes"]})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.strong,{children:"Memgraph Logs"})}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vectorRemote.grafanaDashboard.enabled: true"})}),(0,n.jsxs)(i.td,{children:["The logs ",(0,n.jsx)(i.code,{children:"vectorRemote"})," ships to VictoriaLogs"]})]})]})]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"prometheus"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" grafanaDashboard"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" namespace"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"monitoring"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:" # must be a namespace the Grafana sidecar watches"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" label"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"grafana_dashboard"})]}),"\n",(0,n.jsx)(i.span,{children:" "}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"vectorRemote"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" grafanaDashboard"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" enabled"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" namespace"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"monitoring"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" label"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"grafana_dashboard"})]})]})}
1),"\n",(0,n.jsxs)(i.p,{children:["Each ",(0,n.jsx)(i.code,{children:"ConfigMap"})," must live in a namespace the sidecar watches â set ",(0,n.jsx)(i.code,{children:"namespace"})," to\nGrafanaâs namespace (or run the sidecar with ",(0,n.jsx)(i.code,{children:"searchNamespace: ALL"}),"). Both default to\n",(0,n.jsx)(i.code,{children:"prometheus.namespace"}),", else the release namespace. The metrics dashboard is also covered\nunder ",(0,n.jsx)(i.a,{href:"#grafana-dashboard-for-direct-scraping",children:"Grafana dashboard for direct scraping"}),"."]}),"\n",(0,n.jsxs)(i.p,{children:["Both use datasource template variables rather than hardcoded UIDs, so they bind to the\ndatasources you select. The OpenMetrics dashboard needs a Prometheus-compatible one\n(âData sourceâ); the logs dashboard needs a VictoriaLogs one (âLogs data sourceâ) for its\npanels plus a Prometheus-compatible one (âMetrics data sourceâ) that populates its filter\nvariables. Both filter on the ",(0,n.jsx)(i.code,{children:"cluster_id"}),", ",(0,n.jsx)(i.code,{children:"cluster_env"})," and ",(0,n.jsx)(i.code,{children:"service_name"})," labels you set\nin ",(0,n.jsx)(i.code,{children:"vmagentRemote.externalLabels"})," and ",(0,n.jsx)(i.code,{children:"vectorRemote.extraLabels"}),", and break metrics and logs\ndown per instance, so you can compare coordinators and data instances in the same view."]}),"\n",(0,n.jsxs)(i.p,{children:["If you do not run a Grafana sidecar, both dashboards can be imported by hand via\n",(0,n.jsx)(i.em,{children:"Dashboards"})," â ",(0,n.jsx)(i.em,{children:"New"})," â ",(0,n.jsx)(i.em,{children:"Import"})," in Grafana â they live in the Helm charts repository under\n",(0,n.jsx)(i.a,{href:"https://github.com/memgraph/helm-charts/tree/main/charts/memgraph-high-availability/dashboards",children:(0,n.jsx)(i.code,{children:"charts/memgraph-high-availability/dashboards/"})}),"."]}),"\n",(0,n.jsx)(i.h2,{id:s[45].id,children:s[45].value}),"\n",(0,n.jsx)(i.p,{children:"The following table lists the configurable parameters of the Memgraph HA chart\nand their default values."}),"\n",(0,n.jsxs)(i.table,{children:[(0,n.jsx)(i.thead,{children:(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.th,{children:"Parameter"}),(0,n.jsx)(i.th,{children:"Description"}),(0,n.jsx)(i.th,{children:"Default"})]})}),(0,n.jsxs)(i.tbody,{children:[(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"image.repository"})}),(0,n.jsx)(i.td,{children:"Memgraph Docker image repository"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"docker.io/memgraph/memgraph"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"image.tag"})}),(0,n.jsx)(i.td,{children:"Specific tag for the Memgraph Docker image. Overrides the image tag whose default is chart version."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"3.1.0"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"image.pullPolicy"})}),(0,n.jsx)(i.td,{children:"Image pull policy"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"IfNotPresent"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"memgraphUserId"})}),(0,n.jsx)(i.td,{children:"The user id that is hardcoded in Memgraph and Mage images"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"101"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"memgraphGroupId"})}),(0,n.jsx)(i.td,{children:"The group id that is hardcoded in Memgraph and Mage images"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"103"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"clusterDomain"})}),(0,n.jsxs)(i.td,{children:["Kubernetes cluster domain used to build the internal FQDN service addresses (",(0,n.jsx)(i.code,{children:"<svc>.<namespace>.svc.<clusterDomain>"}),") of data instances and coordinators. Override if your cluster uses a custom domain."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"cluster.local"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.co
1de,{children:"storage.data.libPVCSize"})}),(0,n.jsx)(i.td,{children:"Size of the lib storage PVC for data instances"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"1Gi"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.data.libStorageAccessMode"})}),(0,n.jsx)(i.td,{children:"Access mode used for lib storage on data instances"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"ReadWriteOnce"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.data.libStorageClassName"})}),(0,n.jsx)(i.td,{children:"The name of the storage class used for storing data on data instances"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:'""'})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.data.createLogStorageClaim"})}),(0,n.jsxs)(i.td,{children:["Create a PVC for logs on data instances. When ",(0,n.jsx)(i.code,{children:"false"}),", ",(0,n.jsx)(i.code,{children:"commonArgs.data.logging.log_file"})," must be ",(0,n.jsx)(i.code,{children:'""'}),"."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"true"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.data.logPVCSize"})}),(0,n.jsx)(i.td,{children:"Size of the log PVC for data instances"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"1Gi"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.data.logStorageAccessMode"})}),(0,n.jsx)(i.td,{children:"Access mode used for log storage on data instances"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"ReadWriteOnce"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.data.logStorageClassName"})}),(0,n.jsx)(i.td,{children:"The name of the storage class used for storing logs on data instances"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:'""'})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.data.createCoreDumpsClaim"})}),(0,n.jsx)(i.td,{children:"Create a PVC for core dumps on data instances"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"false"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.data.coreDumpsStorageClassName"})}),(0,n.jsx)(i.td,{children:"Storage class name for core dumps PVC on data instances"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:'""'})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.data.coreDumpsStorageSize"})}),(0,n.jsx)(i.td,{children:"Size of the core dumps PVC on data instances"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"10Gi"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.data.coreDumpsMountPath"})}),(0,n.jsx)(i.td,{children:"Mount path for core dumps on data instances"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"/var/core/memgraph"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.data.coreDumpsImage.repository"})}),(0,n.jsx)(i.td,{children:"Image repository for the data instance core-dumps init container."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"docker.io/library/busybox"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.data.coreDumpsImage.tag"})}),(0,n.jsx)(i.td,{children:"Image tag for the data instance core-dumps init container."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"1.37.0"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.data.coreDumpsImage.pullPolicy"})}),(0,n.jsx)(i.td,{children:"Image pull policy for the data instance core-dumps init container."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"IfNotPresent"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.data.extraVolumes"})}),(0,n.jsx)(i.td,{children:"Additional volumes to add to data instance pods"}
1),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"[]"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.data.extraVolumeMounts"})}),(0,n.jsx)(i.td,{children:"Additional volume mounts to add to data instance containers"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"[]"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.coordinators.libPVCSize"})}),(0,n.jsx)(i.td,{children:"Size of the lib storage PVC for coordinators"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"1Gi"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.coordinators.libStorageAccessMode"})}),(0,n.jsx)(i.td,{children:"Access mode used for lib storage on coordinators"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"ReadWriteOnce"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.coordinators.libStorageClassName"})}),(0,n.jsx)(i.td,{children:"The name of the storage class used for storing data on coordinators"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:'""'})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.coordinators.createLogStorageClaim"})}),(0,n.jsxs)(i.td,{children:["Create a PVC for logs on coordinators. When ",(0,n.jsx)(i.code,{children:"false"}),", ",(0,n.jsx)(i.code,{children:"commonArgs.coordinators.logging.log_file"})," must be ",(0,n.jsx)(i.code,{children:'""'}),"."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"true"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.coordinators.logPVCSize"})}),(0,n.jsx)(i.td,{children:"Size of the log PVC for coordinators"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"1Gi"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.coordinators.logStorageAccessMode"})}),(0,n.jsx)(i.td,{children:"Access mode used for log storage on coordinators"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"ReadWriteOnce"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.coordinators.logStorageClassName"})}),(0,n.jsx)(i.td,{children:"The name of the storage class used for storing logs on coordinators"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:'""'})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.coordinators.createCoreDumpsClaim"})}),(0,n.jsx)(i.td,{children:"Create a PVC for core dumps on coordinators"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"false"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.coordinators.coreDumpsStorageClassName"})}),(0,n.jsx)(i.td,{children:"Storage class name for core dumps PVC on coordinators"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:'""'})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.coordinators.coreDumpsStorageSize"})}),(0,n.jsx)(i.td,{children:"Size of the core dumps PVC on coordinators"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"10Gi"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.coordinators.coreDumpsMountPath"})}),(0,n.jsx)(i.td,{children:"Mount path for core dumps on coordinators"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"/var/core/memgraph"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.coordinators.coreDumpsImage.repository"})}),(0,n.jsx)(i.td,{children:"Image repository for the coordinator core-dumps init container."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"docker.io/library/busybox"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.coordinators.coreDumpsImage.tag"})}),(0,n.jsx)(i.td,{children:"Image tag for the coordinator core-dumps init container."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"1.37.0"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.co
1de,{children:"storage.coordinators.coreDumpsImage.pullPolicy"})}),(0,n.jsx)(i.td,{children:"Image pull policy for the coordinator core-dumps init container."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"IfNotPresent"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.coordinators.extraVolumes"})}),(0,n.jsx)(i.td,{children:"Additional volumes to add to coordinator pods"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"[]"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"storage.coordinators.extraVolumeMounts"})}),(0,n.jsx)(i.td,{children:"Additional volume mounts to add to coordinator containers"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"[]"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"externalAccessConfig.coordinator.serviceType"})}),(0,n.jsx)(i.td,{children:"IngressNginx, NodePort, CommonLoadBalancer or LoadBalancer. By default, no external service will be created."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:'""'})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"externalAccessConfig.coordinator.annotations"})}),(0,n.jsx)(i.td,{children:"Annotations for external services attached to coordinators."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"{}"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"externalAccessConfig.dataInstance.serviceType"})}),(0,n.jsx)(i.td,{children:"IngressNginx, NodePort or LoadBalancer. By default, no external service will be created."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:'""'})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"externalAccessConfig.dataInstance.annotations"})}),(0,n.jsx)(i.td,{children:"Annotations for external services attached to data instances."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"{}"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"externalAccessConfig.ingress.dataPortBase"})}),(0,n.jsxs)(i.td,{children:["Base port for data instance ports on the IngressNginx controller (",(0,n.jsx)(i.code,{children:"dataPortBase + data instance id"}),")."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"9000"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"externalAccessConfig.ingress.coordinatorPortBase"})}),(0,n.jsxs)(i.td,{children:["Base port for coordinator ports on the IngressNginx controller (",(0,n.jsx)(i.code,{children:"coordinatorPortBase + coordinator id"}),"). Kept well above ",(0,n.jsx)(i.code,{children:"dataPortBase"})," so the data and coordinator port ranges never overlap."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"10000"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"externalAccessConfig.gateway.enabled"})}),(0,n.jsxs)(i.td,{children:["Enable Gateway API external access. Only exposes tiers whose ",(0,n.jsx)(i.code,{children:"serviceType"})," is empty; fails rendering if both tiers have a ",(0,n.jsx)(i.code,{children:"serviceType"})," set."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"false"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"externalAccessConfig.gateway.gatewayClassName"})}),(0,n.jsx)(i.td,{children:"Name of a pre-existing GatewayClass. Required when creating a new Gateway."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:'""'})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"externalAccessConfig.gateway.existingGatewayName"})}),(0,n.jsx)(i.td,{children:"Name of an existing Gateway to attach routes to. Skips Gateway creation."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:'""'})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"externalAccessConfig.gateway.existingGatewayNamespace"})}),(0,n.jsx)(i.td,{children:"Namespace of the existing Gateway. Defaults to release namespace."}
1),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:'""'})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"externalAccessConfig.gateway.annotations"})}),(0,n.jsx)(i.td,{children:"Annotations for the Gateway resource."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"{}"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"externalAccessConfig.gateway.labels"})}),(0,n.jsx)(i.td,{children:"Labels for the Gateway resource."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"{}"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"externalAccessConfig.gateway.dataPortBase"})}),(0,n.jsxs)(i.td,{children:["Base port for data instance Gateway listeners (",(0,n.jsx)(i.code,{children:"dataPortBase + data instance id"}),"). Must not resolve to ",(0,n.jsx)(i.code,{children:"ports.boltPort"}),", which the shared coordinators listener uses."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"9000"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"headlessService.enabled"})}),(0,n.jsx)(i.td,{children:"Specifies whether headless services will be used inside K8s network on all instances."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"false"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"ports.boltPort"})}),(0,n.jsx)(i.td,{children:"Bolt port used on coordinator and data instances. Also the port of the shared coordinators Gateway listener."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"7687"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"ports.managementPort"})}),(0,n.jsx)(i.td,{children:"Management port used on coordinator and data instances."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"10000"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"ports.replicationPort"})}),(0,n.jsx)(i.td,{children:"Replication port used on data instances."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"20000"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"ports.coordinatorPort"})}),(0,n.jsx)(i.td,{children:"Coordinator port used on coordinators."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"12000"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"ports.metricsPort"})}),(0,n.jsxs)(i.td,{children:["Metrics port for coordinators and data instances. Opened only if ",(0,n.jsx)(i.code,{children:"prometheus.enabled"})," is set to ",(0,n.jsx)(i.code,{children:"true"}),"."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"9091"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"affinity.topologyKey"})}),(0,n.jsx)(i.td,{children:"Topology domain used by all pod affinity and anti-affinity rules (for example a node or an availability zone)"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"kubernetes.io/hostname"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"affinity.unique"})}),(0,n.jsx)(i.td,{children:"Schedule pods on different nodes in the cluster"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"false"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"affinity.parity"})}),(0,n.jsx)(i.td,{children:"Schedule pods on the same node with maximum one coordinator and one data node"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"false"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"affinity.nodeSelection"})}),(0,n.jsx)(i.td,{children:"Schedule pods on nodes with specific labels"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"false"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"affinity.roleLabelKey"})}),(0,n.jsx)(i.td,{children:"Label key for node selection"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"role"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.co
1de,{children:"affinity.dataNodeLabelValue"})}),(0,n.jsx)(i.td,{children:"Label value for data nodes"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"data-node"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"affinity.coordinatorNodeLabelValue"})}),(0,n.jsx)(i.td,{children:"Label value for coordinator nodes"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"coordinator-node"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"container.data.terminationGracePeriodSeconds"})}),(0,n.jsx)(i.td,{children:"Grace period for data instance pod termination"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"1800"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"container.data.livenessProbe.failureThreshold"})}),(0,n.jsx)(i.td,{children:"Failure threshold for liveness probe"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"20"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"container.data.livenessProbe.timeoutSeconds"})}),(0,n.jsx)(i.td,{children:"Timeout for liveness probe"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"10"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"container.data.livenessProbe.periodSeconds"})}),(0,n.jsx)(i.td,{children:"Period seconds for liveness probe"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"5"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"container.data.readinessProbe.failureThreshold"})}),(0,n.jsx)(i.td,{children:"Failure threshold for readiness probe"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"20"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"container.data.readinessProbe.timeoutSeconds"})}),(0,n.jsx)(i.td,{children:"Timeout for readiness probe"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"10"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"container.data.readinessProbe.periodSeconds"})}),(0,n.jsx)(i.td,{children:"Period seconds for readiness probe"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"5"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"container.data.startupProbe.failureThreshold"})}),(0,n.jsx)(i.td,{children:"Failure threshold for startup probe"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"1440"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"container.data.startupProbe.timeoutSeconds"})}),(0,n.jsx)(i.td,{children:"Timeout for probe"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"10"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"container.data.startupProbe.periodSeconds"})}),(0,n.jsx)(i.td,{children:"Period seconds for startup probe"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"10"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"container.data.terminationGracePeriodSeconds"})}),(0,n.jsxs)(i.td,{children:["Grace period for data pod termination. Increase when ",(0,n.jsx)(i.code,{children:"--storage-snapshot-on-exit"})," is enabled so the snapshot has time to finish."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"30"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"container.coordinators.livenessProbe.failureThreshold"})}),(0,n.jsx)(i.td,{children:"Failure threshold for liveness probe"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"20"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"container.coordinators.livenessProbe.timeoutSeconds"})}),(0,n.jsx)(i.td,{children:"Timeout for liveness probe"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"10"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"container.coordinators.livenessProbe.periodSeconds"})}),(0,n.jsx)(i.td,{children:"Period seconds for liveness probe"}
1),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"5"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"container.coordinators.readinessProbe.failureThreshold"})}),(0,n.jsx)(i.td,{children:"Failure threshold for readiness probe"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"20"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"container.coordinators.readinessProbe.timeoutSeconds"})}),(0,n.jsx)(i.td,{children:"Timeout for readiness probe"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"10"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"container.coordinators.readinessProbe.periodSeconds"})}),(0,n.jsx)(i.td,{children:"Period seconds for readiness probe"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"5"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"container.coordinators.startupProbe.failureThreshold"})}),(0,n.jsx)(i.td,{children:"Failure threshold for startup probe"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"20"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"container.coordinators.startupProbe.timeoutSeconds"})}),(0,n.jsx)(i.td,{children:"Timeout for probe"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"10"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"container.coordinators.startupProbe.periodSeconds"})}),(0,n.jsx)(i.td,{children:"Period seconds for startup probe"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"10"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"container.coordinators.terminationGracePeriodSeconds"})}),(0,n.jsx)(i.td,{children:"Grace period for coordinators pod termination."}),(0,n.jsxs)(i.td,{children:[(0,n.jsx)(i.code,{children:"30"}),"."]})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"data"})}),(0,n.jsx)(i.td,{children:"Configuration for data instances"}),(0,n.jsxs)(i.td,{children:["See ",(0,n.jsx)(i.code,{children:"data"})," section"]})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"coordinators"})}),(0,n.jsx)(i.td,{children:"Configuration for coordinator instances"}),(0,n.jsxs)(i.td,{children:["See ",(0,n.jsx)(i.code,{children:"coordinators"})," section"]})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"sysctlInitContainer.enabled"})}),(0,n.jsx)(i.td,{children:"Enable the init container to set sysctl parameters"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"true"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"sysctlInitContainer.maxMapCount"})}),(0,n.jsxs)(i.td,{children:["Value for ",(0,n.jsx)(i.code,{children:"vm.max_map_count"})," to be set by the init container"]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"524288"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"sysctlInitContainer.image.repository"})}),(0,n.jsx)(i.td,{children:"Image repository for the sysctl init container"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"library/busybox"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"sysctlInitContainer.image.tag"})}),(0,n.jsx)(i.td,{children:"Image tag for the sysctl init container"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"1.37.0"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"sysctlInitContainer.image.pullPolicy"})}),(0,n.jsx)(i.td,{children:"Image pull policy for the sysctl init container"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"IfNotPresent"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"fixOwnershipInitContainer.enabled"})}),(0,n.jsxs)(i.td,{children:["Enable the init container that ",(0,n.jsx)(i.code,{children:"chown"}),"s lib/log/core-dump mounts to ",(0,n.jsx)(i.code,{children:"memgraphUserId:memgraphGroupId"})," before Memgraph starts. Use when the storage driver does not honor ",(0,n.jsx)(i.co
1de,{children:"fsGroup"}),"."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"false"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"fixOwnershipInitContainer.image.repository"})}),(0,n.jsx)(i.td,{children:"Image repository for the fix-ownership init container."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"docker.io/library/busybox"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"fixOwnershipInitContainer.image.tag"})}),(0,n.jsx)(i.td,{children:"Image tag for the fix-ownership init container."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"1.37.0"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"fixOwnershipInitContainer.image.pullPolicy"})}),(0,n.jsx)(i.td,{children:"Image pull policy for the fix-ownership init container."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"IfNotPresent"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"secrets.name"})}),(0,n.jsxs)(i.td,{children:["Name of the Kubernetes Secret holding the Memgraph Enterprise license and organization name. Must exist before ",(0,n.jsx)(i.code,{children:"helm install"}),"."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"memgraph-secrets"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"secrets.licenseKey"})}),(0,n.jsxs)(i.td,{children:["Key in the Secret whose value is exposed as ",(0,n.jsx)(i.code,{children:"MEMGRAPH_ENTERPRISE_LICENSE"})," to data and coordinator pods."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"MEMGRAPH_ENTERPRISE_LICENSE"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"secrets.organizationKey"})}),(0,n.jsxs)(i.td,{children:["Key in the Secret whose value is exposed as ",(0,n.jsx)(i.code,{children:"MEMGRAPH_ORGANIZATION_NAME"})," to data and coordinator pods."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"MEMGRAPH_ORGANIZATION_NAME"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"resources.coordinators"})}),(0,n.jsx)(i.td,{children:"CPU/Memory resource requests/limits for coordinators. Left empty by default."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"{}"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"resources.data"})}),(0,n.jsx)(i.td,{children:"CPU/Memory resource requests/limits for data instances. Left empty by default."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"{}"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"scrapeMemgraphDirectly"})}),(0,n.jsxs)(i.td,{children:["Serve metrics in OpenMetrics format and scrape Memgraph directly instead of ",(0,n.jsx)(i.code,{children:"mg-exporter"})," (requires Memgraph >= 3.11). Only selects the format/target â still enable a scraper via ",(0,n.jsx)(i.code,{children:"prometheus.serviceMonitor.enabled"})," and/or ",(0,n.jsx)(i.code,{children:"vmagentRemote.enabled"}),"."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"false"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"prometheus.enabled"})}),(0,n.jsxs)(i.td,{children:["If set to ",(0,n.jsx)(i.code,{children:"true"}),", K8s resources representing Memgraphâs Prometheus exporter will be deployed."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"false"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"prometheus.namespace"})}),(0,n.jsxs)(i.td,{children:["Namespace in which ",(0,n.jsx)(i.code,{children:"kube-prometheus-stack"})," is installed. The ",(0,n.jsx)(i.code,{children:"ServiceMonitor"}),", the Grafana dashboard ",(0,n.jsx)(i.code,{children:"ConfigMap"})," and (when ",(0,n.jsx)(i.code,{children:"prometheus.enabled"})," is ",(0,n.jsx)(i.code,{children:"true"}),") the exporter resources are created here. When empty, the release namespace is used."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:'""'})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.co
1de,{children:"prometheus.memgraphExporter.port"})}),(0,n.jsx)(i.td,{children:"The port on which Memgraphâs Prometheus exporter is available."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"9115"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"prometheus.memgraphExporter.pullFrequencySeconds"})}),(0,n.jsx)(i.td,{children:"How often will Memgraphâs Prometheus exporter pull data from Memgraph instances."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"5"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"prometheus.memgraphExporter.repository"})}),(0,n.jsx)(i.td,{children:"The repository where Memgraphâs Prometheus exporter image is available."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"docker.io/memgraph/prometheus-exporter"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"prometheus.memgraphExporter.tag"})}),(0,n.jsx)(i.td,{children:"The tag of Memgraphâs Prometheus exporter image."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"0.2.3"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"prometheus.memgraphExporter.tls.skipVerify"})}),(0,n.jsxs)(i.td,{children:["When ",(0,n.jsx)(i.code,{children:"true"}),", mg-exporter does not verify Memgraphâs server certificate. Only applied when scraping instances with ",(0,n.jsx)(i.code,{children:"tls.bolt.enabled=true"}),"."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"true"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"prometheus.memgraphExporter.tls.caSecretName"})}),(0,n.jsxs)(i.td,{children:["Name of a pre-created Secret containing the CA bundle. When set (and ",(0,n.jsx)(i.code,{children:"skipVerify=false"}),"), the chart mounts it at ",(0,n.jsx)(i.code,{children:"/etc/mg-exporter/ssl"}),"."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:'""'})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"prometheus.memgraphExporter.tls.caSecretKey"})}),(0,n.jsx)(i.td,{children:"Key inside the Secret holding the CA certificate."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"ca.crt"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"prometheus.memgraphExporter.extraVolumes"})}),(0,n.jsxs)(i.td,{children:["Additional volumes mounted on the ",(0,n.jsx)(i.code,{children:"mg-exporter"})," Deployment (e.g. ConfigMaps with custom exporter configs)."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"[]"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"prometheus.memgraphExporter.extraVolumeMounts"})}),(0,n.jsxs)(i.td,{children:["Additional volume mounts for the ",(0,n.jsx)(i.code,{children:"mg-exporter"})," container."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"[]"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"prometheus.serviceMonitor.enabled"})}),(0,n.jsxs)(i.td,{children:["If enabled, a ",(0,n.jsx)(i.code,{children:"ServiceMonitor"})," object will be deployed."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"false"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"prometheus.serviceMonitor.kubePrometheusStackReleaseName"})}),(0,n.jsxs)(i.td,{children:["The release name under which ",(0,n.jsx)(i.code,{children:"kube-prometheus-stack"})," chart is installed. Rendered as the ",(0,n.jsx)(i.code,{children:"release"})," label on the ",(0,n.jsx)(i.code,{children:"ServiceMonitor"}),", which is how the stack discovers it."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"kube-prometheus-stack"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"prometheus.serviceMonitor.interval"})}),(0,n.jsx)(i.td,{children:"How often will Prometheus pull data from Memgraphâs Prometheus exporter."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"15s"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.co
1de,{children:"prometheus.grafanaDashboard.enabled"})}),(0,n.jsxs)(i.td,{children:["Ship the bundled âMemgraph OpenMetricsâ Grafana dashboard as a ",(0,n.jsx)(i.code,{children:"ConfigMap"})," for a Grafana sidecar to auto-load."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"false"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"prometheus.grafanaDashboard.namespace"})}),(0,n.jsxs)(i.td,{children:["Namespace for the dashboard ",(0,n.jsx)(i.code,{children:"ConfigMap"}),"; must be one the Grafana sidecar watches. Defaults to ",(0,n.jsx)(i.code,{children:"prometheus.namespace"}),", else release namespace."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:'""'})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"prometheus.grafanaDashboard.label"})}),(0,n.jsx)(i.td,{children:"Label the Grafana sidecar selects dashboards by."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"grafana_dashboard"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.enabled"})}),(0,n.jsxs)(i.td,{children:["Deploy a vmagent Deployment that scrapes mg-exporter (or Memgraph directly when ",(0,n.jsx)(i.code,{children:"scrapeMemgraphDirectly=true"}),") and remote-writes to a Prometheus-compatible endpoint."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"false"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.namespace"})}),(0,n.jsxs)(i.td,{children:["Namespace for the vmagent Deployment and its resources. Defaults to ",(0,n.jsx)(i.code,{children:"prometheus.namespace"})," when empty."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:'""'})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.image.repository"})}),(0,n.jsx)(i.td,{children:"vmagent image repository."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"victoriametrics/vmagent"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.image.tag"})}),(0,n.jsx)(i.td,{children:"vmagent image tag."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"v1.139.0"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.image.pullPolicy"})}),(0,n.jsx)(i.td,{children:"vmagent image pull policy."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"IfNotPresent"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.remoteWrite.url"})}),(0,n.jsxs)(i.td,{children:["Prometheus ",(0,n.jsx)(i.code,{children:"remote_write"})," URL. Required when ",(0,n.jsx)(i.code,{children:"vmagentRemote.enabled=true"}),"."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:'""'})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.remoteWrite.basicAuth.secretName"})}),(0,n.jsxs)(i.td,{children:["Kubernetes Secret holding basic-auth credentials for ",(0,n.jsx)(i.code,{children:"remote_write"}),". When empty, basic auth is not configured."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:'""'})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.remoteWrite.basicAuth.usernameKey"})}),(0,n.jsx)(i.td,{children:"Key in the basic-auth Secret holding the username."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"username"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.remoteWrite.basicAuth.passwordKey"})}),(0,n.jsx)(i.td,{children:"Key in the basic-auth Secret holding the password."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"password"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.scrapeInterval"})}),(0,n.jsxs)(i.td,{children:["Global ",(0,n.jsx)(i.code,{children:"scrape_interval"})," applied to vmagent scrape jobs."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"15s"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.co
1de,{children:"vmagentRemote.externalLabels"})}),(0,n.jsx)(i.td,{children:"External labels attached to every scraped sample before remote-write."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"{}"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.resources"})}),(0,n.jsx)(i.td,{children:"Resource requests/limits for the vmagent container."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"{}"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.httpPort"})}),(0,n.jsxs)(i.td,{children:["vmagent local HTTP listen port for metrics/debug (the remote-write target is ",(0,n.jsx)(i.code,{children:"remoteWrite.url"}),")."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"8429"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.kubernetes.enabled"})}),(0,n.jsx)(i.td,{children:"Enable scraping of Kubernetes infrastructure metrics used by kube-prometheus dashboards."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"false"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.kubernetes.kubeStateMetrics.enabled"})}),(0,n.jsxs)(i.td,{children:["Scrape ",(0,n.jsx)(i.code,{children:"kube-state-metrics"}),"."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"true"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.kubernetes.kubeStateMetrics.jobName"})}),(0,n.jsxs)(i.td,{children:["Prometheus ",(0,n.jsx)(i.code,{children:"job"})," label for kube-state-metrics. Keep aligned with dashboard/recording-rule expectations."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"kube-state-metrics"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.kubernetes.kubeStateMetrics.targets"})}),(0,n.jsx)(i.td,{children:"Static scrape targets for kube-state-metrics."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"[kube-prometheus-stack-kube-state-metrics.monitoring.svc.cluster.local:8080]"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.kubernetes.nodeExporter.enabled"})}),(0,n.jsxs)(i.td,{children:["Scrape ",(0,n.jsx)(i.code,{children:"node-exporter"}),"."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"true"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.kubernetes.nodeExporter.jobName"})}),(0,n.jsxs)(i.td,{children:["Prometheus ",(0,n.jsx)(i.code,{children:"job"})," label for node-exporter."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"node-exporter"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.kubernetes.nodeExporter.useKubernetesDiscovery"})}),(0,n.jsx)(i.td,{children:"Discover node-exporter pods via Kubernetes SD so namespace/pod/node labels are present for recording rules."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"false"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.kubernetes.nodeExporter.podMetricsPort"})}),(0,n.jsx)(i.td,{children:"Pod port used by Kubernetes SD to match node-exporter pods."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:'"9100"'})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.kubernetes.nodeExporter.appNameLabel"})}),(0,n.jsxs)(i.td,{children:["Expected value of ",(0,n.jsx)(i.code,{children:"app.kubernetes.io/name"})," on node-exporter pods."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"prometheus-node-exporter"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.kubernetes.nodeExporter.appInstanceLabel"})}),(0,n.jsxs)(i.td,{children:["Expected value of ",(0,n.jsx)(i.code,{children:"app.kubernetes.io/instance"})," on node-exporter pods."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"kube-prometheus-stack-prometheus-node-exporter"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.co
1de,{children:"vmagentRemote.kubernetes.nodeExporter.targets"})}),(0,n.jsxs)(i.td,{children:["Static fallback targets for node-exporter when ",(0,n.jsx)(i.code,{children:"useKubernetesDiscovery=false"}),"."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"[kube-prometheus-stack-prometheus-node-exporter.monitoring.svc.cluster.local:9100]"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.kubernetes.kubelet.enabled"})}),(0,n.jsx)(i.td,{children:"Scrape kubelet metrics via the Kubernetes API server node proxy."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"true"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.kubernetes.kubelet.jobName"})}),(0,n.jsxs)(i.td,{children:["Prometheus ",(0,n.jsx)(i.code,{children:"job"})," label for kubelet. Keep as ",(0,n.jsx)(i.code,{children:"kubelet"})," so kube-prometheus dashboards and rules still match."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"kubelet"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.kubernetes.kubelet.metricsPath"})}),(0,n.jsx)(i.td,{children:"Metrics path for the primary kubelet scrape (cAdvisor)."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"/metrics/cadvisor"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.kubernetes.kubelet.additionalMetricsEnabled"})}),(0,n.jsxs)(i.td,{children:["Enable a second kubelet scrape job for ",(0,n.jsx)(i.code,{children:"/metrics"})," alongside the cAdvisor job."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"true"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.kubernetes.kubelet.additionalJobName"})}),(0,n.jsxs)(i.td,{children:["Prometheus ",(0,n.jsx)(i.code,{children:"job"})," label for the additional kubelet scrape."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"kubelet-metrics"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.kubernetes.kubelet.additionalMetricsPath"})}),(0,n.jsx)(i.td,{children:"Metrics path for the additional kubelet scrape."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"/metrics"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.kubernetes.kubelet.apiServerAddress"})}),(0,n.jsx)(i.td,{children:"Kubernetes API server address used to proxy kubelet scrapes."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"kubernetes.default.svc:443"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vmagentRemote.kubernetes.kubelet.insecureSkipVerify"})}),(0,n.jsx)(i.td,{children:"Skip TLS verification of the kube-apiserver serving cert when scraping kubelet."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"false"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vectorRemote.enabled"})}),(0,n.jsx)(i.td,{children:"Add a Vector sidecar that ships Memgraph logs from its monitoring websocket to a Loki-compatible endpoint."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"false"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vectorRemote.data"})}),(0,n.jsx)(i.td,{children:"Add the Vector sidecar to data instance pods."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"true"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vectorRemote.coordinators"})}),(0,n.jsx)(i.td,{children:"Add the Vector sidecar to coordinator pods."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"true"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vectorRemote.websocketPort"})}),(0,n.jsx)(i.td,{children:"Memgraph monitoring websocket port used by both the chart args and the Vector sidecars."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"7444"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.co
1de,{children:"vectorRemote.image.repository"})}),(0,n.jsx)(i.td,{children:"Vector image repository."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"timberio/vector"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vectorRemote.image.tag"})}),(0,n.jsx)(i.td,{children:"Vector image tag."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"0.49.0-debian"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vectorRemote.image.pullPolicy"})}),(0,n.jsx)(i.td,{children:"Vector image pull policy."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"IfNotPresent"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vectorRemote.logsEndpoint"})}),(0,n.jsxs)(i.td,{children:["Loki-compatible logs endpoint base URL; Vectorâs loki sink appends ",(0,n.jsx)(i.code,{children:"/loki/api/v1/push"}),". Required when ",(0,n.jsx)(i.code,{children:"vectorRemote.enabled=true"}),"."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:'""'})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vectorRemote.auth.secretName"})}),(0,n.jsx)(i.td,{children:"Kubernetes Secret holding basic-auth credentials for the logs endpoint. When empty, basic auth is not configured."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:'""'})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vectorRemote.auth.usernameKey"})}),(0,n.jsx)(i.td,{children:"Key in the basic-auth Secret holding the username."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"username"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vectorRemote.auth.passwordKey"})}),(0,n.jsx)(i.td,{children:"Key in the basic-auth Secret holding the password."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"password"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vectorRemote.extraLabels"})}),(0,n.jsx)(i.td,{children:"Extra labels attached to every log event shipped by Vector."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"{}"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vectorRemote.grafanaDashboard.enabled"})}),(0,n.jsxs)(i.td,{children:["Ship the bundled âMemgraph Logsâ Grafana dashboard as a ",(0,n.jsx)(i.code,{children:"ConfigMap"})," for a Grafana sidecar to auto-load."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"false"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vectorRemote.grafanaDashboard.namespace"})}),(0,n.jsxs)(i.td,{children:["Namespace for the dashboard ",(0,n.jsx)(i.code,{children:"ConfigMap"}),"; must be one the Grafana sidecar watches. Defaults to ",(0,n.jsx)(i.code,{children:"prometheus.namespace"}),", else release namespace."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:'""'})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vectorRemote.grafanaDashboard.label"})}),(0,n.jsx)(i.td,{children:"Label the Grafana sidecar selects dashboards by."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"grafana_dashboard"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"vectorRemote.resources"})}),(0,n.jsx)(i.td,{children:"Resource requests/limits for the Vector sidecar container."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"{}"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"labels.coordinators.podLabels"})}),(0,n.jsx)(i.td,{children:"Enables you to set labels on a pod level for coordinators."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"{}"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"labels.coordinators.statefulSetLabels"})}),(0,n.jsx)(i.td,{children:"Enables you to set labels on a stateful set level for coordinators."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"{}"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.co
1de,{children:"labels.coordinators.serviceLabels"})}),(0,n.jsx)(i.td,{children:"Enables you to set labels on a service level for coordinators."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"{}"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"labels.data.podLabels"})}),(0,n.jsx)(i.td,{children:"Enables you to set labels on a pod level for data instances."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"{}"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"labels.data.statefulSetLabels"})}),(0,n.jsx)(i.td,{children:"Enables you to set labels on a stateful set level for data instances."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"{}"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"labels.data.serviceLabels"})}),(0,n.jsx)(i.td,{children:"Enables you to set labels on a service level for data instances."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"{}"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"clusterSetup.labels"})}),(0,n.jsxs)(i.td,{children:["Custom labels applied to both the post-install ",(0,n.jsx)(i.code,{children:"cluster-setup"})," Job and its pod template."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"{}"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"clusterSetup.podSecurityContext"})}),(0,n.jsxs)(i.td,{children:["Pod-level security context for the ",(0,n.jsx)(i.code,{children:"cluster-setup"})," Job pod. See ",(0,n.jsx)(i.a,{href:"#customize-the-cluster-setup-job",children:"Customize the cluster-setup Job"}),"."]}),(0,n.jsxs)(i.td,{children:[(0,n.jsx)(i.code,{children:"runAsUser: 101"}),", ",(0,n.jsx)(i.code,{children:"runAsGroup: 103"}),", ",(0,n.jsx)(i.code,{children:"runAsNonRoot: true"}),", ",(0,n.jsx)(i.code,{children:"seccompProfile.type: RuntimeDefault"})]})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"clusterSetup.containerSecurityContext"})}),(0,n.jsxs)(i.td,{children:["Container-level security context for the ",(0,n.jsx)(i.code,{children:"cluster-setup"})," container. See ",(0,n.jsx)(i.a,{href:"#customize-the-cluster-setup-job",children:"Customize the cluster-setup Job"}),"."]}),(0,n.jsxs)(i.td,{children:[(0,n.jsx)(i.code,{children:"allowPrivilegeEscalation: false"}),", ",(0,n.jsx)(i.code,{children:'capabilities.drop: ["ALL"]'}),", ",(0,n.jsx)(i.code,{children:"readOnlyRootFilesystem: true"}),", ",(0,n.jsx)(i.code,{children:"runAsNonRoot: true"}),", ",(0,n.jsx)(i.code,{children:"seccompProfile.type: RuntimeDefault"})]})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"updateStrategy.type"})}),(0,n.jsxs)(i.td,{children:["Update strategy for StatefulSets. Possible values are ",(0,n.jsx)(i.code,{children:"RollingUpdate"})," and ",(0,n.jsx)(i.code,{children:"OnDelete"})]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"RollingUpdate"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"extraEnv.data"})}),(0,n.jsx)(i.td,{children:"Env variables that users can define and are applied to data instances"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"[]"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"extraEnv.coordinators"})}),(0,n.jsx)(i.td,{children:"Env variables that users can define and are applied to coordinators"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"[]"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"commonArgs.data.logging.log_level"})}),(0,n.jsxs)(i.td,{children:["Log level applied to every data instance via ",(0,n.jsx)(i.code,{children:"--log-level"}),". Must not be empty."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"TRACE"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"commonArgs.data.logging.also_log_to_stderr"})}),(0,n.jsxs)(i.td,{children:["When ",(0,n.jsx)(i.code,{children:"true"}
1),", appends ",(0,n.jsx)(i.code,{children:"--also-log-to-stderr"})," to every data instance. Must be a boolean."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"true"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"commonArgs.data.logging.log_file"})}),(0,n.jsxs)(i.td,{children:["Log-file path applied to every data instance via ",(0,n.jsx)(i.code,{children:"--log-file"}),". Empty disables file logging."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"/var/log/memgraph/memgraph.log"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"commonArgs.data.logging.log_retention_days"})}),(0,n.jsxs)(i.td,{children:["Number of days to retain log files on every data instance via ",(0,n.jsx)(i.code,{children:"--log-retention-days"}),"."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"35"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"commonArgs.coordinators.logging.log_level"})}),(0,n.jsxs)(i.td,{children:["Log level applied to every coordinator via ",(0,n.jsx)(i.code,{children:"--log-level"}),". Must not be empty."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"TRACE"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"commonArgs.coordinators.logging.also_log_to_stderr"})}),(0,n.jsxs)(i.td,{children:["When ",(0,n.jsx)(i.code,{children:"true"}),", appends ",(0,n.jsx)(i.code,{children:"--also-log-to-stderr"})," to every coordinator. Must be a boolean."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"true"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"commonArgs.coordinators.logging.log_file"})}),(0,n.jsxs)(i.td,{children:["Log-file path applied to every coordinator via ",(0,n.jsx)(i.code,{children:"--log-file"}),". Empty disables file logging."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"/var/log/memgraph/memgraph.log"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"commonArgs.coordinators.logging.log_retention_days"})}),(0,n.jsxs)(i.td,{children:["Number of days to retain log files on every coordinator via ",(0,n.jsx)(i.code,{children:"--log-retention-days"}),"."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"35"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"userContainers.data"})}),(0,n.jsx)(i.td,{children:"Additional sidecar containers for data instance pods"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"[]"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"userContainers.coordinators"})}),(0,n.jsx)(i.td,{children:"Additional sidecar containers for coordinator pods"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"[]"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"tolerations.data"})}),(0,n.jsx)(i.td,{children:"Tolerations for data instance pods"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"[]"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"tolerations.coordinators"})}),(0,n.jsx)(i.td,{children:"Tolerations for coordinator pods"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"[]"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"initContainers.data"})}),(0,n.jsx)(i.td,{children:"Init containers that users can define that will be applied to data instances."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"[]"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"initContainers.coordinators"})}),(0,n.jsx)(i.td,{children:"Init containers that users can define that will be applied to coordinators."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"[]"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"coreDumpUploader.enabled"})}),(0,n.jsxs)(i.td,{children:["Enable the core dump S3 uploader sidecar. Requires ",(0,n.jsx)(i.code,{children:"storage.<role>.createCoreDumpsClaim"}
1)," to be ",(0,n.jsx)(i.code,{children:"true"}),"."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"false"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"coreDumpUploader.image.repository"})}),(0,n.jsx)(i.td,{children:"Docker image repository for the uploader sidecar"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"amazon/aws-cli"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"coreDumpUploader.image.tag"})}),(0,n.jsx)(i.td,{children:"Docker image tag for the uploader sidecar"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"2.33.28"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"coreDumpUploader.image.pullPolicy"})}),(0,n.jsx)(i.td,{children:"Image pull policy for the uploader sidecar"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"IfNotPresent"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"coreDumpUploader.s3BucketName"})}),(0,n.jsx)(i.td,{children:"S3 bucket name where core dumps will be uploaded"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:'""'})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"coreDumpUploader.s3Prefix"})}),(0,n.jsx)(i.td,{children:"S3 key prefix (folder) for uploaded core dumps"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"core-dumps"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"coreDumpUploader.awsRegion"})}),(0,n.jsx)(i.td,{children:"AWS region of the S3 bucket"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"us-east-1"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"coreDumpUploader.pollIntervalSeconds"})}),(0,n.jsx)(i.td,{children:"How often (in seconds) the sidecar checks for new core dump files"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"30"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"coreDumpUploader.secretName"})}),(0,n.jsx)(i.td,{children:"Name of the K8s Secret containing AWS credentials"}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"aws-s3-credentials"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"coreDumpUploader.accessKeySecretKey"})}),(0,n.jsxs)(i.td,{children:["Key in the K8s Secret for ",(0,n.jsx)(i.code,{children:"AWS_ACCESS_KEY_ID"})]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"AWS_ACCESS_KEY_ID"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"coreDumpUploader.secretAccessKeySecretKey"})}),(0,n.jsxs)(i.td,{children:["Key in the K8s Secret for ",(0,n.jsx)(i.code,{children:"AWS_SECRET_ACCESS_KEY"})]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"AWS_SECRET_ACCESS_KEY"})})]})]})]}),"\n",(0,n.jsxs)(i.p,{children:["For the ",(0,n.jsx)(i.code,{children:"data"})," and ",(0,n.jsx)(i.code,{children:"coordinators"})," sections, each item in the list has the\nfollowing parameters:"]}),"\n",(0,n.jsxs)(i.table,{children:[(0,n.jsx)(i.thead,{children:(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.th,{children:"Parameter"}),(0,n.jsx)(i.th,{children:"Description"}),(0,n.jsx)(i.th,{children:"Default"})]})}),(0,n.jsxs)(i.tbody,{children:[(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"id"})}),(0,n.jsx)(i.td,{children:"ID of the instance"}),(0,n.jsxs)(i.td,{children:[(0,n.jsx)(i.code,{children:"0"})," for data, ",(0,n.jsx)(i.code,{children:"1"})," for coordinators"]})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"internalAccessAnnotations"})}),(0,n.jsx)(i.td,{children:"Per-instance annotations for the internal ClusterIP Service."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"{}"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"externalAccessAnnotations"})}),(0,n.jsx)(i.td,{children:"Per-instance annotations for the external access Service, merged with global annotations."}
1),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"{}"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"extraVolumes"})}),(0,n.jsxs)(i.td,{children:["Additional volumes available only to this instanceâs pod, added on top of ",(0,n.jsx)(i.code,{children:"storage.<role>.extraVolumes"}),". Rendered through ",(0,n.jsx)(i.code,{children:"tpl"}),", so Helm templating is supported."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"[]"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"extraVolumeMounts"})}),(0,n.jsxs)(i.td,{children:["Additional volume mounts for this instanceâs Memgraph container. Each ",(0,n.jsx)(i.code,{children:"name"})," must match an entry in this instanceâs ",(0,n.jsx)(i.code,{children:"extraVolumes"})," or in ",(0,n.jsx)(i.code,{children:"storage.<role>.extraVolumes"}),"."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"[]"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"tls.bolt.enabled"})}),(0,n.jsxs)(i.td,{children:["Enable Bolt TLS termination on this instance. The chart auto-appends ",(0,n.jsx)(i.code,{children:"--bolt-cert-file"})," / ",(0,n.jsx)(i.code,{children:"--bolt-key-file"})," and mounts the certificate Secret at ",(0,n.jsx)(i.code,{children:"/etc/memgraph/ssl"}),"."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"false"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"tls.bolt.secretName"})}),(0,n.jsxs)(i.td,{children:["Name of a pre-existing Kubernetes Secret holding the Bolt TLS certificate and private key. Required when ",(0,n.jsx)(i.code,{children:"tls.bolt.enabled=true"}),"."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"bolt-tls-secret"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"tls.bolt.certSecretPath"})}),(0,n.jsx)(i.td,{children:"Key inside the Secret holding the TLS certificate."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"tls.crt"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"tls.bolt.keySecretPath"})}),(0,n.jsx)(i.td,{children:"Key inside the Secret holding the TLS private key."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"tls.key"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"tls.intraCluster.enabled"})}),(0,n.jsxs)(i.td,{children:["Enable TLS on internal cluster communication for this instance. The chart auto-appends ",(0,n.jsx)(i.code,{children:"--cluster-cert-file"})," / ",(0,n.jsx)(i.code,{children:"--cluster-key-file"})," / ",(0,n.jsx)(i.code,{children:"--cluster-ca-file"})," and mounts the certificate Secret at ",(0,n.jsx)(i.code,{children:"/etc/memgraph/intra_cluster_tls"}),"."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"false"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"tls.intraCluster.secretName"})}),(0,n.jsxs)(i.td,{children:["Name of a pre-existing Kubernetes Secret holding the intra-cluster TLS certificate, private key and CA bundle. Required when ",(0,n.jsx)(i.code,{children:"tls.intraCluster.enabled=true"}),"."]}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"intra-tls-<instance>-secret"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"tls.intraCluster.certSecretPath"})}),(0,n.jsx)(i.td,{children:"Key inside the Secret holding the TLS certificate."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"tls.crt"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"tls.intraCluster.keySecretPath"})}),(0,n.jsx)(i.td,{children:"Key inside the Secret holding the TLS private key."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"tls.key"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"tls.intraCluster.caSecretPath"})}),(0,n.jsx)(i.td,{children:"Key inside the Secret holding the CA bundle."}),(0,n.jsx)(i.td,{children:(0,n.jsx)(i.code,{children:"ca.crt"})})]}),(0,n.jsxs)(i.tr,{children:[(0,n.jsx)(i.td,{children:(0,n.jsx)(i.co
1de,{children:"args"})}),(0,n.jsx)(i.td,{children:"Per-instance Memgraph CLI flags. Append-only â see the note below for flags the chart manages."}),(0,n.jsxs)(i.td,{children:[(0,n.jsx)(i.code,{children:'["--storage-snapshot-on-exit=false"]'})," for data, ",(0,n.jsx)(i.code,{children:"[]"})," for coordinators"]})]})]})]}),"\n",(0,n.jsxs)(i.p,{children:["The ",(0,n.jsx)(i.code,{children:"args"})," field accepts any Memgraph CLI flag ",(0,n.jsx)(i.strong,{children:"except"})," the following, which\nthe chart appends automatically and rejects when set per-instance:\n",(0,n.jsx)(i.code,{children:"--bolt-port"}),", ",(0,n.jsx)(i.code,{children:"--management-port"}),", ",(0,n.jsx)(i.code,{children:"--coordinator-port"}),", ",(0,n.jsx)(i.code,{children:"--coordinator-id"}),",\n",(0,n.jsx)(i.code,{children:"--coordinator-hostname"}),", ",(0,n.jsx)(i.code,{children:"--data-directory"}),", ",(0,n.jsx)(i.code,{children:"--log-level"}),",\n",(0,n.jsx)(i.code,{children:"--also-log-to-stderr"}),", ",(0,n.jsx)(i.code,{children:"--log-file"}),", ",(0,n.jsx)(i.code,{children:"--bolt-cert-file"}),", ",(0,n.jsx)(i.code,{children:"--bolt-key-file"}),",\n",(0,n.jsx)(i.code,{children:"--cluster-cert-file"}),", ",(0,n.jsx)(i.code,{children:"--cluster-key-file"})," and ",(0,n.jsx)(i.code,{children:"--cluster-ca-file"}),".\nConfigure those through ",(0,n.jsx)(i.code,{children:"ports.*"}),", ",(0,n.jsx)(i.code,{children:"commonArgs.{data,coordinators}.logging.*"}),"\nand the per-instance ",(0,n.jsx)(i.code,{children:"tls.bolt.*"})," / ",(0,n.jsx)(i.code,{children:"tls.intraCluster.*"})," blocks instead."]}),"\n",(0,n.jsxs)(i.p,{children:["For all available database settings, refer to the ",(0,n.jsx)(i.a,{href:"/database-management/configuration",children:"configuration settings\ndocs"}),"."]}),"\n",(0,n.jsx)(i.h2,{id:s[46].id,children:s[46].value}),"\n",(0,n.jsxs)(i.p,{children:["Memgraphâs ",(0,n.jsx)(i.strong,{children:"High Availability"})," supports in-service software upgrades (ISSU).\nThis guide explains the process when using ",(0,n.jsx)(i.a,{href:"(/getting-started/install-memgraph/kubernetes#memgraph-high-availability-helm-chart)",children:"HA Helm\ncharts"}),".\nThe procedure is very similar for native deployments."]}),"\n",(0,n.jsx)(a.P,{type:"info",children:(0,n.jsxs)(i.p,{children:["Some Memgraph versions require additional upgrade steps beyond the standard ISSU\nprocedure. Check the ",(0,n.jsx)(i.a,{href:"/clustering/high-availability/migrating-to-v3-9-ha",children:"Migrating to v3.9 HA"})," page for\nversion-specific instructions before proceeding."]})}),"\n",(0,n.jsx)(a.P,{type:"warning",children:(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"Important"}),": Although the upgrade process is designed to complete\nsuccessfully, unexpected issues may occur. We strongly recommend doing a backup\nof your ",(0,n.jsx)(i.code,{children:"lib"})," directory on all of your ",(0,n.jsx)(i.code,{children:"StatefulSets"})," or native instances\ndepending on the deployment type."]})}),"\n",(0,n.jsx)("h3",{className:"custom-header",children:" Prerequisites "}),"\n",(0,n.jsxs)(i.p,{children:["If you are using ",(0,n.jsx)(i.strong,{children:"HA Helm charts"}),", set the following configuration before\ndoing any upgrade."]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsx)(i.code,{children:(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"updateStrategy.type"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"OnDelete"})]})})}),"\n",(0,n.jsx)(i.p,{children:"Depending on the infrastructure on which you have your Memgraph cluster, the\ndetails will differ a bit, but the backbone is the same."}),"\n",(0,n.jsx)(i.p,{children:"Prepare a backup of all data from all instances. This ensures you can safely\ndowngrade cluster to the last stable version you had."}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:["For ",(0,n.jsx)(i.strong,{children:"native deployments"}
1),", tools like ",(0,n.jsx)(i.code,{children:"cp"})," or ",(0,n.jsx)(i.code,{children:"rsync"})," are sufficient."]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:["For ",(0,n.jsx)(i.strong,{children:"Kubernetes"}),", create a ",(0,n.jsx)(i.code,{children:"VolumeSnapshotClass"}),"with the yaml file fimilar\nto this:"]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"apiVersion"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"snapshot.storage.k8s.io/v1"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"kind"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"VolumeSnapshotClass"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"metadata"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" name"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"csi-azure-disk-snapclass"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"driver"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"disk.csi.azure.com"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"deletionPolicy"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"Delete"})]})]})}),"\n",(0,n.jsx)(i.p,{children:"Apply it:"}),"\n",(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsx)(i.code,{children:(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" apply"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" -f"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" azure_class.yaml"})]})})}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["On ",(0,n.jsx)(i.strong,{children:"Google Kubernetes Engine"}),", the default CSI driver is\n",(0,n.jsx)(i.code,{children:"pd.csi.storage.gke.io"})," so make sure to change the field ",(0,n.jsx)(i.code,{children:"driver"}),"."]}),"\n",(0,n.jsxs)(i.li,{children:["On ",(0,n.jsx)(i.strong,{children:"AWS EKS"}),", refer to the ",(0,n.jsx)(i.a,{href:"https://docs.aws.amazon.com/eks/latest/userguide/csi-snapshot-controller.html",children:"AWS snapshot controller\ndocs"}),"."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)("h3",{className:"custom-header",children:" Create snapshots "}),"\n",(0,n.jsxs)(i.p,{children:["Now you can create a ",(0,n.jsx)(i.code,{children:"VolumeSnapshot"})," of the lib directory using the yaml file:"]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"apiVersion"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"snapshot.storage.k8s.io/v1"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"kind"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"VolumeSnapshot"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"metadata"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" name"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"coord-3-snap"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#6A737D","--shiki-dark":"#6A737D"},children:" # Use a unique name for each instance"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" namespace"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"default"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"spec"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" volumeSnapshotClassName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"csi-azure-disk-snapclass"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" source"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" persistentVolumeClaimName"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"memgraph-coordinator-3-lib-storage-memgraph-coordinator-3-0"})]})]})}),"\n",(0,n.jsx)(i.p,{children:"Apply it:"}),"\n",(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsx)(i.co
1de,{children:(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" apply"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" -f"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" azure_snapshot.yaml"})]})})}),"\n",(0,n.jsx)(i.p,{children:"Repeat for every instance in the cluster."}),"\n",(0,n.jsx)("h3",{className:"custom-header",children:" Update configuration "}),"\n",(0,n.jsxs)(i.p,{children:["Next you should update ",(0,n.jsx)(i.code,{children:"image.tag"})," field in the ",(0,n.jsx)(i.code,{children:"values.yaml"})," configuration file\nto the version to which you want to upgrade your cluster."]}),"\n",(0,n.jsxs)(i.ol,{children:["\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:["In your ",(0,n.jsx)(i.code,{children:"values.yaml"}),", update the image version:"]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"image"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:":"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:" tag"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"<new_version>"})]})]})}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsx)(i.p,{children:"Apply the upgrade:"}),"\n",(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsx)(i.code,{children:(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"helm"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" upgrade"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" <"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"releas"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"e"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:">"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" <"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"char"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"t"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:">"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" -f"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" <"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"path_to_values.yam"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"l"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:">"})]})})}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["Since we are using ",(0,n.jsx)(i.code,{children:"updateStrategy.type=OnDelete"}),", this step will not restart\nany pod, rather it will just prepare pods for running the new version."]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["For ",(0,n.jsx)(i.strong,{children:"native deployments"}),", ensure the new binary is available."]}),"\n"]}),"\n",(0,n.jsx)("h3",{className:"custom-header",children:" Upgrade procedure (zero downtime) "}),"\n",(0,n.jsxs)(i.p,{children:["Our procedure for achieving zero-downtime upgrades consists of restarting one\ninstance at a time. Memgraph uses ",(0,n.jsx)(i.strong,{children:"primaryâsecondary replication"}),". To avoid\ndowntime:"]}),"\n",(0,n.jsxs)(i.ol,{children:["\n",(0,n.jsxs)(i.li,{children:["Upgrade ",(0,n.jsx)(i.strong,{children:"replicas"})," first."]}),"\n",(0,n.jsxs)(i.li,{children:["Upgrade the ",(0,n.jsx)(i.strong,{children:"main"})," instance."]}),"\n",(0,n.jsxs)(i.li,{children:["Upgrade ",(0,n.jsx)(i.strong,{children:"coordinator followers"})]}),"\n",(0,n.jsxs)(i.li,{children:["Upgrade the ",(0,n.jsx)(i.strong,{children:"coordinator leader"}),"."]}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:"In order to find out on which pod/server the current main and the current\ncluster leader sits, run:"}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"cypher","data-word-wrap":"","data-copy":"",children:(0,n.jsx)(i.co
1de,{children:(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"SHOW INSTANCES;"})})})}),"\n",(0,n.jsx)("h4",{className:"custom-header",children:" Query behavior during the upgrade "}),"\n",(0,n.jsx)(i.p,{children:"Your applications can stay connected to the cluster throughout the upgrade.\nWhat they will observe depends on the query type and the replication mode:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"Read queries always work"}),", regardless of the replication mode used. There\nis no specific exception you need to catch â Neo4j drivers are preconfigured\nwith automatic retries, so reads hitting an instance that is restarting are\ntransparently retried."]}),"\n",(0,n.jsxs)(i.p,{children:["One exception applies to minimal clusters: with ",(0,n.jsx)(i.strong,{children:"1 main and 1 replica"}),", you\nneed to enable the\n",(0,n.jsx)(i.a,{href:"/clustering/high-availability/ha-commands-reference#enabled_reads_on_main",children:(0,n.jsx)(i.code,{children:"enabled_reads_on_main"})}),"\ncoordinator setting so that, while the only replica is being upgraded, read\nqueries are routed to the main instance:"]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"cypher","data-word-wrap":"","data-copy":"",children:(0,n.jsx)(i.code,{children:(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"SET"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" COORDINATOR SETTING "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"'enabled_reads_on_main'"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" TO "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"'true'"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:";"})]})})}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.strong,{children:"Write queries depend on the replication mode:"})}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"ASYNC"})," â writes keep working without errors."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"SYNC"})," â writes keep working. A commit that couldnât be replicated to the\ninstance being restarted (e.g. the old main while it is coming back up) is\nstill committed on the MAIN, and the failure is reported as a\n",(0,n.jsx)(i.code,{children:"SyncReplicationFailure"})," warning\n",(0,n.jsx)(i.a,{href:"/database-management/query-metadata#notifications",children:"notification"})," in the\nquery summary rather than as an error. Your application doesnât need to\nhandle anything to keep working; read the notification if you want to log\nwhich replica fell behind, for example: ",(0,n.jsx)(i.code,{children:"Failed to replicate to SYNC replica 'instance_1': replica is not reachable or not in sync with the main"}),". Before\nMemgraph 3.13, the same situation raised a ",(0,n.jsx)(i.code,{children:"ReplicationException"})," that\napplications had to catch."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.strong,{children:"STRICT_SYNC"})," â writes wonât work while a data instance is being\nrestarted. Because of the two-phase commit protocol, a transaction cannot\nbe committed unless every STRICT_SYNC replica confirms it, so writes are\naborted until the restarted instance rejoins the cluster."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["If these write-side effects are not acceptable for your workload, you can pause\nwrites across the whole cluster for the duration of the upgrade. The\nrecommended way is the\n",(0,n.jsx)(i.a,{href:"/clustering/high-availability/ha-commands-reference#global_read_only",children:(0,n.jsx)(i.code,{children:"global_read_only"})}),"\ncoordinator setting. Connect to the coordinator leader and run:"]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"cypher","data-word-wrap":"","data-copy":"",children:(0,n.jsx)(i.co
1de,{children:(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"SET"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" COORDINATOR SETTING "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"'global_read_only'"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" TO "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"'true'"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:";"})]})})}),"\n",(0,n.jsxs)(i.p,{children:["When enabled, the current MAIN stops accepting write queries while it keeps\nserving reads and replicating existing data to REPLICAs. The setting blocks\n",(0,n.jsx)(i.strong,{children:"all write sources"})," on the MAIN â user Cypher writes,\n",(0,n.jsx)(i.a,{href:"/querying/time-to-live",children:"TTL"})," background expiry, and ",(0,n.jsx)(i.a,{href:"/data-streams",children:"stream-"})," and\n",(0,n.jsx)(i.a,{href:"/fundamentals/triggers",children:"trigger-"}),"driven writes â so the dataset stays frozen\nwhile replicas catch up and you swap binaries. The value is persisted in the\ncoordinatorâs Raft-replicated cluster state, so it survives coordinator restarts\nand leader re-elections, and is honored across failovers: a newly promoted MAIN\ncomes up read-only instead of silently accepting writes."]}),"\n",(0,n.jsx)(a.P,{type:"warning",children:(0,n.jsx)(i.p,{children:"While the cluster runs mixed versions during the rolling upgrade, read-only mode\nis honored best-effort: older instances behave as before until every node is\nupgraded, after which the cluster self-heals to the requested state."})}),"\n",(0,n.jsxs)(l.g,{children:[(0,n.jsx)("h4",{className:"custom-header",children:" Upgrade replicas "}),(0,n.jsx)(i.p,{children:"Before restarting any replica, check whether replicas are caught up with the\nMAIN:"}),(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"cypher","data-word-wrap":"","data-copy":"",children:(0,n.jsx)(i.code,{children:(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"SHOW REPLICATION LAG;"})})})}),(0,n.jsx)(i.p,{children:"If the replica you are about to restart is lagging behind, wait until it\ncatches up before deleting its pod."}),(0,n.jsxs)(i.p,{children:["If you are using K8s, the upgrade can be performed by deleting the pod. Start by\ndeleting the replica pod (in this example replica is running on the pod\n",(0,n.jsx)(i.code,{children:"memgraph-data-1-0"}),"):"]}),(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsx)(i.code,{children:(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" delete"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" pod"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" memgraph-data-1-0"})]})})}),(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"Native deployment:"})," stop the old binary and start the new one."]}),(0,n.jsx)(i.p,{children:"Before starting the upgrade of the next pod, it is important to wait until all\npods are ready. Otherwise, you may end up with a data loss. On K8s you can\neasily achieve that by running:"}),(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsx)(i.code,{children:(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" wait"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --for=condition=ready"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" pod"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --all"})]})})}),(0,n.jsx)(i.p,{children:"For the native deployment, check if all your instances are alived manually."}
1),(0,n.jsx)(i.p,{children:"This step should be repeated for all of your replicas in the cluster."}),(0,n.jsx)("h4",{className:"custom-header",children:" Upgrade the main "}),(0,n.jsxs)(i.p,{children:["When the main pod is deleted, the coordinator detects that the main is down and\nperforms an ",(0,n.jsx)(i.strong,{children:"automatic failover"}),", promoting one of the already upgraded\nreplicas to be the new main. Until the failover completes, the cluster does not\naccept write queries. The length of this time window depends on how quickly the\nfailover happens, which is governed by two coordinator settings: the\ncoordinator pings data instances every\n",(0,n.jsx)(i.a,{href:"/clustering/high-availability/ha-commands-reference#instance_health_check_frequency_sec",children:(0,n.jsx)(i.code,{children:"instance_health_check_frequency_sec"})}),"\nseconds and declares an instance down after it hasnât responded for\n",(0,n.jsx)(i.a,{href:"/clustering/high-availability/ha-commands-reference#instance_down_timeout_sec",children:(0,n.jsx)(i.code,{children:"instance_down_timeout_sec"})}),"\nseconds. Lowering these values shortens the write-unavailability window."]}),(0,n.jsx)(i.p,{children:"Upgrade the main pod:"}),(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" delete"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" pod"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" memgraph-data-0-0"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" wait"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --for=condition=ready"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" pod"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --all"})]})]})}),(0,n.jsx)("h4",{className:"custom-header",children:" Upgrade coordinators "}),(0,n.jsx)(i.p,{children:"The upgrade of coordinators is done in exactly the same way. Start by upgrading\nfollowers and finish with deleting the leader pod:"}),(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsxs)(i.code,{children:[(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" delete"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" pod"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" memgraph-coordinator-3-0"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" wait"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --for=condition=ready"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" pod"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --all"})]}),"\n",(0,n.jsx)(i.span,{children:" "}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" delete"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" pod"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" memgraph-coordinator-2-0"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" wait"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --for=condition=ready"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" pod"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --all"})]}),"\n",(0,n.jsx)(i.span,{children:" "}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" delete"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" pod"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" memgraph-coordinator-1-0"})]}),"\n",(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"kubectl"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" wait"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --for=condition=ready"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" pod"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:" --all"})]})]})})]}),"\n",(0,n.jsx)("h3",{className:"custom-header",children:" Verify upgrade "}),"\n",(0,n.jsx)(i.p,{children:"Your upgrade should be finished now, to check that everything works, run:"}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"cypher","data-word-wrap":"","data-copy":"",children:(0,n.jsx)(i.co
1de,{children:(0,n.jsx)(i.span,{children:(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"SHOW VERSION;"})})})}),"\n",(0,n.jsx)(i.p,{children:"It should show you the new Memgraph version."}),"\n",(0,n.jsxs)(i.p,{children:["If you paused writes with ",(0,n.jsx)(i.code,{children:"global_read_only"})," before the upgrade, return the\ncluster to normal read/write operation once all nodes are upgraded and healthy:"]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"cypher","data-word-wrap":"","data-copy":"",children:(0,n.jsx)(i.code,{children:(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:"SET"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" COORDINATOR SETTING "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"'global_read_only'"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:" TO "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"'false'"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:";"})]})})}),"\n",(0,n.jsx)("h3",{className:"custom-header",children:" Rollback "}),"\n",(0,n.jsxs)(i.p,{children:["If during the upgrade, you figured out that an error happened or even after\nupgrading all of your pods something doesnât work (e.g. write queries donât\npass), you can safely downgrade your cluster to the previous version using\n",(0,n.jsx)(i.code,{children:"VolumeSnapshots"})," you took on K8s or file backups for native deployments."]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.strong,{children:"Kubernetes:"})}),"\n",(0,n.jsx)(i.pre,{icon:c.k3,tabIndex:"0","data-language":"bash","data-word-wrap":"","data-copy":"",children:(0,n.jsx)(i.code,{children:(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#6F42C1","--shiki-dark":"#B392F0"},children:"helm"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:" uninstall"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:" <"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#032F62","--shiki-dark":"#9ECBFF"},children:"releas"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:"e"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#D73A49","--shiki-dark":"#F97583"},children:">"})]})})}),"\n",(0,n.jsxs)(i.p,{children:["In ",(0,n.jsx)(i.code,{children:"values.yaml"}),", for all instances set:"]}),"\n",(0,n.jsx)(i.pre,{tabIndex:"0","data-language":"yaml","data-word-wrap":"","data-copy":"",children:(0,n.jsx)(i.code,{children:(0,n.jsxs)(i.span,{children:[(0,n.jsx)(i.span,{style:{"--shiki-light":"#22863A","--shiki-dark":"#85E89D"},children:"restoreDataFromSnapshot"}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#24292E","--shiki-dark":"#E1E4E8"},children:": "}),(0,n.jsx)(i.span,{style:{"--shiki-light":"#005CC5","--shiki-dark":"#79B8FF"},children:"true"})]})})}),"\n",(0,n.jsx)(i.p,{children:"Make sure to set correct name of the snapshot you will use to recover your\ninstances."}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.strong,{children:"Native deployments:"})," restore from your file backups."]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(a.P,{type:"info",children:(0,n.jsxs)(i.p,{children:["If youâre doing an upgrade on ",(0,n.jsx)(i.code,{children:"minikube"}),", it is important to make sure that the\nsnapshot resides on the same node on which the ",(0,n.jsx)(i.code,{children:"StatefulSet"})," is installed.\nOtherwise, it wonât be able to restore ",(0,n.jsx)(i.code,{children:"StatefulSet's"})," attached\nPersistentVolumeClaim from the ",(0,n.jsx)(i.code,{children:"VolumeSnapshot"}),"."]})}),"\n",(0,n.jsx)(d.h,{})]})},"/clustering/high-availability/setup-ha-cluster-k8s",{filePath:"pages/clustering/high-availability/setup-ha-cluster-k8s.mdx",hasJsxInH1:!0,timestamp:1789474418e3,pageMap:h.O,frontMatter:{title:"Setup high availability cluster with Kubernetes",description:"See how one can setup a high availability cluster with Kubernetes."},title:"Setup high availability cluster with Kubernetes"},"undefined"==typeof RemoteContent?o:RemoteContent.useTOC)},39781:(e,s,i)=>{"use strict";i.d(s,{A:()=>r});var n=i(23798);i(21462);let r=()=>(0,n.jsx)("svg",{width:"24",height:"24",viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg",className:"fill-[#636363] dark:fill-[#666364]",children:(0,n.jsx)("path",{d:"M20.317 4.369C18.725 3.569 17.03 3.029 15.27 2.757c-.068.124-.142.284-.195.411-1.447-.214-2.9-.214-4.347 0-.058-.127-.126-.287-.195-.411C6.972 3.029 5.277 3.569 3.683 4.369c-2.348 3.916-2.983 7.728-2.67 11.491 1.88 1.351 3.7 2.187 5.51 2.737.435-.597.822-1.237 1.152-1.919-.633-.242-1.238-.522-1.824
1-.844.156-.123.31-.25.463-.377 1.204.522 2.475.871 3.806 1.013.122-.284.234-.572.336-.864-1.155-.17-2.29-.51-3.364-.98.095-.125.191-.247.288-.37 2.428.91 5.049.91 7.465 0 .098.123.194.245.288.37-1.074.47-2.21.81-3.364.98.1.292.212.58.336.864 1.331-.142 2.603-.491 3.806-1.013.153.127.308.254.463.377-.586.322-1.191.602-1.824.844.33.682.717 1.322 1.152 1.919 1.808-.55 3.63-1.386 5.51-2.737.321-3.763-.32-7.575-2.67-11.491ZM8.833 13.348c-.813 0-1.473-.752-1.473-1.677s.657-1.679 1.473-1.679c.817 0 1.477.752 1.477 1.679 0 .925-.66 1.677-1.477 1.677Zm6.334 0c-.813 0-1.473-.752-1.473-1.677s.657-1.679 1.473-1.679c.817 0 1.477.752 1.477 1.679 0 .925-.66 1.677-1.477 1.677Z"})})},63279:(e,s,i)=>{"use strict";i.d(s,{h:()=>d});var n=i(23798),r=i(13615),h=i(78952),t=i(39781),a=i(82408);i(21462);let l=()=>(0,n.jsxs)("svg",{width:"24",height:"24",viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg",className:"fill-[#636363] dark:fill-[#666364]",children:[(0,n.jsx)("path",{d:"M19 4h-1V2h-2v2H8V2H6v2H5a3 3 0 0 0-3 3v12a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3V7a3 3 0 0 0-3-3Zm1 15a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V10h16v9Zm0-11H4V7a1 1 0 0 1 1-1h1v2h2V6h8v2h2V6h1a1 1 0 0 1 1 1v1Z"}),(0,n.jsx)("rect",{x:"6",y:"12",width:"2",height:"2",rx:"1"}),(0,n.jsx)("rect",{x:"10",y:"12",width:"2",height:"2",rx:"1"}),(0,n.jsx)("rect",{x:"14",y:"12",width:"2",height:"2",rx:"1"}),(0,n.jsx)("rect",{x:"6",y:"16",width:"2",height:"2",rx:"1"}),(0,n.jsx)("rect",{x:"10",y:"16",width:"2",height:"2",rx:"1"}),(0,n.jsx)("rect",{x:"14",y:"16",width:"2",height:"2",rx:"1"})]});function d(){return(0,n.jsxs)("div",{children:[(0,n.jsx)("hr",{className:"border-t-1 border-[#e3e6e8] mt-12"}),(0,n.jsxs)(r.P,{children:[(0,n.jsx)(h.u,{icon:(0,n.jsx)(t.A,{}),title:"Discord",body:"Join the community",href:"https://discord.gg/memgraph",is_external:!0}),(0,n.jsx)(h.u,{icon:(0,n.jsx)(a.A,{}),title:"GitHub",body:"Ask a question",href:"https://github.com/memgraph/memgraph/discussions",is_external:!0}),(0,n.jsx)(h.u,{icon:(0,n.jsx)(l,{}),title:"Office hours",body:"Talk with Memgraph engineers",href:"https://memgraph.com/office-hours",is_external:!0})]})]})}},63288:(e,s,i)=>{"use strict";i.d(s,{g:()=>t});var n=i(23798),r=i(71623),h=i(21462);function t({children:e,className:s,style:i,...t}){let a=(0,h.useId)().replaceAll(":","");return(0,n.jsx)("div",{className:(0,r.A)("nextra-steps _ms-4 _mb-12 _border-s _border-gray-200 _ps-6","dark:_border-neutral-800",s),style:{...i,"--counter-id":a},...t,children:e})}},66863:(e,s,i)=>{"use strict";i.d(s,{P:()=>l});var n=i(23798),r=i(71623),h=i(86665);let t={default:"\uD83D\uDCA1",error:"\uD83D\uDEAB",info:(0,n.jsx)(h.KS,{className:"_mt-1"}),warning:"â ï¸"},a={default:(0,r.A)("_border-orange-100 _bg-orange-50 _text-orange-800 dark:_border-orange-400/30 dark:_bg-orange-400/20 dark:_text-orange-300"),error:(0,r.A)("_border-red-200 _bg-red-100 _text-red-900 dark:_border-red-200/30 dark:_bg-red-900/30 dark:_text-red-200"),info:(0,r.A)("_border-blue-200 _bg-blue-100 _text-blue-900 dark:_border-blue-200/30 dark:_bg-blue-900/30 dark:_text-blue-200"),warning:(0,r.A)("_border-yellow-100 _bg-yellow-50 _text-yellow-900 dark:_border-yellow-200/30 dark:_bg-yellow-700/30 dark:_text-yellow-200")};function l({children:e,type:s="default",emoji:i=t[s]}){return(0,n.jsxs)("div",{className:(0,r.A)("nextra-callout _overflow-x-auto _mt-6 _flex _rounded-lg _border _py-2 ltr:_pr-4 rtl:_pl-4","contrast-more:_border-current contrast-more:dark:_border-current",a[s]),children:[(0,n.jsx)("div",{className:"_select-none _text-xl ltr:_pl-3 ltr:_pr-2 rtl:_pr-3 rtl:_pl-2",style:{fontFamily:'"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"'},children:i}),(0,n.jsx)("div",{className:"_w-full _min-w-0 _leading-7",children:e})]})}},78952:(e,s,i)=>{"use strict";i.d(s,{u:()=>r});var n=i(23798);function r(e){let{icon:s,title:i,href:r,body:h,is_external:t}=e;return(0,n.jsx)("a",{href:r,target:t?"_blank":"",className:"social-card group flex flex-col justify-start overflow-hidden rounded-lg border border-gray-200 text-current no-underline dark:shadow-none hover:shadow-gray-100 dark:hover:shadow-none shadow-gray-100 active:shadow-sm active:shadow-gray-200 transition-all duration-200 hover:border-gray-300 bg-transparent shadow-sm dark:border-neutral-800 hover:bg-slate-50 hover:shadow-md dark:hover:border-neutral-700 dark:hover:bg-neutral-900",children:(0,n.jsxs)("div",{className:"p-4 flex flex-col gap-2 dark:bg-[#3a3436]",children:[(0,n.jsxs)("div",{className:"flex font-semibold items-start gap-2 text-gray-700 dark:text-gray-100 items-center",children:[s,(0,n.jsx)("span",{children:i})]}),h&&(0,n.jsx)("p",{className:"mt-2 text-sm font-medium text-gray-600 dark:text-gray-300",children:h})]})})}},82408:(e,s,i)=>{"use strict";i.d(s,{A:()=>r});var n=i(23798);i(21462);let r=()=>(0,n.jsx)("svg",{width:"24",height:"24",viewBox:"0 0 24 24",children:(0,n.jsx)("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M23.4704 12.1978C23.4704 14.6376 22.756 16.832 21.3272 18.7809C19.8984 20.7299 18.0527 22.0785 15.7901 22.827C15.5267 22.8756 15.3341 22.8416 15.2122 22.7249C15.0903 22.6083 15.0294 22.4625 15.0294 22.2875V19.211C15.0294 18.2682 14.7758 17.578 14.2686 17.1406C14.8245 17.0823 15.3244 16.9948 15.7681 16.8782C16.2119 16.7615 16.6702 16.572 17.1433 16.3095C17.6163 16.0471 18.0113 15.7239 18.3282 15.3399C18.6452 14.956 18.9036 14.4457 19.1036 13.809C19.3035 13.1723 19.4035 12.4408 19.4035 11.6146C19.4035 10.4384 19.0182 9.43726 18.2478 8.61102C18.6086 7.72647 18.5696 6.735 18.1307 5.6366C17.8577 5.54912 17.4627 5.60258 16.9458 5.79699C16.4289 5.99139 15.9802 6.20524 15.5999 6.43853L15.044 6.78846C14.137 6.53573 13.2007 6.40937 12.2352 6.40937C11.2697 6.40937 10.3334 6.53573 9.42638 6.78846C9.27034 6.68154 9.0631 6.55031 8.80465 6.39479C8.5462 6.23926 8.13902 6.05215 7.58311 5.83344C7.0272 5.61473 6.60784 5.54912 6.32501 5.6366C5.89589 6.735 5.86175 7.72647 6.2226 8.61102C5.45213 9.43726 5.0669 10.4384 5.0669 11.6146C5.0669 12.4408 5.16687 13.1699 5.3668 13.8017C5.56673 14.4335 5.82274 14.9438 6.13483 15.3326C6.44692 15.7214 6.83947 16.0471 7.31248 16.3095C7.78549 16.572 8.24386 16.7615 8.68761 16.8782C9.13137 16.9948 9.63119 17.0823 10.1871 17.1406C9.79699 17.4906 9.55805 17.9911 9.47028 18.6424C9.26547 18.7396 9.04603 18.8125 8.81197 18.8611C8.5779 18.9097 8.29995 18.934 7.9781 18.934C7.65626 18.934 7.33686 18.8295 7.01989 18.6205C6.70292 18.4116 6.43229 18.1078 6.20798 17.7093C6.02267 17.3982 5.78617 17.1455 5.49847 16.9511C5.21076 16.7567 4.96938 16.64 4.77432 16.6011L4.48174 16.5574C4.27693 16.5574 4.13552 16.5793 4.0575 16.623C3.97947 16.6668 3.95509 16.7226 3.98434 16.7907C4.0136 16.8587 4.0575 16.9268 4.11601 16.9948C4.17453 17.0629 4.23792 17.1212 4.30619 17.1698L4.40859 17.2427C4.62315 17.3399 4.83527 17.5246 5.04496 17.7967C5.25465 18.0689 5.40825 18.3
1168 5.50578 18.5403L5.65207 18.8757C5.77886 19.2451 5.99342 19.544 6.29575 19.7724C6.59809 20.0008 6.9248 20.1466 7.2759 20.2098C7.627 20.273 7.96591 20.307 8.29263 20.3119C8.61934 20.3167 8.88998 20.2997 9.10455 20.2608L9.44102 20.2025C9.44102 20.5719 9.44346 21.0044 9.44833 21.5002C9.45321 21.9959 9.45564 22.2584 9.45564 22.2875C9.45564 22.4625 9.39225 22.6083 9.26546 22.7249C9.13868 22.8416 8.94362 22.8756 8.6803 22.827C6.41765 22.0785 4.57196 20.7299 3.14317 18.7809C1.71439 16.832 1 14.6376 1 12.1978C1 10.1663 1.50227 8.29269 2.50681 6.57704C3.51134 4.86139 4.87428 3.50299 6.59565 2.50179C8.31702 1.50059 10.1968 1 12.2352 1C14.2735 1 16.1533 1.50059 17.8747 2.50179C19.5961 3.50299 20.959 4.86139 21.9636 6.57704C22.9681 8.29269 23.4704 10.1663 23.4704 12.1978Z",fill:"#646265"})})}},e=>{e.O(0,[8293,7106,636,6593,8792],()=>e(e.s=20554)),_N_E=e.O()}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.