Vaultwarden — совместимый с Bitwarden сервер, написанный на Rust. Он хранит зашифрованные хранилища, вложения и Send, а вы продолжаете пользоваться привычными клиентами Bitwarden: браузерным расширением, десктопным приложением и мобильными версиями. Для семьи или небольшой команды это удобнее, чем синхронизация через чужие облака, но требует собственного домена, HTTPS и дисциплины с резервными копиями. Проект неофициальный и не связан с Bitwarden, Inc.

Что вы получаете и чего не получаете

Сервер принимает API Bitwarden и отдаёт веб-интерфейс, поэтому клиенты работают почти без ограничений. Мастер-пароль не покидает устройство в открытом виде, а на сервере лежат зашифрованные данные. Это не отменяет главного риска: при компрометации сервера злоумышленник может подменить клиент, украсть сессию или удалить хранилище. Поэтому HTTPS, обновления и резервные копии — не опция, а часть установки.

Vaultwarden — проект с небольшим числом мейнтейнеров. Перед обновлением читайте release notes, делайте копию и держите возможность отката. Для критичного семейного хранилища разумно зафиксировать конкретный тег или digest после проверки.

Домен, DNS и TLS

Клиенты Bitwarden требуют HTTPS, кроме обращений к localhost. Купите или используйте существующий домен, направьте A/AAAA-запись на внешний адрес сервера и откройте 80 и 443. Внутренний IP без публикации тоже возможен, но тогда понадобится собственный ACME или самоподписанный сертификат, которому доверяют все устройства.

Самый короткий путь — Caddy: он сам получает сертификат Let’s Encrypt и обновляет его. Контейнер Vaultwarden слушает только localhost, а прокси завершает TLS.

vault.example.com {
    encode zstd gzip
    reverse_proxy 127.0.0.1:8080
}

Если Caddy работает в контейнере, адрес 127.0.0.1 указывает на сам контейнер. В этом случае используйте имя сервиса во внутренней сети Docker или host.docker.internal с соответствующей настройкой.

Запуск контейнера

Создайте каталог vw-data и файл .env рядом с compose.yaml. Секреты не должны попадать в git: добавьте .env и vw-data/ в .gitignore, а права на .env выставьте 0600.

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    env_file: .env
    volumes:
      - ./vw-data:/data
    ports:
      - "127.0.0.1:8080:8080"
DOMAIN=https://vault.example.com
ROCKET_PORT=8080
SIGNUPS_ALLOWED=true
INVITATIONS_ALLOWED=true
ADMIN_TOKEN=замените-на-длинную-случайную-строку

Запустите сервис и проверьте, что он отвечает. Эндпоинт /alive возвращает отметку времени и удобен для мониторинга.

docker compose up -d
docker compose logs -f --tail 50 vaultwarden
curl -fsS https://vault.example.com/alive
curl -I https://vault.example.com

Первый вход и закрытие регистрации

Откройте https://vault.example.com, создайте аккаунт и сразу включите двухфакторную аутентификацию: TOTP или аппаратный ключ WebAuthn. Затем выключите свободную регистрацию и приглашения, иначе любой, кто узнает адрес, сможет создать учётную запись.

Резервные коды и ключ восстановления храните вне сервера — на бумаге в сейфе или в офлайн-копии. Если единственная копия мастер-пароля лежит в самом Vaultwarden, потеря доступа к серверу означает потерю всех остальных паролей. Экспорт хранилища тоже делайте регулярно и храните зашифрованным, а раз в несколько месяцев проверяйте вход с нового устройства.

SIGNUPS_ALLOWED=false
INVITATIONS_ALLOWED=false
SHOW_PASSWORD_HINT=false
EMERGENCY_ACCESS_ALLOWED=false

После изменения переменных окружения контейнер нужно пересоздать, а не просто перезапустить: значения фиксируются при создании. Выполните docker compose up -d, предварительно убедившись, что ваш аккаунт уже существует и вы не заблокировали единственного администратора.

Админ-панель и Argon2

Панель /admin по умолчанию включается только при заданном ADMIN_TOKEN. Простая строка работает, но хранится в открытом виде, поэтому используйте PHC-строку Argon2id. Встроенная команда hash запросит пароль дважды и выведет строку ADMIN_TOKEN='...'. В конфиг копируйте саму PHC-строку, а не префикс ADMIN_TOKEN=.

docker exec -it vaultwarden /vaultwarden hash
docker exec vaultwarden printenv ADMIN_TOKEN
curl -I https://vault.example.com/admin
grep -n admin_token vw-data/config.json

В .env строку с долларами берите в одинарные кавычки. В compose.yaml при передаче через environment каждый $ нужно удвоить, иначе Compose попытается подставить переменную и испортит хеш. Проверка через printenv показывает, что реально получил процесс.

Если вы сохранили настройки в админке, Vaultwarden создаст config.json, и его значения начнут перекрывать переменные окружения. Это частая причина «я поменял .env, а ничего не изменилось». Либо управляйте всем через админку, либо удалите config.json и настройте сервис через окружение.

Резервное копирование

В каталоге данных лежат db.sqlite3, вложения, отправленные файлы, ключи rsa_key* и, возможно, config.json. Копировать один файл базы недостаточно: вложения и ключи должны быть согласованы с ней. На работающем сервере используйте онлайн-бэкап SQLite, а затем копируйте файлы. Утилита sqlite3 должна быть установлена на хосте.

sqlite3 vw-data/db.sqlite3 ".backup '/backup/vw-$(date +%F).sqlite3'"
tar --exclude='db.sqlite3*' -C vw-data -czf /backup/vw-files-$(date +%F).tar.gz .
ls -lh /backup
sha256sum /backup/vw-*

Храните копии на другом носителе и в другом месте, шифруйте архив и регулярно проверяйте восстановление на тестовом контейнере. Бэкап, который ни разу не разворачивали, считается несуществующим. Проверьте архив на другом хосте и убедитесь, что контейнер стартует с восстановленными данными. Помните, что копия содержит и зашифрованные хранилища, и служебные секреты, поэтому доступ к ней должен быть ограничен.

Обновления и диагностика

Перед обновлением сделайте копию, зафиксируйте текущий тег и прочитайте изменения. Скачайте новый образ, пересоздайте контейнер и проверьте вход, синхронизацию и вложения. Если что-то сломалось, верните прежний тег и восстановите данные.

docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail 100 vaultwarden

Типичные проблемы: 502 от прокси означает, что контейнер не слушает указанный порт; клиент не подключается — проверьте DOMAIN и сертификат; вложения не загружаются — место на диске и права на vw-data; уведомления не приходят — прокси должен пропускать WebSocket и заголовки Upgrade. Для писем с приглашениями настройте SMTP, а пароль передавайте через SMTP_PASSWORD_FILE, а не в открытом environment.

  • Не открывайте порт 8080 наружу — только локально или через reverse proxy.
  • Ограничьте /admin по IP на прокси, если панель нужна редко.
  • Следите за свободным местом: база и вложения растут вместе с хранилищем.
  • Держите зафиксированный тег образа и читайте changelog перед обновлением.

Итог

Vaultwarden даёт контроль над своим хранилищем паролей, но требует полноценной эксплуатации: домен, TLS, закрытая регистрация, Argon2 для админки, проверенные бэкапы и аккуратные обновления. Начните с одного пользователя и тестового восстановления, затем добавляйте семью. Такой порядок снижает риск потерять доступ к самым важным учётным данным.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте