Moving from Google Cloud Composer to self-hosted Apache Airflow

A practical plan for teams leaving Cloud Composer for Airflow they run, covering what maps cleanly, what needs rework, the documented paths and how to cut over without double runs.

On this page

Why teams move DAGs off Cloud Composer and what the move involves

Platform teams are looking at this move because Google now documents Cloud Composer as Managed Service for Apache Airflow, and the team that must run Airflow inside its own cloud accounts, data centers or restricted networks has to decide what it takes over. The short answer on effort is that DAG code is usually the smaller part of the work. The larger part is getting onto a supported Airflow 3 line, rebuilding the connections and secrets that DAGs use, choosing how DAG files reach the scheduler and workers, and cutting over without two copies of the same pipeline running. Airflow 2 reached end of life on April 22, 2026, so a Composer environment still pinned to an Airflow 2 image is already running without fixes. The Airflow 3 upgrade guide requires being on Airflow 2.7 or later before upgrading and recommends moving to the latest 2.x first.

Start by confirming which Composer generation and image version each environment runs, and which Airflow release that image carries. Google's version list shows Gen 3 environments offering Airflow 3.1, 3.2 and 3.3 builds, and newer builds follow a 12-month support period, so the image in use sets the upgrade path. Inventory the Airflow providers and Google-specific packages in each environment's requirements, because Airflow 3 changes how task code reaches metadata and the API, and DAGs that read Airflow models directly will need rework before the move. Ruff rules AIR301 and AIR302 are the documented starting point for finding removed or moved features in DAG code.

The Google provider includes the GCP Secret Manager backend and BigQuery operators, so pipelines can keep calling Google services after they leave Composer. What changes is where the credentials come from and who controls them. Each Composer connection, variable and secret needs an owner on the new platform, a decision about whether it stays in Secret Manager or moves to a secrets store you run, and a test that proves the same DAG run authenticates the same way. Confirm with your security team which identity the self-hosted scheduler and workers will use to reach Google APIs before any DAG is switched over.

Which Composer features map to self-hosted Airflow and which need rework

This table compares the features a Composer environment provides with what each one becomes on self-hosted Airflow, and flags the items that change under Airflow 3. Read the rows marked as rework first, because they decide how much DAG code must change before the first run on your own infrastructure.

Composer featureSelf-hosted equivalentChanges under Airflow 3
Image version and Python environmentOfficial Airflow image or PyPI install with constraints, pinned to the Airflow release you chooseAirflow 3 requires Python 3.10 to 3.14, so confirm your DAG dependencies support that range
GCS DAG folder synced to the environmentDAG bundle delivered by your own process, such as git sync or a baked image, with the DAG processor running separatelyThe DAG processor must run as its own component in Airflow 3
Google connections in the Airflow UI or CLIConnections stored in your metadata database or a secrets backend, recreated with the same connection IDsConfirm connection IDs match what DAGs reference, since they are not carried over automatically
Secret Manager access through the environmentCloudSecretManagerBackend from the Google provider, with credentials from a service account you manageNo change to the backend itself, but task code must not read Airflow database sessions to fetch secrets
Google operators such as BigQuery operatorsSame operators from the Google provider package, installed and version-pinned in your imageKeep the provider versions compatible with your chosen Airflow 3 release
Plugins and requirements managed through Composer settingsDependencies and plugins baked into your image or installed through your build pipelinePlugins that touch the webserver or database models need rework for the API server and Task SDK
Task code that uses database sessions or models directlyTask code calls the REST API or Task SDK insteadChanged: Airflow 3 no longer lets task code use Airflow database sessions or models directly
SubDAGs in Airflow 2 DAGsTaskGroups for grouping tasks inside a single DAGChanged: SubDAGs are removed in Airflow 3, so each one needs rewriting as a TaskGroup
Web UI served by the environmentAPI server started with the airflow api-server command, plus your own ingress and authenticationChanged: the webserver is replaced by the API server
Google sign-in managed by the platformOne auth manager set by the auth_manager option, such as the Simple auth manager or the FAB providerChanged: only one auth manager is allowed at a time, and Simple is the default

