Jumat, 10 April 2026, 10:00 WIB. Saya lagi di teras rumah, kopi pertama belum habis. WhatsApp masuk dari klien sejak 2025, pemilik marketplace top-up voucher game online (jual diamond Mobile Legends, voucher Free Fire, UC PUBG, mirip codashop versi lokal):
“Bro, weekend kemarin server gua dua kali kena 503 pas peak jam 19–22. Padahal paket Rumahweb katanya unlimited, ternyata shared CPU tetap kena throttle. Promo top-up Mobile Legends mau drop Sabtu depan, takut down lagi. Bisa pindah ke VPS hari ini? Tapi transaksi user terus masuk 24/7, gak boleh down barang sedetik karena user yang udah klik bayar bakal retry, bisa double charge.”
Saya cek jam: 10:02. Sambil ngopi saya bilang ke dia: “Jam 11:30 WIB site sudah di VPS Contabo Singapore. 90 menit eksekusi. 0 detik downtime.”
Jam 11:29 WIB, site sudah hidup di Contabo. Eksekusi nyata: 87 menit. Selama 6 menit jendela cutover, 52 request masuk, semuanya 200 OK. Tidak ada satu plugin migration pun yang saya pakai.
Artikel ini berisi playbook persisnya 6 fase, dengan alokasi menit per fase yang saya catat sendiri. Stack yang dipakai: Ubuntu 24.04 LTS, Nginx 1.24, PHP 8.3-FPM, MariaDB 10.11, WordPress 6.6.2, Cloudflare Free.
1. Kenapa 90 Menit, Kenapa Tanpa Plugin Migration, Kenapa Tanpa Downtime
Tabel BEFORE vs AFTER
| Metrik | BEFORE (Rumahweb SMALL) | AFTER (Contabo VPS Singapore) |
|---|---|---|
| TTFB di peak jam 20:00 WIB | 612 ms | 198 ms |
| TTFB cold (no cache) | 612 ms | 187 ms |
| PageSpeed Mobile | 62 | 88 |
| LCP mobile (simulasi 4G) | 7.4 detik | 2.6 detik |
| Biaya per tahun | Rp 100.000 | ~Rp 1.600.000 (16x lebih mahal) |
| Kapasitas peak request (sebelum 5xx) | ~45 req/detik | >280 req/detik |
| 5xx error per minggu (di event traffic) | 2 kejadian, total 18 menit down | 0 |
| Downtime saat migrasi | – | 0 detik (verified Cloudflare Logs) |
Bayar 16x Lebih Mahal, Kenapa Saya Tetap Bilang Worth It
Tutorial migrasi WordPress di internet hampir selalu menjual narasi “pindah ke VPS biar hemat”. Kasus klien saya kebalikannya. Dia bayar 16x lebih mahal sengaja.
Alasannya simpel: paket Rumahweb SMALL Rp 100k/tahun cukup buat blog 500 visit/hari. Tidak cukup buat marketplace top-up yang peak 35k–50k visit saat event Mobile Legends skin drop. Saat traffic spike, shared CPU di-throttle oleh provider, itu sebabnya muncul 503 di peak hour, padahal paketnya labeled “unlimited”.
Kalkulasi sederhana yang saya jelaskan ke klien:
- Margin per transaksi top-up: rata-rata Rp 1.500 (dari voucher Rp 10.000 sampai Rp 200.000)
- 18 menit down saat event = ~120 transaksi gagal = potensi loss Rp 180.000
- Plus reputational damage (user yang retry kena double charge → komplain)
- Selisih biaya VPS – shared per tahun: ~Rp 1.500.000
- Break-even: 10 transaksi gagal terhindarkan per tahun
Bayar Rp 1.500.000 lebih per tahun untuk menghindari 1 event 5xx = jelas worth it.
5 Plugin Migration yang Saya BANNED untuk Site dengan Transaksi 24/7
| Plugin | Alasan teknis tidak saya pakai |
|---|---|
| All-in-One WP Migration | File .wpress monolithic. Stuck di 87% saat ukuran >512 MB di shared hosting karena max_execution_time=30s. Tidak resumable, harus mulai 0%. |
| Duplicator | PHP archive load semuanya ke memory. 312 MB uploads + 124 MB DB = peak memory >500 MB, melewati memory_limit=256M shared hosting. |
| UpdraftPlus | Bagus untuk backup, bukan untuk migration silent. Butuh aktivasi plugin di site target yang sudah publicly accessibl, bertentangan dengan cutover via DNS flip. |
| WP Vivid | Sama dengan Duplicator, monolithic archive, tidak ramah memory shared. |
| Migrate Guru | Cloud transfer ke server pihak ketiga. Untuk site marketplace yang menyimpan log transaksi user, saya butuh DPA (Data Processing Agreement) yang jelas, Migrate Guru gratis tidak menyediakan itu. |
Alternatif yang saya pakai: rsync (incremental, resumable) + mysqldump (lock-free) + Cloudflare proxy swap (origin transparent ke user).
2. Pre-requisites Checklist (15 Menit, H-24 Sebelum Cutover)
15 menit ini saya lakukan 24 jam sebelum jam 10:00 WIB tanggal 10 April. Tujuannya satu: pastikan TTL DNS sudah propagasi ke 300 detik agar kalau ada fallback, revert-nya cepat.
- VPS Contabo sudah running, LEMP stack siap. Pastikan PHP 8.3-FPM, MariaDB 10.11, Nginx 1.24 sudah hidup dan UFW + fail2ban sudah dinyalakan.
- DNS A record diturunkan TTL-nya ke 300 detik (dari default 14400) di Cloudflare. Lakukan minimum 24 jam sebelum cutover.
- Cloudflare Proxied mode = ON (orange cloud). Ini KUNCI dari “0 downtime”, user selalu connect ke edge Cloudflare (104.x.x.x), bukan ke IP origin Anda.
- Akses shared hosting Rumahweb, paket SMALL biasanya hanya kasih File Manager + phpMyAdmin (tidak ada SSH). Cari paket anda, kalau ada SSH, gunakan rsync over SSH yang lebih cepat.
- Uptime Kuma monitor sudah running 24 jam sebelumnya, interval check 30 detik, untuk dapat baseline grafik before/after.

