Switching to a cheaper VPS — whether that means moving to a different provider or dropping to a smaller plan — is the highest-leverage cost cut most server owners never make, because they assume it requires hours of downtime. It does not. With a two-server rsync loop and a DNS cutover, the actual interruption is typically under five minutes, and for many setups it is zero. This is the step-by-step plan we use for production sites.
Before You Start: Size the Cheaper Target
Moving to a cheaper server that cannot handle the load is worse than overpaying. Measure first. Run monitoring on the current server for at least two weeks — htop for CPU/RAM, vnstat for bandwidth, du -sh for disk — and only downsize if the numbers are consistently below these thresholds:
- CPU sustained under 60% (ignore brief spikes)
- RAM usage under 80% excluding page cache, and swap not actively in use
- Disk under 70%, and the 30% headroom covers a full backup plus a month of growth
- Bandwidth under 50% of the cheaper plan’s allowance
If your current server fails any of these checks, the cheaper plan is not viable yet — optimize first (enable caching, purge logs, move backups off-server), then re-measure. When the numbers look right, compare budget VPS plans on our comparison table to shortlist providers whose specs match what you actually use.
Step 1: Provision and Harden the New Server
Order the new VPS using the same OS and major version as the old one — matching PHP, MySQL, and nginx versions avoids subtle config breakage. Then, before moving any data:
- Run
apt update && apt upgrade(or the equivalent for your distro). - Add your SSH key and disable password login.
- Install and enable a firewall (
ufw), allowing only SSH, HTTP, HTTPS, and mail ports you actually use. - Install fail2ban with default settings.
- Install the same software stack versions as the old server: nginx or Apache, PHP-FPM, MySQL/MariaDB, Redis.
Time spent here is the cheapest insurance of the whole migration — a hardened server never needs a mid-migration security scramble.
Step 2: Replicate Data with an rsync Loop
Copy everything except the live database first, because files change rarely and the sync is safe to repeat. From the old server:
rsync -avz --delete /var/www/ user@new-server:/var/www/
Then handle the database. For MySQL/MariaDB, a consistent dump is essential:
mysqldump --single-transaction --quick --routines --triggers --databases appdb | ssh user@new-server "mysql"
Repeat the file rsync once or twice a day until cutover, so the delta shrinks to minutes. The --delete flag keeps the destination identical to the source — it is safe because the new server’s own files live outside /var/www.
Step 3: Lower DNS TTLs Before Cutover
DNS records carry a TTL (time-to-live) that tells resolvers how long to cache the old IP. If your TTL is 86,400 seconds (24 hours), the cutover can take a full day to propagate. Lower it 24–48 hours before the switch:
- Set the TTL on the A/AAAA records you will change to 60–300 seconds.
- Wait at least one old-TTL period so all resolvers pick up the new value.
- Verify with
dig +noall +answer example.comfrom a few different resolvers (e.g.dig @8.8.8.8,dig @1.1.1.1).
If your provider offers a floating IP that you can move between servers (many do, some at a small monthly fee), you can skip DNS timing entirely — the IP stays the same and the cutover is instant for everyone.
Step 4: The Cutover Window
Pick a low-traffic window and execute in this order — the whole sequence takes 10–15 minutes, with the actual outage under five:
- Run the final file rsync (usually seconds if you synced recently).
- Stop the web server and cron on the old server:
systemctl stop nginx php8.x-fpm cron. - Take a final database dump and import it on the new server.
- Update configs on the new server (database credentials, absolute paths, cron jobs, mail config).
- Start services on the new server:
systemctl start nginx php8.x-fpm mysql. - Verify locally before touching DNS:
curl -H "Host: example.com" http://NEW_IPshould return your site; checksystemctl statusfor every service. - Point DNS at the new IP (or move the floating IP).
If anything fails on the new server, the old one is still fully intact — just point DNS back and reschedule. That is the entire rollback plan, and it is why the sequence above never deletes anything from the old server.
Step 5: Verify and Watch After Cutover
For the first 24–48 hours, watch the new server like a hawk:
- Check SSL: run certbot for the new server’s IP and confirm certificates renew.
- Check mail flow: send test messages to Gmail and Outlook and confirm they are not flagged (verify SPF/DKIM/DMARC and rDNS if you self-host mail).
- Check cron: confirm scheduled jobs ran on the new server and did not double-run against the old one.
- Check logs:
tail -f /var/log/nginx/error.logand MySQL’s error log for connection errors. - Watch resource usage: if CPU or RAM sits at the thresholds you measured earlier, the downgrade was correctly sized.
Keep the old server running for 7–14 days as a rollback target and a source for anything you forgot to migrate. This is also when the flat-rate economics of budget VPS hosting start paying you back — the bill is lower and the workload is identical.
Post-Migration Cleanup
After the observation window: cancel the old server (ask about prorated refunds — most budget providers issue them within 7 days), update your backups to target the new server, and update any monitoring or status pages that reference the old IP. One last check: review common budget VPS questions in our FAQ for anything you might have missed — the mistakes that hurt are always the ones nobody planned for.
The Bottom Line
A cheaper VPS is a two-week project: measure, provision, replicate, cut over, verify. The downtime is minutes, the rollback is a DNS flip, and the saving repeats every single month. There is no reason to keep paying for a server that your own monitoring data says you do not need.



