The Deckhouse Code chart is built on the GitLab Helm chart. Values that this page does not list keep the names and the meaning of the upstream chart. The tables below list the values the chart adds under global.codeHelm, the additions under global.psql and global.appConfig, and the upstream defaults the chart changes. The Default column shows the value the chart ships with; — means the value is empty until you set it.

Components the cluster provides

The chart deploys the application and, when registry.enabled is true, the container registry. The cluster provides the components below before the release is installed; the chart does not deploy them:

  • an ingress controller, addressed by global.ingress.class and, when the load balancer is enabled, by global.codeHelm.loadbalancer.ingressService;
  • cert-manager with a ClusterIssuer, used by global.codeHelm.ingress.tls and global.codeHelm.tls.internal;
  • PostgreSQL, Redis and an S3-compatible object storage, addressed by global.psql, global.redis and global.appConfig.object_store;
  • Prometheus Operator and Grafana, when the objects from Monitoring are used;
  • GitLab Runner.

The upstream subcharts gitlab-runner, prometheus, certmanager, nginx-ingress, nginx-ingress-geo, haproxy, traefik, kubernetes-ingress, gitlab-zoekt and redis-ha are not part of the chart. Setting their install or enabled key to true, or installCertmanager to true, fails the install.

Secrets created from values

global.codeHelm.externalSecrets creates the Secrets with the credentials of the external services from the values file, in place of Secrets created by hand before the install. Each Secret is named after the release, so several releases can share a namespace.

When registry.enabled is true, the container registry needs a storage Secret from either the registry.storage.s3 block below or registry.storage.secret; when both are absent, the install fails.

