Independent testing Updated August 2026 387 self-hosting guides 5 VPS providers tested

guide

Cara Deploy ke VPS dengan Kamal (Panduan Lengkap)

Kamal men-deploy aplikasi Docker Anda ke VPS biasa lewat SSH, tanpa Kubernetes. Tulis config/deploy.yml, ukur servernya dengan benar, dan rilis tanpa downtime.

Kamal tidak berjalan di VPS Anda. Ia adalah alat deployment yang Anda pasang di mesin sendiri atau di runner CI, dan ia terhubung ke server lewat SSH untuk bekerja. Basecamp membuatnya untuk merilis aplikasi Rails tanpa Kubernetes, tetapi Kamal men-deploy apa saja yang bisa dibangun menjadi image Docker.

Perbedaan itu mengubah apa yang sebenarnya Anda cari. VPS adalah target Kamal, jadi ia harus cukup besar untuk aplikasi Anda, basis datanya, dan beberapa hari versi image. Jejak Kamal sendiri di server adalah nol.

Apa yang Sebenarnya Ditaruh Kamal di Server

kamal setup terhubung lewat SSH (sebagai root secara bawaan, diautentikasi dengan kunci SSH Anda) dan menjalankan tiga langkah: memasang Docker kalau belum ada, menjalankan aksesori yang Anda deklarasikan, lalu men-deploy aplikasi. Setelah itu host menjalankan:

Kamal sendiri adalah sebuah gem (gem install kamal, versi 2.12.0 saat tulisan ini dibuat) dan tidak meninggalkan daemon apa pun.

Prasyarat

Sebelum mulai, siapkan:

Memilih Penyedia VPS

Karena server hanya menjalankan kontainer, nilai penyedia dari keandalan jaringan, ruang disk, dan seberapa cepat Anda bisa membangun ulang sebuah host:

PenyediaHargaFiturTautan Afiliasi
Contabo VPS5,99 EUR/bulanDisk 400 GB menyerap image besar dan riwayat rollback yang panjangContabo VPS
Hetzner Cloud5,49 EUR/bulan2 vCPU / 4 GB / 40 GB NVMe, snapshot untuk membangun ulang host dengan cepatHetzner Cloud
DigitalOcean6 USD/bulanDokumentasi dan API terbaik untuk mengotomatiskan host itu sendiriDigitalOcean
Vultr5 USD/bulanBanyak pilihan region untuk menempatkan aplikasi dekat penggunanyaVultr
Linode5 USD/bulanHarga mudah diprediksi, penyiapan jaringan lugasLinode

Untuk perbandingan menyeluruh, lihat halaman perbandingan VPS lengkap kami.

DigitalOcean adalah titik awal termudah di sini, karena dokumentasinya mencakup pekerjaan tingkat host yang tidak dikerjakan Kamal untuk Anda: aturan firewall, swap, dan pembaruan keamanan otomatis.

Menyiapkan Server

  1. Buat VPS dengan image Ubuntu 24.04 minimal dan kunci SSH Anda terpasang.
  2. Pastikan SSH root berfungsi, karena begitulah Kamal terhubung secara bawaan:
ssh root@ip-vps-anda
  1. Buka hanya yang Anda perlukan. kamal-proxy mengakhiri TLS di server, jadi port 22, 80, dan 443 sudah cukup:
ufw allow 22,80,443/tcp && ufw enable

Anda tidak perlu memasang Docker sendiri. Kamal memasangnya pada kamal setup pertama kalau belum ada.

Memasang Kamal dan Menulis Konfigurasi

Di mesin Anda sendiri, di dalam direktori aplikasi:

gem install kamal
kamal init

kamal init membuat config/deploy.yml. Konfigurasi minimal yang berfungsi memerlukan nama layanan, sebuah image, dan setidaknya satu host:

service: myapp
image: pengguna-registry-anda/myapp

servers:
  web:
    hosts:
      - 203.0.113.10

registry:
  username: pengguna-registry-anda
  password:
    - KAMAL_REGISTRY_PASSWORD

proxy:
  ssl: true
  host: app.example.com