How Composer generations and image versions change the starting point

The source Composer environment fixes the Airflow version and the provider set, so the migration starts with an inventory of what the environment actually runs. Record the exact image version, every installed PyPI package with its pinned version, and every environment variable and Airflow configuration override. Teams often assume the DAG folder is the whole application, but a Composer environment can carry provider packages, custom plugins and runtime settings that the DAGs quietly depend on. Export this inventory from the environment itself rather than from the team's memory or the original requirements file, because the two frequently disagree.

Google documents Cloud Composer as Managed Service for Apache Airflow, and its Gen 3 environments offer Airflow 3.1, 3.2 and 3.3 builds. Google's versions page describes a 12-month support period for newer builds, so an environment on an older build may be closer to the end of its support than the team expects. Choose the target Airflow version on purpose, based on the upstream support table, your own upgrade capacity and the provider versions your DAGs need, instead of copying whatever build the source environment happens to run. Upstream Airflow 2 has already reached end of life, so a target on Airflow 2 would start with no fixes at all.

Confirm current image support with Google before you set the migration timeline, because support windows and available builds change. Ask which build your environment will receive next, when your current build leaves support, and whether any Composer-specific behavior in your DAGs or operators is tied to that build. Then compare the target self-hosted version against the same provider list, since a provider release that matches your source build may not match the version you choose to run. Write the answers into the migration plan so the target version, the provider pins and the cutover date all rest on confirmed facts.

Documented paths for moving DAGs, connections and secrets

No vendor-supplied one-click importer is assumed for this move, so each path below is a set of steps your team owns. The paths differ in what they carry across (DAG files, connection definitions, secret values, runtime base image and code compatibility), and most teams combine two or three of them.

Copy DAG files from the GCS folder

Composer stores DAG files in a Cloud Storage bucket folder that you can read directly. Copy the files into the delivery mechanism your self-hosted Airflow uses, such as a Git-synced repository, a bundle or a baked image. Confirm with Google which export or download tooling is available for your Composer generation before you rely on it, and record the source object versions so you can prove which code ran. Remove any plugins, data files or requirements that were stored in the same bucket and do not belong in the DAG folder.

Recreate connections in the new metadata database

Composer connections live in the Airflow metadata database that Google operates, so you cannot copy that database as is. Inventory every connection by ID, type and owner, then recreate each one in your deployment through your chosen secrets path or the Airflow connection settings. Replace any connection that depends on Composer-specific service accounts or network paths, and test each one with a non-destructive task before any production DAG uses it.

Point CloudSecretManagerBackend at existing secrets

The Google provider includes the CloudSecretManagerBackend, so your self-hosted Airflow can read the same Secret Manager entries that Composer DAGs use today. Configure the backend with the project and the service account that your workers run as, and confirm that account holds only the read access it needs. Test secret lookups in a staging environment, and check that connection IDs and variable names resolve to the same values before you switch any schedule.

Build on the official Docker image or Helm chart

Start from the official Airflow Docker image or the community Helm chart, which uses that image, instead of the image Composer runs. Install the Google provider and any other packages your DAGs import, pinned with constraints that match your Airflow version. Composer's bundled PyPI packages do not carry over automatically, so compare the installed package list with what your DAGs import and record every difference.

Run Ruff AIR301 and AIR302 checks

Before moving DAG code to Airflow 3, run Ruff with the AIR301 and AIR302 rules over the DAG folder to find removed imports, renamed arguments and deprecated patterns. Airflow 3 also blocks direct database access from task code and removes SubDAGs, so these checks will not catch every issue. Review the findings with the DAG owners and fix them in version control before the first staging run.

The sequence from inventory to decommissioning Composer

