SSD Nodes Learn Hosting plans →
Panduan Matt ConnorOleh Matt Connor · Diperbarui 2026-08-29

Vaultwarden di VPS: Kelola Kata Sandi Sendiri

Panduan menjalankan Vaultwarden dengan Docker di VPS, memakai HTTPS, admin token, Fail2ban, serta backup teruji untuk menjaga data kata sandi Anda.

Yang Anda bangun

Pengelola kata sandi yang sepenuhnya Anda miliki: Vaultwarden yang berjalan dalam satu container kecil di belakang reverse proxy yang melakukan terminasi HTTPS, dengan aplikasi resmi Bitwarden pada ponsel, laptop, dan browser yang diarahkan ke server tersebut. Vaultwarden mengimplementasikan ulang API server Bitwarden dalam Rust dan menggunakan protokol yang sama seperti bitwarden.com. Karena itu, semua client resmi dapat menggunakannya tanpa perubahan. Vaultwarden hanya membutuhkan sekitar 100 MB RAM, bukan beberapa container seperti stack resmi.

Instalasinya sendiri hanya memerlukan belasan baris Compose. Ada tiga hal yang benar-benar penting dan sering menyebabkan masalah: TLS harus tersedia sebelum Anda membuka web vault untuk pertama kalinya, pendaftaran publik harus ditutup segera setelah akun Anda sendiri dibuat, dan volume data harus dicadangkan serta dipulihkan dalam pengujian. Satu direktori tersebut menyimpan semua kata sandi Anda.

Prasyarat dan hal penting yang perlu diketahui

  • VPS dengan Docker Engine dan plugin Compose, menggunakan Ubuntu 24.04 yang baru dipasang pada mesin KVM, serta akses root atau sudo. RAM 512 MB benar-benar cukup; 1 GB lebih leluasa. Ini adalah salah satu layanan paling ringan yang dapat Anda jalankan dan berada di posisi teratas dalam daftar singkat layanan yang layak di-self-host. Namun, sesuaikan ukuran VPS dengan layanan lain yang menggunakannya: menempatkan pustaka foto yang di-self-host seperti PhotoPrism atau Immich pada VPS yang sama akan meningkatkan kebutuhan minimum RAM hingga beberapa gigabyte, sedangkan Vaultwarden hampir tidak menambahnya. Perhitungan yang sama berlaku untuk front end media yang ditambahkan nanti, karena mengubah pustaka Jellyfin menjadi toko rental tahun 90-an yang dapat dijelajahi berarti menambah satu container yang selalu aktif serta ruang RAM untuk transcoding dalam anggaran yang sama.
  • Domain dengan record A (dan AAAA jika Anda menggunakan IPv6) yang mengarah vault.example.com ke VPS. Sertifikat TLS diterbitkan untuk nama persis ini, sehingga DNS harus sudah dapat melakukan resolusi sebelum Anda memulai.
  • Port 80 dan 443 terbuka ke Internet dan ditangani oleh reverse proxy, bukan langsung oleh Vaultwarden. Port 80 hanya digunakan untuk tantangan sertifikat ACME dan redirect HTTP ke HTTPS.
  • Hal terpenting yang perlu diketahui sejak awal: client Bitwarden menolak berkomunikasi dengan server yang tidak menggunakan HTTPS. Tidak ada opsi untuk "menguji melalui http terlebih dahulu"; cara tersebut tidak berfungsi karena alasan konkret yang dibahas pada bagian berikutnya.

Mengapa Vaultwarden, bukan stack Bitwarden resmi

Kliennya sama, tetapi penggunaan resource jauh lebih rendah. Bitwarden resmi untuk self-hosting dirilis sebagai kumpulan container (MSSQL, Nginx, Identity, Api, Admin, dan lainnya) dan membutuhkan sekitar 2 GB RAM. Vaultwarden adalah satu binary yang secara default menyimpan semua data dalam database SQLite dan hanya menggunakan beberapa puluh megabyte saat idle. Untuk satu orang, keluarga, atau tim kecil, ini merupakan pilihan yang jelas. Karena Vaultwarden mengimplementasikan API Bitwarden secara kompatibel, data Anda tetap portabel antara Vaultwarden dan bitwarden.com.