💡 Pro tip #1 Pakai
screenuntuk SSH session tahan disconnectMigrasi 312 MB via rsync di koneksi rumahan kadang putus tengah jalan. Solusi simpel: bungkus session SSH Anda dengan
screen.ssh user@vps-ip screen -S migrasi # ... jalankan rsync di sini # Tekan Ctrl+A lalu D untuk detach (session jalan di background) # Untuk re-attach: screen -r migrasiKalau koneksi internet Anda putus, rsync tetap jalan di server. Re-attach saat WiFi balik.
3. Fase 1: Snapshot Awal di Shared Hosting (12 menit)
10:00 WIB. Saya mulai dengan ambil snapshot dari Rumahweb. Karena paket SMALL tidak punya SSH, saya pakai 2 jalur:
Files via File Manager → kompresi tar.gz → download via wget di VPS:
Login cPanel Rumahweb → File Manager → pilih folder public_html/ → klik Compress → format tar.gz → output <code”>site-snapshot-100426.tar.gz. Lalu di VPS Contabo:
cd /var/www/
wget https://shared-rumahweb-host.example/cpanel-download-link/site-snapshot-100426.tar.gz
tar -xzvf site-snapshot-100426.tar.gz
Output yang saya lihat:
--2026-04-10 10:08:14-- https://shared-rumahweb-host.example/.../site-snapshot-100426.tar.gz
Length: 327434215 (312M) [application/gzip]
Saving to: 'site-snapshot-100426.tar.gz'
site-snapshot-100426.tar.gz 100%[===================>] 312.27M 11.4MB/s in 28s
2026-04-10 10:08:42 (11.4 MB/s) - 'site-snapshot-100426.tar.gz' saved [327434215/327434215]
312 MB di 28 detik (~11.4 MB/s), Contabo Singapore PoP cukup deket ke Rumahweb Indonesia.
Database via phpMyAdmin:
Login phpMyAdmin Rumahweb → pilih database → tab Export → method Custom (bukan Quick). Yang saya centang spesifik:
- Tabel: pilih semua kecuali
wp_useractivity_log(saya bersihkan dulu pakai SQLDELETE FROM wp_useractivity_log WHERE created_at < NOW() - INTERVAL 7 DAY;— ini yang bikin DB dari 187 MB turun ke 124 MB) - Format: SQL
- Output: gzipped
- ❌ Uncheck “Add DROP TABLE” (penting, biar import nanti tidak ngehapus tabel yang sudah ada di VPS kalau saya lagi test)
- ✅ Check “Add IF NOT EXISTS”
- ✅ Check “Enclose table and field names with backquotes”
Klik Go. File marketplace-db-100426.sql.gz (38 MB compressed, 124 MB extracted) men-download ke laptop saya. Saya upload ke VPS via scp:
scp marketplace-db-100426.sql.gz user@vps-ip:/var/www/marketplace.tld/
12 menit total. 10:12 WIB.

