> ## Documentation Index
> Fetch the complete documentation index at: https://astronomer.io/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Upgrade to Astro Private Cloud 2.0 from 1.x

Use this document to upgrade from Astro Private Cloud (APC) 1.x to 2.0. The upgrade primarily involves migrating your `values.yaml` override file to the new schema and running a Helm upgrade.

<Note>
  If you are upgrading from APC 0.37.x directly to 2.0, use the [Upgrade to 2.0 from 0.37](/docs/astro-private-cloud/v-2-x/upgrade-037-to-2) guide instead. That guide covers the additional platform-level steps required when skipping 1.x.
</Note>

## Prerequisites

* Verify that you are running APC 1.x. If you are on 0.37.x, see the [Upgrade to 2.0 from 0.37](/docs/astro-private-cloud/v-2-x/upgrade-037-to-2) guide.

* Back up your platform database. At minimum, create a snapshot or backup of your PostgreSQL database (RDS snapshot, Azure backup, Cloud SQL backup, or `pg_dump`).

* Verify that all platform and Airflow Deployment Pods are healthy:

  ```bash wrap theme={null}
  kubectl get pods -n astronomer
  kubectl get pods -n astronomer-<deployment-release-name>
  ```

* Python 3.10 or later installed on your local computer (required for the values migration script).

* Install the `ruamel.yaml` Python package:

  ```bash wrap theme={null}
  pip install ruamel.yaml
  ```

## Step 1: Get the migration script

