Halo Sobat Online! Pernah tidak terpikir, semua password kita — email, m-banking, sampai akun jualan — selama ini dititipkan di server orang lain? Hari ini kita balik arah: kita pasang Vaultwarden di VPS sendiri, jadi brankas password itu berdiri di rumah kita sendiri. Hasilnya: sinkron otomatis antar HP dan laptop, aplikasi resmi Bitwarden tetap bisa dipakai, dan tidak ada biaya bulanan yang harus dibayar.
Kalau artikel sebelumnya kita sudah main-main dengan Docker, Nginx, dan Cloudflare Tunnel, kali ini kita pakai kombinasi Vaultwarden + Caddy dalam satu file compose.yaml. Ringkas, rapi, dan HTTPS-nya otomatis.
Kenapa Password Manager Self-Hosted?
Coba bayangkan password manager itu seperti brankas. Selama ini kita menaruh brankas di gedung orang lain: praktis, tapi kuncinya bukan cuma milik kita. Kalau kita self-host, brankasnya pindah ke rumah sendiri — datanya ada di disk VPS kita, dan yang punya akses penuh hanya kita.
Ada beberapa hal yang membuat langkah ini menarik:
- Tidak ada langganan bulanan. Fitur yang biasanya dikunci di paket premium (TOTP/2FA storage, lampiran file, organisasi) terbuka di server sendiri.
- Datamu tidak ikut dihapus. Selama VPS hidup dan file database kita aman, vault kita tetap ada — tidak tergantung kebijakan vendor.
- Tetap kompatibel. Vaultwarden adalah implementasi ulang API Bitwarden, jadi aplikasi resmi Bitwarden di Android, iOS, ekstensi browser, dan CLI tetap bisa login tanpa modifikasi.
Catatan jujurnya: self-host berarti tanggung jawab ikut pindah. Update keamanan, backup, dan HTTPS jadi urusan kita. Makanya tiga hal itu kita bahas serius di bawah.
Apa Itu Vaultwarden dan Seberapa Ringan?
Vaultwarden adalah implementasi ulang sisi server Bitwarden yang ditulis dengan Rust. Karena ringan, ia nyaman hidup di VPS kecil: RAM idle sekitar 50 MB dan naik ke kisaran 100-150 MB saat dipakai. Server resmi Bitwarden butuh beberapa kontainer sekaligus plus database tersendiri; Vaultwarden cukup satu kontainer kecil dengan SQLite di dalamnya.
Versi stabil terbaru saat artikel ini ditulis adalah 1.37.3 (rilis 13 September 2026), dan rilis itu wajib untuk klien Bitwarden versi 2026.8.0 ke atas. Jadi kalau nanti update, lakukan pada versi yang tercatat jelas, bukan asal tarik latest.
Yang Perlu Disiapkan
- VPS dengan Docker dan Docker Compose. Spek 1 vCPU / 1 GB RAM sudah lebih dari cukup.
- Domain atau subdomain, contohnya
vault.domainkamu.com, dengan A record diarahkan ke IP VPS. Sertifikat HTTPS akan diterbitkan untuk nama itu, jadi DNS harus beres dulu. - Port 80 dan 443 boleh terbuka ke internet, karena Caddy yang akan menerima tamu dan menggantikan Vaultwarden di baliknya.
- Akses SSH ke VPS. Sebaiknya SSH-nya sudah diamankan dulu (kalau belum, langkahnya mirip tutorial pengamanan SSH yang pernah kita bahas).
Kalau domainnya masih memakai proxy Cloudflare, matikan dulu atau atur mode SSL-nya ke Full (strict) sebelum menyalakan Caddy, supaya penerbitan sertifikat tidak bolak-balik gagal.
Langkah Pasang Vaultwarden di VPS Pakai Docker Compose
Semua file kita taruh di satu folder, /opt/vaultwarden, supaya backup gampang: satu folder itu saja yang perlu diselamatkan.
1. Buat folder proyek dan file .env
Masuk ke VPS lalu siapkan foldernya, termasuk folder data yang nanti diisi Vaultwarden.
sudo mkdir -p /opt/vaultwarden/vw-data
cd /opt/vaultwarden
sudo chown -R 1000:1000 vw-data
Isi file .env seperti ini. Tanda ' satu di sekitar token jangan dihapus — di file .env nilainya dibaca apa adanya, jadi tanda $ tidak perlu digandakan.
DOMAIN=https://vault.domainkamu.com
[email protected]
SIGNUPS_ALLOWED=true
ADMIN_TOKEN='$argon2id$v=19$m=19456,t=2,p=1$TEMPEL-HASH-DARI-LANGKAH-2'
2. Bikin ADMIN_TOKEN yang ter-hash (argon2)
Token admin itu kunci panel /admin, jadi perlakukan seperti password root. Vaultwarden bisa mencetak PHC string argon2id, sehingga yang tersimpan di server hanya hash-nya, bukan password aslinya.
docker run --rm -it vaultwarden/server:1.37.3 /vaultwarden hash --preset owasp
Perintah itu akan meminta password dua kali, lalu mencetak string yang diawali $argon2id$v=19$.... Salin string tersebut ke baris ADMIN_TOKEN di .env (tetap di dalam tanda kutip tunggal), lalu simpan password yang tadi kita ketik di brankas lain.
3. Tulis compose.yaml
Hanya dua layanan: Vaultwarden dan Caddy. Perhatikan bahwa Vaultwarden tidak diberi ports: — ia hanya bisa dijangkau Caddy lewat jaringan Docker internal.
services:
vaultwarden:
image: vaultwarden/server:1.37.3
container_name: vaultwarden
restart: unless-stopped
user: "1000:1000"
env_file: .env
volumes:
- ./vw-data:/data
expose:
- "80"
networks:
- vw-net
caddy:
image: caddy:2
container_name: caddy
restart: unless-stopped
env_file: .env
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./caddy-data:/data
- ./caddy-config:/config
networks:
- vw-net
networks:
vw-net:
4. Buat Caddyfile
Caddy akan menerbitkan sertifikat Let’s Encrypt otomatis dan meneruskan semua permintaan ke Vaultwarden. Cukup tiga baris inti.
{$DOMAIN} {
encode zstd gzip
tls {$EMAIL}
reverse_proxy vaultwarden:80 {
header_up X-Real-IP {remote_host}
}
}
Catatan penting: sejak Vaultwarden 1.29.0, koneksi WebSocket untuk notifikasi dilayani di port yang sama dengan HTTP. Jadi kalau kalian menemukan tutorial lama yang menambahkan jalur /notifications/hub terpisah atau variabel WEBSOCKET_ENABLED, itu sudah tidak berlaku — variabelnya dihapus sejak 1.31.0.
5. Buka firewall dan nyalakan
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
cd /opt/vaultwarden && docker compose up -d
docker compose logs -f vaultwarden
Kalau di log muncul baris seperti Rocket has launched from http://0.0.0.0:80, artinya Vaultwarden sudah hidup di dalam jaringannya. Beri Caddy beberapa detik untuk mengambil sertifikat, lalu buka https://vault.domainkamu.com — harus muncul halaman login Bitwarden dengan gembok hijau.
6. Buat akun pertama, lalu tutup pendaftaran
Klik Create account dan daftarkan email plus master password kalian. Master password ini tidak bisa direset oleh siapa pun, termasuk kita sebagai admin server, jadi simpan di tempat yang benar-benar aman.
Setelah akun jadi, langsung tutup pintunya dengan mengubah .env:
SIGNUPS_ALLOWED=false
lalu jalankan docker compose up -d lagi. Kalau langkah ini dilewatkan, siapa pun yang menemukan URL server kita bisa membuat akun di atasnya.
7. Buka panel /admin
Panel admin ada di https://vault.domainkamu.com/admin dan dilindungi ADMIN_TOKEN. Dari sini kita bisa melihat user, mengatur organisasi, dan memeriksa versi. Kalau halamannya balas 404, artinya ADMIN_TOKEN belum terpasang dengan benar. Kalau panel ini tidak dibutuhkan, jangan set token sama sekali — halaman itu otomatis mati.
8. Sambungkan aplikasi Bitwarden
- Di ekstensi browser: buka halaman login, klik ikon gear, pilih Self-hosted, isi
https://vault.domainkamu.com, simpan. - Di aplikasi HP: di layar login, buka pengaturan server, isi alamat yang sama.
- Login memakai email dan master password yang tadi dibuat. Semua item otomatis tersinkron ke server sendiri.
Jangan Lupa Backup Vault-nya
Seluruh isi vault — database db.sqlite3, lampiran, sampai kunci RSA penanda sesi — ada di folder /data di dalam kontainer, yang kita bind ke vw-data. Sejak versi 1.32.1 Vaultwarden punya perintah backup bawaan yang membuat salinan konsisten:
cd /opt/vaultwarden
docker exec -it vaultwarden /vaultwarden backup
docker compose stop
tar czf vaultwarden-$(date +%F).tar.gz vw-data
docker compose start
Simpan hasilnya di luar VPS — misalnya ke object storage atau komputer sendiri. Backup yang menempel di server yang sama tidak menolong sama sekali saat VPS-nya bermasalah. Kalau butuh mengangkat arsip itu ke cloud secara otomatis, pola rclone + systemd timer yang pernah kita pakai untuk backup VPS bisa langsung dipakai ulang.
Jebakan yang Sering Bikin Gagal
- Klien Bitwarden menolak server HTTP. Extensi dan aplikasi HP hanya mau bicara lewat HTTPS. Melewati tahap Caddy dan mencoba “tes pakai http dulu” hampir selalu berakhir dengan error
Cannot read property 'importKey'. - Tanda
$diADMIN_TOKENyang ditulis langsung di compose. Kalau token ditaruh di bagianenvironment:(bukan lewat.env), setiap$harus digandakan menjadi$$. Kalau tidak, Compose hanya berpesanThe "argon2id" variable is not setdan token jadi kosong. DOMAINharus berupa URL https lengkap. Nilai ini dipakai untuk menyusun tautan lampiran dan WebAuthn. Salah atau tertulishttp://membuat fitur-fitur itu rusak walau halaman depannya tampak normal.- Jangan pernah memberi Vaultwarden
ports: "80:80". Kalau port-nya dipublikasikan langsung, instance kita bisa ditemukan lewat scan alamat IP. Biarkan hanya Caddy yang menghadap internet. - Jangan pakai HTTPS bawaan Vaultwarden (Rocket TLS) untuk produksi. Dokumentasi resminya sendiri menandainya hanya untuk pengembangan dan tidak mendukung SNI ketat.
- Perbarui dengan urutan yang benar: backup dulu, lalu
docker compose pull && docker compose up -d, lalu uji login dan sinkronisasi. Rilis Vaultwarden sering berisi perbaikan keamanan, jadi jangan biarkan berbulan-bulan tanpa update.
Kesimpulan
Dengan tiga file saja — .env, compose.yaml, dan Caddyfile — kita sudah punya password manager pribadi yang jalan 24 jam, ber-HTTPS otomatis, dan bisa diakses dari HP maupun laptop. Total biaya bulanannya hanya sewa VPS yang sudah kita bayar untuk keperluan lain.
Kunci suksesnya cuma tiga: tutup pendaftaran setelah akun pertama dibuat, jangan biarkan master password hilang, dan rawat backup di luar server. Kalau tiga hal itu dijaga, brankas password kalian akan jauh lebih aman daripada menumpang di layanan yang tidak kita kendalikan.
Selamat mencoba, Sobat Online! Kalau ada bagian yang macet, tulis di kolom komentar — biasanya masalahnya cuma salah DNS atau salah tanda kutip. Semangat, dan sampai jumpa di tutorial berikutnya!

