- Features
- Pricing
- English
- français
- Deutsche
- Contact us
- Docs
- Login

The decision to migrate a production application is rarely about the destination. It is about the friction of the journey.
For most engineering leaders, the word "migration" is a synonym for "refactor."
The industry has conditioned us to assume that moving to a modern cloud platform requires throwing away years of stable configuration, learning a new proprietary DSL, and rewriting core application logic to fit a specific container or serverless model.
This "migration tax" is the single biggest reason why technical debt accumulates. Teams stay on aging, insecure, or expensive infrastructure because the cost of moving feels higher than the cost of staying.
However, when you analyze why migrations fail to meet deadlines or budgets, it is rarely the application code that causes the blowout. It is the infrastructure primitives.
A migration strategy (what we call a "migration blueprint") focuses on decoupling your application from those primitives. By using standardized environments, you can move the application as it is, while the platform absorbs the complexity of the underlying wiring.
This migration blueprint is designed for organizations managing long-lived, complex application estates where stability is non-negotiable.
This blueprint applies if you are migrating:
When you migrate to a raw cloud provider, you are forced to pay a "primitive debt" before the first line of code even runs.
This debt is the primary source of cognitive overload for senior engineers. It includes manual provisioning of virtual machines, writing thousands of lines of Terraform to define VPCs and subnets, and manually configuring IAM roles for every service connection.
For a mid-market organization, this manual overhead often consumes the majority of senior engineering time, delaying delivery by quarters rather than weeks.
The goal is to eliminate this work. You are evaluating a platform based on how much of this "boring" infrastructure it can automate away.
The first step in a rewrite-free migration is moving from imperative infrastructure to declarative service mapping.
In a traditional migration, you tell the provider how to build a database: "Create a t3.medium instance, attach 50GB of storage, and open port 5432."
In this blueprint, your primary migration artifact is a single, version-controlled configuration file (.upsun/config.yaml). This file defines:
Because Upsun uses standardized environments, the platform already knows how to provision and secure these services.
You don't have to rewrite your application's connection logic; the platform provides a consistent relationship between your app and its services.
This turns the migration into an act of deployment rather than an act of manual engineering.
A primary reason for code rewrites during migration is "environment mismatch."
An application that runs on a developer's laptop might fail in a legacy staging environment because of a slight difference in a library version or a different filesystem permission model.
To avoid a rewrite, you need environment parity.
Upsun’s standardized environments ensure that the build and runtime are identical across every stage of the lifecycle. This is particularly critical for stateful workloads and monoliths that expect a specific, predictable environment.
When you define your application dependencies in your configuration, the platform creates a containerized environment that remains consistent from the first branch to final production.
You don't have to "fix" your code to work in the cloud; the platform provides the predictability the code expects. For senior architects, this consistency is the ultimate safety net against the "it worked on my machine" syndrome.
The most dangerous moment of any migration is the "cutover." Traditionally, this is preceded by testing in a staging environment that is a "close approximation" of production.
In this blueprint, "close enough" is not an option.
Upsun allows you to create production-perfect clones for every branch. When you are testing your migration on a feature branch, you are testing against a perfect replica of your target production stack. This includes your service versions, your infrastructure configuration, and a sanitized clone of your production data.
This allows you to validate the migration of the actual application logic against real world conditions.
This capability transforms migration from a "leap of faith" into a verified deployment process. If the migration works on the branch, you have the proof required to proceed with the production cutover.
A common trap in modernization is getting "locked in" to a provider's proprietary services as part of the migration.
While these services offer power, they often require you to rewrite significant portions of your application to fit their specific APIs.
Upsun’s approach is built on portability.
While you choose your cloud provider (AWS, Azure, GCP, IBM, or OVHcloud) at project creation, the platform layer remains identical.
This means you can move your application from one provider to another by re-provisioning the project on the new provider, without rewriting your application code or your infrastructure configuration.
This gives you strategic optionality. You can meet data sovereignty requirements or satisfy an executive mandate for cloud diversity without the traditional increase in operational overhead.
From a leadership perspective, a "no-rewrite" migration is about resource allocation.
In most migrations, infrastructure work consumes the majority of senior engineering time. Every hour a senior developer spends debugging a Terraform script or refactoring a legacy module for a new provider is an hour they aren't spending on your product roadmap.
By letting the platform manage the "grind" of infrastructure, you can execute a migration with a smaller team in a fraction of the time. This is the difference between a migration that costs the company months of innovation and one that serves as a springboard for faster delivery.
The goal of this blueprint isn't to never migrate again. It is to make migration a repeatable, low-risk operation instead of a once-a-decade crisis.
By adopting a model based on standardized environments, you remove the friction of the "everything refactor" and eliminate the cognitive load of managing cloud primitives. You give your team the guardrails they need to move, scale, and iterate with confidence.
Migration doesn't have to be a rewrite. It just needs a better platform.
Join our monthly newsletter
Compliant and validated