Vaultwarden: свой менеджер паролей на VPS

Self-hosted сервисы
Vaultwarden: свой менеджер паролей на VPS

Пароли расползаются по браузерам, заметкам и стикерам, а платные облачные менеджеры просят подписку за каждое устройство. Vaultwarden — это лёгкая реализация серверной части Bitwarden на Rust, полностью совместимая с официальными клиентами и расширениями браузера. Разберём, как выглядит vaultwarden установка на собственном VPS: поднимем сервис в Docker, закроем его HTTPS и получим свой Bitwarden под полным контролем. В итоге все пароли будут храниться на вашем сервере, а не в чужом облаке.

Почему Vaultwarden, а не облачная подписка

Официальный сервер Bitwarden написан на C# и тянет за собой несколько контейнеров, SQL-сервер и заметные требования к памяти. Vaultwarden делает то же самое в одном небольшом контейнере на Rust: он занимает десятки мегабайт RAM и спокойно работает даже на минимальном тарифе. При этом клиенты остаются родными — мобильное приложение Bitwarden, десктоп и браузерные расширения подключаются к вашему серверу так же, как к официальному облаку.

Ключевые причины держать менеджер паролей у себя:

  • Данные не покидают ваш сервер, а хранилище зашифровано ключом, который знаете только вы.
  • Нет ежемесячной платы за организации, вложения или двухфакторную аутентификацию — всё это доступно бесплатно.
  • Полный контроль над бэкапами: база SQLite умещается в один файл, который легко копировать.
  • Возможность закрыть доступ фаерволом или спрятать сервис за VPN.

Для такого сервиса не нужен мощный сервер. Vaultwarden прекрасно живёт на NAT VPS с общим IPv4 и проброшенными портами — трафика он создаёт мало, а порт 25 (закрытый на NAT-тарифах) ему не нужен, потому что почтовые уведомления работают через внешний SMTP по портам 465 или 587.

Что понадобится перед установкой

Минимальный набор — сервер с Linux, установленный Docker и доменное имя, направленное на IP сервера. Домен важен: браузерные расширения Bitwarden отказываются работать с хранилищем без HTTPS, поэтому самоподписанный сертификат или доступ по голому IP не подойдут для повседневного использования.

КомпонентЗачем нуженКомментарий
VPSХостинг сервисаХватит NAT Base от Cheap-Host
Домен или поддоменДля валидного HTTPSНапример, vault.example.com
Docker и Docker ComposeЗапуск контейнераОдин compose-файл
Reverse proxyТерминация TLSNginx или Caddy

Если Docker ещё не стоит, поставьте его по инструкции из статьи Docker на VPS: установка и первые шаги. Дальше я предполагаю, что docker и плагин docker compose уже доступны.

Шаг 1. Готовим директорию и данные

Создадим отдельную папку для сервиса и каталог, куда Vaultwarden будет складывать базу и вложения. Держать данные на отдельном томе удобно для бэкапов.

# Создаём рабочую директорию проекта
mkdir -p /opt/vaultwarden/data
cd /opt/vaultwarden

Каталог data смонтируем внутрь контейнера. Именно в нём окажутся файл db.sqlite3, ключи RSA для токенов и загруженные вложения — эти файлы и есть всё ваше хранилище.

Шаг 2. Пишем docker-compose.yml

Опишем сервис в compose-файле. Обратите внимание на переменную ADMIN_TOKEN — это пароль к административной панели, и его нужно заменить на длинную случайную строку. Регистрацию новых пользователей мы отключаем, чтобы посторонние не могли создать аккаунт на вашем сервере.

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      # Внешний адрес сервиса, обязателен для работы клиентов
      DOMAIN: "https://vault.example.com"
      # Отключаем открытую регистрацию после создания своего аккаунта
      SIGNUPS_ALLOWED: "false"
      # Длинный случайный токен для входа в /admin
      ADMIN_TOKEN: "ЗАМЕНИТЕ_НА_ДЛИННУЮ_СЛУЧАЙНУЮ_СТРОКУ"
    volumes:
      - ./data:/data
    ports:
      # Слушаем только localhost, наружу пустим через reverse proxy
      - "127.0.0.1:8080:80"

Сгенерировать надёжный токен для ADMIN_TOKEN можно прямо в терминале:

# Печатаем 48 случайных байт в base64 — годится как admin-токен
openssl rand -base64 48

Скопируйте результат в compose-файл. Порт мы намеренно привязали к 127.0.0.1, чтобы контейнер не торчал в интернет напрямую — весь внешний трафик пойдёт через reverse proxy с TLS.

Шаг 3. Запускаем контейнер

# Запускаем сервис в фоне
docker compose up -d

# Проверяем, что контейнер поднялся
docker compose ps

# Смотрим логи на предмет ошибок
docker compose logs -f vaultwarden

Если в логах видно строку о том, что сервис слушает порт 80 внутри контейнера, значит всё в порядке. Локально Vaultwarden уже доступен на 127.0.0.1:8080, но открывать его пока рано — сначала настроим HTTPS. Подробнее про работу с compose-стеками читайте в материале Docker Compose на практике.

Шаг 4. Reverse proxy и HTTPS

