deploymanage ~ %

Zero Downtime Deployment: Deploy Without Downtime and Roll Back in One Click

Zero downtime deployments should be boring. DeployManage builds each release into its own directory while the current version keeps serving every request, runs a health check, flips the symlink atomically, and gives you one-click rollback if anything looks wrong. No maintenance window, no 500 page, no waiting until 2 a.m.

# free plan · no credit card required

Works on any cloud: Hetzner, DigitalOcean, AWS, Vultr, Linode, OVHcloud and custom VPS.

zsh · deploymanage
deploymanage ~ % server create --provider hetzner --region ash1
provisioning ...... web-01.prod
online in 41s ..... hardened + firewalled
deploymanage ~ % deploy web-01.prod
ssh · pull · build · migrate · reload
live in 11.3s ..... zero downtime
deploymanage ~ %
# the short answer

A zero downtime deployment ships new code without any interruption to live traffic. It works by building the new release in a separate directory, installing dependencies and running migrations before the switch, health-checking that release, then flipping a symlink so the change goes live in a single atomic step. If the new version fails its check, the old one keeps serving and you roll back instantly. DeployManage automates this whole flow, including safe database migrations and one-click rollback, on servers you own across any cloud provider.

Last updated July 2026

# What makes a deployment truly zero downtime

$ deploymanage release
Atomic release switch

Each deploy builds into a fresh timestamped release directory while the current one keeps serving traffic. Only when the build is complete and healthy does a single symlink flip make it live, so there is never a half-installed app in front of users.

$ deploymanage health
Health check before the switch

The new release is booted and hit with a health check before it takes traffic. If it returns anything other than a clean response, the deploy stops and the previous version stays live. Nothing broken ever reaches your users.

$ deploymanage rollback
One-click rollback

Every previous release stays on disk. If a bug slips through, roll back to the last known-good release with one click. Because the old code is untouched, rollback is another instant symlink flip, not a rebuild.

$ deploymanage migrate
Safe database migrations

Run migrations as part of the deploy with the expand-and-contract pattern, so the schema stays compatible with both the old and new code during the switch. Additive changes first, cleanup later, no locked tables blocking live requests.

$ deploymanage queue
Graceful worker restarts

Queue workers and scheduled jobs are restarted cleanly on the new code after the release goes live, so a background worker never runs last week's code against this week's schema.

$ deploymanage any
Any stack, any cloud

Laravel, plain PHP, Node, static builds: the atomic release model works the same. Provision on your own Hetzner, DigitalOcean, AWS or Vultr account and keep full root access to the box.

# how it works

01
Build the new release

The new commit is checked out into its own directory. Dependencies install and the front-end builds while the current version keeps handling every request.

02
Migrate and warm caches

Additive database migrations run and config, route and view caches are rebuilt against the new release, all before it takes any traffic.

03
Health check, then flip

The release is health-checked. If it passes, a single symlink flip makes it live in one atomic step. If it fails, the deploy aborts and nothing changes.

04
Restart workers, keep the old release

Queue workers restart on the new code and the previous release stays on disk, ready for an instant one-click rollback if you need it.

Zero downtime deployment vs deploying in place

The old way is to pull new code straight into the live directory, run migrations, and hope no request lands mid-deploy. Here is why the atomic release model wins.

What happens Zero downtime deployment Deploy in place
User impact during deploy Zero: the old release serves until the switch Requests hit a half-updated app, 500s and errors
Where new code is built A separate release directory Directly over the running app
Going live One atomic symlink flip Files change gradually while live
If the deploy fails Old release keeps serving, deploy aborts App is left broken, needs a hotfix
Rollback Instant flip to the previous release Re-pull the old code and pray
Maintenance window None, deploy any time of day Off-hours or a scheduled outage
Database changes Expand and contract, schema stays compatible Migrations can lock tables mid-request

# who it's for

Startups shipping several times a day