KeyTypeDefaultDescription
global.codeHelm.externalSecrets.enabledbooleanfalseWhether the chart creates the Secrets described in this table. When true, registryDockerConfig is required, and either the backup credentials or gitlab.toolbox.backups.objectStorage.config.secret must be set; otherwise the install fails.
global.codeHelm.externalSecrets.psqlPasswordstring—Password of the PostgreSQL role from global.psql.username. Creates the Secret <release>-postgres with the key from global.psql.password.key; the release uses this Secret when global.psql.password.secret is not set.
global.codeHelm.externalSecrets.redisPasswordstring—Password of the Redis server. Creates the Secret named by global.redis.auth.secret (<release>-redis-secret by default) with the key from global.redis.auth.key.
global.codeHelm.externalSecrets.redisSentinelPasswordstring—Password of the Sentinel servers from global.redis.sentinels. Requires global.redis.sentinelAuth.enabled: true; without it the install fails. Creates the Secret <release>-redis-sentinel-secret with the key secret, the name the release reads when global.redis.sentinelAuth.secret is not set; setting both fails the install.
global.codeHelm.externalSecrets.praefectPasswordstring—Password of the Praefect PostgreSQL user from global.praefect.psql.user. Requires global.praefect.psql.host; without it the install fails. Creates the Secret named by global.praefect.psql.dbSecret.secret (<release>-praefect-dbsecret by default).
global.codeHelm.externalSecrets.s3.providerstringAWSName of the storage backend in the object storage connection. Stays AWS for every S3-compatible storage.
global.codeHelm.externalSecrets.s3.regionstringus-east-1Region of the object storage. Required when the s3 block is used.
global.codeHelm.externalSecrets.s3.aws_access_key_idstring—Access key ID of the object storage. Setting it or the secret key activates the s3 block, which creates the Secret <release>-s3-connection with the key connection; global.appConfig.object_store.connection then points to this Secret unless you set it yourself.
global.codeHelm.externalSecrets.s3.aws_secret_access_keystring—Secret access key of the object storage. Required when the s3 block is used.
global.codeHelm.externalSecrets.s3.endpointstring—URL of the S3 endpoint with the scheme, for example https://storage.example.com. Required when the s3 block is used.
global.codeHelm.externalSecrets.s3.hoststring—Host of the S3 endpoint without the scheme, for path-style storages.
global.codeHelm.externalSecrets.s3.path_stylebooleanfalseWhether the bucket name goes into the URL path instead of the host name.
global.codeHelm.externalSecrets.s3.aws_signature_versioninteger4Version of the request signature the storage accepts.
global.codeHelm.externalSecrets.backup.aws_access_key_idstring—Access key ID of the storage that receives backup archives. Together with the secret key creates the Secret <release>-s3cfg with the key config, which the backup utility reads. The storage may differ from the one in the s3 block.
global.codeHelm.externalSecrets.backup.aws_secret_access_keystring—Secret access key of the backup storage.
global.codeHelm.externalSecrets.registry.storage.s3.bucketstring—Bucket that stores container image layers. Setting it or accesskey activates the block, which creates the Secret <release>-registry-storage-config; the registry reads it without further settings, and registry.storage.secret is then ignored.
global.codeHelm.externalSecrets.registry.storage.s3.accesskeystring—Access key of the registry storage. Required when the block is used.
global.codeHelm.externalSecrets.registry.storage.s3.secretkeystring—Secret key of the registry storage. Required when the block is used.
global.codeHelm.externalSecrets.registry.storage.s3.regionstringus-east-1Region of the registry storage. Required when the block is used.
global.codeHelm.externalSecrets.registry.storage.s3.regionendpointstring—URL of the registry storage endpoint, for example https://storage.example.com. Required when the block is used.
global.codeHelm.externalSecrets.registry.storage.s3.v4authbooleantrueWhether the registry signs requests with AWS Signature Version 4.
global.codeHelm.externalSecrets.registry.storage.s3.securebooleantrueWhether the registry connects to the storage over HTTPS.
global.codeHelm.externalSecrets.registry.storage.s3.rootdirectorystring/Prefix inside the bucket under which the registry stores its data.
global.codeHelm.externalSecrets.registry.storage.s3.checksumDisabledbooleanfalseWhether the registry omits checksums from multipart copy requests. Set true for storages that reject checksummed UploadPartCopy requests.
global.codeHelm.externalSecrets.registry.storage.database.passwordstring—Password of the PostgreSQL user of the registry metadata database. Creates the Secret <release>-registry-database-password with the key password.
global.codeHelm.externalSecrets.registryDockerConfigstring—Base64-encoded .dockerconfigjson with the credentials of the image registry the chart pulls from. Creates the Secret <release>-image-pull-secret of type kubernetes.io/dockerconfigjson. Required when enabled is true.

Backup storage

global.codeHelm.backup holds the address of the storage that receives backup archives. It is used together with the credentials from global.codeHelm.externalSecrets.backup to build the Secret <release>-s3cfg.

KeyTypeDefaultDescription
global.codeHelm.backup.regionstringus-east-1Region of the backup storage.
global.codeHelm.backup.endpointstringhttp://minio:9000URL of the backup storage endpoint. The scheme selects the transport: http:// connects without TLS, https:// with TLS.

Ingress TLS

global.codeHelm.ingress.tls selects where the certificates of the Ingress objects come from.

KeyTypeDefaultDescription
global.codeHelm.ingress.tls.modestringcertManagerSource of the Ingress certificates. certManager: the chart creates a cert-manager Certificate for every enabled host, stored in the Secrets <release>-tls (web interface), <release>-registry-tls, <release>-pages-tls and <release>-kas-tls; the install fails when cert-manager is absent or when an ingress.tls.secretName override names another Secret. manual: the chart issues no Ingress certificates. The Ingress of each component uses the Secret named in its ingress.tls.secretName (gitlab.webservice, registry, gitlab.gitlab-pages, gitlab.kas); a component without one uses the Secret in global.ingress.tls.secretName, whose certificate then covers every enabled host. The install fails when neither global.ingress.tls.secretName nor gitlab.webservice.ingress.tls.secretName is set.
global.codeHelm.ingress.tls.clusterIssuerstringletsencryptName of the cert-manager ClusterIssuer that signs the Ingress certificates in the certManager mode.

