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 akan Anda bangun
Pengelola kata sandi yang sepenuhnya Anda kendalikan: Vaultwarden yang berjalan dalam satu container kecil di belakang reverse proxy yang menangani terminasi HTTPS, dengan aplikasi resmi Bitwarden pada ponsel, laptop, dan browser Anda diarahkan ke server tersebut. Vaultwarden mengimplementasikan ulang API server Bitwarden dalam Rust dan menggunakan protokol yang sama seperti bitwarden.com. Karena itu, client resmi dapat menggunakannya tanpa perubahan selama server selalu diperbarui. Namun, rilis client baru terkadang memerlukan rilis Vaultwarden yang sesuai: 1.37.2 diperlukan untuk client 2026.8.0 dan yang lebih baru. Vaultwarden hanya memerlukan sekitar 100 MB RAM, bukan beberapa container seperti stack resmi.
Proses instalasinya sendiri hanya memerlukan belasan baris Compose. Ada tiga hal yang benar-benar penting dan dapat menyebabkan kegagalan. TLS harus tersedia sebelum Anda membuka web vault untuk pertama kalinya. Pendaftaran publik harus ditutup segera setelah akun Anda sendiri dibuat. Volume data harus dicadangkan dan diuji pemulihannya, karena satu direktori tersebut menyimpan semua kata sandi yang Anda miliki.
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.comke 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 kebutuhan resource jauh lebih rendah. Deployment Bitwarden resmi yang di-hosting sendiri didistribusikan sebagai bundle container, termasuk MSSQL Express, Identity, Api, Admin, dan komponen lainnya. Deployment ini membutuhkan RAM minimal 2 GB. Bitwarden juga menyediakan Bitwarden lite, yaitu satu image Docker yang membutuhkan RAM minimal 200 MB. Namun, Bitwarden lite ditujukan untuk penggunaan pribadi dan home lab, bukan untuk bisnis. Database dan pencadangannya juga sepenuhnya menjadi tanggung jawab Anda. Vaultwarden adalah satu binary yang secara default menyimpan seluruh data dalam database SQLite dan saat idle hanya menggunakan RAM beberapa puluh megabyte. Untuk satu orang, keluarga, atau tim kecil, Vaultwarden merupakan pilihan yang jelas. Karena mengimplementasikan Bitwarden API secara kompatibel, data Anda tetap portabel antara Vaultwarden dan bitwarden.com.
Konsekuensinya, sebagian besar fitur enterprise tidak tersedia. SCIM provisioning tidak didukung, meskipun dukungan OpenID Connect SSO tersedia sejak 1.35.0. Anda juga menjadi operatornya, sehingga patching, HTTPS, dan pencadangan menjadi tanggung jawab Anda. Panduan ini membahas ketiga tugas tersebut.
Mengapa HTTPS tidak dapat diabaikan
Web vault dan ekstensi browser Bitwarden menurunkan kunci enkripsi di browser menggunakan Web Crypto API (window.crypto.subtle). Browser hanya menyediakan crypto.subtle dalam secure context, HTTPS, atau kasus khusus alamat loopback seperti http://localhost dan http://127.0.0.1. Melalui http://vault.example.com biasa, tindakan tersebut undefined, sehingga saat aplikasi menurunkan kunci, aplikasi langsung menghasilkan error, dan konsol menampilkan:
Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'importKey')Halaman macet atau menampilkan error kriptografi umum, dan tidak ada pengguna yang dapat login. Klien desktop, seluler, dan browser melakukan pemeriksaan sendiri terhadap URL yang di-hosting sendiri. Jika endpoint menggunakan http atau tidak dapat dijangkau, klien menolaknya dengan:
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 sekali pun hanya 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.comBaris 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/vaultwardenBuat .env untuk secret admin dan file Compose di direktori tersebut.
# .env
ADMIN_TOKEN=paste-a-strong-token-hereBuat 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: trueAda 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 vaultwardenProses 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. Dua bentuk dapat digunakan.
Bentuk sederhana menggunakan string acak yang sudah Anda buat dengan openssl rand -base64 48. Karena base64 tidak pernah berisi $, string tersebut dapat langsung dimasukkan ke .env tanpa escaping.
Bentuk yang lebih aman adalah hash Argon2 PHC. Dengan demikian, token plaintext tidak pernah disimpan di disk. Buat hash menggunakan image yang sama:
docker run --rm -it vaultwarden/server /vaultwarden hash --preset owaspPerintah tersebut meminta input dua kali dan mencetak string yang diawali $argon2id$v=19$.... Berikut jebakan yang dapat menghabiskan waktu hingga satu jam: Docker Compose memperlakukan $ sebagai interpolasi variabel. Jadi, jika Anda menempelkan hash langsung di bawah environment: dalam file Compose, Anda harus menggandakan setiap $ menjadi $$. Nilai tersebut boleh diapit tanda kutip. Yang penting adalah escaping-nya:
environment:
ADMIN_TOKEN: $$argon2id$$v=19$$m=19456,t=2,p=1$$c29tZXNhbHQ$$RdescudvJCsgt3ub+b+dWRWJTmaaJObGJika Anda ingin menyimpan hash di .env, aturannya berbalik: biarkan tanda $ tetap satu, apit seluruh nilai dengan tanda kutip tunggal (ADMIN_TOKEN='$argon2id$v=19$...'), lalu baris ${ADMIN_TOKEN} yang sudah ada dalam file Compose akan mengambilnya. Jangan pernah menggandakan $ di dalam .env. Jika Anda membiarkan tanda $ tunggal di dalam file Compose, Compose akan memperingatkan The "argon2id" variable is not set dan mengosongkan token tersebut. 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 milik 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 dan masukkan token admin plaintext (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 The admin panel is disabled, please configure the 'ADMIN_TOKEN' variable to enable it, berarti ADMIN_TOKEN kosong atau tidak ditetapkan. Kondisi ini menonaktifkan panel sepenuhnya dan tetap merupakan pilihan yang valid jika Anda tidak pernah membutuhkannya. Jika panel terbuka 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 konfigurasi dasarnya tersedia di panduan pengerasan 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 menampilkan sesuatu seperti /var/lib/docker/volumes/vaultwarden_vw-data/_data. File 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 = 3600Muat ulang dengan sudo systemctl restart fail2ban dan konfirmasikan dengan sudo fail2ban-client status vaultwarden.
Tiga detail Docker menentukan apakah konfigurasi ini benar-benar memberikan perlindungan. Pertama, jika log menampilkan IP: 127.0.0.1 atau alamat proxy Anda pada setiap upaya yang gagal, Vaultwarden akan memblokir proxy. 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, dan CF-Connecting-IP jika berada di belakang Cloudflare. Sejak 1.37.4, dengan X-Forwarded-For, Vaultwarden menggunakan alamat paling kanan yang tidak terdapat dalam IP_HEADER_TRUSTED_PROXIES (default local, yang mencakup proxy pada host atau jaringan Docker yang sama). Jadi, jika ada CDN di depan proxy Anda, cantumkan juga alamat CDN tersebut di sana. Kedua, chain iptables yang benar bergantung pada proxy Anda. Jika Traefik berjalan sebagai container dengan port yang dipublikasikan, trafik melewati jalur FORWARD milik Docker. Karena itu, pemblokiran harus ditempatkan di DOCKER-USER seperti di atas. Namun, jika Anda memilih opsi host-nginx dari Langkah 1, koneksi berakhir di nginx pada host melalui chain INPUT, sehingga pemblokiran DOCKER-USER tidak akan melihatnya. Dalam kasus tersebut, hapus baris chain = DOCKER-USER agar Fail2ban menggunakan chain default INPUT. Ketiga, gunakan banaction = iptables-allports, bukan default berbasis port. Jail ini tidak mendefinisikan port, dan pemblokiran untuk semua port di DOCKER-USER akan memblokir pelaku 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 melewatkan salah satunya akan gagal saat dibutuhkan.
Menyalin db.sqlite3 saat Vaultwarden sedang menulis dapat menghasilkan file yang belum selesai ditulis dan rusak. Karena itu, buat snapshot saat layanan dihentikan sementara. 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 vaultwardenJalankan 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 object storage, yang mengenkripsi arsip dan melakukan deduplikasi pada snapshot berulang secara otomatis. Tombol Backup Database pada panel admin adalah cara praktis untuk membuat snapshot langsung yang hanya berisi file SQLite, tetapi tidak menyertakan lampiran dan key.
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/serverDari laptop, buat tunnel ke server dengan ssh -L 8888:127.0.0.1:8888 you@your-vps dan buka http://localhost:8888 (atau http://127.0.0.1:8888). Karena alamat loopback dianggap sebagai secure context, crypto.subtle tersedia dan vault dapat didekripsi melalui http biasa di sini. Ini adalah satu-satunya jenis alamat yang mengizinkannya. Login dengan master password Anda dan pastikan semua entri tersedia. Jika tersedia, berarti database, RSA key, dan master password Anda berhasil dipulihkan secara utuh. Anda dapat membangun ulang semuanya pada VPS baru dalam hitungan menit. Hentikan container dengan Ctrl-C, lalu hapus /tmp/vw-restore. Gunakan kebiasaan membuat tunnel ini untuk UI admin lain pada server yang seharusnya tidak pernah menghadap 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 pada pengaturan self-hosted di client.
/admin menolak kata sandi yang benar. Hash Argon2 kehilangan karakter escape-nya. Setiap $ harus menjadi $$ di file Compose, tetapi gunakan satu $ di dalam tanda kutip tunggal pada .env. Kemungkinan lain, 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 Langkah 1. Vault tetap berfungsi, tetapi sinkronisasi baru berjalan saat vault dibuka. Port khusus lama 3012 sudah dihapus sejak v1.31.0, sehingga rute WebSocket terpisah tidak diperlukan.
Fail2ban melaporkan pemblokiran, tetapi penyerang tetap dapat terhubung. Fail2ban memblokir 127.0.0.1 karena IP_HEADER salah, atau pemblokiran ditempatkan pada chain iptables yang salah. Tetapkan 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 -dVaultwarden 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 client desktop, mobile, browser, dan CLI resmi dapat digunakan dengannya, dengan penggunaan resource yang jauh lebih rendah daripada stack resmi. Format vault-nya sama, sehingga migrasi dapat dilakukan ke kedua arah dengan mengekspor dan mengimpor.
Apakah HTTPS benar-benar diperlukan, atau saya dapat menjalankannya melalui http di LAN?
Anda memerlukan HTTPS untuk penggunaan apa pun selain pengujian loopback. Web vault dan extension Bitwarden menggunakan Web Crypto API milik browser, yang hanya tersedia dalam secure context. Karena itu, client akan menampilkan Cannot read properties of undefined dan tidak pernah berhasil login jika menggunakan http biasa. Satu-satunya alamat http yang berfungsi adalah alamat loopback seperti http://localhost atau http://127.0.0.1. Karena itu, pengujian pemulihan pada Step 8 menggunakan SSH tunnel.
Bagaimana cara mencegah orang asing mendaftar di server saya?
Setel SIGNUPS_ALLOWED: "false" di 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 link undangan. Periksa daftar pengguna admin secara berkala untuk memastikan tidak ada akun tak terduga yang muncul.
Bagaimana cara mencadangkan vault Vaultwarden saya?
Hentikan container untuk sementara, lalu arsipkan seluruh volume vw-data, db.sqlite3, attachments/, sends/, config.json, dan file rsa_key.*. Setelah itu, salin arsip keluar dari server, idealnya melalui cron setiap malam. Menyalin file SQLite aktif saat server berjalan dapat menyebabkan snapshot rusak, jadi lakukan pencadangan saat server dihentikan. Yang paling penting, pulihkan arsip tersebut satu kali ke container sementara dan login, sehingga Anda mengetahui bahwa cadangan itu benar-benar dapat digunakan sebelum mengandalkannya.
Apakah self-hosting kata sandi 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 cadangan. Vault Anda dienkripsi di sisi client menggunakan master password, sehingga server pun tidak pernah melihat kata sandi Anda dalam bentuk plaintext. Bahkan db.sqlite3 yang dicuri tidak dapat mengungkap entri Anda tanpa master password tersebut. Namun, server tetap menyimpan email akun dan hash bersalt yang diturunkan dari setiap master password. Penyerang dapat mencoba memecahkannya secara offline, jadi lindungi file database dan setiap salinannya. Konsekuensinya, patching dan pencadangan menjadi tanggung jawab Anda. Karena itu, Fail2ban dan prosedur pemulihan bukan pilihan tambahan dalam panduan ini. Setelah semuanya diterapkan, pembahasan lebih lanjut tentang titik yang sebenarnya dapat diserang pada vault yang di-self-host merupakan langkah berikutnya yang bermanfaat. Karena entri di dalamnya dienkripsi pada client, hal yang tersisa untuk dilindungi adalah token admin dan arsip cadangan.