Parolalarınızı bir bulut parola yöneticisinde tutmak yerine kendi sunucunuzda saklamak istiyorsanız Vaultwarden en çok tercih edilen seçeneklerden biridir. Vaultwarden, Bitwarden istemcileriyle (tarayıcı eklentisi, masaüstü ve mobil uygulamalar, web kasası) uyumlu çalışan, Rust ile yazılmış, gayriresmî bir sunucu uygulamasıdır. Kasanız sizin VPS'inizde durur; yedeği, erişimi ve güncellemesi de sizin sorumluluğunuzdadır.

Bu rehberde Vaultwarden'ı resmî wiki'de anlatılan şekilde Docker Compose ile kuracak, yalnızca yerel adrese bağlayıp Nginx ve Let's Encrypt arkasına alacak, ilk hesabı açtıktan sonra yeni kayıtları kapatacak, admin panelini Argon2 ile hash'lenmiş bir token ile koruyacak, güncelleme ve yedekleme düzenini kuracağız. Parola kasası gibi hassas bir serviste her adımı atlamadan uygulamanızı öneririz.

Vaultwarden nedir, Bitwarden ile ilişkisi ne?

Vaultwarden nedir, Bitwarden ile ilişkisi ne? Bitwarden istemcileriyle uyumlu, gayriresmî sunucu, Lisans, Docker imajı, Konteyner içi port

Projenin GitHub sayfası Vaultwarden'ı "Rust ile yazılmış, gayriresmî, Bitwarden uyumlu sunucu" olarak tanımlar; projenin eski adı bitwarden_rs idi. Lisansı AGPL-3.0'dır. Sayfada açıkça şu not yer alır: proje Bitwarden veya Bitwarden, Inc. ile ilişkili değildir. Bu nedenle Vaultwarden ile ilgili bir sorunu Bitwarden'ın resmî destek kanallarına taşımamalısınız; proje kendi GitHub sayfası ve wiki'si üzerinden yürür.

Kimler için uygun? Kendi kasasını kendisi barındırmak isteyen bireyler, aileler ve küçük ekipler için. Buna karşılık sunucu bakımını, güncellemeleri ve yedekleri düzenli yapamayacaksanız, kendi barındırdığınız bir parola kasası tek arıza noktası haline gelebilir. Wiki belirli bir CPU veya RAM alt sınırı vermez.