In the manual mode, create the Secrets yourself, or add cert-manager.io/cluster-issuer: <ISSUER> to global.ingress.annotations, where <ISSUER> is the name of a cert-manager ClusterIssuer. Every Ingress of the chart carries these annotations, and cert-manager issues each certificate into the Secret its Ingress names.

Load balancer

global.codeHelm.loadbalancer deploys an HAProxy Deployment with a Service of type LoadBalancer, named <release>-code-loadbalancer. The Service accepts ports 80, 443 and 22: HTTP and HTTPS are forwarded to the ingress controller, SSH to the Git shell Service inside the cluster. This gives the instance one external address for Git over HTTPS and SSH.

KeyTypeDefaultDescription
global.codeHelm.loadbalancer.enabledbooleantrueWhether the chart deploys the load balancer. When true, gitlab.gitlab-shell.service.type must stay ClusterIP; otherwise the install fails. When false, expose SSH yourself by setting gitlab.gitlab-shell.service.type to LoadBalancer or NodePort.
global.codeHelm.loadbalancer.proxyProtocolbooleanfalseWhether HAProxy sends the backends a PROXY protocol v2 header with the client IP address. Requires an ingress controller with use-proxy-protocol: "true" and a Git shell with gitlab.gitlab-shell.sshDaemon: gitlab-sshd and gitlab.gitlab-shell.config.proxyProtocol: true; the Git shell side is checked at install, and without a controller that accepts the header all web traffic stops. See Preserving the client IP address for the rollout order.
global.codeHelm.loadbalancer.frontendProxyProtocolbooleanfalseWhether HAProxy requires the PROXY protocol header on incoming connections to the ports 80, 443 and 22. Enable only with a PROXY protocol proxy in front of the load balancer, together with proxyProtocol.
global.codeHelm.loadbalancer.ingressServicestringingress-nginx-controller.ingress-nginx.svcDNS name of the ingress controller Service that receives HTTP and HTTPS traffic when httpBackends and ingressClass are empty.
global.codeHelm.loadbalancer.ingressClassstring—Name of the ingress class whose controller receives HTTP and HTTPS traffic. The backend becomes <ingressClass>-load-balancer; used when httpBackends is empty.
global.codeHelm.loadbalancer.httpBackendsarray of strings[]Names of the HTTP and HTTPS backends. Each name N becomes the backend N-load-balancer with the ports 80 and 443. Takes precedence over ingressClass and ingressService.
global.codeHelm.loadbalancer.replicasinteger1Number of HAProxy pods when the autoscaler is disabled.
global.codeHelm.loadbalancer.resourcesobjectrequests 100m CPU and 128Mi memory, limits 500m CPU and 256Mi memoryResource requests and limits of the HAProxy container.
global.codeHelm.loadbalancer.hpa.enabledbooleanfalseWhether a HorizontalPodAutoscaler scales the HAProxy Deployment.
global.codeHelm.loadbalancer.hpa.minReplicasinteger1Lower bound of the autoscaler.
global.codeHelm.loadbalancer.hpa.maxReplicasinteger2Upper bound of the autoscaler.
global.codeHelm.loadbalancer.hpa.cpuUtilizationinteger80Target average CPU utilization, in percent of the request.
global.codeHelm.loadbalancer.hpa.memoryUtilizationinteger80Target average memory utilization, in percent of the request.
global.codeHelm.loadbalancer.pdb.enabledbooleanfalseWhether a PodDisruptionBudget keeps at least one HAProxy pod available during voluntary disruptions.
global.codeHelm.loadbalancer.annotationsobject{}Annotations of the LoadBalancer Service, for example the address annotation of the cloud or MetalLB load balancer.
global.codeHelm.loadbalancer.loadBalancerClassstring—Value of the service.kubernetes.io/load-balancer-class annotation of the Service, when the cluster runs several load balancer implementations.

Internal TLS

