SSD Nodes Learn Hosting plans →
Rehberler Matt ConnorYazan Matt Connor

VPS üzerinde Vaultwarden ile parola yönetimi kurulumu

Docker ve Vaultwarden kullanarak kendi parola yöneticinizi kurun. HTTPS yapılandırması, admin token kullanımı, Fail2ban ve veri yedekleme adımlarıyla güvenli kurulumu öğrenin.

Ne inşa ediyorsunuz

Tamamen size ait bir parola yöneticisi: HTTPS sonlandırması yapan bir reverse proxy arkasında, tek bir küçük container içinde çalışan Vaultwarden; telefonunuzda, dizüstü bilgisayarınızda ve tarayıcınızda bu sunucuya işaret eden resmi Bitwarden uygulamaları. Vaultwarden, Bitwarden sunucu API'sini Rust ile yeniden uygular ve bitwarden.com ile aynı protokolü kullanır. Bu sayede, sunucuyu güncel tuttuğunuz sürece resmi istemciler üzerinde hiçbir değişiklik yapmadan çalışır (yeni istemci sürümleri bazen uyumlu bir Vaultwarden sürümü gerektirir: 2026.8.0 ve daha yeni istemciler için 1.37.2 sürümü zorunludur). Ancak bu yapı, resmi çoklu container yığını yerine yaklaşık 100 MB RAM ile çalışır.

Kurulumun kendisi on iki satırlık bir Compose dosyasından ibarettir. Gerçekten önemli olan ve hata çıkaran üç nokta şunlardır: Web vault'u yüklemeden önce TLS yapılandırılmış olmalıdır, kendi hesabınızı oluşturduğunuz anda genel kayıtlar kapatılmalıdır ve veri dizini yedeklenip geri yükleme testi yapılmalıdır; çünkü bu dizin sahip olduğunuz tüm parolaları barındırır.

Prerequisites and the honest gotchas

  • A VPS with Docker Engine and the Compose plugin, on a fresh Ubuntu 24.04 KVM box with root or sudo. 512 MB of RAM is genuinely enough; 1 GB is comfortable. This is one of the lightest things you can run, it sits near the top of the shortlist of services worth self-hosting. Size the box for whatever else shares it, though: putting a self-hosted photo library like PhotoPrism or Immich on the same VPS pushes your RAM floor into the gigabytes, while Vaultwarden barely moves it. The same arithmetic applies to media front ends you bolt on later, since dressing a Jellyfin library up as a walkable 90s rental store means another always-on container plus transcoding headroom on the same budget.
  • A domain with an A record (and AAAA if you have IPv6) pointing vault.example.com at the VPS. The TLS certificate is issued for this exact name, so DNS must resolve before you start.
  • Ports 80 and 443 open to the internet, terminated by your reverse proxy, never by Vaultwarden directly. Port 80 is used only for the ACME certificate challenge and an HTTP-to-HTTPS redirect.
  • The biggest gotcha up front: the Bitwarden clients refuse to talk to a server that is not HTTPS. There is no "test it over http first", that path does not work, for a concrete reason covered next.

Neden resmi Bitwarden yığını yerine Vaultwarden

Aynı istemciler, çok daha düşük kaynak kullanımı. Standart resmi self-hosted Bitwarden dağıtımı bir dizi container (MSSQL Express, Identity, Api, Admin ve daha fazlası) olarak sunulur ve en az 2 GB RAM gerektirir. Bitwarden ayrıca en az 200 MB RAM gerektiren, tek bir Docker imajından oluşan Bitwarden lite sürümünü de sunar; ancak bu sürüm kurumsal kullanım için değil, kişisel kullanım ve ev laboratuvarları için tasarlanmıştır ve veritabanı ile yedekleme sorumluluğunu tamamen size bırakır. Vaultwarden ise varsayılan olarak her şeyi bir SQLite veritabanında saklayan ve boşta sadece birkaç on megabayt bellek tüketen tek bir binary dosyasıdır. Tek bir kişi, bir aile veya küçük bir ekip için en mantıklı seçenek budur. Bitwarden API'sini eksiksiz uyguladığı için verileriniz hem Vaultwarden hem de bitwarden.com arasında taşınabilir durumdadır.