This sequence moves DAGs from Cloud Composer to a self-hosted Airflow in controlled stages, so each schedule has one owner at every point and the Composer environment is retired only after its outputs and evidence are confirmed.

  1. Inventory DAGs, providers, connections and variables

    Export the list of DAGs from the Composer environment and the GCS DAG folder, then record the Airflow and provider package versions, every connection, every Airflow variable and every secrets backend setting. Note which DAGs call Google services such as BigQuery, Cloud Storage or Pub/Sub, and which depend on files in the bucket or on Composer-specific environment variables. Your team owns this inventory and the platform engineer confirms it against the Composer console. The step is done when every DAG has an owner, a schedule, a dependency list and a named destination for each connection and secret.

  2. Run the Airflow 3 compatibility pass

    Check the DAG code against Airflow 3 before any runtime work starts. Run Ruff with the AIR301 and AIR302 rules, replace direct database session and model access in task code with the REST API or Task SDK, and convert any SubDAGs to TaskGroups. If your Composer DAGs run on a 2.x build, the upgrade guide recommends moving to the latest 2.x release first, and Airflow 3 requires a 2.7 or later starting point. The step closes when the lint output is clean for the rules you chose and each DAG has a recorded result in a shared tracker.

  3. Stand up a self-hosted pilot on the official image

    Deploy Airflow 3 on infrastructure you control using the official container image, with the API server and DAG processor running as separate components. Use PostgreSQL 14 to 18 as the metadata database, because the default SQLite backend is for testing only. Connect the pilot to the same Google services through the Google provider and the GCP Secret Manager secrets backend, using a dedicated service account with the narrowest roles the DAGs need. The platform team signs off when the pilot passes a health check, runs a sample DAG against a non-production BigQuery dataset, and reads a test secret from Secret Manager.

  4. Run both environments in parallel with single ownership

    Migrate DAGs in batches and keep one owner per schedule at all times. A DAG that is active in the new environment is paused in Composer, and the team compares outputs from both sides for a defined review period agreed in advance. Owners check row counts, file outputs and downstream consumers, and they record any difference in a log. The team confirms the log shows no schedule active in both environments, because a double run can write duplicate data or trigger downstream jobs twice. The step is done when each batch has matching outputs and an owner has signed the comparison.

  5. Cut over each schedule in a controlled order

    For each DAG, pause the Composer DAG first, confirm that no run is in progress, and then enable the self-hosted DAG with the same schedule and start date. Record the last successful Composer run and the first self-hosted run so the handover can be audited. Keep the cutover to one DAG or one dependency group at a time, and make the rollback step explicit: re-pause the new DAG and unpause the Composer DAG. The step closes when the runs show the expected sequence and the cutover record names the approver and the time of each change.

  6. Retire the Composer environment and bucket

    After every DAG has run successfully on the self-hosted platform for the retention window you set, export the DAG files, logs and any run history you must keep to archival storage. Then delete the Composer environment and empty the GCS bucket that held its DAG folder, after confirming that no other system reads from it. Ask your Google Cloud account team or your own billing records to confirm the final charges and the deletion of the associated resources. The step is done when the decommissioning record lists the deleted resources, the archive location and the approver, and the evidence is stored with your change records.

What drives effort and cost when moving off Composer

How many DAGs and providers affect the effort of moving off Composer?

The number of DAGs sets the bulk of the migration work, and the number of distinct provider packages sets how much compatibility checking the team needs. Each DAG has to be inventoried, assigned an owner, and classified as move as is, rewrite, or retire. Provider packages matter because each Google provider import, operator and hook must resolve in the target image, and provider versions must match the Airflow release you choose. Ask the partner to group DAGs by shared imports and by the Google services they call, since a small number of shared patterns usually covers many DAGs. Count DAGs that are dormant or duplicated separately, because retiring them costs less than porting them.

Does Airflow 2 DAG code need rework to run on Airflow 3?