global.codeHelm.tls.internal encrypts the traffic between the components of the release with certificates from cert-manager: the chart creates a self-signed Issuer, an internal CA and a Certificate for the web service, Workhorse, Praefect and each Gitaly virtual storage. The Secrets are named <release>-webservice-tls, <release>-workhorse-tls, <release>-praefect-tls and the Gitaly Secret of each virtual storage.

KeyTypeDefaultDescription
global.codeHelm.tls.internal.enabledbooleantrueWhether the chart creates the internal CA and the component certificates. Requires cert-manager in the cluster and the upstream flags gitlab.webservice.tls.enabled, global.workhorse.tls.enabled, global.gitaly.tls.enabled and global.praefect.tls.enabled set to true (the chart default); the install fails when one of them is false. Has no effect when global.codeHelm.istio.enabled is true.

Istio

global.codeHelm.istio puts the release into an Istio service mesh: the pods receive the sidecar injection label, and a PeerAuthentication object sets the mTLS mode of the namespace. The mesh replaces the internal TLS, so global.codeHelm.tls.internal.enabled, global.gitaly.tls.enabled, global.praefect.tls.enabled, global.workhorse.tls.enabled, gitlab.webservice.tls.enabled and, when the registry is enabled, registry.tls.enabled must be false; otherwise the install fails.

KeyTypeDefaultDescription
global.codeHelm.istio.enabledbooleanfalseWhether the pods join the mesh. Requires Istio with the security.istio.io/v1beta1 API and sidecar injection enabled for the namespace. The migration, backup and database reindex Jobs run the proxy as a native sidecar, which needs Kubernetes 1.29 or later; a classic sidecar would keep a finished Job pod running.
global.codeHelm.istio.strictbooleanfalsemTLS mode of the PeerAuthentication object: false is PERMISSIVE, true is STRICT. In the strict mode the Workhorse and SSH ports stay permissive, because the ingress controller and Git clients are outside the mesh.

Metrics through kube-rbac-proxy

global.codeHelm.kubeRbacProxy adds a kube-rbac-proxy sidecar to the web service, Sidekiq, Gitaly, Git shell, Pages, Praefect, exporter, registry and load balancer pods. The sidecar serves the metrics of its pod on the port https-metrics and lets a request through only after a TokenReview and a SubjectAccessReview of its bearer token. The chart creates a Service <release>-<component>-metrics and a ServiceMonitor <release>-<component> per component, the Secret <release>-prometheus-token the ServiceMonitors take the token from, and the RBAC objects the sidecars need for the reviews.

KeyTypeDefaultDescription
global.codeHelm.kubeRbacProxy.enabledbooleanfalseWhether the sidecars, Services, ServiceMonitors and RBAC objects are created. When true, disable the upstream ServiceMonitors so that Prometheus scrapes through the proxy: gitlab.webservice.serviceMonitor.enabled, gitlab.sidekiq.serviceMonitor.enabled, gitlab.gitaly.serviceMonitor.enabled, gitlab.gitlab-shell.serviceMonitor.enabled, gitlab.gitlab-pages.serviceMonitor.enabled, gitlab.praefect.serviceMonitor.enabled and gitlab.gitlab-exporter.serviceMonitor.enabled.
global.codeHelm.kubeRbacProxy.serviceAccountTokenstring—Bearer token Prometheus presents to the sidecars. Required when enabled is true; otherwise the install fails. The ServiceAccount the token belongs to needs the verb get on the deployments/prometheus-metrics and statefulsets/prometheus-metrics subresources in the release namespace.
global.codeHelm.kubeRbacProxy.caSecretstring—Name of an existing Secret with the CA certificate under the key ca.crt, which the sidecars use to verify client certificates. When empty, the CA comes from clusterIssuer.
global.codeHelm.kubeRbacProxy.clusterIssuerstringselfsignedName of the cert-manager ClusterIssuer that signs the CA Certificate <release>-kube-rbac-proxy-ca when caSecret is empty. When both are empty and enabled is true, the install fails.
global.codeHelm.kubeRbacProxy.resourcesobjectrequests 10m CPU, 25Mi memory and 50Mi ephemeral storageResource requests and limits of the sidecar.
global.codeHelm.kubeRbacProxy.securityContextobjectno privilege escalation, read-only root filesystem, all capabilities dropped, RuntimeDefault seccomp profileSecurity context of the sidecar.

