Безопасность сервера 9 мин чтения 2026-09-19

Свой сервер паролей Vaultwarden на VDS в Docker Compose: развертывание с HTTPS, защитой админки и автоматическими бэкапами

Развертывание приватного сервера паролей Vaultwarden на VDS в Docker Compose: настройка Nginx с автовыпуском SSL Let's Encrypt, проксирование WebSocket для мгновенной синхронизации, хэширование ADMIN_TOKEN через Argon2id, запрет открытой регистрации и горячее резервное копирование SQLite.

Инженерная редакция SysKit Проверено инженерами SysKit.ru

Менеджеры паролей стали критической точкой отказа как для частных специалистов, так и для IT-команд. Хранение доступов к серверам, базам данных, API-токенам и личным аккаунтам в закрытых облачных сервисах вроде 1Password, Bitwarden Cloud или LastPass несет два серьезных риска: внезапную блокировку аккаунта по географическому признаку и вероятность масштабных утечек данных из централизованных дата-центров провайдера.

Оптимальное инженерное решение — развертывание собственного сервера Vaultwarden на независимом виртуальном сервере (VDS). В этом материале подробно разбираем развертывание контейнера Vaultwarden в Docker Compose, генерацию криптографически стойкого хэша для панели администратора, настройку Nginx с бесплатным SSL-сертификатом и WebSocket, а также организацию регулярных горячих бэкапов базы данных без простоя сервиса.

1. Зачем развертывать Vaultwarden: независимость от SaaS и экономия ресурсов

Vaultwarden (ранее известный как Bitwarden_RS) — это легковесная альтернативная реализация серверной части Bitwarden, написанная на языке Rust. Сервис на 100% совместим со всеми официальными клиентскими приложениями Bitwarden: расширениями для браузеров (Chrome, Firefox, Safari, Edge), десктопными программами (Windows, macOS, Linux) и мобильными клиентами для iOS и Android.

Главная причина популярности Vaultwarden среди системных администраторов — поразительная разница в потреблении системных ресурсов по сравнению с официальным серверным пакетом Bitwarden:

Параметр сравнения Официальный Bitwarden Server Vaultwarden (Rust)
Стек технологий .NET Core / C#, 10+ микросервисов Один бинарный файл на Rust
База данных Microsoft SQL Server (MSSQL) Встроенная SQLite (или PostgreSQL/MySQL)
Потребление памяти (RAM) 3–4 ГБ RAM в покое 25–40 МБ RAM в активном режиме
Минимальный тариф VDS От 2 vCPU и 4 ГБ RAM (~2 000–3 000 ₽/мес) 1 vCPU и 1 ГБ RAM (~200–350 ₽/мес)
Клиентские приложения Официальные приложения Bitwarden Официальные приложения Bitwarden
Синхронизация в реалтайме WebSocket через отдельный шлюз Встроенный WebSocket-сервер

Таким образом, Vaultwarden дает полный функционал экосистемы Bitwarden (включая защищенные заметки, хранение банковских карт, одноразовые пароли 2FA/TOTP и экстренный доступ), работая даже на недорогом сервере начального уровня.

2. Системные требования и подготовка виртуального сервера

Для стабильной работы сервера паролей на 1–10 пользователей достаточно минимальной конфигурации:

  • Процессор: 1 виртуальное ядро (vCPU).
  • Оперативная память: 1 ГБ RAM (с головой хватит для ОС Ubuntu 24.04 LTS, Docker, Vaultwarden и Nginx).
  • Диск: 10–20 ГБ NVMe. База паролей с шифрованными записями обычно занимает не более 50–100 МБ.
  • Сетевой адрес: публичный статический IPv4.
  • Доменное имя: поддомен третьего уровня, например pass.example.com или vault.yourdomain.ru.

Совет инженера: проверка распространения DNS перед настройкой SSL

Перед выпуском SSL-сертификата убедитесь, что A-запись вашего поддомена успешно указывает на публичный IP-адрес VDS. Проверить доступность DNS-записей через глобальные резолверы можно с помощью утилиты DNS Lookup и Резолвер на платформе SysKit.