Catatan: Karena kerahasian nama website user yang saya kelolah disini saya menggunakan nama marketplace atau dengan domain marketplace.tld sebagai data dummy mengganti nama domain asli yang user miliki demi kerahasian website yang pernah saya handle.
4. Fase 2: Restore di VPS + Dry Run Lokal (18 menit)
Sekarang saya restore ke VPS Contabo. Belum ubah DNS publik, semua verifikasi pakai trick /etc/hosts di laptop saya.
Set permission files:
cd /var/www/marketplace.tld/
sudo chown -R www-data:www-data .
sudo find . -type d -exec chmod 755 {} \;
sudo find . -type f -exec chmod 644 {} \;
sudo chmod 600 wp-config.php
Import DB:
gunzip marketplace-db-100426.sql.gz
sudo mysql -u root -p
CREATE DATABASE marketplace_wp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;
CREATE USER 'wp_marketplace'@'localhost' IDENTIFIED BY 'GANTI_DENGAN_PASSWORD_32_CHAR';
GRANT ALL PRIVILEGES ON marketplace_wp.* TO 'wp_marketplace'@'localhost';
FLUSH PRIVILEGES;
EXIT;
mysql -u wp_marketplace -p marketplace_wp < marketplace-db-100426.sql
124 MB DB import dalam ~3 menit di NVMe SSD Contabo. Output mysqldump import:
[no output if successful — silent success]
Untuk verifikasi:
mysql -u wp_marketplace -p -e "USE marketplace_wp; SHOW TABLES; SELECT COUNT(*) FROM wp_posts;"
Output:
+--------------------------+
| Tables_in_marketplace_wp |
+--------------------------+
| wp_commentmeta |
| wp_comments |
| wp_links |
| wp_options |
| wp_postmeta |
| wp_posts |
| wp_term_relationships |
| wp_term_taxonomy |
| wp_termmeta |
| wp_terms |
| wp_usermeta |
| wp_users |
| wp_woocommerce_sessions |
+--------------------------+
+----------+
| COUNT(*) |
+----------+
| 78 |
+----------+
78 post: match dengan jumlah di Rumahweb. Good.
Edit wp-config.php:
define( 'DB_NAME', 'marketplace_wp' );
define( 'DB_USER', 'wp_marketplace' );
define( 'DB_PASSWORD', 'GANTI_DENGAN_PASSWORD_32_CHAR' );
define( 'DB_HOST', 'localhost' );
// Regenerate salts via https://api.wordpress.org/secret-key/1.1/salt/
define('AUTH_KEY', 'GANTI_DENGAN_PASSWORD_32_CHAR');
// ... 7 salts lainnya juga ganti
⚠️ Catatan #1 JANGAN ganti
WP_HOME/WP_SITEURLke IP VPSBanyak tutorial migrasi WordPress menyarankan ubah
WP_HOMEkehttp://VPS-IP/untuk testing. JANGAN. Saat cutover nanti, kalau Anda lupa ganti balik, akan terjadi:
- User akses
https://marketplace.tld/- Cloudflare proxy ke VPS origin → response Set-Header dengan
Location: http://VPS-IP/- Browser user redirect ke
http://VPS-IP/— yang TIDAK punya SSL, brokenCara aman: biarkan
WP_HOMEdanWP_SITEURLdi nilai domain asli. Verifikasi via/etc/hoststrick di laptop Anda saja.
Verifikasi lokal: /etc/hosts trick:
Di laptop saya (bukan di VPS), edit /etc/hosts:
sudo nano /etc/hosts
Tambah baris:
123.45.67.89 marketplace.tld
123.45.67.89 www.marketplace.tld
(Ganti 123.45.67.89 dengan IP Contabo Anda.) Lalu buka browser → https://marketplace.tld/. Browser saya akan resolve marketplace.tld ke IP Contabo, bypass DNS publik. Saya cek: homepage muncul, grid voucher Mobile Legends tampil, klik 1 produk → halaman produk muncul.
Jangan lupa hapus baris /etc/hosts setelah dry run selesai.
“Generate password kuat dengan
. Untuk salt 8 baris, gunakan generator official https://api.wordpress.org/secret-key/1.1/salt/ — copy-paste 8 baris yang dihasilkan ke wp-config.php menimpa default.”
18 menit total Fase 2. 10:30 WIB.