The migration scripts are located in the `bin/` folder of the [Astronomer Helm chart repository](https://github.com/astronomer/astronomer). Clone the repository and check out the `release-2.0` branch:

```bash wrap theme={null}
git clone https://github.com/astronomer/astronomer.git
cd astronomer
git checkout release-2.0
```

The script you need for this upgrade path is `bin/migrate-helm-chart-values-1x-to-2x.py`.

## Step 2: Migrate your `values.yaml`

APC 2.0 introduces a unified feature flag schema that reorganizes scattered `global.*` boolean flags into domain-grouped structures with a consistent `.enabled` pattern. The migration script also restructures APC API configuration flags under `astronomer.houston.config.deployments` into nested paths. The migration script automates both transformations.

### Back up your override file

```bash wrap theme={null}
cp my-values.yaml my-values.yaml.backup
```

### Preview changes (dry run)

Run the migration script in dry-run mode to see what will change without modifying any files:

```bash wrap theme={null}
./bin/migrate-helm-chart-values-1x-to-2x.py --dry-run my-values.yaml
```

Example output:

```text wrap theme={null}
Found 12 migration(s) to apply:
  global.rbacEnabled -> global.rbac.enabled
  global.sccEnabled -> global.scc.enabled
  global.openshiftEnabled -> global.openshift.enabled
  global.networkNSLabels -> global.networkNSLabels.enabled
  global.namespaceFreeFormEntry -> global.namespaceManagement.namespaceFreeFormEntry.enabled
  global.taskUsageMetricsEnabled -> global.metricsReporting.taskUsageMetrics.enabled
  global.deployRollbackEnabled -> global.deploymentLifecycle.deployRollback.enabled
  global.features.namespacePools -> global.namespaceManagement.namespacePools
  global.dagOnlyDeployment -> global.deployMechanisms.dagOnlyDeployment
  global.loggingSidecar -> global.logging.loggingSidecar
  astronomer.houston.config.deployments.dagProcessorEnabled -> astronomer.houston.config.deployments.airflowComponents.dagProcessor.enabled
  astronomer.houston.config.deployments.triggererEnabled -> astronomer.houston.config.deployments.airflowComponents.triggerer.enabled
```

If you see `No migrations needed`, your file is already compatible with 2.0.

### Run the migration

<Tabs>
  <Tab title="In-place with backup (recommended)">
    ```bash wrap theme={null}
    ./bin/migrate-helm-chart-values-1x-to-2x.py --in-place --backup my-values.yaml
    ```

    This modifies your file directly and creates `my-values.yaml.bak` as a backup.
  </Tab>

  <Tab title="Write to a new file">
    ```bash wrap theme={null}
    ./bin/migrate-helm-chart-values-1x-to-2x.py my-values.yaml migrated-values.yaml
    ```
  </Tab>

  <Tab title="Output to stdout">
    ```bash wrap theme={null}
    ./bin/migrate-helm-chart-values-1x-to-2x.py my-values.yaml > migrated-values.yaml
    ```
  </Tab>
</Tabs>

### Review the migrated file

Open the migrated file and verify the changes look correct. The script preserves YAML comments and formatting.

## Step 3: Validate the Helm upgrade (dry run)

Before making any changes to your cluster, run a Helm upgrade dry run to verify that the upgrade will succeed:

```bash wrap theme={null}
helm upgrade -f migrated-values.yaml -n astronomer astronomer astronomer/astronomer --version 2.0.x --dry-run
```

Replace `2.0.x` with the specific patch version you are upgrading to.

<Warning>
  Don't proceed until the dry run completes successfully. If it fails, resolve the reported errors first.
</Warning>

## Step 4: Upgrade to APC 2.0

Perform a standard Helm upgrade using your migrated values file:

```bash wrap theme={null}
helm upgrade -f migrated-values.yaml -n astronomer astronomer astronomer/astronomer --version 2.0.x
```

Replace `2.0.x` with the specific patch version you are upgrading to.

<Note>
  **Airgapped environments**

  For airgapped environments that can't access the internet, download the Helm chart `.tgz` file directly from the Astronomer Helm repository:

  ```text wrap theme={null}
  https://helm.astronomer.io/astronomer-<version>.tgz
  ```

  Replace `<version>` with the specific version you are upgrading to. Upload this file to your internal artifact repository, then reference it in your `helm upgrade` command.
</Note>

## Step 5: Migrate cluster configuration in the APC database

The Helm values migration Python script updates `values.yaml` on disk. Separately, the APC database can still store legacy flat `deployments` keys in each registered cluster’s `config` and `configOverride` until the cluster config path migration has run.

That migration is part of the APC API’s `yarn migrate` script (it invokes `migrate-cluster-config-paths` along with other jobs). If your control-plane upgrade already runs the full `yarn migrate` pipeline, this step is usually not a separate manual task.

If the migration hasn’t run or you need to run it again (for example after a failed migrate, or to confirm with a dry run first), you can run the same job independently with `yarn migrate-cluster-config-paths` from the `houston-api` pod, with the platform database reachable. Without this database update—whether it ran inside `yarn migrate` or a standalone run—cluster-level rows might not line up with the 2.0 [config governance](/docs/astro-private-cloud/v-2-x/config-governance) model.

* **What it does**: For every registered cluster, the APC API rewrites stored `config` / `configOverride` from old paths to the domain-grouped nested structure (the same renames the Helm migrator applies under `astronomer.houston.config.deployments`). It also invalidates the cluster details cache in the APC API.

* **When you need a standalone run**: For **1.x → 2.0** when you had registered data plane clusters in 1.x, **and** the cluster rows were never migrated (for example `yarn migrate` didn't run, or the step failed). **Don't** treat this as a standard [0.37 → 2.0](/docs/astro-private-cloud/v-2-x/upgrade-037-to-2) requirement—you typically have no pre-existing 2.0 cluster records to fix on that path.

* **Command** (on a host with the APC API release and DB access):

  ```bash wrap theme={null}
  yarn migrate-cluster-config-paths --dry-run
  yarn migrate-cluster-config-paths
  ```

  A dry run reports how many clusters **would** be updated; a full run applies changes and reports migrated vs skipped counts. Exit is non-zero if any cluster failed.

* **Strict config validation in the APC API**: The chart sets `astronomer.houston.strictSchemaCheck`. For how the 1.x migrator injects it, see the [values migration reference](#values-migration-reference) section. When `strictSchemaCheck.enabled` is `true`, the APC API rejects `deployments` config overrides with unknown keys or bad types. If you need to allow keys not yet in the generated schema, you can set `astronomer.houston.strictSchemaCheck.enabled: false` in your platform `values.yaml` and run another `helm upgrade` (see [Git-Sync relay metrics](/docs/astro-private-cloud/v-2-x/git-sync-relay-metrics) for a related case).

## Step 6: Verify the upgrade

After the upgrade completes, verify that all platform components are running:

```bash wrap theme={null}
kubectl get pods -n astronomer
```

All Pods should be in a `Running` or `Completed` state. If any Pods are in a `CrashLoopBackOff` or `Error` state, see [Debug upgrade](/docs/astro-private-cloud/v-2-x/debug-upgrade).

## Step 7: Upgrade all Airflow Deployments

After you have validated that all platform Pods are healthy, upgrade your Airflow Deployments to ensure full compatibility with 2.0.

<Note>
  Existing Airflow Deployments typically continue to function after the platform upgrade without immediate action. However, Astronomer recommends upgrading Deployments to ensure full compatibility with the new platform version.
</Note>

To upgrade Deployments, use one of the following approaches:

* **Astro UI**: Upgrade each Deployment manually from the Astro UI by navigating to the Deployment and triggering an upgrade.
* **APC API**: Use the APC API `upsertDeployment` mutation for programmatic or bulk upgrades.
* **Astro CLI**: Use the Astro CLI's [astro deploy](/docs/cli/v1.43/astro-deploy) command.

## Values migration reference

`bin/migrate-helm-chart-values-1x-to-2x.py` applies rules in this order: (1) every `global` map in the file (values under each `global` key, including nested charts); (2) `astronomer.houston.config` flags; (3) `astronomer.houston.config.deployments` rewrites, plus chart-only key deletions; (4) `nginx.cspPolicy`; (5) inject `astronomer.houston.strictSchemaCheck` if missing. The following tables list every rule in `bin/helm_chart_values_migration_shared.py` that the 1.x script uses. Keep this list aligned with the `release-2.0` branch of the [Astronomer Helm chart](https://github.com/astronomer/astronomer). The script only migrates keys that are present in your file; it doesn't add keys you didn't set, except for `strictSchemaCheck` as noted. Keys with no rule here are left unchanged.

### `global` feature flags

For each `global` mapping in the document, the old key is removed after migration (or dropped if the new path already exists).

| Old path                                     | New path                                                    | Type             |
| -------------------------------------------- | ----------------------------------------------------------- | ---------------- |
| `global.rbacEnabled`                         | `global.rbac.enabled`                                       | boolean → nested |
| `global.sccEnabled`                          | `global.scc.enabled`                                        | boolean → nested |
| `global.openshiftEnabled`                    | `global.openshift.enabled`                                  | boolean → nested |
| `global.networkNSLabels`                     | `global.networkNSLabels.enabled`                            | boolean → nested |
| `global.namespaceFreeFormEntry`              | `global.namespaceManagement.namespaceFreeFormEntry.enabled` | boolean → nested |
| `global.taskUsageMetricsEnabled`             | `global.metricsReporting.taskUsageMetrics.enabled`          | boolean → nested |
| `global.deployRollbackEnabled`               | `global.deploymentLifecycle.deployRollback.enabled`         | boolean → nested |
| `global.features.namespacePools` (subtree)   | `global.namespaceManagement.namespacePools`                 | subtree move     |
| `global.dagOnlyDeployment` (subtree)         | `global.deployMechanisms.dagOnlyDeployment`                 | subtree move     |
| `global.loggingSidecar` (subtree)            | `global.logging.loggingSidecar`                             | subtree move     |
| `global.podDisruptionBudgetsEnabled`         | `global.podDisruptionBudgets.enabled`                       | boolean → nested |
| `global.postgresqlEnabled`                   | `global.postgresql.enabled`                                 | boolean → nested |
| `global.prometheusPostgresExporterEnabled`   | `global.prometheusPostgresExporter.enabled`                 | boolean → nested |
| `global.nodeExporterEnabled`                 | `global.nodeExporter.enabled`                               | boolean → nested |
| `global.manualNamespaceNamesEnabled`         | `global.namespaceManagement.manualNamespaceNames.enabled`   | boolean → nested |
| `global.enablePerHostIngress`                | `global.perHostIngress.enabled`                             | boolean → nested |
| `global.enableArgoCDAnnotation`              | `global.argoCD.annotation.enabled`                          | boolean → nested |
| `global.disableManageClusterScopedResources` | `global.manageClusterScopedResources.enabled`               | inverted boolean |
| `global.astronomerEnabled`                   | `global.astronomer.enabled`                                 | boolean → nested |
| `global.nginxEnabled`                        | `global.nginx.enabled`                                      | boolean → nested |
| `global.alertmanagerEnabled`                 | `global.alertmanager.enabled`                               | boolean → nested |
| `global.grafanaEnabled`                      | `global.grafana.enabled`                                    | boolean → nested |
| `global.kubeStateEnabled`                    | `global.kubeState.enabled`                                  | boolean → nested |
| `global.prometheusEnabled`                   | `global.prometheus.enabled`                                 | boolean → nested |
| `global.elasticsearchEnabled`                | `global.elasticsearch.enabled`                              | boolean → nested |
| `global.vectorEnabled`                       | `global.daemonsetLogging.enabled`                           | boolean → nested |
| `global.fluentdEnabled`                      | `global.daemonsetLogging.enabled`                           | boolean → nested |

### `astronomer.houston.config` (non-`deployments`) flags and move

| Old path                                                               | New path                                                                   | Type             |
| ---------------------------------------------------------------------- | -------------------------------------------------------------------------- | ---------------- |
| `astronomer.houston.config.emailConfirmation`                          | `astronomer.houston.config.emailConfirmation.enabled`                      | boolean → nested |
| `astronomer.houston.config.publicSignups`                              | `astronomer.houston.config.publicSignups.enabled`                          | boolean → nested |
| `astronomer.houston.config.updateRuntimeCheckEnabled`                  | `astronomer.houston.config.updateRuntimeCheck.enabled`                     | boolean → nested |
| `astronomer.houston.config.updateAirflowCheckEnabled`                  | `astronomer.houston.config.updateAirflowCheck.enabled`                     | boolean → nested |
| `astronomer.houston.config.subdomainHttpsEnabled`                      | `astronomer.houston.config.subdomainHttps.enabled`                         | boolean → nested |
| `astronomer.houston.config.useAutoCompleteForSensitiveFields`          | `astronomer.houston.config.autoCompleteForSensitiveFields.enabled`         | boolean → nested |
| `astronomer.houston.config.shouldLogUsername`                          | `astronomer.houston.config.logUsername.enabled`                            | boolean → nested |
| `astronomer.houston.config.disableSSLVerify`                           | `astronomer.houston.config.sslVerification.enabled`                        | inverted boolean |
| `astronomer.houston.config.auth.openidConnect.idpGroupsImportEnabled`  | `astronomer.houston.config.auth.openidConnect.idpGroupsImport.enabled`     | boolean → nested |
| `astronomer.houston.config.auth.openidConnect.idpGroupsRefreshEnabled` | `astronomer.houston.config.auth.openidConnect.idpGroupsRefresh.enabled`    | boolean → nested |
| `astronomer.houston.config.auth.openidConnect.insecureIDPTokenLog`     | `astronomer.houston.config.auth.openidConnect.insecureIDPTokenLog.enabled` | boolean → nested |
| `astronomer.houston.config.webserver.graphqlPlaygroundEnabled`         | `astronomer.houston.config.webserver.graphqlPlayground.enabled`            | boolean → nested |
| `astronomer.houston.config.nats.tlsEnabled`                            | `astronomer.houston.config.nats.tls.enabled`                               | boolean → nested |
| `astronomer.houston.config.workers.dplink.debugEnabled`                | `astronomer.houston.config.workers.dplink.debug.enabled`                   | boolean → nested |
| `astronomer.houston.config.apollo.auditMiddlewareEnabled`              | `astronomer.houston.config.apollo.auditMiddleware.enabled`                 | boolean → nested |
| `astronomer.houston.config.deployments.mockWebhook.krbEnabled`         | `astronomer.houston.config.deployments.mockWebhook.krb.enabled`            | boolean → nested |
| `astronomer.houston.config.helm.rbacEnabled`                           | `astronomer.houston.config.helm.rbac.enabled`                              | boolean → nested |
| `astronomer.houston.config.deployments.mockWebhook.krbRealm`           | `astronomer.houston.config.deployments.mockWebhook.krb.realm`              | move value       |

### `nginx.cspPolicy`

| Old path                     | New path                  | Type             |
| ---------------------------- | ------------------------- | ---------------- |
| `nginx.cspPolicy.cdnEnabled` | `nginx.cspPolicy.enabled` | boolean → nested |

### `astronomer.houston.config.deployments` path migrations

Let `d` = `astronomer.houston.config.deployments`. Migrations run in the order below (same as `HOUSTON_DEPLOYMENT_PATH_MIGRATIONS` in code). The **Transform** column names match the code: `boolean-to-airflowV3` adds a default `minimumAstroRuntimeVersion` when converting from a plain boolean, and `taskUsageReport-to-taskUsageMetrics` maps the legacy task usage object into `metricsReporting.taskUsageMetrics`. `deprecated-unset` means the key is **removed** with no replacement.

| Old key (`d.<key>`)                                   | New path (under `d`)                                                             | Transform                           |
| ----------------------------------------------------- | -------------------------------------------------------------------------------- | ----------------------------------- |
| `performanceOptimizationModeEnabled`                  | `performanceOptimization.enabled`                                                | boolean-to-enabled                  |
| `upsertExtraIniAllowed`                               | `upsertDeployment.extraIniAllowed`                                               | move                                |
| `logHelmValues`                                       | `logHelmValues.enabled`                                                          | boolean-to-enabled                  |
| `airflowV3`                                           | `runtimeManagement.airflowV3`                                                    | boolean-to-airflowV3                |
| `customImageShaEnabled`                               | `runtimeManagement.customImageSha.enabled`                                       | boolean-to-enabled                  |
| `enableListAllRuntimeVersions`                        | `runtimeManagement.listAllRuntimeVersions.enabled`                               | boolean-to-enabled                  |
| `runtimeEnvOverideSemverCheck`                        | `runtimeManagement.runtimeEnvOverrideSemverCheck`                                | move (note: old key name spelling)  |
| `astroRuntimeReleasesFile`                            | `runtimeManagement.astroRuntimeReleasesFile`                                     | move                                |
| `airflowMinimumAstroRuntimeVersion`                   | `runtimeManagement.airflowMinimumAstroRuntimeVersion`                            | move                                |
| `loggingSidecar`                                      | `logging.loggingSidecar`                                                         | move                                |
| `elasticsearch`                                       | `logging.elasticsearch`                                                          | move                                |
| `configureDagDeployment`                              | `deployMechanisms.configureDagDeployment.enabled`                                | boolean-to-enabled                  |
| `dagOnlyDeployment`                                   | `deployMechanisms.dagOnlyDeployment.enabled`                                     | boolean-to-enabled                  |
| `nfsMountDagDeployment`                               | `deployMechanisms.nfsMountDagDeployment.enabled`                                 | boolean-to-enabled                  |
| `gitSyncDagDeployment`                                | `deployMechanisms.gitSyncDagDeployment.enabled`                                  | boolean-to-enabled                  |
| `gitSyncRelay`                                        | `deployMechanisms.gitSyncRelay`                                                  | move                                |
| `triggererEnabled`                                    | `airflowComponents.triggerer.enabled`                                            | boolean-to-enabled                  |
| `dagProcessorEnabled`                                 | `airflowComponents.dagProcessor.enabled`                                         | boolean-to-enabled                  |
| `disableManageResourceQuotasAndLimitRanges`           | `resourceManagement.resourceQuotas.enabled`                                      | invert-to-enabled                   |
| `components`                                          | `resourceManagement.components`                                                  | move                                |
| `executors`                                           | `resourceManagement.executors`                                                   | move                                |
| `astroUnit`                                           | `resourceManagement.astroUnit`                                                   | move                                |
| `maxExtraCapacity`                                    | `resourceManagement.maxExtraCapacity`                                            | move                                |
| `maxPodCapacity`                                      | `resourceManagement.maxPodCapacity`                                              | move                                |
| `sidecars`                                            | `resourceManagement.sidecars`                                                    | move                                |
| `overProvisioningFactorMem`                           | `resourceManagement.overProvisioningFactorMem`                                   | move                                |
| `overProvisioningFactorCPU`                           | `resourceManagement.overProvisioningFactorCPU`                                   | move                                |
| `overProvisioningComponents`                          | `resourceManagement.overProvisioningComponents`                                  | move                                |
| `manualReleaseNames`                                  | `namespaceManagement.manualReleaseNames.enabled`                                 | boolean-to-enabled                  |
| `manualNamespaceNames`                                | `namespaceManagement.manualNamespaceNames.enabled`                               | boolean-to-enabled                  |
| `namespaceFreeFormEntry`                              | `namespaceManagement.namespaceFreeFormEntry`                                     | object-or-boolean-to-nested         |
| `preDeploymentValidationHook`                         | `namespaceManagement.namespaceFreeFormEntry.preDeploymentValidationHook`         | move                                |
| `preDeploymentValidationHookTimeout`                  | `namespaceManagement.namespaceFreeFormEntry.preDeploymentValidationHookTimeout`  | move                                |
| `namespaceLabels`                                     | `namespaceManagement.namespaceLabels`                                            | move                                |
| `preCreatedNamespaces`                                | `namespaceManagement.preCreatedNamespaces`                                       | move                                |
| `deployRollback`                                      | `deploymentLifecycle.deployRollback`                                             | object-or-boolean-to-nested         |
| `hardDeleteDeployment`                                | `deploymentLifecycle.hardDeleteDeployment.enabled`                               | boolean-to-enabled                  |
| `cleanupAirflowDb`                                    | `deploymentLifecycle.cleanupAirflowDb`                                           | object-or-boolean-to-nested         |
| `database`                                            | `databaseManagement.database`                                                    | move                                |
| `manualConnectionStrings`                             | `databaseManagement.manualConnectionStrings.enabled`                             | boolean-to-enabled                  |
| `pgBouncerResourceCalculationStrategy`                | `databaseManagement.pgBouncerResourceCalculationStrategy`                        | move                                |
| `exposeDockerWebhookEndpoint`                         | `deploymentImagesRegistry.exposeDockerWebhookEndpoint.enabled`                   | boolean-to-enabled                  |
| `enableUpdateDeploymentImageEndpoint`                 | `deploymentImagesRegistry.updateDeploymentImageEndpoint.enabled`                 | boolean-to-enabled                  |
| `enableUpdateDeploymentImageEndpointDockerValidation` | `deploymentImagesRegistry.updateDeploymentImageEndpointDockerValidation.enabled` | boolean-to-enabled                  |
| `serviceAccountAnnotationKey`                         | `deploymentImagesRegistry.serviceAccountAnnotationKey`                           | move                                |
| `grafanaUIEnabled`                                    | `metricsReporting.grafana.enabled`                                               | boolean-to-enabled                  |
| `taskUsageReport`                                     | `metricsReporting.taskUsageMetrics`                                              | taskUsageReport-to-taskUsageMetrics |
| `pagination`                                          | `metricsReporting.pagination`                                                    | move                                |
| `canUpsertDeploymentFromUI`                           | `upsertDeployment.allowFromUi.enabled`                                           | boolean-to-enabled                  |

**Removed keys (no replacement, `deprecated-unset` or chart-only delete)**

| Key under `d`                                  | Reason                                |
| ---------------------------------------------- | ------------------------------------- |
| `upsertDeploymentEnabled`                      | `deprecated-unset`                    |
| `enableSystemAdminCanCreateDeprecatedAirflows` | `deprecated-unset`                    |
| `defaultDistribution`                          | `deprecated-unset`                    |
| `astroUnitsEnabled`                            | Chart-only delete (no 2.x equivalent) |
| `resourceProvisioningStrategy`                 | Chart-only delete (no 2.x equivalent) |
| `maxPodAu`                                     | Chart-only delete (no 2.x equivalent) |

### Injected default

| Path                                   | Injected if missing | Notes                                                        |
| -------------------------------------- | ------------------- | ------------------------------------------------------------ |
| `astronomer.houston.strictSchemaCheck` | `enabled: true`     | `AddKeyIfMissing` in `migrate-helm-chart-values-1x-to-2x.py` |

## FAQ

<AccordionGroup>
  <Accordion title="Is the migration idempotent?">
    Yes. Running the script multiple times on the same file produces the same output. Running it on an already-migrated file reports "No migrations needed" and makes no changes.
  </Accordion>

  <Accordion title="What about YAML comments?">
    The script uses `ruamel.yaml` in round-trip mode, which preserves comments and formatting. Inline comments transfer to the new key names. Comments on untouched keys are unaffected.
  </Accordion>

  <Accordion title="What if I have both old and new keys?">
    If a key already exists at the new-schema path, the new-schema value takes precedence and the stale old key is removed. For example, if your file contains both `global.rbacEnabled: true` and `global.rbac.enabled: false`, the script keeps `global.rbac.enabled: false` and deletes `global.rbacEnabled`.
  </Accordion>

  <Accordion title="What if I have a full copy of values.yaml instead of just overrides?">
    The script works on full files, but Astronomer recommends extracting only your customizations into a separate override file. Running the migration on a full copy of the old defaults may carry forward old default values (like image tags) that should be updated to the new chart defaults.
  </Accordion>
</AccordionGroup>

## Roll back

If you need to revert the values migration:

1. Restore your backup:

   ```bash wrap theme={null}
   cp my-values.yaml.backup my-values.yaml
   ```

2. To downgrade the chart after a Helm upgrade:

   ```bash wrap theme={null}
   helm rollback astronomer <previous-revision> --namespace astronomer
   ```