Подключитесь к вашему VDS по SSH и установите Docker Engine вместе с плагином Compose, если они еще не установлены:

# Обновление индекса пакетов
sudo apt update && sudo apt upgrade -y

# Установка зависимостей
sudo apt install -y curl apt-transport-https ca-certificates gnupg lsb-release

# Добавление официального репозитория Docker
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Установка Docker и Compose v2
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Проверка корректности установки
docker compose version

Создадим рабочую директорию для хранения конфигурации и постоянных данных Vaultwarden:

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

3. Готовый манифест Docker Compose и переменные окружения

Развертывание сервиса реализуется через файл docker-compose.yml. Мы изолируем сетевой порт контейнера на локальном адресе 127.0.0.1:8080. Это исключает прямой доступ пользователей из интернета к контейнеру в обход обратного прокси Nginx и встроенного файрвола.

Важное предупреждение: Docker и обход файрвола UFW

Если привязать порт как 8080:80, Docker автоматически добавит разрешающие правила в цепочку iptables DOCKER, тем самым открыв порт наружу даже при включенном UFW. Обязательно указывайте локальную привязку 127.0.0.1:8080:80. Подробный разбор этой уязвимости читайте в статье Docker обходит UFW на Linux: закрываем внутренние порты контейнеров.

Создайте файл docker-compose.yml в каталоге /opt/vaultwarden/:

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden-app
    restart: unless-stopped
    environment:
      - WEBSOCKET_ENABLED=true
      - SIGNUPS_ALLOWED=true
      - INVITATIONS_ALLOWED=true
      - DOMAIN=https://pass.example.com
      - LOG_FILE=/data/vaultwarden.log
      - LOG_LEVEL=warn
      - EXTENDED_LOGGING=true
    volumes:
      - ./vw-data:/data
    ports:
      - "127.0.0.1:8080:80"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:80/alive"]
      interval: 30s
      timeout: 5s
      retries: 3

Пояснения к ключевым переменным окружения:

  • WEBSOCKET_ENABLED=true: включает поддержку WebSocket прямо на основном HTTP-порту для мгновенной синхронизации изменений между всеми авторизованными клиентами без нажатия кнопки обновления.
  • SIGNUPS_ALLOWED=true: временно разрешает регистрацию, чтобы вы могли создать свою первую учетную запись администратора. Сразу после регистрации мы переключим этот флаг в false.
  • DOMAIN=https://pass.example.com: канонический URL вашего сервиса, необходимый для корректной генерации ссылок подтверждения почты, иконок сайтов и работы протокола WebAuthn / FIDO2.
  • volumes: ./vw-data:/data: каталог хоста, где Vaultwarden сохраняет зашифрованную базу данных SQLite (db.sqlite3), RSA-ключи сервера, кэш фавиконок и вложения.

Быстро сформировать манифесты под любые сервисы с изоляцией портов можно в интерактивном инструменте Генератор Docker Compose стеков онлайн.

4. Рекомендуемые надежные VDS-провайдеры для сервера паролей

Менеджер паролей — сервис с высочайшими требованиями к аптайму. Внезапный сбой сервера лишит вас доступа к учетным записям и серверам в самый неподходящий момент. Для круглосуточного размещения Vaultwarden редакция SysKit рекомендует проверенных провайдеров с быстрыми NVMe-накопителями, защитой каналов связи и автоматическими резервными копиями:

Рекомендуемые VDS-провайдеры

Отказоустойчивые сервера с быстрыми NVMe и каналом до 1 Гбит/с

Выбор редакции
⚡

Timeweb Cloud

Оптимальный выбор для развертывания Vaultwarden: быстрый запуск чистой Ubuntu 24.04 LTS, выделенный IPv4, высокоскоростные NVMe-диски со скоростью до 3500 МБ/с и автоматические ежедневные бэкапы.

Конфигурация
1–2 vCPU / 1–2 GB RAM / 25–40 GB NVMe
Tier III ЦОД
🔷

