This runbook moves a Linux web workload from a 20i VPS to a TinyServers NVMe VPS while keeping the old server available during DNS propagation. It uses an initial copy, pre-cutover testing and a final data sync. “Zero downtime” still depends on the application: write-heavy systems should use maintenance mode or database replication during the final cutover.
Prerequisites
- A live 20i VPS (Debian / Ubuntu)
- A freshly deployed TinyServers NVMe VPS (IPv4 only)
- SSH root access on both machines
- Your local
id_ed25519.pubpublic-key file - ~15 minutes
Start here: download the printable migration checklist and tick off every backup, test and rollback item.
1 · Generate (or reuse) an SSH key
If you don’t already have a key pair on your 20i box, create one:
# On the 20i VPS
ssh-keygen -t ed25519 -C "20i > TinyServers migration"
2 · Authorise that key on your TinyServers VPS
TinyServers doesn’t (yet) expose key upload in the panel, so we’ll append your 20i public key to ~/.ssh/authorized_keys manually:
# Still on the 20i VPS
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@NEW_IP
# ─or─
cat ~/.ssh/id_ed25519.pub | ssh root@NEW_IP
"mkdir -p ~/.ssh && chmod 700 ~/.ssh &&
cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
3 · Mirror your files with rsync
From inside your 20i server run:
# Replace NEW_IP with your TinyServers public IPv4.
# First preview the deletion set; remove --dry-run only after review.
rsync -aAXvz --delete --dry-run
-e "ssh -i ~/.ssh/id_ed25519"
/var/www/ root@NEW_IP:/var/www/
rsync -aAXvz --delete
-e "ssh -i ~/.ssh/id_ed25519"
/var/www/ root@NEW_IP:/var/www/
4 · Dump & import your database
# On the 20i VPS
mysqldump -u root -p --all-databases > ~/dump.sql
scp -i ~/.ssh/id_ed25519 ~/dump.sql root@NEW_IP:/root/
# On the TinyServers VPS
mysql -u root -p < /root/dump.sql
Pre-cutover test and final sync
Before changing public DNS, test the destination while the old server still serves users:
curl --resolve yourdomain.example:443:NEW_IP https://yourdomain.example/ -I
ssh root@NEW_IP 'systemctl --failed'
Verify login, forms, uploads, email, cron jobs and application logs. Then pause writes or enable maintenance mode and run one final file and database sync:
rsync -aAXvz --delete
-e "ssh -i ~/.ssh/id_ed25519"
/var/www/ root@NEW_IP:/var/www/
mysqldump -u root -p --single-transaction --all-databases |
ssh root@NEW_IP 'mysql -u root -p'
Review every path before using --delete; an incorrect source path can remove destination files. For a busy database, use application maintenance mode or proper replication instead of relying on one logical dump.
5 · Switch DNS (TTL = 300 s)
- Edit your domain’s
Arecord to point to <NEW_IP>. - Lower TTL to 300 seconds first, wait, then flip the IP.
6 · Verify & decommission
curl -I https://yourdomain→ shows TinyServers IP.- Backup & destroy the old 20i VPS to stop billing.
FAQ
Will I lose data?
The initial copy is not enough for a changing site. Pause writes or use replication, run the final sync, verify row/file counts and retain the old VPS until the new service is stable.
When should I cancel the old VPS?
Keep it online and read-only for at least 24–48 hours after DNS is stable. Cancel only after logs, transactions, backups and external DNS resolvers all confirm the move.
Is there a paid migration service?
The guide is DIY. Support can clarify the TinyServers side but does not perform a complete application migration.
Compare current NVMe VPS plans →
Next step: ready to migrate? Start with an NVMe VPS Romania plan from €2.48/month and follow the zero-downtime steps above.
Leave a Reply