ÖzellikDeğer
TürBitwarden istemcileriyle uyumlu, gayriresmî sunucu
LisansAGPL-3.0
Docker imajıvaultwarden/server (docker.io, ghcr.io ve quay.io'da yayınlanır)
Konteyner içi port80
Veri dizini/data (konteyner içinde)
Bitwarden, Inc. ile ilişkisiYok

Neden HTTPS zorunlu?

README'ye göre web kasası, Web Crypto API için HTTPS ve güvenli bir bağlam (secure context) gerektirir. Wiki'nin HTTPS sayfası da tarayıcıların bu API'leri çoğunlukla yalnızca HTTPS bağlamında sunduğunu ve HTTPS'in pratikte zorunlu olduğunu belirtir. Önerilen yöntem, Vaultwarden'ı HTTPS'i üstlenen bir ters proxy arkasına almak ve sertifikayı Let's Encrypt ile almaktır. Vaultwarden'ın kendi içindeki (Rocket) TLS desteği wiki'de önerilmez.

Hazırlık

  • Ubuntu 24.04 çalışan bir VPS ve sudo yetkili bir kullanıcı.
  • Docker Engine ve Compose eklentisi (resmî apt deposundan): Docker Compose başlangıç rehberi.
  • Vaultwarden için bir alt alan adı, örneğin vault.alanadiniz.com, ve sunucu IP'nize işaret eden A kaydı.
  • Nginx ve Certbot: Let's Encrypt SSL kurulumu.
  • UFW'de yalnızca 22, 80 ve 443 portlarının açık olması: UFW rehberi.

Adım 1: Admin token'ı hash'leyin

Admin paneli (/admin) ADMIN_TOKEN ile açılır ve bu değer panelin parolası gibidir. Wiki, yapılandırma çoğu zaman düz metin saklandığı için token'ın Argon2id ile hash'lenmesini önerir. Önce uzun, rastgele bir parola üretin, sonra Vaultwarden'ın yerleşik hash komutuyla PHC biçiminde bir hash oluşturun:

bash
openssl rand -base64 32
sudo docker run --rm -it vaultwarden/server /vaultwarden hash

Komut parolayı iki kez sorar ve $argon2id$v=19$... ile başlayan bir metin üretir. Varsayılan olarak Bitwarden ayarlarını (m=64 MiB, t=3, p=4) kullanır; --preset owasp ile OWASP alt sınırları seçilebilir. Panele girerken hash'i değil, ilk ürettiğiniz parolayı yazacaksınız; bu parolayı parola yöneticinizde saklayın.

Adım 2: Docker Compose ile kurulum

bash
sudo mkdir -p /opt/vaultwarden
cd /opt/vaultwarden
sudo nano .env

Wiki'ye göre hash'i compose dosyasının environment bölümüne doğrudan yazarsanız içindeki beş $ karakterini $$ olarak kaçırmanız gerekir. .env dosyasında ise kaçırma gerekmez; değeri tek tırnak içine yazmanız yeterlidir:

bash
ADMIN_TOKEN='BURAYA_vaultwarden_hash_CIKTISINI_YAPISTIRIN'
bash
sudo chmod 600 .env
sudo nano compose.yaml
yaml
services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      DOMAIN: "https://vault.alanadiniz.com"
      SIGNUPS_ALLOWED: "true"
      ADMIN_TOKEN: ${ADMIN_TOKEN}
    volumes:
      - ./vw-data/:/data/
    ports:
      - 127.0.0.1:8000:80

DOMAIN, wiki'ye göre ters proxy kullanırken gereklidir; Vaultwarden'ın ekler gibi özelliklerin doğru çalışması için HTTPS adresini bilmesi gerekir. SIGNUPS_ALLOWED şimdilik true; ilk hesabınızı açınca kapatacağız. latest etiketi belgelerdeki etikettir; isterseniz belirli bir sürüm etiketine sabitleyin. Çıktıyı kontrol edip başlatın:

bash
sudo docker compose config | grep ADMIN_TOKEN
sudo docker compose up -d
sudo docker compose logs -f

Adım 3: Nginx ters proxy ve Let's Encrypt

Aşağıdaki yapılandırma, wiki'deki Nginx örneğinden (BlackDex) uyarlanmıştır. 1.29.0 sürümünden beri WebSocket bildirimleri ana HTTP portunda çalışır; ters proxy'nin Upgrade ve Connection başlıklarını iletmesi gerekir. Önce 80 portu için bloğu yazıyoruz; SSL kısmını Certbot ekleyecek:

bash
sudo nano /etc/nginx/sites-available/vaultwarden
nginx
upstream vaultwarden-default {
  zone vaultwarden-default 64k;
  server 127.0.0.1:8000;
  keepalive 2;
}

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      "";
}

server {
    listen 80;
    listen [::]:80;
    server_name vault.alanadiniz.com;

    client_max_body_size 525M;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    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;

    location / {
      proxy_pass http://vaultwarden-default;
    }
}
bash
sudo ln -s /etc/nginx/sites-available/vaultwarden /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d vault.alanadiniz.com

Certbot 443 bloğunu ve HTTPS yönlendirmesini ekler. Wiki örneği http2 on; satırını da içerir; bu yönerge Nginx 1.25.1 ile geldiği için nginx -v ile sürümünüze bakın, daha eski bir sürümde bu satırı eklemeyin. Sunucuda başka bir sitede $connection_upgrade değişkeni zaten tanımlıysa map bloğunu ikinci kez eklemeyin. Wiki ayrıca, Cloudflare proxy kullanıyorsanız $remote_addr yerine gerçek ziyaretçi IP başlığını kullanmayı önerir; ayrıntı için Cloudflare gerçek ziyaretçi IP rehberi.

WebSocket'in çalıştığını wiki'deki gibi test edebilirsiniz: tarayıcının geliştirici araçlarında Ağ sekmesini WS ile filtreleyin, web kasasına yeniden giriş yapın ve /notifications/hub isteği için 101 yanıtı görün. Mobil uygulamalar WebSocket değil, kendi push bildirim altyapısını kullanır.

Adım 4: İlk hesap ve kayıtları kapatma

Adım 4: İlk hesap ve kayıtları kapatma: SIGNUPS_ALLOWED, SIGNUPS_DOMAINS_WHITELIST, SIGNUPS_VERIFY, DOMAIN