Rahasia disimpan di .kamal/secrets, yang dibaca Kamal saat deploy. Kamal mencari .kamal/secrets-common lebih dulu, baru .kamal/secrets:

KAMAL_REGISTRY_PASSWORD=$KAMAL_REGISTRY_PASSWORD

Jauhkan berkas itu dari kontrol versi dan ambil nilainya dari environment shell Anda atau dari pengelola kata sandi.

Menjalankan Deploy Pertama

kamal setup

Satu perintah itu memasang Docker, menjalankan aksesori, membangun dan mengirim image Anda, lalu menyalakan aplikasi. Setiap deploy berikutnya cukup:

kamal deploy

Untuk memeriksa apa yang berjalan di host:

kamal app containers

Di Mana Image Dibangun

Secara bawaan Kamal membangun image secara lokal, di mesin mana pun tempat Anda menjalankannya, lalu mengirimnya ke registry. Server hanya menarik. Kalau laptop Anda arm64 dan VPS-nya amd64, kunci arsitektur targetnya atau arahkan Kamal ke builder jarak jauh:

builder:
  arch: amd64
  remote: ssh://[email protected]

Cross-build lewat emulasi cukup lambat untuk terasa pada setiap deploy. Kalau VPS adalah satu-satunya mesin amd64 yang Anda punya, ia bisa merangkap sebagai builder — tetapi ukurlah untuk proses build Docker, bukan sekadar untuk menjalankan aplikasi, yang biasanya berarti naik satu paket demi RAM tambahan.

Mengukur Disk

Kamal menyimpan kontainer dan image lama di server supaya kamal rollback bisa menjalankan versi sebelumnya tanpa menarik ulang dari registry. Secara bawaan ia membersihkannya setelah tiga hari. Rencanakan ruang untuk data aplikasi Anda sendiri ditambah sekitar tiga hari versi image beserta lapisan dasar bersamanya.

Image 1 GB yang di-deploy beberapa kali sehari duduk nyaman di 40 GB NVMe milik Hetzner. Image 3 GB pada disk 25 GB akan memenuhinya dalam sepekan, dan disk penuh merusak deploy berikutnya, bukan yang sedang berjalan — yang membuatnya mudah terlewat sampai terlambat.

Peralihan Tanpa Downtime

kamal-proxy baru memindahkan trafik ke kontainer baru setelah kontainer itu menjawab GET /up dengan status 200. Dari sini ada dua konsekuensi:

Kalau health check tidak pernah lolos, deploy kehabisan waktu dan Kamal membiarkan kontainer lama tetap melayani trafik.

Mengamankan Deployment

Tips Penutup

Untuk pembahasan lebih lanjut soal memilih servernya, lihat halaman perbandingan VPS lengkap kami.

Frequently asked questions

Kamal berjalan di VPS atau di mesin saya sendiri?

Kamal berjalan di mesin Anda atau di runner CI Anda. Ia adalah gem Ruby yang terhubung ke server lewat SSH, memasang Docker kalau belum ada, dan menjalankan kontainer Anda. Yang tertinggal di VPS adalah kamal-proxy beserta kontainer aplikasi dan aksesori Anda, tidak pernah Kamal itu sendiri.

Berapa disk yang dibutuhkan VPS yang dipakai sebagai target Kamal?

Siapkan ruang untuk data aplikasi Anda ditambah kira-kira tiga hari versi image, karena Kamal menyimpan kontainer dan image lama untuk rollback dan membersihkannya setelah tiga hari secara bawaan. Image 1 GB yang di-deploy beberapa kali sehari muat lapang di 40 GB; image 3 GB pada disk 25 GB tidak.

Kenapa deploy Kamal saya kehabisan waktu lalu di-rollback?

kamal-proxy baru mengalihkan trafik setelah kontainer baru menjawab GET /up dengan status 200. Kalau aplikasi Anda tidak menyediakan endpoint semacam itu, atau endpoint itu mengembalikan error selagi aplikasi masih dimuat, health check tidak pernah lolos dan Kamal kembali ke kontainer sebelumnya.