Selectel

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

Конфигурация
1–2 vCPU / 1–2 GB RAM / 20–30 GB NVMe
Простой старт
🟠

Beget

Отличный провайдер для персональных сервисов с интуитивной панелью управления, быстрой установкой Docker в 1 клик, бесплатной защитой от DDoS-атак и круглосуточной русскоязычной поддержкой.

Конфигурация
1 vCPU / 1 GB RAM / 20 GB NVMe

5. Безопасность и харденинг: хэшированный ADMIN_TOKEN и запрет открытой регистрации

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

Шаг 1: Запрет свободной регистрации посторонних пользователей

Сразу после того как вы зарегистрировали свой личный мастер-аккаунт в веб-интерфейсе, закройте публичную регистрацию. Измените в файле docker-compose.yml значение переменной:

      - SIGNUPS_ALLOWED=false
      - INVITATIONS_ALLOWED=true

Флаг INVITATIONS_ALLOWED=true позволит вам при необходимости приглашать коллег или членов семьи вручную через панель управления без открытия свободной регистрации для всего интернета.

Шаг 2: Безопасный ADMIN_TOKEN с хэшированием Argon2id

Vaultwarden содержит встроенную служебную панель управления https://pass.example.com/admin, через которую можно просматривать список пользователей, удалять аккаунты, управлять рассылками и настройками сервера. Доступ к ней защищается токеном ADMIN_TOKEN.

В старых инструкциях часто предлагают задавать токен в виде открытой текстовой строки. Это серьезная ошибка: текстовый токен сохраняется в открытом виде в переменных окружения процесса и файлах логов. Современные версии Vaultwarden требуют генерации стойкого криптографического хэша Argon2id.

Сгенерируйте хэш прямо внутри официального Docker-образа с помощью команды:

docker run --rm -it vaultwarden/server:latest /vaultwarden hash

Утилита запросит ввод мастер-пароля для администратора и вернет хэш-строку вида:

Password: 
$argon2id$v=19$m=65536,t=3,p=4$q3...$a8...

Важное предупреждение: экранирование знаков доллара в Docker Compose

Синтаксис Docker Compose воспринимает одиночный знак доллара $ как начало переменной bash. Если вставить полученный хэш без изменений, Compose сотрет имя алгоритма, и вход в панель администратора работать не будет. Каждый знак $ в хэше необходимо продублировать: $$.

Пример корректно экранированной переменной в блоке environment файла docker-compose.yml:

    environment:
      - WEBSOCKET_ENABLED=true
      - SIGNUPS_ALLOWED=false
      - INVITATIONS_ALLOWED=true
      - DOMAIN=https://pass.example.com
      - ADMIN_TOKEN=$$argon2id$$v=19$$m=65536,t=3,p=4$$c29tZXNhbHQ...$$ZXhhbXBsZWhhc2g...

После сохранения файла примените обновленную конфигурацию:

docker compose up -d

Теперь панель управления по адресу https://pass.example.com/admin надежно защищена от атак полного перебора (brute-force).

6. Настройка Nginx Reverse Proxy: SSL Let's Encrypt и WebSocket для синхронизации

Браузерные расширения Bitwarden используют криптографический стандарт Web Crypto API, который по соображениям безопасности работает исключительно в безопасном контексте (HTTPS). Попытка подключиться к серверу по незащищенному HTTP приведет к ошибкам шифрования и блокировке авторизации.

Настроим Nginx в качестве обратного прокси-сервера (Reverse Proxy) с автоматическим выпуском бесплатного сертификата Let's Encrypt через Certbot.

Установите Nginx и Certbot на хост-сервер:

sudo apt install -y nginx certbot python3-certbot-nginx

Создайте конфигурационный файл виртуального хоста /etc/nginx/sites-available/vaultwarden.conf:

upstream vaultwarden_backend {
    server 127.0.0.1:8080;
    keepalive 32;
}