https://vault.alanadiniz.com adresinden hesabınızı oluşturun ve güçlü bir ana parola seçin. Ana parolanızı unutursanız kasanızı açmanın yolu yoktur; bunu bir kenara güvenli şekilde not etmeyi düşünün. Güçlü parola seçimi için güçlü şifre ve entropi rehberine bakabilirsiniz.

Wiki'ye göre varsayılan olarak örneğinize erişebilen herkes hesap açabilir. Hesabınızı açtıktan hemen sonra compose dosyasında SIGNUPS_ALLOWED: "false" yapın ve konteyneri yeniden oluşturun. Ortam değişkenleri konteynere bağlı olduğu için basit bir restart yetmez:

bash
cd /opt/vaultwarden
sudo nano compose.yaml   # SIGNUPS_ALLOWED: "false"
sudo docker compose up -d
DeğişkenNe yapar
SIGNUPS_ALLOWEDfalse olduğunda yeni kayıtları kapatır
SIGNUPS_DOMAINS_WHITELISTKaydı belirli e-posta alan adlarıyla sınırlar; ayarlanırsa SIGNUPS_ALLOWED yok sayılır
SIGNUPS_VERIFYtrue olduğunda yeni kullanıcıların giriş için e-postasını doğrulamasını ister
DOMAINÖrneğin herkese açık HTTPS adresi
ADMIN_TOKENAdmin panelinin hash'lenmiş parolası

Adım 5: Admin panelini güvenli kullanma

Adım 5: Admin panelini güvenli kullanma: Paneli kullanmadan önce HTTPS'i etkinleştirin; aksi halde ortadaki adam..., Panelde ilk kez Save dediğinizde veri dizininde config.json...

Admin paneli https://vault.alanadiniz.com/admin adresindedir. Wiki'nin uyarıları şunlardır:

  • Paneli kullanmadan önce HTTPS'i etkinleştirin; aksi halde ortadaki adam saldırısına açık kalırsınız.
  • Panelde ilk kez Save dediğinizde veri dizininde config.json oluşur ve buradaki değerler ortam değişkenlerini geçersiz kılar. Wiki, yapılandırma için ortam değişkenlerini önerir; config.json yolunu bilinçli seçmediyseniz panelde ayar kaydetmekten kaçının.
  • "You are using a plain text ADMIN_TOKEN which is insecure" uyarısı görürseniz token düz metin, biçimi bozuk ya da config.json içindeki bir değer ortam değişkenini eziyor olabilir. sudo docker exec vaultwarden printenv ADMIN_TOKEN ile kontrol edin.
  • Admin oturumları varsayılan olarak 20 dakika sürer (ADMIN_SESSION_LIFETIME).
  • Paneli tamamen kapatmak için ADMIN_TOKEN değişkenini ve config.json içindeki admin_token anahtarını kaldırıp konteyneri yeniden oluşturun.

Güncelleme

Wiki'deki Compose güncelleme komutları:

bash
cd /opt/vaultwarden
sudo docker compose pull
sudo docker compose up -d
sudo docker compose logs -f

Güncellemeden önce aşağıdaki yöntemle bir yedek alın ve sürüm notlarını GitHub'daki Releases sayfasından okuyun. Watchtower gibi otomatik güncelleme araçları wiki'de anılır; ancak parola kasasında değişiklikleri görmeden güncellemek yerine elle ve yedekli güncelleme daha kontrollüdür.

Yedekleme

Varsayılan SQLite kurulumunda tüm veriler vw-data klasöründedir. Wiki'nin yedekleme sayfasına göre:

Dosya / klasörWiki'deki durumu
db.sqlite3Yedek gerekli
attachmentsYedek gerekli
config.jsonYedek önerilir
rsa_key*Yedek önerilir
sendsİsteğe bağlı
icon_cacheİsteğe bağlı

Çalışan bir SQLite veritabanını doğrudan kopyalamak yerine sqlite3 aracının .backup komutunu kullanın. Docker imajında sqlite3 ve cron bulunmadığı için bu işi ana makinede yaparsınız. Cron içinde % karakteri özel anlam taşıdığından komutları bir betiğe koymak en temiz yoldur:

bash
sudo apt install sqlite3
sudo mkdir -p /root/vw-yedek
sudo nano /usr/local/bin/vw-yedek.sh
bash
#!/bin/bash
set -e
T=$(date '+%Y%m%d-%H%M')
cd /opt/vaultwarden
sqlite3 vw-data/db.sqlite3 ".backup '/root/vw-yedek/db-$T.sqlite3'"
tar czf /root/vw-yedek/dosyalar-$T.tar.gz -C vw-data attachments sends config.json rsa_key.pem 2>/dev/null || true
find /root/vw-yedek -type f -mtime +14 -delete
bash
sudo chmod 700 /usr/local/bin/vw-yedek.sh
sudo crontab -e
# Her gece 03:15
15 3 * * * /usr/local/bin/vw-yedek.sh

Kurulumunuzda sends veya config.json henüz yoksa tar komutu uyarı verebilir; betikteki || true bu yüzden var, yine de arşivin içeriğini ilk çalıştırmadan sonra kontrol edin. Vaultwarden 1.32.1 ve sonrasında yerleşik bir /vaultwarden backup komutu da bulunur; ayrıntısı wiki'dedir.

Sık görülen sorunlar

BelirtiOlası nedenÇözüm
Web kasası açılmıyor veya kripto hatası veriyorSite HTTPS olmadan açılıyorCertbot ile sertifika alın, HTTP'den HTTPS'e yönlendirin
Ekler yüklenmiyor veya bağlantıları bozukDOMAIN eksik ya da yanlışDOMAIN değerini tam HTTPS adresi yapıp konteyneri yeniden oluşturun
Değişiklikler diğer tarayıcıda anında görünmüyorWebSocket başlıkları iletilmiyorUpgrade/Connection başlıklarını ekleyin, /notifications/hub için 101 yanıtını kontrol edin
Admin panelinde düz metin token uyarısıHash bozuk, tırnak veya $$ hatası, config.json ezmesiprintenv ile değeri ve grep admin_token vw-data/config.json ile dosyayı kontrol edin
SIGNUPS_ALLOWED değişti ama kayıt hâlâ açıkKonteyner yeniden oluşturulmadı veya config.json değeri geçerlidocker compose up -d ile yeniden oluşturun, admin panelindeki değeri kontrol edin
Büyük dosya yüklemede 413Nginx gövde sınırıclient_max_body_size değerini kontrol edin
504 Gateway TimeoutNginx bekleme süresi kısaWiki'de önerilen proxy_*_timeout değerlerini ekleyin; ayrıca 502/504 rehberi

Sık Sorulan Sorular

Vaultwarden resmî Bitwarden sunucusu mu?

Hayır. Vaultwarden, Bitwarden istemcileriyle uyumlu, gayriresmî ve bağımsız bir projedir; GitHub sayfasına göre Bitwarden veya Bitwarden, Inc. ile ilişkili değildir.

Resmî Bitwarden uygulamalarıyla kullanabilir miyim?

Evet, proje Bitwarden istemcileriyle uyumlu olacak şekilde geliştirilir. Uygulamaların giriş ekranında kendi barındırdığınız sunucu seçeneğini seçip https://vault.alanadiniz.com adresini girersiniz. Geçerli bir HTTPS sertifikası olmadan bağlantı kurmayı denemeyin.

SQLite yeterli mi, MySQL veya PostgreSQL gerekir mi?

Varsayılan kurulum SQLite kullanır ve bu rehber de onu temel alır. Wiki, MySQL veya PostgreSQL kullanan kurulumlarda veri klasörüne ek olarak ayrı bir veritabanı dökümü alınması gerektiğini belirtir.

Sunucum çökerse parolalarıma erişebilir miyim?

Bitwarden istemcileri kasanın bir kopyasını cihazda tutabilir; ancak bu bir yedek stratejisi değildir. Sunucu dışı, şifrelenmiş ve geri yüklemesi denenmiş yedekleriniz olmalı. Ayrıca sunucunuzun çalışıp çalışmadığını ayrı bir makineden izlemek için Uptime Kuma rehberine göz atabilirsiniz.

Yazılım ve hizmet adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen projeler veya şirketlerle ortaklık ilişkisi bulunduğu anlamına gelmez.

İlgili içerikler: Portainer kurulumu · Uptime Kuma kurulumu · Nextcloud kurulumu · Gitea kurulumu · VPS güvenlik sertleştirme · Fail2ban ile SSH koruması · Reverse proxy nedir?