Deploy during business hours without a maintenance window. The current version keeps serving until the new one is proven healthy, so shipping often stops being scary.

Agencies running client sites

Push updates to dozens of client apps without booking downtime with each client. Rollback is one click if a change misbehaves on a live site.

SaaS with a paying user base

Paying customers expect the app to be up at all hours. Atomic releases and health checks mean a bad build never reaches them and revenue keeps flowing during a deploy.

E-commerce during peak season

Ship a fix on Black Friday without taking the store offline. A zero downtime deployment lets you deploy at the exact moment you need to, not after the traffic drops.

Teams tired of 2 a.m. deploys

Move deploys out of the middle of the night. When every release is health-checked and instantly reversible, there is no reason to wait for a quiet window.

Apps with a strict uptime SLA

Meet an uptime commitment while still shipping regularly. Deploys stop counting against your error budget because users never see them happen.

What zero downtime deployment actually means

A zero downtime deployment ships a new version of your application without any interruption to the people using it. No maintenance page, no dropped requests, no window where the site returns a 500 while files are being copied. From the user's side, the old version answers their request, and the very next request quietly gets the new version. They never notice the switch happened.

The reason plain deploys cause downtime is that they change a live directory in place. You pull new code on top of running code, and for a few seconds the app is a mix of old and new files. A request that lands during that window can hit a controller that no longer matches its view, or a model that expects a column the migration has not added yet. The result is errors, and if a migration locks a table, the whole app can stall.

The fix is to stop editing the live app at all. You build the new version somewhere else, prove it works, and then switch to it in one instant step. That switch is the only moment anything changes for users, and it is atomic, so there is no in-between state to catch a request in.

How the atomic release model works

The pattern behind almost every reliable zero downtime deployment is the atomic release. Instead of one folder that holds your app, the server keeps a releases directory with a numbered folder per deploy, plus a current symlink that points at whichever release is live. Shared things that must survive between releases, like your .env file and the storage folder, live in a separate shared directory and are symlinked into each release.

A deploy checks out the new commit into a fresh folder such as releases/20260724093000. Inside that folder it runs the full build: install dependencies with composer install --no-dev --optimize-autoloader, build front-end assets, link in the shared .env and storage, run database migrations, and rebuild the framework caches. The live app is untouched the entire time, still serving from the old release.

Only when the new release is fully built and passes a health check does the deploy repoint the current symlink to the new folder. That symlink update is a single filesystem operation, so a request either sees the old release or the new one, never a blend of the two. That is what makes the switch zero downtime.

Handling database migrations without downtime

Code is easy to swap atomically. The database is the hard part, because both the old and the new release share the same database during the switch. If a migration renames or drops a column the old code still uses, the old release breaks the moment the migration runs, before you have even flipped the symlink.

The safe approach is expand and contract, sometimes called parallel change. You split a risky change into steps that are each backward compatible. To rename a column, you first add the new column and write to both, deploy code that reads the new one, backfill the data, and only in a later deploy drop the old column once nothing references it. At no single point does the live schema stop matching the code that is running against it.

The other rule is to avoid migrations that take a long exclusive lock on a large table during peak traffic, since those block every query until they finish. DeployManage runs migrations as part of the deploy and encourages additive, non-locking changes so the schema stays compatible with both releases through the switch. That way the database never becomes the thing that takes your app down.

Zero downtime deployment strategies compared

There are a few well-known strategies, and the atomic release model can back most of them. Rolling deployment updates your servers a few at a time, so some serve the new version while others still serve the old one, and capacity stays up throughout. It is efficient but means both versions run at once for a while, which your database schema has to tolerate.

Blue-green deployment keeps two full environments. One is live, the other is idle. You deploy to the idle one, test it, then move all traffic over at once. Rollback is just moving traffic back. It is the safest to reverse but needs double the infrastructure. Canary releasing sends a small slice of traffic to the new version first and widens it as the release proves stable, which is great for catching subtle bugs under real load.