server {
    listen 80;
    listen [::]:80;
    server_name pass.example.com;

    # Ограничение размера тела запроса для загрузки вложений
    client_max_body_size 64M;

    # Основной прокси-шлюз к приложению
    location / {
        proxy_pass http://vaultwarden_backend;
        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;
    }

    # Поддержка WebSocket для мгновенной синхронизации клиентов
    location /notifications/hub {
        proxy_pass http://vaultwarden_backend;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header 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;
    }
}

Активируйте виртуальный хост и выпустите сертификат Let's Encrypt:

# Активация конфигурации
sudo ln -s /etc/nginx/sites-available/vaultwarden.conf /etc/nginx/sites-enabled/

# Проверка синтаксиса Nginx
sudo nginx -t

# Автоматический выпуск SSL-сертификата через Certbot
sudo certbot --nginx -d pass.example.com --redirect

# Перезапуск веб-сервера
sudo systemctl reload nginx

Совет инженера: проверка стойкости TLS и портов

После активации проверьте корректность цепочки сертификата через онлайн-сканер Проверка SSL / TLS сертификата, а также убедитесь в утилите Сканер открытых портов онлайн, что порт 8080 надежно изолирован от интернета и открыты только стандартные 80 и 443 порты.

7. Подключение официальных клиентов Bitwarden на десктопах и смартфонах

Все официальные приложения Bitwarden поддерживают переключение на сторонний сервер без необходимости оплачивать премиум-подписку. Настройка занимает меньше минуты:

  1. Установите официальное приложение Bitwarden из App Store, Google Play или расширение для вашего браузера.
  2. На стартовом экране входа найдите значок шестеренки (⚙️) в верхнем левом углу или пункт «Сменить сервер».
  3. В поле «URL-адрес сервера» (Server URL) укажите адрес вашего домена: https://pass.example.com. Остальные поля оставьте пустыми — они автоматически унаследуют базовый адрес.
  4. Нажмите «Сохранить».
  5. Создайте свой мастер-аккаунт (если делаете это впервые) или введите логин и мастер-пароль для входа.

Для проверки работы WebSocket создайте новую тестовую запись в расширении браузера на компьютере: через секунду эта запись автоматически отобразится в мобильном приложении на смартфоне без необходимости ручной синхронизации.

8. Автоматическое горячее резервное копирование SQLite в S3-хранилище

Поскольку Vaultwarden хранит базу паролей в файле SQLite (vw-data/db.sqlite3), простое копирование файла через команду cp во время работы контейнера опасно: если процесс Vaultwarden выполняет запись в момент копирования, полученная копия базы будет повреждена.

Правильный инженерный подход — использование встроенной команды SQLite для создания целостного снимка базы данных на лету (онлайн-бэкап) с последующим шифрованием архива и отправкой в независимое объектное S3-хранилище.

Установите клиент SQLite на хост-сервер:

sudo apt install -y sqlite3 gzip

Создайте каталог для бэкапов и готовый bash-скрипт /opt/vaultwarden/backup.sh:

sudo mkdir -p /opt/vaultwarden/backups
sudo nano /opt/vaultwarden/backup.sh

Вставьте содержимое скрипта:

#!/usr/bin/env bash
set -euo pipefail

BACKUP_DIR="/opt/vaultwarden/backups"
VW_DATA="/opt/vaultwarden/vw-data"
DATE=$(date +%Y%m%d_%H%M%S)
ARCHIVE_NAME="vw_backup_${DATE}.tar.gz"

mkdir -p "${BACKUP_DIR}"

# 1. Создание консистентного горячего снимка SQLite базы
sqlite3 "${VW_DATA}/db.sqlite3" ".backup '${BACKUP_DIR}/db_snapshot.sqlite3'"

# 2. Упаковка снимка базы данных, RSA-ключей и вложений в сжатый архив
tar -czf "${BACKUP_DIR}/${ARCHIVE_NAME}"     -C "${BACKUP_DIR}" "db_snapshot.sqlite3"     -C "${VW_DATA}" "rsa_key.pem" "rsa_key.pub" "attachments" "sends" 2>/dev/null || true

