Гид по технологиям

Установка Vaultwarden на Ubuntu 22.04

• 7 min read • DevOps • Обновлено 27 Nov 2025
Vaultwarden на Ubuntu 22.04 — установка и настройка
Vaultwarden на Ubuntu 22.04 — установка и настройка

Кому подходит эта инструкция

  • Системным администраторам и DevOps-инженерам, которые хотят развернуть легковесную альтернативу Bitwarden.
  • Тем, кто использует Ubuntu 22.04 и предпочитает контейнеризацию через Docker Compose v2.

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

  • Рабочий Vaultwarden с HTTPS (Let’s Encrypt через Caddy).
  • Настроенный SMTP для подтверждения почты.
  • Автоматические ежедневные бэкапы SQLite и инструкция по восстановлению.
  • Базовые рекомендации по безопасности и сопровождающие чеклисты.

Схема установки Vaultwarden на сервере

H2: Предварительные требования

  • Сервер с Ubuntu 22.04.
  • Неразовый (non-root) пользователь с правами sudo.
  • UFW (Uncomplicated Firewall) включён и работает.
  • Домен (FQDN), указывающий на сервер, например vaultwarden.example.com.
  • Обновлённая система:
$ sudo apt update && sudo apt upgrade

Важно: далее мы используем Docker Compose v2 (команда docker compose). Если на вашей машине используется старый docker-compose, обновите его.

H2: Шаг 1 — настройка брандмауэра (UFW)

Проверьте статус UFW:

$ sudo ufw status

Ожидаемый пример вывода:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Разрешите HTTP и HTTPS:

$ sudo ufw allow http
$ sudo ufw allow https

Проверьте статус ещё раз, чтобы убедиться, что правила применены.

H2: Шаг 2 — установка Docker и Docker Compose

Добавьте GPG-ключ Docker и официальный репозиторий, затем установите пакеты:

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg

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

$ sudo apt update

$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Чтобы запускать docker без sudo, добавьте пользователя в группу docker:

$ sudo usermod -aG docker ${USER}

Примените изменения, перелогинившись или выполнив:

$ su - ${USER}

H2: Шаг 3 — файл docker-compose для Vaultwarden

Создайте каталог и файл docker-compose.yml:

$ mkdir vaultwarden
$ cd vaultwarden
$ nano docker-compose.yml

Вставьте этот пример (замените DOMAIN и EMAIL):

version: '3'

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: always
    environment:
      WEBSOCKET_ENABLED: "true"  # Enable WebSocket notifications.
      DOMAIN: "https://vaultwarden.example.com"
      SMTP_HOST: ""
      SMTP_FROM: "<[email protected]>"
      SMTP_PORT: "587"
      SMTP_SECURITY: "starttls"
      SMTP_USERNAME: ""
      SMTP_PASSWORD: ""
    volumes:
      - ./vw-data:/data

  caddy:
    image: caddy:2
    container_name: caddy
    restart: always
    ports:
      - 80:80  # Needed for the ACME HTTP-01 challenge.
      - 443:443
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - ./caddy-config:/config
      - ./caddy-data:/data
    environment:
      DOMAIN: "https://vaultwarden.example.com"  # Your domain.
      EMAIL: "[email protected]"                 # The email address to use for ACME registration.
      LOG_FILE: "/data/access.log"

Сохраните файл (Ctrl+X → Y).

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

  • image — образ Docker на Docker Hub.
  • container_name — читаемый ярлык контейнера.
  • restart: always — автоперезапуск контейнера при падении.
  • environment — переменные окружения для Vaultwarden и Caddy (обратите внимание на SMTP_SECURITY: starttls для 587, force_tls для 465).
  • volumes — сопоставления директорий для сохранения данных между хостом и контейнером.
  • ports — проброс портов (80 и 443 для Caddy, 3012 для WebSocket Vaultwarden).

H2: Шаг 4 — дополнительные параметры Vaultwarden

Ниже перечислены часто используемые переменные окружения. Добавляйте их в секцию environment контейнера vaultwarden.

Отключение регистрации

Чтобы запретить свободную регистрацию пользователей:

SIGNUPS_ALLOWED: "false"

Отключение приглашений

Чтобы пользователи организаций не могли приглашать новых участников:

INVITATIONS_ALLOWED: "false"

Отключение подсказок пароля

SHOW_PASSWORD_HINT: "false"

Отключение веб-интерфейса (веб-ваулта)

WEB_VAULT_ENABLED: "false"

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

volumes:
  - ./vw-data:/data
  - /path/to/static/files_directory:/web-vault

Логи и уровень логирования

По умолчанию Vaultwarden пишет в stdout. Для логирования в файл:

LOG_FILE: "/data/vaultwarden.log"

