Untuk pemula gaptek — ada gambar di tiap langkah
Deploy blog ke VPS murah, langkah demi langkah
Versi paling hemat dan paling mudah: kita sewa sebuah server kecil (mulai sekitar €3–5 per bulan), lalu pasang blog kamu di sana sampai benar-benar tayang dengan HTTPS. Tidak butuh pengalaman server — tinggal ikuti dan cocokkan dengan gambar di tiap langkah.
Akun GitHub
Tempat kode blog kamu disimpan.
Sebuah VPS
Ubuntu 24.04, RAM 1–2 GB sudah cukup.
Domain (opsional)
Mulai ~Rp15rb/bln, atau pakai IP dulu.
Link penting — siapkan dulu biar deploy lebih cepat
Buka tab baru untuk daftar akun & alat di bawah ini sebelum mulai. Semua tautan terbuka di tab baru.
Beli domain (opsional)
- Namecheap
Domain .com murah, panel mudah.
- Cloudflare Registrar
Harga domain paling jujur (harga modal).
- Niagahoster Domain
Bayar pakai Rupiah, dukungan lokal.
Alat yang dibutuhkan
- GitHub (gratis)
Tempat menyimpan kode blog kamu.
- PuTTY (SSH untuk Windows)
Kalau kamu pakai Windows lama tanpa SSH.
- Termius (SSH HP & desktop)
Aplikasi SSH yang ramah pemula.
Dokumentasi resmi
- Node.js (NodeSource)
Cara resmi install Node.js di Ubuntu.
- PM2
Menjaga app tetap menyala 24 jam.
- Let's Encrypt / Certbot
HTTPS gratis & otomatis.
- Nginx
Mengarahkan domain ke app kamu.
Pilih & sewa VPS termurah
VPS adalah komputer kecil di internet yang menyala 24 jam. Untuk blog ini, paket termurah sekalipun sudah lebih dari cukup. Penyedia yang ramah pemula dan murah misalnya Hetzner, Contabo, atau DigitalOcean. Buat akun, klik Create Server, lalu pilih Ubuntu 24.04 dan paket paling kecil.
Pilih paket — yang termurah pun sudah cukup untuk blog ini
Nano
€3,29/bln
- 1 vCPU
- 1 GB RAM
- 20 GB SSD
Starter
€4,99/bln
- 2 vCPU
- 2 GB RAM
- 40 GB SSD
Plus
€7,49/bln
- 3 vCPU
- 4 GB RAM
- 80 GB SSD
Langsung beli di sini (klik untuk buka halaman daftar — harga per Juni 2026, bisa berubah):
203.0.113.10) dan password root. Catat keduanya — kita pakai sebentar lagi.Push blog kamu ke GitHub
Di komputer kamu sendiri, buka terminal di dalam folder project lalu jalankan perintah berikut satu per satu (ganti username-kamu dan blog-saya):
kamu@laptop:~/blog$ git initkamu@laptop:~/blog$ git add .kamu@laptop:~/blog$ git commit -m "Initial commit: blog saya"5 files changed, 312 insertions(+)kamu@laptop:~/blog$ git branch -M mainkamu@laptop:~/blog$ git remote add origin https://github.com/username-kamu/blog-saya.gitkamu@laptop:~/blog$ git push -u origin mainbranch 'main' set up to track 'origin/main'.Buka github.com — kode kamu sekarang sudah ada di sana. Inilah yang nanti diunduh oleh VPS.
- app
- components
- content
- package.json
- README.md
Masuk ke VPS lewat SSH
Masih di komputer kamu, hubungkan ke server pakai alamat IP tadi. Ketik yes saat ditanya pertama kali, lalu masukkan password root.
kamu@laptop:~$ ssh root@203.0.113.10The authenticity of host '203.0.113.10' can't be established.Are you sure you want to continue connecting? yesroot@203.0.113.10's password:Welcome to Ubuntu 24.04 LTSroot@vps:~#Buat user baru (lebih aman)
Menjalankan semuanya sebagai root berisiko. Buat user biasa bernama deploy dan beri hak admin:
root@vps:~# adduser deployAdding user `deploy` ...New password: ********root@vps:~# usermod -aG sudo deployroot@vps:~# su - deploydeploy@vps:~$deploy. Tambahkan sudo di depan perintah yang butuh hak admin.Update sistem & install Git
deploy@vps:~$ sudo apt update && sudo apt upgrade -yReading package lists... Donedeploy@vps:~$ sudo apt install -y git curlgit is now installed.Install Node.js, pnpm & PM2
Next.js butuh Node. Pakai nvm supaya gampang. Lalu pasang pnpm (package manager project ini) dan pm2 (penjaga agar blog tetap menyala).
deploy@vps:~$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bashdeploy@vps:~$ source ~/.bashrcdeploy@vps:~$ nvm install 20Now using node v20.19.0deploy@vps:~$ node -vv20.19.0deploy@vps:~$ npm install -g pnpm pm2added 2 packagesClone repository kamu
deploy@vps:~$ git clone https://github.com/username-kamu/blog-saya.git blogCloning into 'blog'...Receiving objects: 100% (312/312), done.deploy@vps:~$ cd blogssh-keygen -t ed25519, tampilkan dengan cat ~/.ssh/id_ed25519.pub, tambahkan di GitHub → Settings → SSH keys, lalu clone pakai URL git@github.com:….Install dependency & build
deploy@vps:~$ pnpm installPackages: +420 donedeploy@vps:~$ pnpm build▲ Next.js 16.2.6✓ Compiled successfully✓ Generating static pages (6/6)sudo fallocate -l 2G /swapfile → sudo chmod 600 /swapfile → sudo mkswap /swapfile → sudo swapon /swapfile, lalu ulangi pnpm build.Jalankan aplikasi dengan PM2
PM2 menjaga blog tetap hidup 24/7 dan menyalakannya kembali otomatis jika server di-restart.
deploy@vps:~$ pm2 start "pnpm start" --name blogdeploy@vps:~$ pm2 savedeploy@vps:~$ pm2 startupdeploy@vps:~$ pm2 status┌─────┬───────┬─────────┬────────┐│ id │ name │ status │ uptime ││ 0 │ blog │ online │ 4s │└─────┴───────┴─────────┴────────┘pm2 startup akan menampilkan satu baris perintah — salin, tempel, dan jalankan baris itu agar blog otomatis menyala setelah server restart.Install & konfigurasi Nginx
Nginx berdiri di depan Next.js dan meneruskan pengunjung dari port 80 ke port 3000. Pasang lalu buka file konfigurasinya:
deploy@vps:~$ sudo apt install -y nginxdeploy@vps:~$ sudo nano /etc/nginx/sites-available/blogDi dalam editor nano, tempel isi berikut (ganti domainkamu.com). Tampilannya seperti ini:
1server {2 listen 80;3 server_name domainkamu.com www.domainkamu.com;4 5 location / {6 proxy_pass http://localhost:3000;7 proxy_http_version 1.1;8 proxy_set_header Host $host;9 proxy_set_header X-Real-IP $remote_addr;10 }11}Salin teks lengkap konfigurasinya dari sini:
server {
listen 80;
server_name domainkamu.com www.domainkamu.com;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}Simpan & keluar (Ctrl+O, Enter, Ctrl+X), lalu aktifkan situsnya:
deploy@vps:~$ sudo ln -s /etc/nginx/sites-available/blog /etc/nginx/sites-enabled/deploy@vps:~$ sudo rm -f /etc/nginx/sites-enabled/defaultdeploy@vps:~$ sudo nginx -tnginx: configuration file ... test is successfuldeploy@vps:~$ sudo systemctl reload nginxBuka firewall
deploy@vps:~$ sudo ufw allow OpenSSHdeploy@vps:~$ sudo ufw allow 'Nginx Full'deploy@vps:~$ sudo ufw enableFirewall is active and enabled on system startupAktifkan HTTPS gratis (Let's Encrypt)
Arahkan dulu A record domain kamu ke IP server (di tempat kamu beli domain). Setelah itu pasang sertifikat gratis:
deploy@vps:~$ sudo apt install -y certbot python3-certbot-nginxdeploy@vps:~$ sudo certbot --nginx -d domainkamu.com -d www.domainkamu.comEnter email: kamu@email.comRedirect HTTP to HTTPS? 2Congratulations! Your certificate is installed.Certificate will auto-renew.https://.Lihat hasilnya — dan cara update nanti
Buka https://domainkamu.com di browser. Selamat — blog kamu sudah tayang, aman, dan online!
Blog berbasis markdown
Tulis di Markdown. Push ke GitHub. Deploy di VPS milikmu sendiri.
Menyiapkan VPS pertama kamu
Sebuah catatan singkat tentang menjalankan blog kamu sendiri…
Menulis dengan Markdown
Sebuah catatan singkat tentang menjalankan blog kamu sendiri…
Mau menerbitkan tulisan baru? Tambahkan file markdown di content/posts/ di komputer kamu, push ke GitHub, lalu di VPS jalankan:
deploy@vps:~$ cd ~/blogdeploy@vps:~$ git pulldeploy@vps:~$ pnpm installdeploy@vps:~$ pnpm builddeploy@vps:~$ pm2 restart blog[PM2] Applying action restartProcessId on app [blog]Biar lebih singkat, simpan langkah-langkah itu dalam sebuah file deploy.sh di repo kamu:
#!/usr/bin/env bash
set -e
cd ~/blog
git pull
pnpm install
pnpm build
pm2 restart blog
echo "Deploy berhasil!"Jadikan bisa dieksekusi sekali saja dengan chmod +x deploy.sh. Setelah itu tiap update cukup jalankan ./deploy.sh.
Kalau ada masalah
| Gejala | Solusi |
|---|---|
| 502 Bad Gateway | Aplikasi mati — cek pm2 status lalu pm2 restart blog |
| Perubahan tidak muncul | Lupa pnpm build + pm2 restart blog |
| Build kehabisan memori | Tambahkan swap (lihat langkah 8) |
| nginx -t gagal | Ada salah ketik di file konfigurasi, perbaiki lalu reload |
| Muncul di IP tapi tidak di domain | A record DNS belum diatur / belum menyebar |
Lihat log secara langsung kapan saja dengan pm2 logs blog.
Lanjutan: deploy app dengan banyak environment variable →
Punya database, API key, dan secret yang banyak? Pelajari cara menatanya dengan rapi & aman.
Alternatif: deploy pakai Docker (dari nol) →
Belum tahu Docker sama sekali? Mulai dari analogi paling sederhana sampai blog tayang di dalam container.
Opsional: deploy tanpa PC, cukup HP Android ���
Belum punya laptop atau komputer? Kerjakan semuanya dari HP Android lewat aplikasi SSH, sampai blog tayang.
Lanjutan: auto-deploy lewat bot Telegram →
Update blog cukup dengan mengirim /deploy dari HP, atau otomatis tiap kali kamu push ke GitHub.
Lanjutan: pasang Cloudflare ke website →
Bikin website lebih cepat, ber-HTTPS, dan lebih aman. Lengkap dengan tombol salin di tiap nilai & perintah.
Lanjutan: integrasi email & autentikasi Gmail (gratis) →
Kirim email verifikasi/OTP pakai Resend atau Gmail SMTP versi gratis. Lengkap dengan App Password, kode, dan tombol salin di tiap langkah.
Lanjutan: hubungkan domain sendiri dengan Nginx →
Pasang Nginx sebagai reverse proxy agar aplikasi di IP:3000 bisa dibuka lewat app.domainku.com. Lengkap dengan tombol salin.
Lanjutan: pasang SSL/HTTPS gratis (Let's Encrypt) →
Ubah http:// jadi https:// bergembok, gratis, dan perpanjang otomatis dengan Certbot. Lengkap dengan tombol salin.
Lanjutan: bikin bot/app online 24 jam dengan PM2 →
Auto-restart saat crash, otomatis nyala setelah reboot, plus log & monitoring. Lengkap dengan tombol salin.
Lanjutan: amankan server (UFW, SSH Key, Fail2ban) →
Tutup port tak perlu, login pakai kunci (bukan password), dan blokir penyerang otomatis. Lengkap dengan tombol salin.
Lanjutan: backup otomatis & cara restore →
Snapshot, backup file & database terjadwal lewat cron, simpan ke cloud, dan cara memulihkan saat server rusak. Lengkap dengan tombol salin.
Lanjutan: monitoring & alert saat blog down →
Pantau uptime gratis dengan UptimeRobot, buat endpoint /health, dan kirim alert ke Telegram saat disk hampir penuh.
Lanjutan: auto-deploy dengan GitHub Actions →
Setiap git pushotomatis mem-build & men-deploy ke VPS lewat SSH. Termasuk deploy key, secret, dan file workflow.
Lanjutan: optimasi performa & keamanan otomatis →
Kompresi gzip/brotli, cache aset, batas memori PM2, log rotation, dan update keamanan otomatis (unattended-upgrades).
Lanjutan: banyak situs & database di 1 VPS →
Jalankan beberapa website dalam satu server (hemat biaya) dengan PM2 + Nginx, plus install PostgreSQL/MySQL dengan data terpisah per situs.
Deployment berhasil!
Kamu sekarang punya kendali penuh atas setiap lapisan blogmu. Kembali ke artikel.