# Удаление временного файла снимка
rm -f "${BACKUP_DIR}/db_snapshot.sqlite3"

# 3. Ротация: удаление локальных бэкапов старше 14 дней
find "${BACKUP_DIR}" -type f -name "vw_backup_*.tar.gz" -mtime +14 -delete

echo "[$(date '+%Y-%m-%d %H:%M:%S')] Резервная копия успешно создана: ${ARCHIVE_NAME}"

Сделайте скрипт исполняемым и добавьте задание в системный планировщик cron для ежедневного выполнения в 03:00 ночи:

sudo chmod +x /opt/vaultwarden/backup.sh

# Добавление задачи в cron
(sudo crontab -l 2>/dev/null; echo "0 3 * * * /opt/vaultwarden/backup.sh >> /var/log/vaultwarden_backup.log 2>&1") | sudo crontab -

Для настройки отправки архивов в облако Selectel или Timeweb S3 ознакомьтесь с практической инструкцией Автоматический бэкап баз данных и файлов с VDS в S3-хранилище, а сгенерировать точное расписание cron поможет Генератор расписаний Crontab.

9. Резюме и чек-лист готовности к эксплуатации

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

Перед тем как переносить все рабочие учетные записи в новое хранилище, сверьтесь с финальным чек-листом:

  • [x] Порт контейнера 8080 привязан строго к адресу 127.0.0.1 и недоступен из интернета напрямую.
  • [x] Публичная регистрация отключена (SIGNUPS_ALLOWED=false).
  • [x] Панель администратора /admin защищена хэшированным токеном ADMIN_TOKEN на базе алгоритма Argon2id.
  • [x] Настроен веб-сервер Nginx с действительным SSL-сертификатом и HTTP/2.
  • [x] Маршрут /notifications/hub корректно проксирует WebSocket без буферизации.
  • [x] Настроен ежедневный автоматический бэкап базы данных через sqlite3 .backup с ротацией архивов.

Готовы развернуть защищенный сервер паролей?

Для стабильной круглосуточной работы Vaultwarden без риска потери данных выберите надежный виртуальный сервер с быстрыми NVMe-накопителями и гарантированным каналом связи.

Вопросы и ответы (FAQ)

Популярные вопросы вебмастеров и сисадминов по данной теме

Будет ли Vaultwarden работать по HTTP без SSL-сертификата?
Нет, официальные расширения Bitwarden для браузеров и мобильные приложения блокируют передачу данных по незащищенному протоколу HTTP. Это требование спецификации Web Crypto API, которая работает исключительно в безопасном контексте (Secure Context / HTTPS). Исключение сделано только для локального адреса localhost (127.0.0.1) при отладке на ПК. Для полноценной работы сервера на внешнем домене обязательно требуется действующий SSL-сертификат (например, бесплатный от Let's Encrypt).
Как включить двухфакторную аутентификацию (2FA, TOTP, YubiKey)?
Vaultwarden из коробки поддерживает все ключевые методы 2FA: одноразовые пароли TOTP (Google Authenticator, Яндекс Ключ), ключи безопасности FIDO2 / WebAuthn (YubiKey), а также подтверждение через электронную почту при настроенном SMTP. Настройка 2FA выполняется каждым пользователем индивидуально в веб-интерфейсе хранилища в разделе «Настройки учетной записи» → «Безопасность» → «Двухфакторная аутентификация».
Как безопасно перенести данные Vaultwarden на другой сервер?
Все данные Vaultwarden (база SQLite, вложения, RSA-ключи сервера) хранятся в каталоге vw-data. Для миграции остановите контейнер командой docker compose down, создайте архив директории vw-data, перенесите его на новый сервер через scp или rsync, распакуйте в рабочую папку проекта и запустите docker compose up -d. После переключения A-записи домена в DNS все клиентские приложения автоматически переподключатся к новому серверу без потери сессий.

Читайте также в блоге SysKit

Смежные руководства и полезные технические статьи