- Deployment model: On-premises
- Configuration reference: Qodo Helm chart
7.23.0; the explicit Argo CD profile first shipped in7.17.0 - Python requirement: 3.11 or later
helm upgrade, read
live Secrets through Helm lookup, or advance Helm’s release revision.
These differences require both chart values and an Application policy.
For more information, see Helm.
Before you begin
Prepare:- Your pinned Qodo chart release, its
values-argocd.yaml,verify-external-secrets.py, andargocd-upgrade-check.py - Python,
kubectl, Helm, and an authenticated Argo CD CLI - An existing Qodo namespace and an approved Argo CD project and destination
- External PostgreSQL, including the database permissions and extensions required by your release
- A ready external Secret controller or approved Secret provisioning process
- Registry, Git, ingress, TLS, identity-provider, and model-provider access for your installation
qodo-prod, Qodo
namespace qodo, and Argo CD namespace argocd. Replace them consistently.
For a new installation, choose a unique Application identity and use the
same name for helm.releaseName. Existing installations retain their Helm
release name.
1. Prepare the values files
Keep your customer configuration in your deployment repository, for exampleenvironments/production/my-values.yaml. Merge the following into that file
and retain your other installation settings:
my-values.yaml (database and broker settings)
qodo-db-admin.POSTGRES_PASSWORD must contain that
user’s password. Retain any release-specific database role settings.
The chart includes values-argocd.yaml with these contents:
values-argocd.yaml
artifactory-values.yaml before values-argocd.yaml. For more information,
see Pull Qodo images and Helm charts through JFrog Artifactory.
If you override Platform’s rule embedding settings, use literal value
entries for platform.env.DYNACONF_RULES__AI__SIMILARITY__EMBEDDING_MODEL_NAME,
platform.env.DYNACONF_RULES__AI__SIMILARITY__EMBEDDING_DIM, and
platform.env.DYNACONF_RULES__AI__SIMILARITY__EMBEDDING_SEND_DIMENSIONS.
Keep your existing model and dimension settings. Their migration runs before
workload ConfigMaps and Secrets are updated, so valueFrom is unsupported
for these non-secret settings. Embedding API credentials remain Secret
references.
2. Provision credentials before the first sync
Your external Secret process must create these fixed names in the Qodo namespace. The Argo CD profile omits them from the chart render:
The Platform bearer must equal
qodo-svc-onprem- followed by the raw
Platform key. The service allowlist must contain that bearer, and the
[qodo_platform].api_key in the TOML file must match it. The packaged
preflight checks these relationships without printing credentials.
Provision your delivery path’s image-pull credentials and the required
provider and TLS Secrets too. The internal inventory above does not replace
those prerequisites. Keep external Secret resources in their own deployment
lifecycle so they are ready before Qodo’s migrations start.
Set your target explicitly, then check the inventory from the extracted
release:
qodo-zitadel-generated and add
--require-zitadel-generated. A new installation does not have that runtime
Secret until provisioning completes. Do not rename fixed targets through
values or regenerate encryption keys against an existing database.
3. Configure repository access and the Application
The following example uses the licensed OCI Helm registry and a separate Git repository for customer values. Argo CD must authenticate to both sources. Configure Git access through your platform team’s existing process. For the chart repository, have that process create the equivalent of this Secret in the Argo CD namespace. Fill credentials privately and keep the populated file out of Git:qodo-chart-repository.yaml
oci://, and the Application’s chart contains the
full repository path. Together they identify
oci://artifacts-self-hosted.qodo.ai/codium-stack/qodo-onprem/qodo-onprem.
For more information, see Declarative setup.
If Artifactory proxies the chart, set url to your Artifactory hostname and
use your Artifactory account and access token. In the Application, set
repoURL to the same hostname. With repository-path access, add the
repository key to the start of chart, for example
qodo-helm-virtual/codium-stack/qodo-onprem/qodo-onprem. For more
information, see Pull the Helm chart through Artifactory.
Save this as qodo-application.yaml, or use the downloadable example from
the Application example.
Replace the repository, project, chart version, values commit, names, and
destination with your approved configuration:
qodo-application.yaml
$values prefix refers to the Git source with ref: values; its path
starts at that repository’s root. The profile files without $values come
from the chart. Pin both sources, and verify the chart version is available
in your delivery channel. For more information, see
Multiple sources for an Application.
This example leaves automated sync, self-heal, and automatic pruning off.
Choose the registered destination cluster that matches the context used by
the verification scripts.
PruneLast=true controls pruning order when pruning is requested; it does
not enable pruning. The ignored fields are annotations maintained by Qodo’s
Jobs. RespectIgnoreDifferences=true preserves them during sync as well as
diff comparison. For more information, see
Sync options.
Keep Application identities unique across controllers targeting the cluster.
If your controller uses instance-label tracking, an Application name that
differs from the Helm release name can rewrite chart selectors. Have its
owner configure appropriate resource tracking before adoption. Namespace
selection alone does not isolate resource ownership or pruning. For more
information, see Resource tracking.
ApplicationSet deployments
Put the Application’ssources, ignoreDifferences, and syncPolicy under
spec.template.spec in your ApplicationSet. Keep its generated Applications
manual during the checks below. Disable automation in the ApplicationSet
template; changing only the generated Application can be overwritten by its
controller. Inspect the actual generated Application before syncing. For more
information, see Automated sync policy.
4. Render and check before syncing
Render the same chart and ordered values you configured in the Application. For the standard extracted chart, the command is:onprem-base.yaml at the top level, use that path instead. Keep rendered
output private: licensed image-pull Secrets can still appear. Confirm the
internal credential Secrets from step 2 are absent and the intended registry,
namespace, and Secret references are correct.
Create or update the Application through your approved GitOps process, then
refresh and inspect its desired state:
--first-install only when no Qodo workloads have been installed. For
adoption or upgrades, omit it so the check compares running consumers with
their Secrets and tests broker and gateway authentication.
Require GO before proceeding. The checker refuses a running or queued
operation, automated sync, stale comparison, rendered internal credentials,
unprotected tracked Secrets, and invalid live credentials. It also rejects
ApplyOutOfSyncOnly=true, which can leave a migration-paused Deployment at
zero replicas instead of restoring its configured count.
5. Run a full sync and verify the result
Use a full Application sync, with automated reconciliation still disabled:
Do not skip hooks or selectively sync resources to bypass a failed stage.
Selective sync skips PostSync hooks. For more information, see
Sync phases and waves.
Identical chart and values inputs keep the same migration Job names. Chart,
configuration, or migration-script changes produce new names so Jobs run
again. Rotating the licensed pull credential without changing its delivery
mode does not rename the Jobs.
On a first install, revision stamping causes one additional rollout after
initial readiness. Wait for it to settle. The post-check requires the actual
sync revision, its setup/migration Jobs, and Deployment/StatefulSet rollouts
to succeed. Then verify SSO, Git provider connectivity, a real review using
your configured model, and the provider webhook path.
Move an existing Helm installation
Plan the ownership transfer with your platform team and rehearse it against a restored copy before production:- Preserve the existing release name, namespace, customer values, and datastore backups. Use that release name in the Application and checker examples.
- Import the existing credential bytes into the external Secret system, including Zitadel’s master key, LiteGit’s vault key, the database password, and
qodo-zitadel-generated. Confirm reconciliation preserves the bytes. - Run
verify-external-secrets.py --require-zitadel-generatedand the liveprecheck without--first-install. Fix credential mismatches before continuing. - Freeze direct Helm upgrades. Keep automated sync, self-heal, and pruning off; inspect the Application diff and tracked resources. Do not run
helm uninstallas an adoption step. - Run the full sync and post-check in the agreed maintenance window. Only one deployment controller should write the workloads.
credential-secret-metadata.yaml (merge into each tracked credential)
argocd app resources and
the pruning dry run; every proposed deletion must belong to the intended
installation. Require the external Secret owner to preserve those resources,
and keep PruneLast=true. Enable self-heal only after confirming the generated
Application has the annotation policy from step 3. For more information, see
Deploy Qodo using Helm.
Upgrade, rollback, and credential rotation
For every upgrade, disable automation in the owning Application or ApplicationSet, finish or terminate the current operation, pin both desired sources, refresh, and run the livepre check. Sync only after GO, then run
post with the expected chart version and verify application behavior.
A rollback can require restored database state, broker topology, and the
same credential bytes. Changing the Git revision alone does not reverse
those changes. Before retrying a version after rollback, run pre again:
jobs.will_run identifies completed Jobs that would otherwise be reused
against the restored state. Follow its exact Job list and the release’s
recovery procedure before retrying.
External Secret rotation does not automatically restart consumers that use
environment variables or subPath mounts. Coordinate a rollout of all
affected consumers after synchronization. The PostSync revision roller is
not a Secret-rotation controller. Preserve encryption keys during an
ownership-only handoff. For more information, see
Manage Qodo secrets with External Secrets Operator.
Recover from earlier configuration issues
If credentials may already have been overwritten, stop automatic
reconciliation and use the release’s recovery procedure with Qodo. Restore
Zitadel and LiteGit encryption keys exactly; generating replacements can
make persisted data unreadable. For more information, see
Moving an Argo CD install off generated credentials.
Some older Argo CD controllers could reuse stale operation state when a
sync was started by writing the Application’s
operation field. Have your
controller owner verify the upstream fix and prefer the normal CLI/UI
sync path. For more information, see
Correctly set operationState values on retry.
Next steps
- Manage Qodo secrets with External Secrets Operator: Configure credential ownership, synchronization, and rotation.
- Configure Kubernetes add-ons with values files: Choose scaling, ingress, and provider overlays before the final Argo CD profile.
- Helm chart configuration reference: Review the values for your selected release.