[Инструкция] Vaultwarden и Caddy в Docker - полный цикл с бэкапом и автообновлением

Vaultwarden – это легковесная реализация сервера Bitwarden на языке Rust, идеально подходящая для домашнего сервера или VPS. Использование Caddy в качестве реверс-прокси позволяет автоматически получить и продлевать SSL-сертификаты, обеспечивая безопасный доступ к вашим паролям.

Официальный репозиторий проекта: Vaultwarden на GitHub

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

Установка Vaultwarden и Caddy через Docker-Compose

Устанавливаем Docker с помощью официального скрипта:

curl https://get.docker.com -o install.sh && sh install.sh

Добавляем в автозагрузку наш Docker:

systemctl enable docker.service

Проверяем что все установилось:

docker version
docker compose version

Создаем нужные директории и сам docker-compose.yml:

mkdir -p /app/vaultwarden
cd /app/vaultwarden
nano docker-compose.yml

Заполняем его следующим содержимым:

services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: always
    environment:
      WEBSOCKET_ENABLED: "true"
      SIGNUPS_ALLOWED: "true" #Меняем на false для закрытия регистрации
    volumes:
      - ./data:/data

  caddy:
    image: caddy:2
    container_name: caddy
    restart: always
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - ./caddy-config:/config
      - ./caddy-data:/data
    environment:
      DOMAIN: "https://ВАШ_ДОМЕН.RU"
      EMAIL: "ВАША_ПОЧТА@gmail.com"
      LOG_FILE: "/data/access.log"

Создаем и наполняем содержимым наш Caddyfile:

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


  tls {$EMAIL}

  encode gzip


  header {

  Strict-Transport-Security "max-age=31536000;"


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

Запускаем наш Docker-Compose.yml файл и завершаем установку:

docker compose up -d

Обновление Vaultwarden

Быстрое обновление (одной строкой)

cd /app/vaultwarden && docker compose down && docker pull vaultwarden/server:latest && docker compose up -d && sleep 5 && docker exec vaultwarden /vaultwarden --version

Пошаговое обновление

Перейти в папку Vaultwarden:

cd /app/vaultwarden

Остановить текущие контейнеры:

docker compose down 

Скачать последнюю версию образа Vaultwarden:

docker pull vaultwarden/server:latest

Перезапустить контейнеры с новым образом:

docker compose up -d

Автоматическое обновление через Watchtower

Чтобы не проверять выход новых версий вручную, мы используем Watchtower. Это сервисный контейнер, который автоматически сканирует установленные образы, скачивает их и перезапускает контейнеры на свежих версиях, сохраняя все настройки.

Настройка автоматического обновления

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

docker rm -f watchtower

Затем выполните команду для запуска Watchtower в универсальном режиме. Он будет проверять обновления для всех контейнеров (Vaultwarden и Caddy) раз в сутки:

docker run -d \
  --name watchtower \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e DOCKER_API_VERSION=1.41 \
  containrrr/watchtower \
  --cleanup \
  --interval 86400

Разбор флагов:

Проверка работы

Вы всегда можете посмотреть, что делал Watchtower и не нашёл ли он обновлений, с помощью логов:

docker logs watchtower

Запуск обновления вручную (здесь и сейчас)

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

docker run --rm \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e DOCKER_API_VERSION=1.41 \
  containrrr/watchtower \
  --cleanup \
  --run-once

Этот способ гораздо надёжнее и чище, чем ручное пересоздание контейнеров.

Проверка версии Vaultwarden

1. Через логи Docker

docker logs vaultwarden 2>&1 | grep -i "version"

(Замените vaultwarden на имя своего контейнера, если оно другое). В самом начале логов при запуске он всегда пишет свою версию.

2. Через консоль внутри контейнера

docker exec -it vaultwarden /vaultwarden --version

Это выведет точную версию исполняемого файла.

3. Через Docker Inspect

Если вы хотите узнать версию образа (тег):

docker inspect vaultwarden | grep -i "version"

Настройка резервного копирования (Backup) в Яндекс.Диск

Установка и настройка rclone

Для синхронизации с облаком используем официальный скрипт установки rclone (всегда ставит актуальную версию):

curl https://rclone.org/install.sh | sudo bash

Проверяем, что установилась актуальная версия:

rclone version

Запускаем конфигурацию:

rclone config

Ход настройки:

  1. n) New remote – вводим имя yandex.
  2. Storage – ищем и выбираем webdav.
  3. url – вводим: https://webdav.yandex.ru
  4. vendor – выбираем yandex (обычно пункт 5). Или other (обычно пункт 8).
  5. user – вводим твой логин (почту) Яндекса.
  6. password – выбираем y) Yes, type in my own password.
    • Внимание: Сюда вставляем не основной пароль, а Пароль приложения (16 букв), который мы создали в Яндекс ID.
  7. bearer_token – оставляем пустым (просто Enter).
  8. Edit advanced config – жмём n (нет).
  9. Keep this "yandex" remote? – жмём y (да).