Vazgeçtiğiniz özellikler kurumsal yeteneklerin çoğunu kapsar: SCIM provizyonu yoktur (her ne kadar 1.35.0 sürümüyle OpenID Connect SSO desteği gelmiş olsa da) ve operatör siz olduğunuz için yamalama, HTTPS ve yedekleme işlemleri sizin sorumluluğunuzdadır. Bu rehber, bu üç görevi ele almaktadır.

HTTPS neden isteğe bağlı değildir

Bitwarden web kasası ve tarayıcı eklentileri, şifreleme anahtarlarınızı tarayıcı içerisinde Web Crypto API (window.crypto.subtle) kullanarak türetir. Tarayıcılar crypto.subtle özelliğini yalnızca güvenli bağlamlarda, yani HTTPS üzerinden veya http://localhost ve http://127.0.0.1 gibi özel loopback adreslerinde kullanıma sunar. Düz http://vault.example.com bağlantısı üzerinden bu özellik undefined durumundadır; bu nedenle uygulama bir anahtar türettiği anda hata verir ve konsolda şu mesaj görünür:

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

Sayfa yanıt vermez veya genel bir kripto hatası gösterir, giriş yapılamaz. Masaüstü, mobil ve tarayıcı istemcileri, self-hosted URL adresine karşı kendi kontrollerini çalıştırır; http (veya erişilemeyen) bir uç noktaya karşı şu hata ile reddederler:

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

Her ikisinin de nedeni aynıdır: geçerli bir HTTPS bağlantısının olmaması. Bu nedenle önce TLS kurulumunu yaparız ve kasayı, hızlıca göz atmak için bile olsa, asla http üzerinden açmayız.

Adım 1, DNS ve reverse proxy (önce TLS)

Kayıtları VPS adresinize yönlendirin ve doğru IP adresine çözümlendiğini doğrulayın:

dig +short vault.example.com

Çıktıdaki satır VPS IP adresiniz olmalıdır. Eğer boşsa veya yanlışsa, DNS ayarlarını düzeltin ve TTL süresinin dolmasını bekleyin; çözümleme yapılamayan bir alan adı için sertifika oluşturma işlemi başarısız olur.

HTTPS ön ucu için bu rehber, Let's Encrypt sertifikalarını otomatik olarak oluşturan ve yenileyen, ayrıca Compose ile doğrudan entegre olan Traefik kullanmaktadır. Eğer halihazırda kullanmıyorsanız, önce Traefik reverse proxy ve otomatik TLS kurulumu adımlarını takip edin; bu kurulum, Vaultwarden servisinin bağlanacağı harici bir Docker ağı (proxy aşağıda) ve bir ACME çözümleyici (letsencrypt) oluşturur. Manuel olarak oluşturulmuş sertifikaya sahip standart bir nginx, Vaultwarden tarafında aynı şekilde çalışır.

Traefik yerine nginx ve Certbot mu tercih ediyorsunuz? Vaultwarden'ı 127.0.0.1:8080 üzerine yerleştirin (servise ports: ["127.0.0.1:8080:80"] ekleyin ve Traefik etiketlerini kaldırın), ardından bir sertifika oluşturun ve proxy yönlendirmesini yapın. Sertifika kısmı Certbot ve nginx ile Let's Encrypt sertifikası oluşturma rehberinde ele alınmıştır. Kritik ek nokta, bildirim yolu üzerindeki WebSocket yükseltmesidir:

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";
    }
}

X-Real-IP satırına dikkat edin; Fail2ban'in daha sonra 127.0.0.1 yerine gerçek saldırganı görmesini sağlayan budur. Bu rehberdeki diğer tüm işlemler, ön tarafta Traefik veya nginx bulunmasından bağımsız olarak aynıdır.

Adım 2, Compose dosyası

Önce proje dizinini oluşturun. Bu kılavuz, Compose proje adını ve dolayısıyla veri birimini vaultwarden_vw-data olarak tahmin edilebilir kılan /opt/vaultwarden kullanır; aşağıdaki Fail2ban ve yedekleme adımları bu tam isme bağlıdır.

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

