Skip to content

Performance & data

Heroku migration

Heroku to Google Cloud Migration

Heroku made sense when you shipped. If the bill, the add-on sprawl or the region list has stopped making sense, the move to Cloud Run is a container and a pipeline — not a rewrite. We plan it, run it, and leave you able to roll back.

The inventory both estates are matched against, and the switch between themPRF · 06
Overview

The same app, on a runtime you control

A Heroku dyno and a Cloud Run service do the same job: run your container, scale it, put a URL in front of it. Most Node.js applications move without their code changing. What changes is everything around the code — how it is built, where secrets come from, which identity it runs as, and what happens when a deploy goes wrong.

That surrounding layer is the whole engagement. We containerise the app, wire GitHub to Cloud Build and Artifact Registry, move config out of dyno env vars into Secret Manager, give the service its own IAM identity instead of a shared key, and keep the Heroku app running until the new one has proven itself.

No rewrite
A twelve-factor Node app is already a container away from Cloud Run. We change the build and the config, not the application.
Reversible by design
The Heroku app stays up and DNS stays switchable until the Cloud Run service has served real traffic. Rollback is a decision, not an incident.
Secrets stop being env vars
Config moves into Secret Manager with IAM-scoped access, so credentials are no longer readable by anyone with dashboard access.
What's included

What the engagement covers

  • Audit of the current dynos, add-ons, buildpacks and config vars
  • Containerisation and a reproducible build
  • GitHub → Cloud Build → Artifact Registry → Cloud Run pipeline
  • Secret Manager for credentials, with a dedicated runtime service account
  • Health checks, logging and a documented rollback path
  • Cutover plan and a parallel-run window before DNS moves

Technologies

  • Google Cloud Run
  • Cloud Build
  • Artifact Registry
  • Secret Manager
  • IAM
  • Node.js
  • Docker
  • GitHub
Use cases

Where this helps most

  • The bill outgrew the app

    Dyno hours and paid add-ons have grown past what the workload justifies, and you want a runtime that scales to zero between traffic.

  • An ecommerce API behind a storefront

    A Node.js service your store depends on needs a deployment model with real build provenance, managed secrets and per-service identity.

  • You need a region, a VPC or an IAM story

    Compliance, latency or a security review has asked for something the dyno model does not offer.

Process

How we deliver

  1. Inventory

    We list every dyno, add-on, scheduled job and config var, and mark which are load-bearing, which are dead, and which have a managed Google Cloud equivalent.

  2. Containerise

    The app gets a Dockerfile and a build that produces the same image locally and in CI, so what you test is what deploys.

  3. Wire the pipeline

    GitHub triggers Cloud Build, images land in Artifact Registry, Cloud Run deploys the revision, and the service runs as its own IAM identity reading from Secret Manager.

  4. Parallel run, then cut

    Both environments run while we compare behaviour and logs. DNS moves last, and the Heroku app stays deployable until you decide otherwise.

FAQ

Heroku to Google Cloud Migration

Will my application code have to change?
Usually very little. A Node app that reads config from the environment, listens on the port it is given and writes logs to stdout is already shaped for Cloud Run. The work is in the Dockerfile, the pipeline and the secret wiring — not in your routes.
What happens to my Heroku Postgres or Redis add-on?
Each add-on is decided separately. Some move to a managed Google Cloud equivalent, some move to another provider, and some stay where they are and are reached over the network. We list the options and the trade-offs per add-on rather than assuming a like-for-like swap.
How much downtime is there?
The cutover is a DNS change after a parallel-run window, so for a stateless HTTP service it is usually measured in DNS propagation rather than in an outage. Anything with a database migration in the middle is planned separately and honestly — we will tell you if a window is needed.
Can we roll back?
Yes, and that is designed in. The Heroku app is left deployable and DNS is left switchable until you sign off. Cloud Run also keeps previous revisions, so rolling back a bad deploy is a revision change rather than a rebuild.
Let's build

Ready to start with heroku to google cloud migration?

Tell us about your store and your goals. We'll come back with a clear, honest plan and a transparent quote.