Often yes, and the rework is driven by which Airflow 2 features the DAGs use. Airflow 3 requires that you be on Airflow 2.7 or later before upgrading, and the upgrade guide recommends moving to the latest 2.x first and checking DAG code with the Ruff AIR301 and AIR302 rules. Task code can no longer use Airflow database sessions or models directly and must use the REST API or Task SDK instead. SubDAGs have been removed in favor of TaskGroups, and the hybrid CeleryKubernetesExecutor and LocalKubernetesExecutor are no longer supported as of Airflow 3.0.0. DAGs that read metadata inside tasks or use SubDAGs are the most expensive to change, so flag them early.

How many Google connections and secrets must move with the DAGs?

The count of Google connections and secrets determines how much configuration work and access review the move involves. Each Airflow connection that points to a Google project, service account or BigQuery dataset must be recreated in the new environment, and its credentials must be stored in a secrets backend. The Google provider includes a Secret Manager backend (CloudSecretManagerBackend), so teams that already keep secrets in Google Secret Manager can often keep them there, which means the new Airflow needs network access and a workload identity that can read them. Inventory connections by service account, note which ones are shared across DAGs, and confirm with your security team which identities may be retained.

Do GCS-backed DAG folders, plugins or custom images add effort?

They add effort when DAGs, plugins or Python dependencies are delivered through Cloud Storage or baked into a Composer image. Composer environments typically sync the DAG folder from a GCS bucket, so the self-hosted team must choose a delivery method such as git-sync, a shared volume, or a build pipeline that packages DAGs into the image. Custom plugins and requirements installed into a Composer image need to be rebuilt on the official Airflow base image and tested against the same provider versions. Ask for a list of every plugin, custom package and environment variable, because each one becomes a build artifact your team must own. The Airflow container and Kubernetes guidance supports this approach, but the delivery design is a decision you must make.

Which Composer version and image do the DAGs currently target?

The Composer generation and image version set the Airflow release you are moving from and therefore the upgrade path. Google documents Managed Service for Apache Airflow (formerly Cloud Composer) versions on its versions page, where Gen 3 environments offer Airflow 3.1, 3.2 and 3.3 builds and newer builds follow a 12-month support period. Record the exact Airflow version, provider versions and Python version of each environment, since the self-hosted target must support the same Python range. If you are on an Airflow 2 image, the upgrade to Airflow 3 is a separate project that should be scheduled before the platform move, not during it.

What does the team have to run after cutover?

After cutover your team operates every component that Google previously managed. In Airflow 3 that includes the scheduler, the DAG processor, which runs as a separate component, and the API server, which replaces the webserver. You also run the metadata database, which must be PostgreSQL or MySQL in production, since SQLite is for testing only. Plan for database backups and restore tests, upgrades, log storage, monitoring, and executor capacity such as Kubernetes nodes or Celery workers. Multiple schedulers are supported for resiliency, but each added component adds operational work. Ask for a written runbook covering who patches, who restores and how often.

Can our own team do this migration without a partner?

A capable platform team can do the work, but the question is whether it has the time and skills for the parts that carry risk. The work includes inventorying DAGs, porting code to Airflow 3 rules, rebuilding images, recreating Google connections, designing a delivery method, and running a parallel period before cutover. Each of these tasks has a clear output, which makes them suitable for a fixed-scope engagement with written deliverables and an agreed timeline. Consider whether your team already runs Kubernetes, PostgreSQL backups and secrets management, because those skills determine how much of the ongoing operation you can absorb.

How do we get a comparable quote for a Composer exit?

Ask every bidder to price against the same written inventory. Provide the DAG count, provider list, Composer version, connection and secret inventory, plugin and image list, and the target platform you have chosen. Ask the quote to separate one-time work (inventory, porting, image build, connection recreation, parallel run and cutover) from recurring work (upgrades, backups, monitoring and support), and to state what is excluded, such as Kubernetes cluster provisioning or Google-side decommissioning. DeployOpen does not publish a price list. A quote follows from the written scope, which is agreed before work starts.