Bu dizinde yönetici parolası ve Compose dosyası için bir .env oluşturun.

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

Bu belirteci openssl rand -base64 48 ile oluşturun ve içine yapıştırın. (Daha güçlü bir özetlenmiş biçim bir sonraki adımda ele alınacaktır; başlangıç için uzun ve rastgele bir dizi yeterlidir.)

# 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

Bu dosya ile ilgili iki husus tüm tasarımı belirler. Herhangi bir ports: eşlemesi yoktur, bu nedenle Vaultwarden'a yalnızca Traefik ve onun TLS'i üzerinden erişilebilir; portu ana makinede yayınlamak, insanların kasayı yanlışlıkla http üzerinden sunmasına neden olur. Ayrıca DOMAIN tam genel HTTPS URL'si olmalıdır: bu değer ek bağlantılarına, WebAuthn 2FA'ya ve bildirim uç noktasına işlenir; bu nedenle yanlış veya http bir değer, site yüklense bile bu işlevleri bozar. latest etiketi, genellikle uygulanan asla-latest kuralının bilinçli bir istisnasıdır; Vaultwarden kararlı sürümlerini tek bir rolling imaj olarak sunar, :testing ise ayrı bir ön sürüm kanalıdır, bu nedenle güncellemeleri bilinçli yapın ve çekmeden önce sürüm notlarına göz atın. Ancak bu istisna sınırlıdır: uzun ömürlü container'ların çoğu, aynı VPS üzerinde kendi kendine barındırılan her zaman açık bir aracı yeniden başlatmalar ve güncellemeler arasında tahmin edilebilir kılan belirli bir etikete sabitlenmelidir.

Servisi ayağa kaldırın ve günlük kayıtlarını izleyin:

docker compose up -d
docker compose logs -f vaultwarden

Doğru bir başlatma işlemi Rocket has launched from http://0.0.0.0:80 gibi bir satırla biter. Traefik'in sertifikayı alması için birkaç saniye bekleyin, ardından https://vault.example.com adresini yükleyin; geçerli bir kilit simgesiyle ve sertifika uyarısı olmadan Bitwarden web kasasını görmelisiniz.

Adım 3, güçlü bir ADMIN_TOKEN ve $$ tuzağı

ADMIN_TOKEN, örneğinizdeki her kullanıcıyı ve ayarı okuyabilen panel olan /admin'yı korur; bu nedenle ona bir root parolası gibi davranın. İki yöntem kullanılabilir.

Basit yöntem, openssl rand -base64 48 ile zaten oluşturduğunuz rastgele dizgidir. base64 hiçbir zaman $ içermediğinden, herhangi bir kaçış karakterine gerek kalmadan doğrudan .env içine yerleştirilebilir.

Güçlendirilmiş yöntem bir Argon2 PHC özetidir (hash), bu sayede düz metin halindeki token hiçbir zaman diskte saklanmaz. Aynı imajı kullanarak bir tane oluşturun:

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

Sistem sizden iki kez giriş yapmanızı ister ve $argon2id$v=19$... ile başlayan bir dizgi yazdırır. İşte insanların bir saatini kaybetmesine neden olan tuzak: Docker Compose, $ ifadesini değişken yerleştirme (interpolation) olarak değerlendirir. Bu nedenle, özeti doğrudan Compose dosyasındaki environment: altına yapıştırırsanız, her $ işaretini $$ olacak şekilde ikiye katlamanız gerekir. Değeri tırnak içine almakta bir sakınca yoktur; önemli olan kaçış karakteridir:

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

Eğer özeti .env içinde tutmayı tercih ederseniz, kural değişir: tek $ işaretlerini olduğu gibi bırakın, değerin tamamını tek tırnak (ADMIN_TOKEN='$argon2id$v=19$...') içine alın; Compose dosyasındaki mevcut ${ADMIN_TOKEN} satırı bunu alacaktır. .env içindeki $ işaretini asla ikiye katlamayın. Compose dosyasının kendisinde tek $ işaretleri bırakırsanız, Compose The "argon2id" variable is not set uyarısını verir ve token değerini boşaltır; ardından /admin doğru parolanızı reddeder. docker compose up -d komutunu çalıştırın ve istemde yazdığınız düz metin parolasını kendi parola yöneticinizde saklayın.