Audit events

global.codeHelm.audit adds an audit sidecar to the web service and Sidekiq pods. The sidecar reads the audit log of its pod and writes each event to its standard output in the CEF format, so the logging stack of the cluster collects the events from the container logs. To read them directly:

d8 k -n code logs <POD_NAME> -c audit

Audit events describes the events themselves.

KeyTypeDefaultDescription
global.codeHelm.audit.enabledbooleantrueWhether the sidecar is added to the web service and Sidekiq pods.
global.codeHelm.audit.resourcesobjectrequests and limits of 100m CPU and 128Mi memoryResource requests and limits of the sidecar.
global.codeHelm.audit.securityContextobjectno privilege escalation, all capabilities dropped, RuntimeDefault seccomp profileSecurity context of the sidecar.

Monitoring

global.codeHelm.monitoring creates the objects that Prometheus Operator and Grafana pick up.

KeyTypeDefaultDescription
global.codeHelm.monitoring.prometheusRulesbooleanfalseWhether the chart creates the PrometheusRule <release>-code-helm with the label prometheus: d8-monitoring. The rules alert on unavailable web service and Sidekiq, failed or stale LDAP synchronization and failing pull mirrors. Created only when the monitoring.coreos.com/v1 API exists in the cluster.
global.codeHelm.monitoring.dashboardsbooleantrueWhether the chart creates the ConfigMap <release>-grafana-dashboard with the label grafana_dashboard: "1" and the Grafana dashboard of the instance. The Grafana dashboard sidecar picks it up from the release namespace; for another namespace, extend the sidecar’s search namespaces.

global.codeHelm.search connects the instance to an OpenSearch cluster for code and content search. Advanced search describes indexing and the search itself.

KeyTypeDefaultDescription
global.codeHelm.search.enabledbooleanfalseWhether advanced search is enabled in the application configuration.
global.codeHelm.search.opensearch.urlstringhttp://opensearch:9200/URL of the OpenSearch endpoint.
global.codeHelm.search.opensearch.credentials.usernamestring—User name of the OpenSearch account. Together with the password creates the Secret <release>-code-helm-opensearch-creds, which the web service and Sidekiq pods mount; without both values the connection is anonymous.
global.codeHelm.search.opensearch.credentials.passwordstring—Password of the OpenSearch account.
global.codeHelm.search.opensearch.maxBulkSizeBytesinteger10485760Upper size of one bulk indexing request, in bytes.
global.codeHelm.search.opensearch.maxBulkConcurrencyinteger10Number of bulk indexing requests in flight at the same time.
global.codeHelm.search.opensearch.repositoryIndexerMaxConcurrencyinteger30Number of repository indexer processes that run at the same time.
global.codeHelm.search.opensearch.indexedFileSizeLimitKbinteger1024Upper size of a file whose content is indexed, in kilobytes. Larger files are indexed by name only.
global.codeHelm.search.opensearch.readTimeoutinteger10Time limit of one search query, in seconds. A query that exceeds it is not repeated, and the search returns an error.
global.codeHelm.search.opensearch.adminRequestTimeoutinteger60Time limit of the index status and index recreation requests, in seconds. These requests are not repeated.
global.codeHelm.search.opensearch.indexingRequestTimeoutinteger1800Time limit of one indexing request, in seconds. A failed indexing request is repeated, so an indexing job can wait longer than this value.
global.codeHelm.search.sidekiq.routingRulesarray[["feature_category=fe_global_search", "global-search-indexing"], ["*", "default"]]Sidekiq routing rules: each item is a pair of a job selector and the queue it goes to. The default sends indexing jobs to the queue global-search-indexing and everything else to default.

To run the indexing jobs in pods of their own, add a Sidekiq pod for the queue:

gitlab:
  sidekiq:
    pods:
      - name: all-in-1
      - name: global-search
        queues: global-search-indexing

Container images

Every workload image is pinned in the chart at build time. global.codeHelm.images replaces the pinned image of a component, for example when the images are mirrored to a registry inside the network.

KeyTypeDefaultDescription
global.codeHelm.images.<component>string—Full image reference of the component, registry/repository:tag or registry/repository@sha256:...; it replaces the pinned reference entirely. Component names: webservice-default, workhorse, sidekiq-all-in-1-v2, sidekiq-global-search-v2, gitaly-default, gitaly-init-cgroups, praefect, registry, shell, toolbox, rails, exporter, mailroom, pages, base, certificates, kube-rbac-proxy, haproxy, vector, kubectl, cfssl-self-sign, kas. A Sidekiq pod from gitlab.sidekiq.pods resolves its image from the key sidekiq-<pod name>-v2 and falls back to sidekiq-all-in-1-v2.
global.codeHelm.nameOverridestring<release>-code-helmName prefix of the objects the chart adds to the upstream chart: the audit ConfigMap, the OpenSearch Secret, the PrometheusRule and the internal TLS Issuers and CA.

PostgreSQL connection encryption

global.psql.sslMode and global.psql.ssl set how the application connects to PostgreSQL. global.praefect.psql.sslMode does the same for the Praefect database and also defaults to prefer.

KeyTypeDefaultDescription
global.psql.sslModestringpreferlibpq SSL mode of the application connections: disable, allow, prefer, require, verify-ca or verify-full. When empty and global.psql.ssl is set, the mode is verify-ca.
global.psql.ssl.secretstring—Name of the Secret with the certificates for a mutual TLS connection. When the ssl block is used, every key of the block is required.
global.psql.ssl.serverCAstring—Key inside that Secret that holds the CA certificate of the server.
global.psql.ssl.clientCertificatestring—Key inside that Secret that holds the client certificate.
global.psql.ssl.clientKeystring—Key inside that Secret that holds the client private key.

Authentication providers

The chart accepts the upstream fields of an entry in global.appConfig.omniauth.providers (name, label, icon, secret, key, args) and the group fields below. When an entry names a secret, the provider is read from that Secret and the group fields go into its YAML. SAML shows the complete provider entries.

KeyTypeDefaultDescription
global.appConfig.omniauth.providers[].allowed_groupsarray of strings—Groups of the identity provider whose members may sign in. When unset, every authenticated user may sign in.
global.appConfig.omniauth.providers[].admin_groupsarray of strings[]Groups whose members receive administrator rights on the instance.
global.appConfig.omniauth.providers[].auditor_groupsarray of strings[]Groups whose members receive auditor rights on the instance.
global.appConfig.omniauth.providers[].groups_attributestringGroupsName of the SAML attribute that carries the group membership.
global.appConfig.omniauth.providers[].external_groupsarray of strings—Groups whose members are marked as external users.

An LDAP server in global.appConfig.ldap.servers.<name> accepts the upstream fields (host, port, uid, base, bind_dn, password, active_directory and the others) and a group_sync block that maps LDAP groups to groups of the instance. LDAP describes the synchronization.

KeyTypeDefaultDescription
global.appConfig.ldap.servers.<name>.group_sync.create_groupsbooleanfalseWhether groups that exist in LDAP and not on the instance are created during synchronization.
global.appConfig.ldap.servers.<name>.group_sync.basestring—Base DN of the LDAP group search.
global.appConfig.ldap.servers.<name>.group_sync.filterstring—LDAP filter that selects the groups to synchronize.
global.appConfig.ldap.servers.<name>.group_sync.scopestring or integer—Scope of the LDAP group search: 0 is the base object, 1 one level below it, 2 the whole subtree.
global.appConfig.ldap.servers.<name>.group_sync.top_level_groupstring—Path of the group on the instance under which the synchronized groups are created.
global.appConfig.ldap.servers.<name>.group_sync.name_maskstring—Regular expression applied to the cn of an LDAP group to extract the group name on the instance.
global.appConfig.ldap.servers.<name>.group_sync.ownerstringrootUser name that owns the groups the synchronization creates.
global.appConfig.ldap.servers.<name>.group_sync.role_mapping[].by_namestring—Regular expression matched against the LDAP group name.
global.appConfig.ldap.servers.<name>.group_sync.role_mapping[].gitlab_rolestring—Role the matched group’s members receive: guest, reporter, developer, maintainer or owner.
global.appConfig.ldap.servers.<name>.group_sync.prefix.attributestring—LDAP attribute whose value is prepended to the group name.
global.appConfig.ldap.servers.<name>.group_sync.prefix.defaultstring—Prefix used when the attribute is absent.
global.appConfig.ldap.servers.<name>.group_sync.prefix.name_maskstring—Regular expression that extracts the prefix from the attribute value.

