Back to Engineering Cases
November 15, 2024

Zero-Downtime VPS Migration with Blue-Green Deployment

99.99% uptime during migration, 40% reduction in response time

Laravel Docker Nginx CloudPanel GitHub Actions MySQL

The Bottleneck

A SaaS client with 50k+ monthly active users was running on a single legacy VPS with no CI/CD pipeline. Every deployment required manual SSH, git pull, and composer install -- causing 5-10 minutes of downtime per release. The database was on the same machine, competing for I/O with the application. Response times peaked at 1.2s under load, and a full server crash during Black Friday cost the client an estimated $12,000 in lost revenue.


Architecture & Automation

I designed a blue-green deployment architecture using CloudPanel on two VPS instances behind an Nginx reverse proxy with health checks:

                  ┌──────────────┐
                  │  Nginx Proxy │
                  │  (health check)│
                  └──────┬───────┘
                         │
          ┌──────────────┴──────────────┐
          │                             │
   ┌──────▼──────┐              ┌──────▼──────┐
   │  VPS Blue   │              │  VPS Green  │
   │  (active)   │              │  (standby)  │
   └──────┬──────┘              └──────┬──────┘
          │                             │
   ┌──────▼──────┐              ┌──────▼──────┐
   │  MySQL RDS  │              │  Redis      │
   │  (managed)  │              │  (cache)    │
   └─────────────┘              └─────────────┘

GitHub Actions workflow triggers on push to main: builds the Docker image, deploys to the inactive VPS, runs migrations, swaps the proxy upstream. Rollback is a single click via GitHub Actions re-run.


Measurable ROI

  • Deployment downtime: 5-10 min → 0 seconds (zero-downtime achieved)
  • Response time (p95): 1.2s → 720ms (-40%)
  • Revenue loss prevention: $12k Black Friday crash → $0 (horizontal scaling handled 3x traffic)
  • Developer hours saved: 4h/week per developer → 16h/month freed for feature work
  • MTTR (Mean Time to Recovery): 45 min → under 2 min via one-click rollback

Written by

Miguel Ortiz

Growth Engineer & Technical SEO

Discuss a Similar Challenge