Adım 4, hesabınızı kaydedin ve kapıyı kilitleyin

SIGNUPS_ALLOWED: "true" ile https://vault.example.com dosyasını açın, Create account seçeneğine tıklayın ve e-posta adresiniz ile güçlü bir ana parola kullanarak kaydınızı oluşturun. Bu ana parola kurtarılamaz; parola sıfırlama özelliği yoktur, bu nedenle parolayı öncelikle kalıcı bir yerde saklayın.

Şimdi kapıyı kilitleyin. Kayıtları kapatmak için Compose dosyasını düzenleyin:

      SIGNUPS_ALLOWED: "false"

docker compose up -d ile yapılandırmayı yeniden uygulayın. Bu, ertelenebilecek bir güvenlik önlemi değildir. Kayıtlar açık bırakılırsa, URL'nizi bulan herkes (botlar dahil) sunucunuzda hesap oluşturabilir. Sizin kasanızı okuyamazlar ancak kaynaklarınızı tüketerek özel örneğinizi herkese açık bir servise dönüştürürler. Kayıtları açık bıraktığınızın göstergesi şudur: /admin, sizin oluşturmadığınız hesapları listeler.

Daha sonra aile üyelerini veya ekip arkadaşlarınızı, genel kayıtları yeniden açmadan eklemek için /admin içindeki Invite User butonunu kullanın; bu yolun çalışması için SMTP yapılandırması gereklidir, böylece davet edilen kişi bağlantısını alabilir.

Adım 5, /admin dizinine erişim

https://vault.example.com/admin adresine gidin ve düz metin halindeki admin token değerini (hash halini değil, rastgele oluşturulan dizgiyi veya belirlediğiniz parolayı) girin. Bu panel üzerinden kullanıcıları listeleyebilir, ayarları yapılandırabilir, test e-postası gönderebilir ve veritabanı yedeği alabilirsiniz.

Eğer sayfa bunun yerine The admin panel is disabled, please configure the 'ADMIN_TOKEN' variable to enable it hatası veriyorsa, ADMIN_TOKEN değişkeni boş veya ayarlanmamış demektir; bu durum paneli tamamen devre dışı bırakır ve panele ihtiyaç duymadığınız durumlarda geçerli bir tercihtir. Sayfa yükleniyor ancak token değerini reddediyorsa, aşağıdaki hata listesinde yer alan $$ karakter kaçırma tuzağını inceleyin. Token değerini mi unuttunuz? Bir kurtarma istemi bulunmamaktadır; .env dosyasını veya Compose dosyasını düzenleyerek yeni bir değer atayın ve docker compose up -d işlemini gerçekleştirin.

Adım 6, Bitwarden istemcilerini bağlayın

Tüm resmi istemciler self-hosted bir sunucuya yönlendirilebilir; bu nedenle Bitwarden masaüstü, mobil veya tarayıcı istemcisini standart mağazalardan yükleyin. Özel bir Vaultwarden sürümüne ihtiyacınız yoktur.

Giriş yapmadan önce giriş ekranındaki ayarlar çarkını açın (Self-hosted veya Region → Self-hosted olarak etiketlenmiştir), Server URL kısmını https://vault.example.com olarak ayarlayın ve kaydedin. Ardından kaydettiğiniz e-posta ve ana parolanızla giriş yapın; istemci hemen bağlanmalı ve kimlik bilgilerini doldurup kaydetmeyi teklif etmelidir.

Eğer bir istemci This is not a recognized Bitwarden server. You may need to check with your provider or update your server. hatası veriyorsa, URL hatalıdır, http kullanıyordur veya sertifika güvenilir değildir. Öncelikle https://vault.example.com adresinin bir tarayıcıda sorunsuz yüklendiğini tekrar kontrol edin. Diğer cihazlardaki yavaş güncellemeler WebSocket push ile ilgilidir ve aşağıda ele alınmıştır.