What makes the migration longer or shorter

This table lists the factors that expand or shrink a Cloud Composer to self-hosted Airflow move, whether each one is paid once or recurs, and what to request in a quote. Read it before comparing proposals, because the same DAG count can mean very different effort depending on task code, Google dependencies and the parallel run plan.

DriverWhy it changes effortOne-time or recurringWhat to ask for in a quote
DAG count and complexityMore DAGs, dynamic generation and cross-DAG dependencies multiply testing and cutover steps.One-timeInventory of DAG count, dependency graph and dynamic DAG patterns, with a per-DAG migration approach.
SubDAGs in useSubDAGs were removed in Airflow 3 in favor of TaskGroups, so each one needs rewriting and retesting.One-timeCount of SubDAGs and the TaskGroup conversion plan for each.
Direct database or session access in task codeAirflow 3 task code cannot use database sessions or models directly and must use the REST API or Task SDK.One-timeAudit of task code for metadata database access and the rewrite estimate for affected tasks.
Custom plugins and operatorsPlugins built for Composer images must be checked against Airflow 3 changes and rebuilt into your own image.One-time, with ongoing maintenance of custom codePlugin list, target Airflow version and who owns updates after handover.
Google services in useBigQuery, Cloud Storage, Dataproc and other Google connections must be reproduced with credentials that work outside Composer.One-time for setup, recurring for credential rotationConnection inventory and the authentication method planned for each Google service.
Secret sprawlVariables, connections and secrets spread across Composer settings and Secret Manager need mapping to the secrets backend you run.One-time mapping, recurring secret rotationCount of secrets and connections, the secrets backend chosen and the rotation process.
Workload isolation needsSeparating teams, runtimes or sensitive jobs means more executors, queues or clusters to design and operate.One-time design, recurring infrastructure costExecutor choice, isolation boundaries and the capacity assumptions behind them.
Database sizing and HA choicesA production metadata database on PostgreSQL or MySQL, with backups and failover, is work Composer previously handled for you.One-time build, recurring operation and backupsDatabase engine and version, HA topology, backup and restore test scope and who runs them.
Depth of the parallel runRunning both platforms to compare outputs for several cycles adds monitoring and reconciliation effort, and guards against double runs.One-time, but duration depends on schedule cadenceLength of the parallel run, comparison criteria and the cutover checklist for disabling Composer schedules.

How double runs, lost secrets and version drift usually happen

Most failed Composer exits come from the same few gaps: two schedulers active at once, credentials that exist in one place only, DAG code tied to the old folder layout, and a self-hosted stack built on a database or Airflow version that cannot be supported. Each card names the failure and the check that prevents it before the first production run.

Two environments holding active schedules

A DAG left unpaused in Composer and enabled in the new Airflow will run twice on the same schedule, often writing to the same tables or sending the same notifications. Before cutover, inventory every DAG in both environments and record which side owns each schedule. Pause or retire the Composer copy first, confirm the self-hosted run is the only active one, and keep a dated log of the switch for audit.

Secrets unreachable from new workers

Connections and variables that resolve through Secret Manager in Composer may not resolve on self-hosted workers, which often fail only at the first task that needs them. Confirm the workers run under an identity with read access to the required secrets, and that the Google provider's Secret Manager secrets backend is configured with the same project and prefix. Test each connection from a worker, not from the scheduler.

Composer-specific paths and GCS layout

DAGs that read from /home/airflow/gcs/data or assume the dags/ folder layout synced from a Cloud Storage bucket will break when that bucket is no longer mounted. Search DAG code and plugins for the gcs path, hard-coded bucket names and Composer environment variables. Replace them with configuration that the self-hosted deployment supplies, and decide how DAG files will be delivered to the new environment before the first run.

Unsupported metadata database choices