5. Fase 3: Sync Incremental + Persiapan Cutover (8 menit)
10:30 WIB sampai 10:38 WIB. Selama 30 menit Fase 1–2 berlangsung, ada data baru di Rumahweb:
- ~7 transaksi top-up baru (insert ke
wp_postmetaorder,wp_woocommerce_order_items, dll) - ~12 komentar baru (mostly bot comments di blog post SEO)
- 3 file upload baru di
wp-content/uploads/2026/04/
Saya butuh sync delta sebelum cutover.
Files delta:
Kalau paket Anda punya SSH, paling cepat pakai rsync incremental:
rsync -avhP --delete \
user@rumahweb-shared:/home/user/public_html/wp-content/uploads/ \
/var/www/marketplace.tld/wp-content/uploads/
Karena Rumahweb SMALL tidak punya SSH, saya pakai cara alternatif: re-compress + re-download incremental.
Tapi 312 MB tidak praktis di-download ulang. Cara cepat di File Manager: filter file dengan Last Modified > 10 April 2026 10:00, compress hanya yang baru, download, extract di VPS. Total 3 file baru, ~1.8 MB. Selesai 90 detik.
Database delta:
Saya export ulang full DB via phpMyAdmin (124 MB compressed → 38 MB), upload ke VPS, import. Ini menimpa data yang sudah ada, tapi karena belum ada transaksi masuk ke VPS (DNS belum di-flip), tidak ada konflik.
mysql -u wp_marketplace -p marketplace_wp < marketplace-db-100426-v2.sql
3 menit. 10:38 WIB.
💡 Pro tip #2 Lakukan Fase 3 di window traffic terendah
Untuk site Indonesia, peak hour di pagi (jam ngantor 09:00–11:00) dan malam (19:00–22:00). Lowest hour: 02:00–05:00 WIB dan 10:00–11:00 WIB.
Site marketplace top-up game saya: peak 19:00–22:00 WIB (anak-anak pulang sekolah/kerja, isi voucher). Saya sengaja pilih cutover 10:00–11:30 WIB karena traffic 1/8 dari peak. Lebih sedikit transaksi yang masuk selama jendela cutover = lebih sedikit data delta yang harus di-sync.
6. Fase 4: DNS Flip via Cloudflare Proxy (Cutover, 6 menit, 0 Downtime)
10:38 WIB. Sekarang yang krusial.
Di Cloudflare dashboard → DNS → cari A record marketplace.tld:
- Sebelum:
marketplace.tld → 89.xx.xx.xx(IP Rumahweb shared), Proxied ON, TTL 300s - Sesudah:
marketplace.tld → 123.45.67.89(IP Contabo), Proxied ON, TTL 300s
Klik Edit → ganti IP → Save. Total waktu klik: <30 detik.
Kenapa user TIDAK kena downtime:
Karena Cloudflare Proxied mode ON (orange cloud), semua user mengakses marketplace.tld lewat IP edge Cloudflare (mis. 104.21.x.x). Cloudflare edge yang switch origin di balik layar:
User browser → 104.21.x.x (Cloudflare edge) → [SWITCH ORIGIN] → 123.45.67.89 (Contabo)
↑
Origin swap transparent ke user
Propagasi internal Cloudflare ke semua PoP-nya: 15–30 detik. Bandingkan dengan DNS-only mode (abu-abu) yang propagasinya 4 jam global karena user resolver di seluruh dunia harus refresh.
Verifikasi cutover sukses:
# Di laptop saya, tanpa /etc/hosts trick lagi
curl -v -o /dev/null -s -w "HTTP %{http_code} | TTFB %{time_starttransfer}s | Total %{time_total}s\n" https://marketplace.tld/
Saya jalankan 5 kali, interval 1 menit:
10:39:02 HTTP 200 | TTFB 0.587s | Total 0.812s ← masih kena IP lama (Rumahweb)
10:40:05 HTTP 200 | TTFB 0.612s | Total 0.834s ← masih
10:41:08 HTTP 200 | TTFB 0.198s | Total 0.241s ← SWITCH! Origin baru (Contabo + FastCGI)
10:42:11 HTTP 200 | TTFB 0.187s | Total 0.230s ← consistent
10:44:14 HTTP 200 | TTFB 0.192s | Total 0.235s ← consistent
Cloudflare butuh ~2 menit dari edit DNS sampai semua edge swap origin (PoP closest to Singapore swap duluan, lalu propagasi ke PoP lain).
Verifikasi di Cloudflare Analytics:
Cloudflare dashboard → Analytics → Origin Response Time → terlihat drop dari 612ms ke 198ms tepat di pukul 10:41 WIB. Itu sinyal traffic sudah masuk ke VPS baru.
Selama 6 menit jendela cutover (10:38–10:44 WIB), Cloudflare Logs menunjukkan: 52 request masuk, 50 status 200, 2 status 304 (Not Modified, dari CDN cache), 0 status 5xx.