Adım 7, giriş uç noktası için bir Fail2ban jail yapılandırması

Vaultwarden, her başarısız giriş denemesini LOG_FILE ile belirlenen dosyaya kaydeder; bu, kaba kuvvet (brute-force) saldırılarına karşı koruma için tam olarak ihtiyaç duyulan şeydir. Eğer halihazırda Fail2ban çalıştırmıyorsanız, kurulum ve temel bilgiler Fail2ban SSH sıkılaştırma rehberi içerisinde mevcuttur; burada vault için bir jail ekleyeceğiz.

Öncelikle Fail2ban'in log dosyasını okuyabilmesi için adlandırılmış birimin (named volume) ana makinede nerede bulunduğunu bulun:

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

Bu komut /var/lib/docker/volumes/vaultwarden_vw-data/_data gibi bir çıktı verir; log dosyası bunun içinde vaultwarden.log konumundadır. Filtreyi oluşturun:

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

Ve jail yapılandırmasını oluşturun:

# /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

sudo systemctl restart fail2ban ile yeniden yükleyin ve sudo fail2ban-client status vaultwarden ile doğrulayın.

Bu yapılandırmanın koruma sağlayıp sağlamayacağına üç Docker detayı karar verir. Birincisi, log dosyası her başarısız denemede IP: 127.0.0.1 veya proxy adresinizi gösteriyorsa, Vaultwarden proxy'yi banlıyor demektir; IP_HEADER değerini proxy'nizin gerçekten gönderdiği başlığa ayarlayın (Traefik için X-Forwarded-For, yukarıdaki nginx bloğu için X-Real-IP, Cloudflare arkasındaysanız CF-Connecting-IP). 1.37.4 sürümünden itibaren, X-Forwarded-For ile Vaultwarden, IP_HEADER_TRUSTED_PROXIES içinde bulunmayan en sağdaki adresi alır (varsayılan local, aynı ana makinedeki veya Docker ağındaki bir proxy'yi kapsar); bu nedenle eğer proxy'nizin önünde bir CDN varsa, onun adreslerini de buraya listeleyin. İkincisi, doğru iptables zinciri proxy'nize bağlıdır: Traefik yayınlanmış portlara sahip bir container olarak çalışıyorsa, trafik Docker'ın FORWARD yolundan geçer, bu nedenle ban yukarıdaki gibi DOCKER-USER içinde olmalıdır; ancak Adım 1'deki host-nginx seçeneğini tercih ettiyseniz, bağlantılar ana makinenin INPUT zincirinde sonlanır ve bir DOCKER-USER banı bunları asla görmez, bu durumda chain = DOCKER-USER satırını silin, böylece Fail2ban varsayılan INPUT zincirini kullanır. Üçüncüsü, port tabanlı varsayılan yerine banaction = iptables-allports kullanın; bu jail herhangi bir port tanımlamaz ve DOCKER-USER içindeki tüm portları kapsayan bir ban, saldırganı sunucudaki tüm yayınlanmış servislerden temiz bir şekilde engeller.

Adım 8, kasayı yedekleyin ve ardından geri yükleyin

vw-data birimi, parola yöneticinizin ta kendisidir. Bu birim db.sqlite3 (tüm girdiler), attachments/ ve sends/ dizinlerini, oturumları imzalayan rsa_key.* dosyalarını ve yönetici panelinden alınan config.json verilerini barındırır. Bunlardan herhangi birini atlayan bir yedekleme, ihtiyaç duyduğunuz anda başarısız olur.

Vaultwarden veri yazarken db.sqlite3 dosyasını kopyalamak, yarım kalmış ve bozuk bir dosya oluşturmanıza neden olabilir; bu nedenle soğuk bir snapshot alın. Kesinti süresi sadece birkaç saniyedir:

#!/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

Bu işlemi cron ile her gece çalıştırın ve .tgz dosyasını sunucunun dışına kopyalayın. Yalnızca koruduğunuz sunucuda duran bir yedekleme, yedekleme sayılmaz. Bunu aktarmanın temiz yolu, arşivi şifreleyen ve yinelenen snapshot'ları sizin için tekilleştiren başka bir sunucuya veya nesne depolama alanına her gece restic yedeklemesi yapmaktır. Yönetici panelindeki Backup Database butonu, yalnızca SQLite dosyasının hızlı bir snapshot'ını almak için kullanışlıdır ancak ekleri ve anahtarları içermez.

Şimdi gerçek bir yedeklemeyi umut dolu bir yedeklemeden ayıran ritüeli gerçekleştirin; bir kez geri yükleyin ve çalıştığını kanıtlayın:

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

Dizüstü bilgisayarınızdan ssh -L 8888:127.0.0.1:8888 you@your-vps ile sunucuya tünel açın ve http://localhost:8888 (veya http://127.0.0.1:8888) adresini açın. Loopback adresleri güvenli bir bağlam olarak kabul edildiğinden, crypto.subtle kullanılabilir durumdadır ve kasa burada düz http üzerinden şifresi çözülmüş şekilde görüntülenir; bu, söz konusu adresin buna izin verildiği tek durumdur. Ana parolanızla giriş yapın ve girdilerinizin mevcut olduğunu doğrulayın: Eğer girdileriniz oradaysa, veritabanınız, RSA anahtarlarınız ve ana parolanız başarıyla yedeklenmiş demektir; böylece yeni bir VPS üzerinde dakikalar içinde sistemi yeniden kurabilirsiniz. Container'ı Ctrl-C ile durdurun ve /tmp/vw-restore dosyasını silin. İnternete asla açık olmaması gereken sunucudaki diğer tüm yönetici arayüzleri için bu tünel alışkanlığını sürdürün; 5173 numaralı porttaki kendi kendine barındırılan open-kritt güvenlik tarayıcısına da bu şekilde erişebilirsiniz.

Hata modları ve karşılaşacağınız dizgeler

Tarayıcı konsolunda Cannot read properties of undefined (reading 'importKey'). Kasa http üzerinden yüklendi, bu nedenle crypto.subtle tanımlı değil; buraya yalnızca https:// üzerinden erişin ve proxy üzerinde HTTP'den HTTPS'e yönlendirmeyi ekleyin.

İstemcide This is not a recognized Bitwarden server.... Sunucu URL'si http, hatalı yazılmış veya sertifika güvenilir değil; https://vault.example.com kısmında geçerli bir kilit simgesi göründüğünü doğrulayın, ardından istemcinin self-hosted ayarlarında URL'yi tekrar girin.

/admin doğru parolayı reddediyor. Argon2 hash değeri kaçış karakterlerini kaybetti, Compose dosyasındaki her $ ifadesi $$ olmalıdır (ancak .env içindeki tek tırnakların arasında tek $ kullanılmalıdır) veya temsil ettiği düz metin yerine hash değerinin kendisini girdiniz.

Cihazlar arası yavaş eşitleme; konsolda WebSocket connection to 'wss://vault.example.com/notifications/hub' failed görünüyor. Proxy, Upgrade/Connection başlıklarını iletmiyor; Traefik bunu otomatik yapar, nginx için 1. Adımdaki iki upgrade satırı gereklidir. Kasa çalışmaya devam eder, sadece açılışta eşitleme yapar. Özel 3012 numaralı port v1.31.0 sürümünden beri kaldırılmıştır, bu nedenle ayrı bir WebSocket rotasına gerek yoktur.

Fail2ban bir yasaklama bildiriyor ancak saldırgan bağlanmaya devam ediyor. IP_HEADER yanlış olduğu için 127.0.0.1 adresini yasaklıyor veya yasaklama yanlış iptables zincirinde duruyor; chain = DOCKER-USER ve banaction = iptables-allports ayarlarını yapılandırın.

Yükseltmeler

Yeni imajı çekin ve yeniden oluşturun; adlandırılmış birim (named volume) ve tüm verileriniz kalıcıdır:

docker compose pull
docker compose up -d

Vaultwarden sık sık yeni sürümler yayınlar. Bazı sürümler geçiş notları içerdiğinden, belirli bir yama sürümüne sabitlenmek yerine projenin sürüm notlarını takip edin. Herhangi bir büyük sürüm yükseltmesinden önce güncel bir yedek alın; tarball dosyasını yeni bir birime geri yükleyerek eski sürüme dönebilirsiniz.

FAQ

Vaultwarden ile Bitwarden aynı şey mi?

Vaultwarden, resmi sunucu değil, onunla uyumlu bağımsız bir sunucudur. Vaultwarden, Bitwarden sunucu API'sini Rust diliyle yeniden yazmıştır; bu sayede resmi masaüstü, mobil, tarayıcı ve CLI istemcileri, resmi yığının tükettiği kaynakların çok daha azıyla çalışabilir. Kasa formatı aynı olduğundan, dışa ve içe aktarma yöntemleriyle iki yönlü geçiş yapabilirsiniz.

HTTPS gerçekten gerekli mi, yoksa yerel ağımda (LAN) http üzerinden çalıştırabilir miyim?

Loopback testi haricindeki her durum için HTTPS gereklidir. Bitwarden web kasası ve eklentileri, yalnızca güvenli bağlamlarda kullanılabilen tarayıcı tabanlı Web Crypto API'sini kullanır; bu nedenle düz http üzerinden istemci Cannot read properties of undefined hatası verir ve giriş yapamaz. Çalışan tek http adresleri http://localhost veya http://127.0.0.1 gibi loopback adresleridir; 8. Adım'daki geri yükleme testinin bir SSH tüneli kullanmasının nedeni budur.

Sunucuma yabancıların kayıt olmasını nasıl engellerim?

Kendi hesabınızı oluşturduktan hemen sonra Compose dosyasında SIGNUPS_ALLOWED: "false" ayarını yapın ve docker compose up -d komutunu çalıştırın. Bundan sonra yeni kişileri, SMTP yapılandırması gerektiren ve davet bağlantısı gönderen /admin içindeki Kullanıcı Davet Et düğmesi aracılığıyla ekleyin. Beklenmedik hesapların oluşmadığından emin olmak için yönetici kullanıcı listesini düzenli olarak kontrol edin.

Vaultwarden kasamı nasıl yedeklerim?

Kapsayıcıyı kısa süreliğine durdurun ve tüm vw-data birimini, db.sqlite3, attachments/, sends/, config.json ve rsa_key.* dosyalarını arşivleyin, ardından arşivi sunucudan dışarı kopyalayın; bunu bir cron işiyle her gece yapmak idealdir. Sunucu çalışırken canlı SQLite dosyasını kopyalamak bozuk bir anlık görüntü alma riski taşır, bu yüzden yedeklemeyi soğuk (servis kapalıyken) alın. En önemlisi, yedeklemeye güvenmeden önce onu geçici bir kapsayıcıya geri yükleyip giriş yaparak yedeğin gerçekliğini doğrulayın.

Parolalarımı kendi sunucumda barındırmak gerçekten güvenli mi?

Bu rehberde ele alınan üç şeyi yaptığınızda evet: gerçek HTTPS, kapatılmış kayıtlar ile güçlü bir yönetici anahtarı ve test edilmiş yedekler. Kasanız istemci tarafında ana parolanızla şifrelendiğinden, sunucu bile parolalarınızı açık metin olarak görmez ve çalınan bir db.sqlite3 dosyası, ana parola olmadan girişlerinizi açığa çıkarmaz. Yine de sunucu, hesap e-postalarını ve her ana paroladan türetilen tuzlanmış bir hash değerini tutar; bir saldırgan bunları çevrimdışı kırmaya çalışabilir, bu yüzden veritabanı dosyasını ve tüm kopyalarını koruyun. Bunun karşılığında yama yönetimi ve yedekleme sorumluluğu size geçer; Fail2ban ve geri yükleme ritüelinin burada isteğe bağlı olmamasının nedeni budur. Bunlar yerine getirildiğinde, kendi kendine barındırılan bir kasanın saldırıya uğrayabileceği noktalar üzerine daha yakından bir bakış faydalı bir sonraki adımdır; çünkü girişlerin kendisi istemcide şifrelendiğinden, savunulması gereken tek şey yönetici anahtarı ve yedekleme arşividir.