Подготовка Яндекс.Диска

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

  1. Зайдите в  Яндекс ID -> Пароли приложений
  2. Нажмите «Создать» -> выбирайте «Файлы».
  3. Назовите его rclone-server и сохраните код. Именно его нужно вводить в пункте password выше.

Создание скрипта для бэкапа

Создаём файл:

nano /root/backup.sh

Вставляем:

#!/bin/bash

# Путь к данным Vaultwarden
SOURCE_DIR="/app/vaultwarden/data"
# Имя файла с датой и временем
FILENAME="vaultwarden-backup-$(date +%Y-%m-%d_%H-%M).tar.gz"

# 1. Создаём архив всех данных (база, ключи, иконки)
# Ключ -C переходит в папку данных, чтобы в архиве не было лишних вложенных папок
tar -czf /tmp/$FILENAME -C $SOURCE_DIR .

# 2. Копируем на Яндекс.Диск. Папка VaultBackups создастся сама.
rclone copy /tmp/$FILENAME yandex:VaultBackups

# 3. Чистим за собой временный файл в /tmp
rm /tmp/$FILENAME

# 4. Удаляем бэкапы в облаке старше 30 дней
rclone delete --min-age 30d yandex:VaultBackups

Даём права на запуск:

chmod +x /root/backup.sh

Автоматизация (Cron)

Заставляем сервер делать бэкап автоматически каждый день в 03:00 ночи:

crontab -e

Добавляем в самый конец:

0 3 * * * /root/backup.sh

Проверка

Для ручного запуска и проверки используйте:

/root/backup.sh
rclone ls yandex:VaultBackups

Восстановление данных (Restore)

Способ 1: Через консоль (с Яндекс.Диска)

Этот метод самый быстрый, если сервер работает и rclone настроен.

Остановите контейнеры:

cd /app/vaultwarden && docker compose down

Посмотрите список доступных бэкапов:

rclone ls yandex:VaultBackups

Скачайте нужный архив (замените имя файла на своё):

rclone copy yandex:VaultBackups/vaultwarden-backup-ИМЯ_ФАЙЛА.tar.gz /tmp/

Очистите текущую папку данных и распакуйте бэкап:

rm -rf /app/vaultwarden/data/*
tar -xzf /tmp/vaultwarden-backup-*.tar.gz -C /app/vaultwarden/data/

Запустите сервис:

docker compose up -d

Способ 2: Через SFTP (MobaXterm / Termius)

Если архив бэкапа лежит у вас на компьютере.

Подключитесь к серверу через MobaXterm или Termius.

Остановите контейнеры в консоли:

cd /app/vaultwarden && docker compose down

Загрузите файл: Просто перетащите ваш архив .tar.gz с компьютера в папку /tmp на сервере через графический интерфейс SFTP.

Распакуйте данные (подставив имя своего файла):

rm -rf /app/vaultwarden/data/*
tar -xzf /tmp/имя_вашего_файла.tar.gz -C /app/vaultwarden/data/

[!WARNING] Важно
Не распаковывайте архив на Windows перед загрузкой, чтобы не нарушить права доступа Linux.

Проверьте права (на всякий случай):

chown -R root:root /app/vaultwarden/data

Запустите сервис:

docker compose up -d