Чтобы уменьшить поток логов:

LOG_LEVEL: "warn"
EXTENDED_LOGGING: "true"

Важно: EXTENDED_LOGGING=true может раскрывать дополнительную информацию в логах — применяйте с осторожностью.

H2: Шаг 5 — файл Caddyfile для Vaultwarden

Создайте Caddyfile рядом с docker-compose.yml:

$ nano Caddyfile

Вставьте конфигурацию (переменные подставляются из environment при запуске контейнера Caddy):

{$DOMAIN}:443 {
  log {
    level INFO
    output file {$LOG_FILE} {
      roll_size 10MB
      roll_keep 10
    }
  }

  tls {$EMAIL}

  encode gzip

  request_body {
       max_size 500MB
  }
  
  header {
       X-XSS-Protection "1; mode=block"
       X-Frame-Options "DENY"
       X-Robots-Tag "none"
       -Server
  }

  reverse_proxy /notifications/hub vaultwarden:3012

  reverse_proxy vaultwarden:80 {
       header_up X-Real-IP {remote_host}
  }
}

Сохраните файл. Caddy будет автоматически получать сертификат Let’s Encrypt через ACME HTTP-01.

Примечание: опция request_body max_size 500MB нужна для работы функции “Send” (отправка больших файлов).

H2: Шаг 6 — запуск Vaultwarden

Запустите сервисы в фоне:

$ docker compose up -d

Проверьте контейнеры:

$ docker ps

Ожидаемый пример: контейнер caddy на 80/443 и vaultwarden с портом 80 и 3012 (WebSocket).

H2: Шаг 7 — использование с клиентами Bitwarden

Откройте ваш домен: https://vaultwarden.example.com

Страница входа Vaultwarden

Создайте аккаунт (Create Account), подтвердите почту — для этого Vaultwarden отправляет письмо проверки.

Страница создания аккаунта Vaultwarden

После регистрации и входа вы увидите рабочую панель Vaultwarden.

Панель управления Vaultwarden

Пример письма подтверждения:

Письмо подтверждения Vaultwarden

Чтобы подключить клиент Bitwarden (например расширение Chrome), укажите сервер URL в настройках расширения:

Окно входа расширения Bitwarden

В настройках расширения введите ваш URL: https://vaultwarden.example.com и сохраните.

Настройки входа Bitwarden

После входа вы получите доступ к клиенту и можете работать как с обычным Bitwarden.

Окно приложения Bitwarden

H2: Шаг 8 — резервное копирование Vaultwarden

Vaultwarden по умолчанию использует SQLite, файл базы обычно находится в ./vw-data/db.sqlite3. Копирование «вслепую» не гарантирует консистентность. Рекомендуемый способ — встроенная команда sqlite3 .backup.

Установите sqlite3 и создайте каталог для бэкапов:

$ sudo apt install sqlite3
$ mkdir ~/vw-backups
$ chmod go-rwx ~/vw-backups

Создайте systemd-сервис для однократного бэкапа:

$ sudo nano /etc/systemd/system/vaultwarden-backup.service

Вставьте (замените на реального пользователя):

[Unit]
Description=backup the vaultwarden sqlite database

[Service]
Type=oneshot
WorkingDirectory=/home//vw-backups
ExecStart=/usr/bin/env bash -c 'sqlite3 /home//vaultwarden/vw-data/db.sqlite3 ".backup backup-$(date -Is | tr : _).sqlite3"'
ExecStart=/usr/bin/find . -type f -mtime +30 -name 'backup*' -delete

Запустите сервис вручную для проверки:

$ sudo systemctl start vaultwarden-backup.service
$ ls -l ~/vw-backups

Пример созданного файла:

-rw-r--r-- 1 root root 196608 Jul 31 17:25 backup-2022-07-31T17_25_04+00_00.sqlite3

Создайте таймер systemd для ежедневного запуска в 04:00:

$ sudo nano /etc/systemd/system/vaultwarden-backup.timer

Содержимое:

[Unit]
Description=schedule vaultwarden backups

[Timer]
OnCalendar=04:00
Persistent=true

[Install]
WantedBy=multi-user.target

Включите и запустите таймер:

$ sudo systemctl enable vaultwarden-backup.timer
$ sudo systemctl start vaultwarden-backup.timer

Проверьте статус:

$ systemctl status vaultwarden-backup.timer

Важное замечание по бэкапу: помимо db.sqlite3 нужно сохранять директорию attachments, файл config.json и приватные ключи rsa_key* — они нужны для полной работоспособности после восстановления. Папки sends и icon_cache опциональны.

H2: Шаг 9 — восстановление Vaultwarden

  1. Остановите контейнеры:
$ docker compose down
  1. Замените содержимое ./vw-data на ваши бэкапы (скопируйте db и другие файлы).
  2. Обязательно удалите db.sqlite3-wal (файл сиделки записи), если он присутствует, перед запуском, чтобы избежать коррумпции.
  3. Запустите контейнеры снова:
$ docker compose up -d

Проверьте логи и состояние контейнеров.

H2: Шаг 10 — обновление Vaultwarden

Последовательность безопасного обновления контейнеров:

$ cd ~/vaultwarden
$ docker compose down --remove-orphans
$ docker compose pull
$ docker compose up -d

Данные в ./vw-data сохранятся, так как это персистентный том на хосте.

H2: Рекомендации по безопасности

Важно учитывать дополнительные меры безопасности при эксплуатации Vaultwarden на продакшн-сервере:

  • Шифруйте бэкапы перед отправкой на удалённое хранилище.
  • Разрешайте доступ к административному интерфейсу только из доверенных сетей или через VPN.
  • Ограничьте привилегии контейнеров (read-only файловые тома, seccomp, AppArmor/SELinux).
  • Включите двухфакторную аутентификацию для учётных записей администраторов.
  • Добавьте fail2ban для защиты от перебора паролей, используя корректный лог-формат (X-Real-IP важен в Caddy config).
  • Регулярно проверяйте обновления образов Vaultwarden и Caddy и тестируйте обновления в staging перед prod.

Important: храните приватные ключи RSA и config.json отдельно и защищённо — их потеря или компрометация приведёт к проблемам с восстановлением и безопасностью.

H2: Полезные сценарии и шаблоны

Playbook: быстрый восстановительный запуск (5 минут)

  1. Переключите DNS на резервный домен (если нужно).
  2. Остановите контейнеры: docker compose down.
  3. Замените ./vw-data на резервную копию.
  4. Удалите db.sqlite3-wal.
  5. Запустите docker compose up -d.
  6. Проверьте логи docker compose logs -f caddy vaultwarden.

Check-лист для администратора (роль-based)

Администратор:

  • Проверить доступность HTTPS.
  • Проверить логи на ошибки при старте.
  • Убедиться, что бэкапы создаются и шифруются.

Оператор (оперативная поддержка):

  • Убедиться, что контейнеры запущены и healthy.
  • Проверить размер и наличие Attachments.

Пользователь:

  • Убедиться, что подтверждение почты приходит.
  • Настроить сервер в клиенте Bitwarden (URL).

Runbook для бэкапа и отката

  • Ежедневный бэкап через systemd timer.
  • Хранить минимум 30 копий локально и зеркально загружать последние N на внешний сервер/облако.
  • Откат: протестировать восстановление на стенде перед заменой prod-данных.

Мини-методология обновлений

  • Pull образ в staging.
  • Запустить контейнер в staging и прогнать smoke-tests.
  • Если OK — применить в production в период низкой нагрузки.

H2: Совместимость и советы по миграции

  • Эта инструкция ориентирована на Ubuntu 22.04, Docker и Docker Compose v2 (плагин).
  • Vaultwarden по умолчанию использует SQLite; для крупных инсталляций рассмотрите внешнюю СУБД (Postgres) — проверяйте официальную документацию Vaultwarden для поддерживаемых конфигураций и ограничений.
  • Тестируйте миграции баз данных на копии данных перед применением на production.

H2: Факты и важные параметры

  • Порты: HTTP 80, HTTPS 443, WebSocket Vaultwarden 3012.
  • Рекомендуемый max_size в Caddy для Send: 500MB.
  • Пример расписания бэкапов в статье: 04:00 ежедневно.
  • Локация данных в примере: ./vw-data (в контейнере /data).

H2: Критерии приёмки

  • Сайт доступен по HTTPS и сертификат валиден.
  • Пользователь может зарегистрироваться и подтвердить email.
  • Клиент Bitwarden подключается к указанному URL и синхронизирует данные.
  • Бэкап создаётся и успешно восстанавливается на тестовом стенде.

H2: Глоссарий одной строкой

  • Vaultwarden — неофициальный сервер Bitwarden, написан на Rust.
  • Caddy — веб-сервер с автоматическим управлением TLS (Let’s Encrypt).
  • WebSocket — канал для уведомлений (порт 3012).
  • ACME HTTP-01 — метод получения TLS-сертификата через HTTP.

H2: Заключение

Вы развернули Vaultwarden с HTTPS, настроили SMTP и автоматические бэкапы. Для безопасной эксплуатации в продакшн-окружении дополнительно рекомендуем вынести СУБД (если нужна масштабируемость), шифровать и удалённо сохранять бэкапы, ограничить доступ к административным интерфейсам и тестировать обновления в staging. Если остались вопросы, проверьте логи контейнеров и официальную документацию Vaultwarden.


Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро