On-premisesGitHub EnterpriseGitLabBitbucket
Use this guide when a Git provider or an identity provider (IdP) shows a certificate that a private certificate authority (CA) signed. Without your CA, Qodo services cannot make HTTPS calls to that system.
Qodo trusts your CA in addition to the public CAs already in the images. You give Qodo only your private CA certificates. You do not give it public root certificates.
This guide applies to the Qodo on-premises Helm chart that includes the
custom-ca-cert Secret. If your values file still sets global.caBundle, read Migrate from global.caBundle first.How it works
You create one optional Kubernetes Secret namedcustom-ca-cert. Each key in the Secret holds one CA certificate file.
When a pod starts, an init container named ca-builder does these steps:
- It copies the trust store of the image (
/etc/ssl/certs/ca-certificates.crt) to a temporary volume. - It then adds every certificate from the Secret to that copy.
- The application container mounts the merged file in place of the original.
SSL_CERT_FILE, REQUESTS_CA_BUNDLE, and GIT_SSL_CAINFO variables to the merged file. Python and Git then use it.
If the Secret does not exist, the pod starts and uses the trust store of the image without changes.
What the chart covers
Theca-builder init container runs in these deployments:
qodo-engine-indexerqodo-engine-pr-kn-consumerqodo-engine-retrieverqodo-gitqodo-git-event-consumerqodo-gitwayqodo-litegitqodo-platformqodo-pr-agent-agenticqodo-agent-runtime-qarqodo-user-to-allowed-repos-consumerqodo-zitadel
qodo-sync-installations CronJob.
The chart does not cover these workloads:
- The analytics and health-probe sidecar containers in
qodo-git. - The bundled LLM gateway (LiteLLM).
Prerequisites
Complete these steps before installing or upgrading the Helm chart.Prepare the certificate files
Each file must be in PEM format. A PEM file is text. It starts with-----BEGIN CERTIFICATE-----.
1
Check the PEM header
Check that the first line of each file is the PEM header.The output must be
-----BEGIN CERTIFICATE-----.2
Check that the file is a valid certificate
Could not read certificate, the file is not PEM. Continue to the next step.3
Convert DER to PEM
If the file is DER, convert it to PEM.
.crt or .cer file can be PEM or DER. Always do step 1 or step 2 to check.
Create the Secret
1
Create the Secret
Create the Secret before you install or upgrade the chart. Use the same namespace as the release.
2
Add chain certificates (if applicable)
If your CA has a chain, add one
--from-file option for each certificate.3
Supply only your private CA certificates. Qodo already trusts the public roots.
Install or upgrade
Run your normalhelm upgrade --install command. You do not set any value for this feature. The chart finds the Secret by its name.
Verify the setup
1
Read the init container log
Read the init container log of a pod.The log shows one line for each certificate:If the Secret is not present, the log shows
No custom certs found, using system bundle only.2
Check that your CA is in the merged file
The command uses the second line of your PEM file as a search key.The output must be
1 or more.3
Make an HTTPS call to your private endpoint
The Replace
qodo-platform image includes python3.https://git.example.com with the address of your Git provider or IdP. A successful call prints an HTTP status code such as 200. A certificate error means the pod does not trust your CA.Add or rotate certificates
Kubernetes does not restart pods when a Secret changes. The chart never reads the contents of the Secret. Do these steps after you add, replace, or remove a certificate.1
Update the Secret
This command replaces the Secret with the new files.
2
Restart the Deployments
qodo-sync-installations Jobs read the Secret when they start. You do not restart them.
Handle a running repository sync
A sync Job that is already running keeps the certificates it had at startup. Wait for it to finish. This is the safe choice.1
List the sync Jobs
2
Wait for the active Job to complete
Migrate from global.caBundle
Earlier chart versions usedglobal.caBundle. It held a full PEM bundle in your values file and replaced the trust store. The chart no longer reads this key.
If your values file still sets global.caBundle, Helm stops with an error that tells you to migrate. This is by design. It prevents a silent loss of trust.
1
Copy your private CA certificate into a PEM file. Your old bundle held public roots and your CA. Take only your CA.
2
Create the Secret
3
Delete
global.caBundle from your values file.4
Run
helm upgrade --install again.global.ingress.caBundle, delete it too. The chart ignores this key.
GitOps and external secrets
The chart does not create thecustom-ca-cert Secret. Create it outside the chart.
- Argo CD or Flux: Apply the Secret from your own source of truth, or create it with
kubectl. Do not put the certificates in the chart values. - External Secrets Operator: Make the
ExternalSecretcreate a Secret namedcustom-ca-certin the release namespace. Each key must hold one PEM certificate.
kubectl rollout restart deployment -n <namespace>.
Configure pod security settings for OpenShift
No OpenShift-specific setting is required for this feature. Setglobal.podSecurityContext as your cluster requires. The ca-builder init container uses the same pod settings as the application container. For these settings, see the Helm chart overview.
Troubleshooting
A pod is stuck in the Init state
A pod is stuck in the Init state
1
Read the init container log
2
Read the pod events
Permission denied error on the copy step means the pod cannot write to the temporary volume. Check that global.podSecurityContext includes an fsGroup that your cluster allows.Calls to the private endpoint still fail
Calls to the private endpoint still fail
Check these causes in order:
- The file is DER and not PEM. Do the checks in Prepare the certificate files.
- The Secret is in the wrong namespace. The Secret and the release must be in the same namespace.
- The pods did not restart. Run
kubectl rollout restart deployment -n <namespace>. - The Secret does not hold the full chain. Add the intermediate certificates as extra keys.
- The call comes from a workload that the chart does not cover, such as the
qodo-gitsidecar containers or the bundled LLM gateway.