⚠️ Catatan #2 Cloudflare proxy MUST be ON sebelum DNS flip
Kalau status A record Anda DNS-only (abu-abu) saat cutover, propagasi A record berlaku global lewat resolver public (Google 8.8.8.8, Cloudflare 1.1.1.1, ISP user, dll). Bisa sampai 4 jam sampai semua user kena IP baru. Selama 4 jam itu:
- Sebagian user masih kena IP Rumahweb (kalau shared sudah Anda matikan = 5xx)
- Sebagian user sudah kena IP Contabo (OK)
- Tidak ada cara untuk mempercepat selain tunggu
WAJIB Proxied mode ON minimum 24 jam sebelum cutover. Jangan switch dari abu-abu ke orange di hari-H, itu memicu re-validation cert + cache miss massive.
6 menit total Fase 4. 10:44 WIB.
7. Fase 5: Post-Migration Validation (14 menit)
Site sudah di VPS, tapi belum aman saya tinggal. 14 menit berikutnya saya validasi semuanya.
Search-replace URL via WP-CLI:
Walau WP_HOME dan WP_SITEURL tidak diubah, di database ada banyak URL hardcoded di wp_options (siteurl, home), wp_posts (post_content yang punya gambar), wp_postmeta (Elementor JSON, ACF field, dll). Saya jalankan search-replace dengan dry-run dulu:
cd /var/www/marketplace.tld/
sudo -u www-data wp search-replace 'http://marketplace.tld' 'https://marketplace.tld' --dry-run --skip-columns=guid
Output:
+------------------+-----------------------+--------------+------+
| Table | Column | Replacements | Type |
+------------------+-----------------------+--------------+------+
| wp_options | option_value | 47 | PHP |
| wp_posts | post_content | 312 | SQL |
| wp_postmeta | meta_value | 1,847 | PHP |
| wp_usermeta | meta_value | 24 | PHP |
| wp_termmeta | meta_value | 8 | PHP |
+------------------+-----------------------+--------------+------+
Success: 2,238 replacements to be made.
Karena dry-run OK, jalankan tanpa --dry-run:
sudo -u www-data wp search-replace 'http://marketplace.tld' 'https://marketplace.tld' --skip-columns=guid
💡 Pro tip #3 Skip kolom
guidKolom
guiddi tabelwp_postsadalah identifier permanen untuk feed RSS. WordPress core sengaja warn: “JANGAN ubah guid setelah post pertama kali publish.” Pakai flag--skip-columns=guiduntuk hindari problem feed RSS terdaftar di Feedburner/Apple News.
Test functional checklist (8 menit):
- Login
/wp-admin/– sukses - Navigasi ke produk voucher Mobile Legends 86 Diamond, halaman tampil normal
- Klik tombol “Beli Sekarang”, redirect ke checkout
- Isi nomor User ID + Zone ID Mobile Legends, form OK
- Pilih payment method (gateway pembayaran Midtrans), popup Midtrans muncul
- Tidak saya teruskan ke payment, biar tidak ganggu live transaction. Tapi popup muncul = endpoint callback sudah pointing ke domain (bukan ke IP)
- Cek WP Mail SMTP plugin → kirim test email → email diterima di Gmail
- Cek
/wp-content/uploads/2026/04/mobile-legends-86-diamond.webp– accessible
Crawl 50 URL random:
sudo -u www-data wp post list --post_type=any --format=ids --posts_per_page=50 | \
xargs -I {} sudo -u www-data wp post url {} | \
xargs -I {} curl -s -o /dev/null -w "%{http_code} %{url_effective}\n" {}
Output (truncated):
200 https://marketplace.tld/produk/mobile-legends-86-diamond/
200 https://marketplace.tld/produk/free-fire-100-diamond/
200 https://marketplace.tld/produk/pubg-60-uc/
200 https://marketplace.tld/cara-topup-mobile-legends-aman/
200 https://marketplace.tld/blog/promo-mobile-legends-skin-collector-2026/
...
200 https://marketplace.tld/tentang-kami/
50/50 status 200. No broken link.
14 menit total Fase 5. 10:58 WIB.