Yang Anda korbankan adalah sebagian besar fitur enterprise: tidak ada provisioning SCIM, meskipun dukungan eksperimental untuk SSO OpenID Connect tersedia sejak 1.35.0. Selain itu, Anda bertindak sebagai operator, sehingga patching, HTTPS, dan backup menjadi tanggung jawab Anda. Panduan ini membahas ketiga tanggung jawab tersebut.

Mengapa HTTPS tidak bersifat opsional

Web vault dan ekstensi browser Bitwarden menghasilkan kunci enkripsi di browser menggunakan Web Crypto API (window.crypto.subtle). Browser hanya menyediakan crypto.subtle dalam secure context, yaitu HTTPS atau kasus khusus http://localhost. Pada http://vault.example.com biasa, fitur tersebut undefined, sehingga saat aplikasi menghasilkan kunci, aplikasi langsung mengalami error dan konsol menampilkan:

Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'importKey')

Halaman akan macet atau menampilkan error kriptografi umum, dan tidak ada pengguna yang berhasil login. Klien desktop, mobile, dan browser melakukan pemeriksaan sendiri terhadap URL yang di-hosting secara mandiri. Jika endpoint menggunakan http atau tidak dapat dijangkau, klien menolaknya dengan pesan:

This is not a recognized Bitwarden server. You may need to check with your provider or update your server.

Keduanya memiliki penyebab yang sama: tidak ada HTTPS yang valid. Karena itu, siapkan TLS terlebih dahulu dan jangan pernah membuka vault melalui http, bahkan hanya sekali untuk pemeriksaan singkat.

Langkah 1, DNS dan reverse proxy (TLS terlebih dahulu)

Arahkan record ke VPS Anda dan pastikan record tersebut mengarah ke alamat yang benar:

dig +short vault.example.com

Baris yang ditampilkan harus berisi IP VPS Anda. Jika kosong atau salah, perbaiki DNS dan tunggu hingga TTL berakhir. Penerbitan sertifikat akan gagal jika nama tersebut tidak dapat di-resolve.

Untuk frontend HTTPS, panduan ini menggunakan Traefik. Traefik menerbitkan dan memperbarui sertifikat Let's Encrypt secara otomatis serta terintegrasi langsung dengan Compose. Jika Anda belum menjalankannya, ikuti penyiapan reverse proxy Traefik dan TLS otomatis terlebih dahulu. Penyiapan tersebut membuat jaringan Docker eksternal (proxy di bawah) dan resolver ACME (letsencrypt) yang digunakan oleh service Vaultwarden. nginx biasa dengan sertifikat yang diterbitkan secara manual bekerja dengan cara yang sama dari sisi Vaultwarden.

Lebih memilih nginx dan Certbot daripada Traefik? Tempatkan Vaultwarden pada 127.0.0.1:8080 (tambahkan ports: ["127.0.0.1:8080:80"] ke service dan hapus label Traefik), lalu terbitkan sertifikat dan teruskan trafik ke sana. Bagian penerbitan sertifikat dibahas dalam penerbitan sertifikat Let's Encrypt dengan Certbot dan nginx. Hal tambahan yang penting adalah upgrade WebSocket pada path notifikasi:

server {
    listen 443 ssl;
    server_name vault.example.com;

    client_max_body_size 525M;

    location / {
        proxy_pass http://127.0.0.1:8080;
        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_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Perhatikan baris X-Real-IP. Baris tersebut memungkinkan Fail2ban melihat penyerang yang sebenarnya, bukan 127.0.0.1. Bagian lain dalam panduan ini sama, baik Traefik maupun nginx yang ditempatkan di depan.

Langkah 2, file Compose

Buat direktori proyek terlebih dahulu. Panduan ini menggunakan /opt/vaultwarden, yang membuat nama proyek Compose, dan karena itu volume data, vaultwarden_vw-data, dapat diprediksi; langkah Fail2ban dan pencadangan di bawah ini bergantung pada nama tersebut.

sudo mkdir -p /opt/vaultwarden
cd /opt/vaultwarden

Buat .env untuk secret admin dan file Compose di direktori tersebut.

# .env
ADMIN_TOKEN=paste-a-strong-token-here

Buat token tersebut dengan openssl rand -base64 48, lalu tempelkan ke dalam file. (Bentuk hash yang lebih kuat dibahas berikutnya; string acak yang panjang sudah cukup untuk memulai.)

# docker-compose.yml
services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      DOMAIN: "https://vault.example.com"
      SIGNUPS_ALLOWED: "true"          # closed in Step 4, keep true just to register
      ADMIN_TOKEN: "${ADMIN_TOKEN}"
      IP_HEADER: "X-Forwarded-For"     # X-Real-IP if your proxy sends that instead
      LOG_FILE: "/data/vaultwarden.log"
      LOG_LEVEL: "warn"
    volumes:
      - vw-data:/data
    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.vw.rule=Host(`vault.example.com`)"
      - "traefik.http.routers.vw.entrypoints=websecure"
      - "traefik.http.routers.vw.tls.certresolver=letsencrypt"
      - "traefik.http.services.vw.loadbalancer.server.port=80"

volumes:
  vw-data:

networks:
  proxy:
    external: true

Ada dua hal pada file ini yang menjadi dasar seluruh desain. Tidak ada pemetaan ports:, sehingga Vaultwarden hanya dapat diakses melalui Traefik dan TLS-nya. Mempublikasikan port Vaultwarden pada host dapat menyebabkan vault disajikan melalui http secara tidak sengaja. Selain itu, DOMAIN harus berupa URL HTTPS publik lengkap. Nilai ini disisipkan ke dalam tautan lampiran, WebAuthn 2FA, dan endpoint notifikasi. Nilai yang salah atau menggunakan http akan merusak fitur-fitur tersebut meskipun situs dapat dimuat. Tag latest merupakan pengecualian yang disengaja terhadap aturan umum untuk tidak pernah-latest. Vaultwarden merilis versi stabilnya sebagai satu image yang terus diperbarui, sedangkan :testing merupakan channel prarilis terpisah. Karena itu, lakukan pembaruan secara sengaja dan baca sekilas catatan rilis sebelum melakukan pull. Namun, pengecualian ini terbatas: sebagian besar container yang berjalan dalam jangka panjang sebaiknya dikunci ke tag yang tepat. Inilah yang membuat agent self-hosted yang selalu aktif pada VPS yang sama tetap dapat diprediksi saat reboot dan pull.

Jalankan dan pantau log:

docker compose up -d
docker compose logs -f vaultwarden

Proses start yang benar berakhir dengan baris seperti Rocket has launched from http://0.0.0.0:80. Tunggu beberapa detik agar Traefik mengambil sertifikat, lalu buka https://vault.example.com. Anda akan melihat web vault Bitwarden dengan ikon gembok yang valid dan tanpa peringatan sertifikat.

Langkah 3, ADMIN_TOKEN yang kuat, dan jebakan $$

ADMIN_TOKEN melindungi /admin, yaitu panel yang dapat membaca setiap pengguna dan pengaturan pada instance Anda. Perlakukan token ini seperti kata sandi root. Ada dua bentuk yang dapat digunakan.

Bentuk sederhana adalah string acak yang sebelumnya Anda buat dengan openssl rand -base64 48. Karena base64 tidak pernah berisi $, string tersebut dapat langsung dimasukkan ke .env tanpa escape.

Bentuk yang lebih aman adalah hash PHC Argon2, sehingga token plaintext tidak pernah disimpan di disk. Buat hash menggunakan image yang sama:

docker run --rm -it vaultwarden/server /vaultwarden hash --preset owasp

Perintah tersebut meminta input dua kali dan mencetak string yang diawali $argon2id$v=19$.... Berikut jebakan yang dapat menghabiskan waktu satu jam: Docker Compose memperlakukan $ sebagai interpolasi variabel. Karena itu, Anda harus menggandakan setiap $ menjadi $$ saat menempelkan hash ke file Compose. Letakkan hash langsung di bawah environment:, bukan melalui .env, dan jangan mengapitnya dengan tanda kutip:

    environment:
      ADMIN_TOKEN: $$argon2id$$v=19$$m=19456,t=2,p=1$$c29tZXNhbHQ$$RdescudvJCsgt3ub+b+dWRWJTmaaJObG

Jika Anda membiarkan tanda $ tunggal, Compose akan memperingatkan The "argon2id" variable is not set dan mengosongkan token. Akibatnya, /admin akan menolak kata sandi Anda yang benar. Jalankan docker compose up -d, lalu simpan plaintext yang Anda masukkan pada prompt di password store pribadi Anda.

Langkah 4, daftarkan akun Anda, lalu tutup akses pendaftaran

Dengan SIGNUPS_ALLOWED: "true", buka https://vault.example.com, klik Create account, lalu daftarkan diri menggunakan email dan master password yang kuat. Master password ini tidak dapat dipulihkan dan tidak ada fitur reset. Simpan terlebih dahulu di tempat yang aman dan tahan lama.

Sekarang tutup akses pendaftaran. Edit file Compose agar pendaftaran akun dinonaktifkan:

      SIGNUPS_ALLOWED: "false"

Terapkan kembali perubahan dengan docker compose up -d. Ini bukan konfigurasi keamanan yang dapat ditunda. Jika dibiarkan terbuka, siapa pun yang menemukan URL tersebut—termasuk crawler—dapat membuat akun di server Anda. Mereka tidak dapat membaca vault milik Anda, tetapi mereka menghabiskan resource dan mengubah instance privat Anda menjadi layanan terbuka. Indikasi bahwa pengaturan tersebut masih aktif: /admin mencantumkan akun yang tidak pernah Anda buat.

Untuk menambahkan anggota keluarga atau rekan tim nanti tanpa membuka kembali pendaftaran publik, gunakan tombol Invite User di /admin. Cara ini memerlukan konfigurasi SMTP agar penerima undangan mendapatkan tautannya.

Langkah 5, mengakses /admin

Buka https://vault.example.com/admin, lalu masukkan token admin dalam teks biasa (string acak atau kata sandi yang Anda hash, bukan hash itu sendiri). Di dalam panel, Anda dapat mencantumkan pengguna, menyesuaikan pengaturan, mengirim email pengujian, dan membuat snapshot database.

Jika halaman menampilkan 404 Not Found, berarti ADMIN_TOKEN kosong atau tidak ditetapkan. Kondisi ini menonaktifkan panel sepenuhnya dan merupakan pilihan yang valid jika Anda tidak pernah membutuhkannya. Jika panel dapat dimuat tetapi menolak token Anda, lihat jebakan escaping $$ dalam daftar kegagalan di bawah. Lupa token? Tidak ada prompt pemulihan. Edit .env atau file Compose, tetapkan token baru, lalu docker compose up -d.

Langkah 6, hubungkan klien Bitwarden

Setiap klien resmi dapat diarahkan ke server yang di-hosting sendiri. Instal klien desktop, seluler, atau browser Bitwarden dari toko aplikasi resmi seperti biasa. Anda tidak memerlukan build Vaultwarden khusus.

Sebelum login, buka ikon roda gigi pengaturan pada layar login (berlabel Self-hosted atau Region → Self-hosted), tetapkan Server URL ke https://vault.example.com, lalu simpan. Selanjutnya, login menggunakan email dan master password yang Anda daftarkan. Klien seharusnya langsung terhubung dan menawarkan pengisian serta penyimpanan kredensial.

Jika klien menampilkan This is not a recognized Bitwarden server. You may need to check with your provider or update your server., URL mungkin salah, menggunakan http, atau sertifikat tidak tepercaya. Periksa kembali apakah https://vault.example.com dapat dimuat tanpa masalah di browser terlebih dahulu. Pembaruan yang lambat pada perangkat lain disebabkan oleh push WebSocket dan dibahas di bawah.

Langkah 7, jail Fail2ban untuk endpoint login

Vaultwarden mencatat setiap login yang gagal ke file yang ditentukan oleh LOG_FILE. Ini persis yang diperlukan oleh perlindungan terhadap brute force. Jika Fail2ban belum berjalan, panduan instalasi dan dasar-dasarnya tersedia di panduan penguatan SSH dengan Fail2ban. Di sini, kita menambahkan satu jail untuk vault.

Pertama, cari lokasi named volume pada host agar Fail2ban dapat membaca log:

docker volume inspect vaultwarden_vw-data --format '{{ .Mountpoint }}'

Perintah tersebut mencetak sesuatu seperti /var/lib/docker/volumes/vaultwarden_vw-data/_data. Log berada di vaultwarden.log di dalamnya. Buat filter:

# /etc/fail2ban/filter.d/vaultwarden.conf
[Definition]
failregex = ^.*Username or password is incorrect\. Try again\. IP: <ADDR>\. Username:.*$
ignoreregex =

Kemudian, buat jail:

# /etc/fail2ban/jail.d/vaultwarden.local
[vaultwarden]
enabled   = true
filter    = vaultwarden
logpath   = /var/lib/docker/volumes/vaultwarden_vw-data/_data/vaultwarden.log
banaction = iptables-allports
chain     = DOCKER-USER
maxretry  = 5
findtime  = 600
bantime   = 3600

Muat ulang dengan sudo systemctl restart fail2ban dan konfirmasikan dengan sudo fail2ban-client status vaultwarden.

Tiga detail Docker menentukan apakah perlindungan ini benar-benar berfungsi. Pertama, jika log menampilkan IP: 127.0.0.1 atau alamat proxy Anda pada setiap percobaan yang gagal, Vaultwarden akan memblokir proxy tersebut. Atur IP_HEADER ke header yang benar-benar dikirim oleh proxy Anda: X-Forwarded-For untuk Traefik, X-Real-IP untuk blok nginx di atas, atau CF-Connecting-IP jika berada di belakang Cloudflare. Kedua, chain iptables yang tepat bergantung pada proxy Anda. Jika Traefik berjalan sebagai container dengan port yang dipublikasikan, trafik melewati jalur Docker FORWARD. Karena itu, pemblokiran harus ditempatkan pada DOCKER-USER seperti di atas. Namun, jika Anda memilih opsi host-nginx dari Langkah 1, koneksi berakhir pada nginx di host, pada chain INPUT. Pemblokiran DOCKER-USER tidak akan pernah melihat koneksi tersebut. Dalam kasus itu, hapus baris chain = DOCKER-USER agar Fail2ban menggunakan chain default INPUT. Ketiga, gunakan banaction = iptables-allports, bukan konfigurasi default berbasis port. Jail ini tidak menetapkan port, dan pemblokiran untuk semua port pada DOCKER-USER akan memblokir pelaku secara menyeluruh dari setiap service yang dipublikasikan pada host tersebut.

Langkah 8, cadangkan vault, lalu pulihkan secara nyata

Volume vw-data adalah password manager Anda. Volume ini menyimpan db.sqlite3 (setiap entri), direktori attachments/ dan sends/, file rsa_key.* yang menandatangani sesi login, serta config.json dari panel admin. Cadangan yang tidak menyertakan salah satunya akan gagal saat diperlukan.

Menyalin db.sqlite3 ketika Vaultwarden sedang menulis dapat menghasilkan file yang belum selesai ditulis dan rusak. Karena itu, buat snapshot saat layanan berhenti. Downtime hanya beberapa detik:

#!/usr/bin/env bash
set -euo pipefail
STAMP=$(date +%F)
DEST=/root/vw-backups
VOL=$(docker volume inspect vaultwarden_vw-data --format '{{ .Mountpoint }}')
mkdir -p "$DEST"
docker compose -f /opt/vaultwarden/docker-compose.yml stop vaultwarden
tar czf "$DEST/vw-$STAMP.tgz" -C "$VOL" .
docker compose -f /opt/vaultwarden/docker-compose.yml start vaultwarden

Jalankan perintah tersebut dari cron setiap malam dan salin .tgz ke luar server. Cadangan yang hanya berada di server yang sedang Anda lindungi bukanlah cadangan. Cara yang tepat untuk mengirimkannya adalah cadangan restic setiap malam ke server lain atau penyimpanan objek. Cara ini mengenkripsi arsip dan melakukan deduplikasi snapshot berulang secara otomatis. Tombol Backup Database pada panel admin berguna untuk membuat snapshot langsung yang hanya berisi file SQLite, tetapi tidak menyertakan lampiran dan kunci.

Sekarang lakukan langkah yang membedakan cadangan nyata dari sekadar harapan: pulihkan cadangan tersebut sekali dan buktikan bahwa cadangan itu berfungsi:

mkdir -p /tmp/vw-restore
tar xzf /root/vw-backups/vw-2026-07-15.tgz -C /tmp/vw-restore
docker run --rm -p 127.0.0.1:8888:80 -v /tmp/vw-restore:/data vaultwarden/server

Dari laptop, buat tunnel ke server dengan ssh -L 8888:127.0.0.1:8888 you@your-vps lalu buka http://localhost:8888. Karena localhost merupakan konteks aman, crypto.subtle tersedia dan vault dapat didekripsi melalui http biasa di sini. Ini adalah satu-satunya tempat yang diizinkan. Login dengan master password Anda dan pastikan entri Anda tersedia. Jika tersedia, database, kunci RSA, dan master password Anda berhasil dipulihkan sepenuhnya. Anda dapat membangun ulangnya pada VPS baru dalam hitungan menit. Hentikan container dengan Ctrl-C lalu hapus /tmp/vw-restore. Terapkan kebiasaan membuat tunnel ini untuk UI admin lain di server yang tidak boleh diakses langsung dari Internet. Dengan cara yang sama, Anda dapat mengakses pemindai keamanan open-kritt yang di-host sendiri pada port 5173.

Mode kegagalan dan string yang akan Anda lihat

Cannot read properties of undefined (reading 'importKey') di konsol browser. Vault dimuat melalui http, sehingga crypto.subtle tidak terdefinisi. Akses hanya melalui https:// dan tambahkan pengalihan HTTP-ke-HTTPS pada proxy.

This is not a recognized Bitwarden server... di client. Server URL menggunakan http, salah ketik, atau sertifikatnya tidak tepercaya. Pastikan https://vault.example.com menampilkan ikon gembok yang valid, lalu masukkan kembali URL tersebut di pengaturan self-hosted client.

/admin menolak password yang benar. Hash Argon2 kehilangan escape character-nya. Setiap $ harus menjadi $$ di Compose, atau Anda memasukkan hash, bukan plaintext yang direpresentasikannya.

Sinkronisasi lintas perangkat lambat; konsol menampilkan WebSocket connection to 'wss://vault.example.com/notifications/hub' failed. Proxy tidak meneruskan header Upgrade/Connection. Traefik melakukannya secara otomatis, sedangkan nginx memerlukan dua baris upgrade dari Step 1. Vault tetap berfungsi, tetapi sinkronisasi hanya dilakukan saat dibuka. Port khusus lama 3012 sudah dihapus sejak v1.31.0, sehingga tidak diperlukan route WebSocket terpisah.

Fail2ban melaporkan ban, tetapi penyerang tetap dapat terhubung. Fail2ban melakukan ban terhadap 127.0.0.1 karena IP_HEADER salah, atau ban diterapkan pada chain iptables yang salah. Atur chain = DOCKER-USER dan banaction = iptables-allports.

Pembaruan

Tarik image baru lalu buat ulang container; named volume dan seluruh data Anda tetap ada:

docker compose pull
docker compose up -d

Vaultwarden merilis pembaruan secara berkala. Pantau catatan rilis proyek, bukan menetapkan versi patch tertentu, karena beberapa rilis menyertakan catatan migrasi. Buat backup terbaru sebelum melakukan pembaruan besar; Anda dapat melakukan rollback dengan memulihkan tarball ke volume baru.

FAQ

Apakah Vaultwarden sama dengan Bitwarden?

Vaultwarden adalah server independen yang kompatibel, bukan server resmi. Vaultwarden mengimplementasikan ulang API server Bitwarden dalam Rust, sehingga semua client resmi untuk desktop, mobile, browser, dan CLI dapat digunakan, dengan kebutuhan resource yang jauh lebih kecil daripada stack resmi. Format vault-nya sama, sehingga Anda dapat melakukan migrasi ke kedua arah dengan mengekspor dan mengimpor.

Apakah HTTPS benar-benar diperlukan, atau dapat dijalankan melalui http di LAN?

Anda memerlukan HTTPS untuk apa pun selain pengujian localhost. Web vault dan ekstensi Bitwarden menggunakan Web Crypto API milik browser, yang hanya tersedia dalam secure context. Karena itu, client akan menampilkan Cannot read properties of undefined melalui http biasa dan tidak pernah berhasil login. Satu-satunya alamat http yang berfungsi adalah http://localhost. Itu sebabnya pengujian restore pada Langkah 8 menggunakan SSH tunnel.

Bagaimana cara mencegah orang asing mendaftar di server saya?

Tetapkan SIGNUPS_ALLOWED: "false" dalam file Compose, lalu jalankan docker compose up -d segera setelah membuat akun Anda sendiri. Setelah itu, tambahkan pengguna baru melalui tombol Undang Pengguna di /admin. SMTP harus dikonfigurasi agar mereka menerima tautan undangan. Periksa daftar pengguna admin secara berkala untuk memastikan tidak ada akun yang tidak diharapkan.

Bagaimana cara mencadangkan vault Vaultwarden?

Hentikan container sebentar, lalu arsipkan seluruh volume vw-data, db.sqlite3, attachments/, sends/, config.json, dan file rsa_key.*. Setelah itu, salin arsip tersebut keluar dari server, idealnya melalui cron setiap malam. Menyalin file SQLite yang sedang digunakan saat server berjalan berisiko menghasilkan snapshot yang rusak, jadi lakukan pencadangan saat server berhenti. Yang paling penting, lakukan restore sekali ke container sementara dan login untuk memastikan backup tersebut benar-benar dapat digunakan sebelum Anda bergantung padanya.

Apakah self-hosting password benar-benar aman?

Ya, jika Anda melakukan tiga hal yang dibahas dalam panduan ini: menggunakan HTTPS yang benar, menutup pendaftaran serta menggunakan token admin yang kuat, dan menguji backup. Vault Anda dienkripsi di sisi client menggunakan master password. Karena itu, server pun tidak pernah melihat password dalam bentuk plaintext, dan db.sqlite3 yang dicuri tidak berguna tanpa password tersebut. Konsekuensinya, patching dan backup kini menjadi tanggung jawab Anda. Itu sebabnya Fail2ban dan prosedur restore bukan pilihan tambahan dalam panduan ini. Setelah semuanya tersedia, pembahasan lebih lanjut tentang titik serangan vault yang di-host sendiri merupakan langkah berikutnya yang berguna. Karena entri di dalamnya telah dienkripsi pada client, hal yang masih harus dilindungi adalah token admin dan arsip backup.