Migrating the metadata store to SQLite, or to MariaDB, leaves a deployment outside the supported configurations and risks data loss. Use PostgreSQL 14 to 18 or MySQL 8.0, 8.4 or an Innovation release, sized and backed up under your own controls. Confirm the chosen version against the prerequisites before provisioning, since the database is hard to change once run history accumulates.

Running an unsupported Airflow version

Composer image versions and the Airflow release a self-hosted team chooses can drift apart, and an older line can reach end of life with no fixes. Pick an Airflow 3 release from the support table, confirm the Python and Kubernetes versions it requires, and set a calendar review before any line enters limited maintenance. Ask the team to write down the upgrade owner and the trigger that starts the next move.

What your team needs to provide and what changes for operators

Before any DAG moves, your team needs to provide four things: access, an inventory, a change window and a named owner for each side of the cutover. On the Google side, that means a project-level reader role on the Composer environment, its Cloud Storage bucket for DAGs, plugins and data, and the Cloud Logging entries for task runs, plus read access to Secret Manager so the team can list which secrets each DAG resolves. On the target side, you need an account that can create the metadata database, the object storage used for logs, and the Kubernetes namespace or VM group that will host Airflow. Ask who holds the Google service account keys today, because many Composer DAGs authenticate through that identity and it has to be replaced deliberately, not copied.

The inventory is the document most often missing. Export the list of DAGs from the Composer bucket, the Airflow connections and variables from the environment, the pip requirements pinned in the environment configuration, and the Composer image version each environment runs. Confirm the version against Google's current Managed Service for Apache Airflow versions page before you pick a target Airflow release, because the Google-managed build and a community release rarely match exactly. Your team also needs to name who owns each DAG's business outcome, since that person signs off on the cutover date for their pipelines and decides which runs can be replayed after a gap.

Operationally, the change is larger than the DAG move. Once cutover completes, your platform team owns the scheduler, the DAG processor, the API server, workers, the metadata database, upgrades, backups and the on-call rotation for failed runs that Google previously handled. If you choose Kubernetes, that includes the cluster, node upgrades, etcd backups and Pod Security settings beneath Airflow. If you choose virtual machines, it includes patching, service supervision and capacity. Decide before the build starts who is paged for a stuck scheduler at 2 a.m., and confirm that your monitoring can detect a parser or scheduler failure, not only a failed task.

Questions teams ask before moving off Cloud Composer

What does it cost to move from Cloud Composer to self-hosted Airflow?

The cost is the sum of the people and infrastructure needed to run the move and then run Airflow yourself. Migration effort is one-time: inventorying DAGs, rebuilding the Airflow image, replacing Composer-specific settings, moving secrets, testing and cutover. Running costs recur: compute for the scheduler, DAG processor, API server and workers, a PostgreSQL or MySQL metadata database, log storage, monitoring and patching. The main drivers are the number of DAGs, how many Google-specific operators and connections they use, how many environments exist, and whether you already run Kubernetes. Ask any quote to separate one-time migration work from recurring operations and to list which infrastructure is billed to your cloud account.

How long does a Composer to self-hosted Airflow migration take?

Duration depends on the size and condition of the DAG estate, not on the Airflow version alone. Teams usually see longer timelines when DAGs depend on Composer-only environment variables, when many tasks use Google operators that need new connections, or when the platform team has not yet built the Kubernetes or VM foundation. A written scope should give phases for inventory, foundation build, DAG porting, parallel run and cutover, with a stated duration for each. No general figure is given here because the supplied sources do not establish one. Ask for a timeline tied to your DAG count and dependency list.

Can our own platform team migrate off Cloud Composer without a partner?

Yes, many teams do, provided they have engineers who can run Airflow in production. The team needs skills in container images, the metadata database, scheduler operations, secrets management and Google service accounts. The hardest parts are usually not the DAG code but the operating model: upgrades, backups, log retention, access control and on-call. If those skills are thin, a fixed-scope engagement can cover the foundation build, the DAG port and the cutover, and leave your team with runbooks. Ask for the handover deliverables in writing before work starts.