8. Fase 6: Tear-Down Shared Hosting (10 menit)
10:58 WIB sampai 11:08 WIB. Site sudah live di VPS, tapi shared hosting Rumahweb belum saya cancel.
Yang TIDAK saya lakukan sekarang
- ❌ Cancel paket Rumahweb. Tunggu minimum 7 hari setelah migrasi sukses. Saya pernah cancel hari-H dan ternyata ada cron job WordPress yang masih hit endpoint email cPanel, baru ketahuan 3 hari kemudian dari log Mailgun.
- ❌ Hapus file di
public_html/Rumahweb. Biarkan dulu sebagai backup live.
Yang SAYA lakukan sekarang
- ✅ Ubah password DB MySQL di Rumahweb (biar tidak ada race condition dari endpoint legacy yang masih nyambung)
- ✅ Ubah password FTP/File Manager
- ✅ Matikan email forwarding cPanel kalau ada (kecuali kalau klien pakai email cPanel sebagai email transaksi, lihat Catatan #3)
- ✅ Download backup full files + DB ke laptop saya (backup lokal di luar VPS, di luar cloud)
- ✅ Catat IP Rumahweb shared (89.xx.xx.xx) dan IP VPS Contabo (123.45.67.89) di file rahasia, buat rollback
⚠️ Catatan #3 Email cPanel SERING ter-host di shared hosting
Klien marketplace top-up biasanya pakai email transaksi (notifikasi pembayaran, OTP, reset password). Kalau email-nya
[email protected]di-host di Rumahweb cPanel, saat Anda matikan shared = email transaksi mati = user tidak terima konfirmasi pembayaran = komplain massive.Sebelum tear-down: pindahkan email ke Mailgun (10k email/bulan gratis) / Zoho Mail Lite ($1/user/bulan) / Google Workspace ($6/user/bulan). Update record MX di Cloudflare DNS. Saya rekomendasikan Mailgun untuk email transaksi karena delivery rate-nya bagus.
10 menit total Fase 6. 11:08 WIB. Migrasi selesai.
9. Rollback Plan: Kalau Setelah 1 Jam VPS Bermasalah
Skenario yang saya antisipasi: setelah migrasi 1 jam, ternyata ada bug di VPS Contabo (misal: out-of-memory karena Redis tidak ke-config dengan benar). Rollback plan saya:
Step 1: Revert DNS (60 detik):
Login Cloudflare → DNS → A record marketplace.tld → ubah balik ke IP Rumahweb (89.xx.xx.xx) → Save. Karena Cloudflare Proxied + TTL 300s, propagasi ke edge dalam 15–30 detik. User mulai kena IP shared lagi.
Step 2: Sync data delta yang masuk di VPS kembali ke shared:
Selama 1 jam VPS hidup, mungkin ada:
- Transaksi user baru (post_meta, woocommerce orders)
- Komentar baru di blog
- File upload baru
Export incremental dari MariaDB VPS:
mysqldump -u wp_marketplace -p \
--where="post_modified > '2026-04-10 11:08:00'" \
--tables wp_posts wp_postmeta wp_comments wp_options \
marketplace_wp > delta-rollback.sql
Lalu import ke MySQL shared Rumahweb via phpMyAdmin. Manual, tapi feasible kalau data delta <1 MB.
Step 3: Investigasi bug VPS di waktu santai:
VPS jangan langsung di-destroy. Snapshot dulu untuk forensic. Cancel langganan Contabo hanya kalau benar-benar tidak salvageable.
💡 Pro tip #4 Simpan 2 IP di catatan
Sebelum cutover, screenshot Cloudflare DNS A record yang menunjukkan IP shared. Tulis di Bitwarden / Notion / file
.txtlokal. Saya pernah cutover lalu rollback 2 hari kemudian, saya lupa IP shared aslinya, harus tanya ke support Rumahweb yang balas 4 jam kemudian.
10. Cara Cegah Migrasi Berikutnya Lebih Cepat
Migrasi 87 menit sudah cepat. Tapi kalau Anda kelola 12+ klien, 87 menit per klien = 1 hari kerja per migrasi. Cara saya tekan ini di klien selanjutnya:
- Ansible playbook untuk LEMP stack: clone repo, jalankan
ansible-playbook site.yml, 4 menit selesai. Lihat Setup VPS Ubuntu 24.04 dari nol. - Backblaze B2 sync harian dari shared: pakai rclone cron daily. Begitu mau migrasi, snapshot terakhir sudah ada di B2, tinggal restore dari B2 ke VPS (lebih cepat daripada download dari shared). Lihat Bagaimana backup otomatis pada website.
- Cloudflare API untuk DNS flip otomatis: script bash 10 baris yang ubah A record via API, tidak perlu klik manual di dashboard. Cocok untuk skedul migrasi pukul 03:00 dini hari.
- Pre-staging VPS: VPS sudah running 1 minggu sebelumnya dengan dummy site, jadi saat hari-H tinggal restore data (bukan provision OS).
11. FAQ
Kenapa Anda tidak pakai plugin All-in-One WP Migration / Duplicator / UpdraftPlus?
Untuk site dengan transaksi 24/7, plugin migration mengharuskan freeze data selama 30+ menit (untuk backup → upload ke target → restore). Metode rsync + Cloudflare proxy switch saya jendela cutover-nya cuma 6 menit, dengan 0 detik 5xx (verified Cloudflare Logs). Untuk blog statis, plugin migration tetap pilihan valid.
Apakah metode ini aman untuk WooCommerce dengan order live?
Aman jika cutover dilakukan di window traffic rendah (10:00–11:00 WIB untuk site Indonesia) dan Anda sudah set Cloudflare Proxied ON. Risiko utama: ~52 request masuk selama 6 menit cutover. Selama itu, sesi WooCommerce di wp_woocommerce_sessions mungkin tertinggal sync, solusinya: Fase 3 sync incremental sebelum DNS flip.
Kalau paket shared saya (Rumahweb SMALL / Niagahoster Bayi) tidak punya SSH, bagaimana?
Pakai cPanel File Manager → compress tar.gz → download wget di VPS (cara yang saya pakai di artikel ini). Bottleneck-nya bandwidth download, bukan SSH. Untuk site <500 MB, perbedaan dengan SSH cuma ~5 menit.
Berapa lama saya harus simpan akun shared hosting lama setelah migrasi?
Minimum 7 hari. Untuk site komersial dengan transaksi: 14–30 hari, agar Anda yakin tidak ada cron job legacy, webhook gateway pembayaran yang masih pointing ke shared, atau email transaksi cPanel yang belum ter-migrasi. Saya selalu re-bill 1 bulan shared sebagai “insurance”.
Apakah email cPanel ikut ter-migrasi otomatis?
Tidak. Email cPanel (mail.marketplace.tld) host-nya di Rumahweb shared. Kalau Anda matikan shared, email ikut mati. Pindahkan ke Mailgun / Zoho Mail / Google Workspace SEBELUM tear-down shared, dan update record MX di Cloudflare DNS.
Apakah perlu re-submit sitemap ke Google Search Console setelah migrasi?
Tidak perlu kalau domain tetap sama. Google akan re-crawl otomatis karena IP berubah (Googlebot detect dari change frequency). Tapi yang WAJIB Anda lakukan: cek Crawl Stats di Search Console 7 hari setelah migrasi, kalau response time naik dari baseline lama, ada masalah di VPS.
12. Penutup
87 menit. 52 request masuk selama jendela cutover. 0 yang 5xx. Klien sekarang bayar 16x lebih mahal untuk hosting, dan minggu setelah migrasi, saat event Mobile Legends “Skin Collector” drop, traffic peak 47k visit dalam 4 jam. TTFB tetap di bawah 200 ms. Tidak ada 503.
Itu yang saya maksud dengan “worth it”.
Kalau Anda mau replicate playbook ini untuk klien Anda, 4 referensi tambahan yang saya rekomendasikan baca:
- playbook setup VPS lengkap dari nol (Ubuntu 24.04 + Nginx + PHP 8.3 + MariaDB 10.11), 2 jam dari deploy sampai TLS A+
- hardening VPS setelah live, biar tahan event traffic spike + serangan layer 7
- Nginx FastCGI cache untuk PageSpeed 100 (yang bikin TTFB stay <200ms saat peak)
Last Updated on Mei 24, 2026 by larhtechBro