Vaultwarden нельзя выставлять в интернет без шифрования: через него ходят все ваши пароли. Поднимем перед ним Nginx, который примет HTTPS-запросы и проксирует их на локальный порт. Сертификат возьмём у Let's Encrypt.

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

    ssl_certificate     /etc/letsencrypt/live/vault.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/vault.example.com/privkey.pem;

    # Vaultwarden отдаёт крупные вложения — увеличиваем лимит тела запроса
    client_max_body_size 128M;

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

Как выпустить и автоматически продлевать сертификат, подробно описано в статье SSL-сертификат Let's Encrypt. Если вы предпочитаете единый шлюз для нескольких сервисов, посмотрите Nginx как reverse proxy — там разобрана типовая схема с несколькими бэкендами за одним доменом.

После перезагрузки конфигурации проверьте синтаксис и примените изменения:

# Проверяем конфиг и перечитываем без остановки сервиса
nginx -t && systemctl reload nginx

Шаг 5. Первый вход и создание аккаунта

Откройте https://vault.example.com в браузере. Поскольку регистрация отключена флагом SIGNUPS_ALLOWED: false, временно включите её, создайте свой аккаунт и снова выключите. Проще всего сделать это через админ-панель по адресу /admin, куда вы войдёте с помощью ADMIN_TOKEN.

Порядок действий:

  1. Зайдите в https://vault.example.com/admin и введите admin-токен.
  2. В разделе настроек временно разрешите регистрацию (SIGNUPS_ALLOWED).
  3. На главной странице создайте свой пользовательский аккаунт с надёжным мастер-паролем.
  4. Вернитесь в админку и снова запретите регистрацию.

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

Шаг 6. Подключаем клиенты

Теперь установите официальное расширение Bitwarden в браузер или приложение на телефон. В настройках подключения (обычно шестерёнка на экране входа) укажите адрес своего сервера — https://vault.example.com. После этого вход выполняется вашей почтой и мастер-паролем, а синхронизация идёт через ваш VPS.

Один и тот же аккаунт работает на всех устройствах одновременно: изменили пароль на телефоне — он тут же появится в браузере на компьютере. Это ровно та же логика, что и у платного Bitwarden, только сервер ваш.

Шаг 7. Резервное копирование хранилища

Все ценные данные лежат в каталоге data. Достаточно регулярно копировать его в безопасное место. Простейший бэкап — остановить контейнер и заархивировать папку.

# Останавливаем сервис, чтобы SQLite не писала во время копирования
docker compose stop vaultwarden

# Архивируем данные с датой в имени файла
tar czf /opt/backups/vaultwarden-$(date +%F).tar.gz -C /opt/vaultwarden data

# Запускаем обратно
docker compose start vaultwarden

Чтобы не делать это руками, автоматизируйте выгрузку по расписанию и храните копии вне сервера. Готовые сценарии и ротацию бэкапов разбираем в статье Резервное копирование VPS. Хорошая практика — держать хотя бы одну копию на другой машине или в объектном хранилище, чтобы потеря сервера не означала потерю всех паролей.

Обслуживание и обновления

Vaultwarden обновляется простой заменой образа. Перед обновлением обязательно сделайте бэкап данных.

# Подтягиваем свежий образ и пересоздаём контейнер
docker compose pull
docker compose up -d

Старые образы можно периодически чистить командой docker image prune, чтобы не забивать диск. Следите за логами после обновления: если что-то пошло не так, откатиться легко — вернуть предыдущий образ и восстановить каталог data из архива.

Частые вопросы

Чем Vaultwarden отличается от официального Bitwarden?

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

Хватит ли NAT VPS для менеджера паролей?

Да, с запасом. Vaultwarden потребляет десятки мегабайт памяти и почти не нагружает процессор, ведь всё шифрование происходит на стороне клиента. NAT Base от Cheap-Host с проброшенными портами полностью закрывает эту задачу. Порт 25 сервису не нужен — почтовые уведомления идут через внешний SMTP по портам 465 или 587.

Обязателен ли домен и HTTPS?

Для повседневной работы — да. Браузерные расширения Bitwarden отказываются подключаться к хранилищу без валидного HTTPS, а передавать пароли по незашифрованному каналу небезопасно в принципе. Поэтому нужен домен и сертификат от Let's Encrypt, а не доступ по голому IP.

Что будет, если я забуду мастер-пароль?

Восстановить хранилище будет невозможно. Мастер-пароль используется для шифрования данных на стороне клиента, и сервер его не хранит. Именно поэтому важно записать пароль в надёжном месте и настроить регулярные бэкапы каталога с данными.

Насколько это безопасно держать пароли на своём сервере?

Безопасно при базовой гигиене: закрытый фаервол, обновления, HTTPS и отключённая открытая регистрация. Данные шифруются до отправки на сервер, поэтому даже при доступе к файлам без мастер-пароля их не прочитать. Для дополнительной защиты сервис можно спрятать за VPN — например, поднять WireGuard на VPS и открывать хранилище только внутри туннеля.

Пора завести свой менеджер паролей

Vaultwarden — тот случай, когда небольшой сервер полностью решает задачу, за которую обычно берут ежемесячную плату. Для него достаточно NAT Base с общим IPv4 и проброшенными портами: сервис лёгкий, а данные при этом остаются под вашим контролем. Выберите подходящий тариф на Cheap-Host, поднимите контейнер по шагам выше и перенесите пароли из чужих облаков к себе.

Читайте также