Memindahkan Website Statis dari Shared Hosting ke VPS Ubuntu
Catatan migrasi NgodingSantai: inventaris situs lama, GitHub sebagai sumber, web root baru, Nginx, DNS, HTTPS, dan verifikasi publik.
NgodingSantai awalnya diletakkan pada layanan shared hosting. Ketika layanan tersebut berakhir, proyek dipindahkan ke Ubuntu VPS Tencent Cloud dan tetap menggunakan repository GitHub sebagai sumber perubahan. Migrasi ini bukan sekadar menyalin folder: server sudah menjalankan aplikasi lain, domain berubah, DNS dikelola tanpa Cloudflare, dan semua sinyal publik harus menunjuk ke alamat baru.
- Situs berupa HTML, CSS, JavaScript, SVG, serta file publik tanpa database.
- Repository:
adzizPe/ngodingsantai, branch produksimaster. - Web root tujuan:
/var/www/ozancicak.biz.id. - Aplikasi lama di VPS tidak boleh dihentikan atau ditimpa.
Inventaris sebelum menyentuh server
Daftar aset dibuat dari repository: halaman HTML, folder artikel, stylesheet, script, gambar, robots.txt, sitemap.xml, ads.txt, dan manifest. Karena situs tidak memakai database, backup database tidak diperlukan. Sebaliknya, URL absolut perlu dicari karena domain lama dapat tertinggal pada canonical, Open Graph, JSON-LD, sitemap, atau email kontak.
rg -n "domain-lama|http://|https://" -g "*.html" -g "*.xml" -g "*.txt" -g "*.js"
git status --short
git log -5 --oneline
Repository lokal yang bersih penting karena GitHub menjadi sumber kebenaran. File rahasia, private key, password, dan token tidak boleh masuk commit. Panduan operasional boleh disimpan di repository apabila Nginx menolak akses publik ke folder tersebut.
Cadangkan konfigurasi VPS yang sudah berjalan
Server tujuan bukan mesin kosong. Pemeriksaan menunjukkan aplikasi lain sudah menggunakan Nginx. Karena itu langkah pertama di VPS adalah menyimpan konfigurasi, melihat virtual host aktif, dan mencari apakah nama domain baru pernah dipakai. Menghapus default atau seluruh sites-enabled akan menjadi tindakan berisiko.
sudo tar -C /etc -czf /home/ubuntu/nginx-before-site.tar.gz nginx
sudo nginx -T 2>&1 | tee /home/ubuntu/nginx-before-site.txt > /dev/null
sudo ls -la /etc/nginx/sites-enabled
sudo grep -RIn "server_name.*ozancicak" /etc/nginx/sites-enabled /etc/nginx/conf.d || true
Buat web root dengan pemilik yang jelas
Direktori dibuat untuk akun deploy ubuntu dan group www-data. Dengan begitu Git dapat berjalan tanpa sudo git, sedangkan Nginx tetap dapat membaca file. Bit setgid pada direktori membantu file baru mempertahankan group.
sudo install -d -o ubuntu -g www-data -m 2755 /var/www/ozancicak.biz.id
sudo -u ubuntu -H git clone --branch master --single-branch git@github.com:adzizPe/ngodingsantai.git /var/www/ozancicak.biz.id
Repository private memakai deploy key khusus dengan akses baca saja. Kunci ini tidak dipakai untuk login administrator dan tidak diberi write access ke GitHub. Jika repository public, clone HTTPS lebih sederhana dan tidak memerlukan kunci.
Tambahkan virtual host, jangan mengganti server lama
Konfigurasi baru memakai server_name ozancicak.biz.id www.ozancicak.biz.id dan root khusus. Nginx memilih server block berdasarkan alamat serta Host header. Karena itu satu IP dapat melayani beberapa situs selama nama host dan direktori tidak dicampur.
sudo cp deploy/nginx-ozancicak.biz.id.conf /etc/nginx/sites-available/ozancicak.biz.id
sudo ln -s /etc/nginx/sites-available/ozancicak.biz.id /etc/nginx/sites-enabled/ozancicak.biz.id
sudo nginx -t
sudo systemctl reload nginx
Sebelum DNS dipindahkan, server block dapat diuji dari VPS dengan Host header. Respons 200 membuktikan routing HTTP lokal benar tanpa menunggu resolver publik.
curl -I -H 'Host: ozancicak.biz.id' http://127.0.0.1/
Arahkan DNS setelah origin siap
Domain menggunakan Zone Editor registrar, bukan Cloudflare. Record A untuk host akar diarahkan ke IP VPS dan www menggunakan CNAME ke domain akar. Nameserver bukan tempat memasukkan IP. Delegasi nameserver harus menunjuk ke penyedia zone yang sedang diedit; jika tidak, record yang terlihat di dashboard tidak akan dijawab di internet.
Terbitkan HTTPS setelah DNS menjawab benar
Certbot dijalankan hanya setelah domain akar dan www mencapai server, port 80/443 terbuka, serta nginx -t lolos. Urutan ini mengurangi kegagalan challenge dan risiko sertifikat diterbitkan untuk host yang salah.
sudo certbot --nginx -d ozancicak.biz.id -d www.ozancicak.biz.id
sudo certbot renew --dry-run
Verifikasi lebih dari halaman utama
- HTTP dialihkan ke HTTPS dan sertifikat mencakup domain akar serta www.
- Beranda, arsip, artikel, profil redaksi, kontak, dan kebijakan merespons dengan benar.
- URL salah mengembalikan 404, bukan beranda berstatus 200.
ads.txt,robots.txt, dansitemap.xmldapat diambil langsung.- Folder
/deploy/,/scripts/, dotfile, dan README tidak dapat diunduh publik. - Aplikasi lama pada VPS tetap menjawab domainnya sendiri.
Rollback yang disiapkan
Jika server block baru gagal, rollback dilakukan dengan menonaktifkan hanya symlink milik domain baru, menjalankan nginx -t, lalu reload. Konfigurasi lama tidak disentuh. Untuk konten, commit sebelumnya dapat dikembalikan melalui Git, bukan mengedit file produksi tanpa riwayat.
Referensi primer
Catatan keputusan yang tidak dipilih
Proyek tidak diunggah dengan FTP langsung ke web root karena cara itu membuat versi produksi sulit dibandingkan dengan repository. Panel hosting lama juga tidak disalin mentah ke VPS: record email, konfigurasi cPanel, dan file cache tidak mempunyai fungsi pada arsitektur baru. Hanya source yang dibutuhkan situs serta konfigurasi yang sengaja ditulis ulang yang dipindahkan.
Docker tidak ditambahkan karena origin hanya menyajikan file statis dan Nginx sudah berjalan di host. Container dapat bermanfaat pada sistem lain, tetapi di sini akan menambah jaringan, volume, image update, dan diagnosis tanpa menyelesaikan kebutuhan yang belum ditangani server block biasa.
Bukti selesai yang disimpan
Hash commit produksi, hasil nginx -t, respons Host lokal sebelum DNS, respons HTTPS setelah DNS, serta salinan konfigurasi sebelum dan sesudah menjadi catatan migrasi. Bukti ini lebih berguna daripada mengandalkan ingatan dashboard ketika masalah muncul beberapa minggu kemudian.