Migration Guide for 1.0.0

May 20, 2026 · View on GitHub

Version 1.0.0 of the nx-cloud Helm chart introduces breaking changes. Please review and update your values accordingly before upgrading.

Migration table

This table maps legacy values (pre-1.0.0) to their new equivalents.

Legacy key pathNew key/path or statusNotes
image.tagglobal.imageTag or per-service image.tagDeprecated. Prefer service-specific image.tag; falls back to global.imageTag.
global.imageRegistryRemovedUse each component's image.repository with full reference (including registry) as needed.
global.imageTagglobal.imageTagStays the same. Can be overridden per component via component.image.tag.
global.imageRepositoryRemovedUse each component's image.repository (full name).
global.namespaceRemovedChart now deploys into .Release.Namespace.
naming.nameOverridenameOverrideMoved/renamed to top-level nameOverride.
naming.fullNameOverridefullNameOverrideMoved/renamed to top-level fullNameOverride.
modeRemovedHardcoded in templates.
nxCloudAppURLglobal.nxCloudAppURLMoved.
verboseLoggingglobal.verboseLogging and component.verboseLoggingMoved. Also configurable per component now.
verboseMongoLoggingRemovedIf required, set via environment variables in supported components. See: Environment variables configured by legacy values.
enableMessageQueueRemovedMessage queue must be set up externally.
frontend.serviceAccountNamefrontend.serviceAccount.nameMoved. Chart now creates a SA by default; disable with frontend.serviceAccount.create=false.
frontend.image.registryRemovedUse frontend.image.repository (full name).
frontend.image.imageNameRemovedUse frontend.image.repository (full name).
frontend.image.repositoryfrontend.image.repositoryMust now include full image name (incl. registry).
frontend.image.tagfrontend.image.tagUnchanged (overrides global.imageTag).
frontend.image.digestRemovedNot supported.
frontend.image.pullPolicyfrontend.image.pullPolicyDefault changed from Always to IfNotPresent.
frontend.deployment.replicasfrontend.deployment.replicasUnchanged.
frontend.deployment.portfrontend.deployment.portUnchanged.
frontend.deployment.env (list)frontend.deployment.env (object)Format changed to key/value object (ENV_NAME: value).
frontend.deployment.volumesfrontend.deployment.volumesUnchanged.
frontend.deployment.volumeMountsfrontend.deployment.volumeMountsUnchanged.
frontend.service.namefrontend.service.nameUnchanged.
frontend.service.typefrontend.service.typeUnchanged.
frontend.service.portfrontend.service.portUnchanged.
frontend.service.annotationsfrontend.service.annotationsUnchanged.
frontend.resourcesfrontend.deployment.resourcesMoved.
nxApi (section)api (section)Section renamed to api.
nxApi.serviceAccountNameapi.serviceAccount.nameMoved. Chart creates SA by default; disable with api.serviceAccount.create=false.
nxApi.image.registryRemovedUse api.image.repository (full name).
nxApi.image.imageNameRemovedUse api.image.repository (full name).
nxApi.image.repositoryapi.image.repositoryMust include full image name.
nxApi.image.tagapi.image.tagUnchanged.
nxApi.image.digestRemovedNot supported.
nxApi.image.pullPolicyapi.image.pullPolicyDefault changed from Always to IfNotPresent/global.
nxApi.deployment.replicasapi.deployment.replicasUnchanged.
nxApi.deployment.portapi.deployment.portUnchanged.
nxApi.deployment.env (list)api.deployment.env (object)Format changed to key/value object (ENV_NAME: value).
nxApi.deployment.readinessProbeRemovedNot provided; configure via extra containers or probes if needed.
nxApi.deployment.volumesapi.deployment.volumesUnchanged.
nxApi.deployment.volumeMountsapi.deployment.volumeMountsUnchanged.
nxApi.service.nameapi.service.nameUnchanged.
nxApi.service.typeapi.service.typeUnchanged.
nxApi.service.portapi.service.portUnchanged.
nxApi.service.annotationsapi.service.annotationsUnchanged.
nxApi.resourcesapi.deployment.resourcesMoved.
fileServer.serviceAccountNamefileServer.serviceAccount.nameMoved. Chart creates SA by default; disable with fileServer.serviceAccount.create=false.
fileServer.image.registryRemovedUse fileServer.image.repository (full name).
fileServer.image.imageNameRemovedUse fileServer.image.repository (full name).
fileServer.image.repositoryfileServer.image.repositoryMust include full image name.
fileServer.image.tagfileServer.image.tagUnchanged.
fileServer.image.digestRemovedNot supported.
fileServer.image.pullPolicyfileServer.image.pullPolicyDefault changed from Always to IfNotPresent.
fileServer.deployment.portfileServer.deployment.portUnchanged.
fileServer.deployment.env (list)fileServer.deployment.env (object)Format changed to key/value object.
fileServer.service.namefileServer.service.nameUnchanged.
fileServer.service.typefileServer.service.typeUnchanged.
fileServer.service.portfileServer.service.portUnchanged.
fileServer.service.annotationsfileServer.service.annotationsUnchanged.
fileServer.resourcesfileServer.deployment.resourcesMoved.
fileServer.securityContextfileServer.deployment.securityContextMoved.
aggregator.serviceAccountNameaggregator.serviceAccount.nameMoved. Chart creates SA by default; disable with aggregator.serviceAccount.create=false.
aggregator.scheduleaggregator.cronjob.scheduleMoved.
aggregator.image.registryRemovedUse aggregator.image.repository (full name).
aggregator.image.imageNameRemovedUse aggregator.image.repository (full name).
aggregator.image.repositoryaggregator.image.repositoryMust include full image name.
aggregator.image.tagaggregator.image.tagUnchanged.
aggregator.image.digestRemovedNot supported.
aggregator.image.pullPolicyaggregator.image.pullPolicyDefault changed from Always to IfNotPresent.
aggregator.env (list)aggregator.cronjob.env (object)Moved and format changed to key/value object.
aggregator.volumesaggregator.cronjob.volumesMoved.
aggregator.volumeMountsaggregator.cronjob.volumeMountsMoved.
aggregator.resourcesaggregator.cronjob.resourcesMoved.
messagequeue (section)RemovedMust be set up externally. No built-in deployment.
nxCloudWorkflows (section)workflowController (section)Section renamed and structure changed.
nxCloudWorkflows.enabledworkflowController.service.enabledRenamed/moved.
nxCloudWorkflows.portworkflowController.service.portRenamed/moved.
nxCloudWorkflows.nameworkflowController.service.nameRenamed/moved.
nxCloudWorkflows.workflowsNamespaceRemovedNow uses .Release.Namespace.
nxCloudWorkflows.externalNameworkflowController.service.externalNameRenamed/moved.
nxCloudWorkflows.headlessworkflowController.service.headlessRenamed/moved.
replicas.frontendfrontend.deployment.replicasDeprecated in favor of per-component replicas.
replicas.nxApiapi.deployment.replicasDeprecated in favor of per-component replicas.
ingress.skipingress.enabledLogic reversed. Set enabled: true instead of skip: false.
ingress.globalStaticIpNameingress.annotationsDeprecated; provide ingress controller specific annotations instead.
ingress.managedCertificatesingress.annotationsDeprecated; use annotations.
ingress.albSchemeingress.annotationsDeprecated; use annotations.
ingress.albListenPortsingress.annotationsDeprecated; use annotations.
ingress.albCertificateArningress.annotationsDeprecated; use annotations.
ingress.classingress.classNameRenamed.
ingress.annotationsingress.annotationsUnchanged, default includes nx.app/installed-by: 'helm'.
fileStorage.storageClassNamefileServer.pvc.storageClassNameMoved.
fileStorage.sizefileServer.pvc.sizeMoved. Note default changed to 10Gi in values.yaml.
fileStorage.resourcePolicyfileServer.pvc.helmResourcePolicyRenamed/moved.
awsS3.*RemovedConfigure via environment variables on the relevant components. See: Environment variables configured by legacy values.
(no legacy key — recent nx-cloud requirement)AWS_REGION env var on the api componentRecent nx-cloud builds (late-2025 and newer) require AWS_REGION to be set explicitly. Earlier builds silently defaulted to us-east-1 when unset. Only applies if your pinned nxprivatecloud/nx-cloud-nx-api image includes the change. For S3-compatible endpoints (MinIO, Hetzner, Ceph) any non-empty string works because the endpoint URL controls routing. Set via api.deployment.env.AWS_REGION. See the nx-cloud release notes.
azure.*RemovedConfigure via environment variables on the relevant components. See: Environment variables configured by legacy values.
useCosmosDbRemovedConfigure via environment variables on the relevant components. See: Environment variables configured by legacy values.
gitlab.*RemovedConfigure via environment variables on the relevant components. See: Environment variables configured by legacy values.
github.*RemovedConfigure via environment variables on the relevant components. See: Environment variables configured by legacy values.
bitbucket.*RemovedConfigure via environment variables on the relevant components. See: Environment variables configured by legacy values.
saml.*RemovedConfigure via environment variables on the relevant components. See: Environment variables configured by legacy values.
selfSignedCertConfigMapRemovedReplace with a ConfigMap via extraObjects and mount via volumes if needed.
preBuiltJavaCertStoreConfigMapRemovedReplace with a ConfigMap via extraObjects and mount via volumes if needed.
vcsHttpsProxyRemovedConfigure via environment variables on the relevant components. See: Environment variables configured by legacy values.
resourceClassConfigurationconfig.agentConfigs (string)Moved and changed: now a single string containing the agent configs.
secret.*RemovedUse environment variables mounted via env/envFrom/envValueFrom. See: Environment variables configured by legacy values.
extraManifestsextraObjectsRenamed.