For a single server or a small fleet, the atomic release plus health check plus instant rollback described here gives you the core benefit of all of them, no user-visible downtime and an instant way back, without running duplicate infrastructure. If you want the full trade-off breakdown, our guide on blue-green vs rolling deployment walks through when each one earns its extra cost.

Why teams run zero downtime deploys on DeployManage

Wiring up releases, symlinks, health checks, shared folders and worker restarts by hand is doable, but it is fiddly, and a single wrong path can take the site down at the worst moment. DeployManage packages the whole flow so a zero downtime deployment is the default, not a script you maintain yourself. You connect a server on your own cloud account, point it at your repository, and every push builds, health-checks and flips a new release with rollback already in place.

Because you own the server and pay the cloud provider directly, there is no per-deploy fee and no markup on top of your infrastructure. You keep full root and SSH access, and the panel handles provisioning, SSL, firewalls, databases, queue workers and scheduled jobs alongside deploys. If you are deploying a Laravel app specifically, the Laravel deployment workflow covers the framework-specific steps like artisan caches and queue:restart. To see where a dedicated panel fits in your stack, start with the server management panel overview.

Frequently asked questions

What is zero downtime deployment?

Zero downtime deployment is releasing new code without any interruption to live traffic. The new version is built in a separate directory, health-checked, and switched in one atomic step, so the running app serves every request throughout. Users never see a maintenance page, a dropped request, or a 500 error while the deploy happens.

How do you deploy without downtime?

You deploy without downtime by never editing the live app in place. Build the new release in its own directory, install dependencies, run backward-compatible migrations, and health-check it while the old release still serves traffic. Then flip a symlink to make the new release live in a single atomic operation, and keep the old release for instant rollback.

Does zero downtime deployment handle database migrations?

Yes, but migrations need the expand-and-contract pattern to stay zero downtime. Because the old and new code share one database during the switch, every schema change must be backward compatible: add columns before you use them, write to both during the transition, and drop the old column only in a later deploy once nothing references it.

What is the difference between zero downtime deployment and blue-green deployment?

Blue-green deployment is one way to achieve zero downtime. It keeps two full environments and switches all traffic from the live one to the idle one at once. Zero downtime deployment is the goal; blue-green, rolling, canary, and the atomic release model are strategies that reach it. The atomic release model gets there on a single server without duplicate infrastructure.

Can I roll back a zero downtime deployment?

Yes, and rollback is instant. Because each release is built in its own directory and the previous ones stay on disk, rolling back is just pointing the live symlink at the last known-good release. There is no rebuild and no redeploy, so recovery from a bad release takes a second, not minutes.

Do I need Kubernetes for zero downtime deployment?

No. Kubernetes offers rolling updates, but you do not need it for zero downtime deploys. The atomic release model with a symlink flip, a health check, and kept-on-disk releases delivers no user-visible downtime and instant rollback on a single VPS or a small fleet, with far less to operate than a cluster.

How do I get zero downtime deployment on Laravel Forge?

Forge includes zero downtime deployments in current subscriptions, after folding in Envoyer, and its version covers a single server. Envoyer could deploy one project across multiple servers. DeployManage runs the same atomic release model with health checks and one-click rollback on every server you connect, on your own cloud account. See our <a href="/laravel-forge-alternative">Laravel Forge alternative</a> page for an honest side-by-side.

What is the best zero downtime deployment strategy for a small team?

For most teams running one to a handful of servers, the atomic release model is the best strategy: build each release in its own directory, health-check it, flip a symlink, keep the previous release on disk. It gives you the uptime of blue-green without paying for two full environments or operating a cluster.

# related

deploymanage ~ % signup

Ship your next release with zero downtime.

Connect a server on your own cloud, point it at your repo, and every deploy builds, health-checks and flips a new release with one-click rollback. Free to start, full root access, no markup.

$ get started free

# free plan · no credit card required