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.

Lingkup studi kasus
  • Situs berupa HTML, CSS, JavaScript, SVG, serta file publik tanpa database.
  • Repository: adzizPe/ngodingsantai, branch produksi master.
  • Web root tujuan: /var/www/ozancicak.biz.id.
  • Aplikasi lama di VPS tidak boleh dihentikan atau ditimpa.
Diagram migrasi dari hosting lama melalui GitHub menuju Ubuntu dan Nginx
Migrasi mempunyai tiga bagian: mengambil sumber yang benar, menyiapkan tujuan yang terisolasi, lalu memperbarui alamat dan sinyal pencarian.

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.

A · @Mengarah ke IPv4 VPS. Hapus A atau AAAA konflik untuk host yang sama.
CNAME · wwwMengarah ke ozancicak.biz.id, bukan ke URL dengan protokol atau path.
TXTDipakai untuk verifikasi layanan seperti Search Console; tidak mengarahkan trafik web.
MXHanya ditambahkan ketika layanan email benar-benar disiapkan.

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, dan sitemap.xml dapat 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.

Artikel terkait