New prerequisite: Valkey (nx-cloud 2025.07+)

nx-cloud 2025.07 introduced a hard dependency on an external Valkey instance (Redis-compatible). If you are running an nxprivatecloud/* image tagged 2025.07 or newer — including the image tags pinned by the chart's appVersion — you must provision Valkey externally and wire it via api.valkey.* before upgrading. The api pod will fail to start otherwise.

See the nx-cloud release notes for 2025.07 for the upstream change, and values.yaml for the full set of api.valkey.* knobs.

If you are pinning your *.image.tag to a pre-2025.07 nx-cloud build, this prerequisite does not apply to your deployment.

Environment variables configured by legacy values

The following table summarizes which environment variables were implicitly configured by legacy values in pre-1.0.0 charts and how their values were derived.

Key (values.yaml)Environment variable(s) created in templatesWhere used
secret.nxCloudMongoServerEndpointNX_CLOUD_MONGO_SERVER_ENDPOINTfrontend, nx-api, aggregator (via nxCloud.env.mongoSecrets)
secret.adminPasswordADMIN_PASSWORDaggregator
secret.awsS3AccessKeyIdAWS_S3_ACCESS_KEY_IDnx-api
secret.awsS3SecretAccessKeyAWS_S3_SECRET_ACCESS_KEYnx-api
secret.azureConnectionStringAZURE_CONNECTION_STRINGnx-api (only when azure.enabled is true)
secret.githubAuthClientIdGITHUB_AUTH_CLIENT_IDfrontend (when github.auth.enabled is true)
secret.githubAuthClientSecretGITHUB_AUTH_CLIENT_SECRETfrontend (when github.auth.enabled is true)
secret.githubWebhookSecretNX_CLOUD_GITHUB_WEBHOOK_SECRETfrontend, nx-api (via nxCloud.frontend.scm.githubAppEnv)
secret.githubAppIdNX_CLOUD_GITHUB_APP_ID, NX_CLOUD_GITHUB_APP_APP_IDfrontend, nx-api (via nxCloud.frontend.scm.githubAppEnv)
secret.githubPrivateKeyNX_CLOUD_GITHUB_PRIVATE_KEYfrontend, nx-api (via nxCloud.frontend.scm.githubAppEnv)
secret.githubAppClientIdNX_CLOUD_GITHUB_APP_CLIENT_IDfrontend, nx-api (via nxCloud.frontend.scm.githubAppEnv)
secret.githubAppClientSecretNX_CLOUD_GITHUB_APP_CLIENT_SECRETfrontend, nx-api (via nxCloud.frontend.scm.githubAppEnv)
awsS3.bucketAWS_S3_BUCKETnx-api
awsS3.acceleratedAWS_S3_ACCELERATED (set to 'TRUE' when true)nx-api
awsS3.endpointAWS_S3_ENDPOINTnx-api
awsS3.enablePathStyleAccessAWS_S3_ENABLE_PATH_STYLE_ACCESS (set to 'TRUE' when true)nx-api
azure.containerAZURE_CONTAINERnx-api
useCosmosDbNX_CLOUD_USE_MONGO42 (set to 'false' when true)nx-api, aggregator
gitlab.auth.enabledGITLAB_APP_ID, GITLAB_APP_SECRETfrontend
gitlab.apiUrlGITLAB_API_URLfrontend
github.auth.enabledGITHUB_AUTH_CLIENT_ID, GITHUB_AUTH_CLIENT_SECRETfrontend
github.pr.apiUrlGITHUB_API_URLfrontend
bitbucket.auth.enabledBITBUCKET_APP_ID, BITBUCKET_APP_SECRETfrontend
bitbucket.apiUrlBITBUCKET_API_URLfrontend
saml.enabledSAML_ENTRY_POINT, SAML_CERTfrontend
vcsHttpsProxyVERSION_CONTROL_HTTPS_PROXYfrontend, nx-api

Configuring record and artifact expiration

Pre-1.0 charts exposed a single clearRecordsOlderThanDays value that drove every expiration env var at once. That value has been removed in v1; expiration is now configured directly via env vars on the relevant components.

The aggregator CronJob deletes Mongo records and the file server deletes cached artifacts on disk. They run independently, so it is the operator's responsibility to keep them in sync.

Important: keep the file server window longer than the hash window

If the file server deletes an artifact while its hash record still exists in Mongo, cache reads for that hash will fail with "artifact not found". Always set:

NX_CACHE_EXPIRATION_PERIOD_IN_DAYS  >  NX_CLOUD_DB_HASH_DATA_EXPIRATION_IN_DAYS

A one-day buffer is usually enough.

Defaults

ComponentEnv varCode default (when unset)Chart default
file serverNX_CACHE_EXPIRATION_PERIOD_IN_DAYS2829 (set in fileServer.deployment.env)
aggregatorNX_CLOUD_DB_RUN_DATA_EXPIRATION_IN_DAYS92unset (falls back to code default)
aggregatorNX_CLOUD_DB_HASH_DATA_EXPIRATION_IN_DAYS28unset (falls back to code default)
aggregatorNX_CLOUD_DB_HASH_DETAILS_EXPIRATION_IN_DAYS14unset (falls back to code default)
aggregatorNX_CLOUD_DB_TERMINAL_OUTPUTS_EXPIRATION_IN_DAYS14unset (falls back to code default)

The chart's default file server window (29) is one day longer than the default hash window (28), which is the safe ordering described above.

Overriding the defaults

To shorten or extend retention, set the env vars directly. For example, to keep 7 days of hash data and clean files one day later:

fileServer:
  deployment:
    env:
      NX_CACHE_EXPIRATION_PERIOD_IN_DAYS: "8"

aggregator:
  cronjob:
    env:
      NX_CLOUD_DB_RUN_DATA_EXPIRATION_IN_DAYS: "7"
      NX_CLOUD_DB_HASH_DATA_EXPIRATION_IN_DAYS: "7"
      NX_CLOUD_DB_HASH_DETAILS_EXPIRATION_IN_DAYS: "7"
      NX_CLOUD_DB_TERMINAL_OUTPUTS_EXPIRATION_IN_DAYS: "7"

If you only override the hash window, remember to bump the file server window to match.

Using self-signed certificates

To add self-signed certificates to a Java keystore, you can use a combination of the initContainers, extraObjects and extraVolumes values.

  1. Add a ConfigMap with a script that copies Java keystore files to a volume.

    extraObjects:
      find-java-security:
        apiVersion: v1
        kind: ConfigMap
        metadata:
          name: nx-cloud-java-security-script
        data:
          find-java-security.sh: |
            #!/bin/sh
            # For Amazon Corretto, find the security directory dynamically
            if [ -n "$JAVA_HOME" ]; then
              # Use JAVA_HOME if available
              JAVA_PATH="$JAVA_HOME"
            else
              # Look for Corretto installations first
              for DIR in /usr/lib/jvm/java-*-amazon-corretto* /usr/lib/jvm/amazon-corretto-*; do
                if [ -d "$DIR" ]; then
                  JAVA_PATH="$DIR"
                  break
                fi
              done
            
              # Fallback to any Java installation if Corretto not found
              if [ -z "$JAVA_PATH" ]; then
                for DIR in /usr/lib/jvm/* /usr/java/*; do
                  if [ -d "$DIR" ]; then
                    JAVA_PATH="$DIR"
                    break
                  fi
                done
              fi
            fi
            
            # Check various possible security directory locations
            if [ -d "$JAVA_PATH/jre/lib/security" ]; then
              # Path found in some Corretto distributions, including Corretto 17
              cp -r "$JAVA_PATH/jre/lib/security" /cacerts
            elif [ -d "$JAVA_PATH/lib/security" ]; then
              # Alternative path in some Corretto and OpenJDK distributions
              cp -r "$JAVA_PATH/lib/security" /cacerts
            elif [ -d "$JAVA_PATH/conf/security" ]; then
              # Another alternative location in some JDK distributions
              cp -r "$JAVA_PATH/conf/security" /cacerts
            else
              echo "Could not find Java security directory in Corretto installation"
              # List all potential security directories for debugging
              find /usr -name "security" -type d 2>/dev/null | grep -i java
              exit 1
            fi
            echo "Successfully copied Java security files from $JAVA_PATH to /cacerts"
    
  2. Create a ConfigMap with the certificates through the extraObjects value or by providing it through another mechanism such as External Secret Operator.

    extraObjects:
      self-signed-certs:
        apiVersion: v1
        kind: ConfigMap
        metadata:
          name: self-signed-certs
        data:
          self-signed-cert.crt: |
            -----BEGIN CERTIFICATE-----
            ...
            -----END CERTIFICATE-----
            
            -----BEGIN CERTIFICATE-----
            ...
            -----END CERTIFICATE-----
    
  3. Add values required to copy and store the certificates

    aggregator:
      cronjob:
        initContainers:
          - command:
              - sh
              - /scripts/find-java-security.sh
            image: nxprivatecloud/nx-cloud-aggregator
            name: copy-cacerts
            volumeMounts:
              - mountPath: /cacerts
                name: cacerts
              - mountPath: /scripts
                name: java-security-script
         
        volumes:
          - name: cacerts
            emptyDir: {}
          - name: self-signed-certs-volume
            configMap:
              name: self-signed-certs  
          - name: java-security-script
            configMap:
              name: nx-cloud-java-security-script
    
        volumeMounts:
          - mountPath: /usr/lib/jvm/java-21-amazon-corretto/jre/lib/security
            name: cacerts
            subPath: security
          - mountPath: /self-signed-certs
            name: self-signed-certs-volume
    
    api:
      deployment:
        initContainers:
          - command:
              - sh
              - /scripts/find-java-security.sh
            image: nxprivatecloud/nx-cloud-nx-api
            name: copy-cacerts
            volumeMounts:
              - mountPath: /cacerts
                name: cacerts
              - mountPath: /scripts
                name: java-security-script
    
        volumes:
          - name: cacerts
            emptyDir: {}
          - name: self-signed-certs-volume
            configMap:
              name: self-signed-certs
          - name: java-security-script
            configMap:
              name: nx-cloud-java-security-script
    
        volumeMounts:
          - mountPath: /usr/lib/jvm/java-21-amazon-corretto/jre/lib/security
            name: cacerts
            subPath: security
          - mountPath: /self-signed-certs
            name: self-signed-certs-volume