Changed upstream defaults

The chart ships the upstream values below with other defaults. Each row names what the change requires from the cluster or the values file.

KeyUpstream defaultChart defaultConsequence
global.registry.enabled, registry.enabledtruefalseThe container registry is not deployed and the application shows no registry; to enable it, set both to true and configure the storage, see Container registry.
global.ingress.classunsetnginxThe Ingress objects target the nginx ingress class; set another class when the cluster uses a different controller.
global.appConfig.object_store.enabledfalsetrueUploads, artifacts, LFS objects, packages and the other stores live in object storage; a connection through global.codeHelm.externalSecrets.s3 or global.appConfig.object_store.connection and a bucket per store are required.
global.appConfig.externalDiffs.enabled, global.appConfig.terraformState.enabled, global.appConfig.dependencyProxy.enabledfalsetrueMerge request diffs, Terraform state and the dependency proxy each need a bucket in global.appConfig.<store>.bucket.
global.praefect.enabledfalsetrueGitaly runs behind Praefect with one virtual storage named default and one Gitaly replica (global.praefect.virtualStorages[0].gitalyReplicas, upstream 3) and one Praefect pod (gitlab.praefect.replicas, upstream 2). Praefect needs its own PostgreSQL database in global.praefect.psql.host, user and dbName.
global.praefect.psql.sslModedisablepreferThe Praefect connection uses TLS when the server offers it.
global.gitaly.tls.enabled, global.praefect.tls.enabled, global.workhorse.tls.enabled, gitlab.webservice.tls.enabledfalsetrueThe components expect the certificates from Internal TLS; keep them true while global.codeHelm.tls.internal.enabled is true, and set them false for Istio.
global.kas.enabledtruefalseThe agent server for Kubernetes is not deployed, and no <release>-kas-tls certificate is created.
global.gatewayApi.enabled, global.gatewayApi.installEnvoytruefalseThe chart exposes the instance through Ingress objects; no Gateway API objects or Envoy Gateway are created.
gitlab.gitlab-shell.service.typeLoadBalancerClusterIPSSH is exposed through Load balancer; change the type only when the load balancer is disabled.
gitlab.gitlab-shell.sshDaemonopensshgitlab-sshdSSH is served by the gitlab-sshd daemon; it decodes the PROXY protocol header of the load balancer and accepts connections without the header.
gitlab.gitlab-shell.config.proxyProtocolfalsetruegitlab-sshd expects the PROXY protocol header of the load balancer; with sshDaemon it forms the Git shell side of preserving the client IP address. The install fails when the values are overridden to the upstream variants while global.codeHelm.loadbalancer.proxyProtocol is enabled.
gitlab.gitaly.cgroups.enabledfalsetrueGitaly runs Git processes in cgroups: 2 GiB and 150000 CPU quota units for the parent, 100 repository cgroups of 1 GiB and 75000 CPU quota units each. The Gitaly pod runs an init container that needs write access to the cgroup filesystem of the node.
gitlab.toolbox.backups.cron.extraArgsunset--repositories-server-sideGitaly uploads repository backups to the backup bucket directly, so the bucket must be reachable from the Gitaly pods.

Additional resources