Do our DAGs need rewriting for Airflow 3?

Some DAGs need changes, and the Airflow 3 upgrade guide is the place to start. Airflow 2.7 or later is required before upgrading, and the guide recommends moving to the latest 2.x first and checking DAG code with the Ruff AIR301 and AIR302 rules. Airflow 3 task code cannot use Airflow database sessions or models directly and must use the REST API or Task SDK, and SubDAGs were removed in favor of TaskGroups. Composer image versions also matter: Google's versions page lists Gen 3 builds on Airflow 3.1, 3.2 and 3.3, so confirm which build your environments run before choosing the target release.

How do secrets and Google connections move to self-hosted Airflow?

Secrets move by changing where Airflow reads them, not by copying values into DAG files. The Google provider includes the CloudSecretManagerBackend, so a self-hosted Airflow can keep reading secrets from GCP Secret Manager if the workers use a service account with the right access. Connections defined in the Composer UI or environment variables must be recreated in your deployment, and each one should be checked for scope. Keep the Secret Manager path in the design, then confirm that your workers, not only the scheduler, can reach it. If you prefer a different store, plan that change as a separate step.

How do we avoid double runs during cutover?

Double runs happen when Composer and the new Airflow both schedule the same DAG against the same data. Avoid them by pausing each DAG in Composer before unpausing it in self-hosted Airflow, and by moving one DAG group at a time with a recorded owner. Compare outputs in a parallel run where the new environment writes to a staging location or is read only. Keep the Composer DAG folder in place as a rollback path until the new schedule has produced verified results. Also check the catchup setting, because an unpaused DAG can backfill missed intervals and repeat work.

Where should the new Airflow run, and what does the team need to operate it?

Airflow can run on Kubernetes, on virtual machines or in other infrastructure you control. The official Helm chart uses the official Docker image, and the production guide recommends container images for Kubernetes. Whichever target you choose, the metadata database should be PostgreSQL or MySQL, since SQLite is for testing only and MariaDB is not supported. Plan for multiple schedulers if you need resiliency, and for a DAG delivery path that replaces the GCS folder. Confirm the Kubernetes version support window before committing to a cluster, because the project maintains only its three most recent minor releases.

How DeployOpen scopes and delivers the Composer move

DeployOpen is a Chainscore Labs company that plans, implements, customizes, integrates, hardens, backs up, upgrades, documents and supports self-hosted open-source platforms inside your own cloud accounts, data centers or air-gapped networks. For a Composer move, we start from a written scope that names your environments, DAG inventory, connections and cutover window before any work begins.

How we scope

  • We inventory Composer environments, their image versions and the DAG folders in Cloud Storage that feed them.
  • We list every Google connection, Secret Manager reference and BigQuery dependency each DAG uses today.
  • Engagements are fixed-scope, so deliverables, timelines and cutover conditions are agreed in writing before work starts.

How we build

  • We stand up self-hosted Airflow 3 on your infrastructure with PostgreSQL, a separate DAG processor and the executor you choose.
  • We rebuild connections and the Secret Manager backend in your environment, then test each DAG against it in staging.
  • We run parallel scheduling checks and confirm that every DAG has one active schedule before any cutover step.

How we hand over

  • You receive runbooks for DAG delivery, deployment, cutover, rollback and decommissioning of the Composer environment.
  • Documentation records the version pins, provider packages, connection inventory and access model as built.
  • Handover includes walkthroughs with the engineers who will operate the platform after the engagement ends.

How we support

  • Ongoing support, upgrades and continuous testing are available as retainers after handover.
  • A retainer can cover Airflow patch and minor upgrades as your release calendar requires, checked against the upgrade guidance.
  • Ask any partner to confirm response expectations and upgrade responsibilities in writing before you sign.

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.