Files

5.1 KiB

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

## Скрипт backup.sh

```bash
#!/bin/bash
# Скрипт резервного копирования Vaultwarden с отправкой на Яндекс.Диск

BACKUP_DIR="/opt/vw/backups"
YADISK_MOUNT="/mnt/yandex-disk"
DATE=$(date +%Y%m%d_%H%M%S)
COMPOSE_DIR="/opt/vw"
CONTAINER_NAME="vaultwarden"
ARCHIVE_NAME="vw_backup_${DATE}.tar.gz"

mkdir -p "${BACKUP_DIR}"

echo "[${DATE}] Начинаем резервное копирование Vaultwarden..."

# Проверка монтирования Яндекс.Диска
if ! mountpoint -q "${YADISK_MOUNT}"; then
    echo "   ОШИБКА: Яндекс.Диск не примонтирован в ${YADISK_MOUNT}"
    echo "   Попробуйте: sudo mount ${YADISK_MOUNT}"
    exit 1
fi

mkdir -p "${YADISK_MOUNT}/backup/vaultwarden-backups" 2>/dev/null
cd "${COMPOSE_DIR}" || exit 1

echo "   -> Останавливаем контейнер для целостности базы данных..."
docker compose stop "${CONTAINER_NAME}"

echo "   -> Создаем архив всей директории проекта..."
#tar -czf "${BACKUP_DIR}/${ARCHIVE_NAME}" -C "${COMPOSE_DIR}" .
tar -czf "${BACKUP_DIR}/${ARCHIVE_NAME}" --exclude="${COMPOSE_DIR}/backups" -C "${COMPOSE_DIR}" .

echo "   -> Запускаем контейнер..."
docker compose start "${CONTAINER_NAME}"

if [ -s "${BACKUP_DIR}/${ARCHIVE_NAME}" ]; then
    echo "      Архив Vaultwarden: $(du -h "${BACKUP_DIR}/${ARCHIVE_NAME}" | cut -f1)"
else
    echo "      Ошибка создания архива!"
    exit 1
fi

echo "   Копирование на Яндекс.Диск..."
cp "${BACKUP_DIR}/${ARCHIVE_NAME}" "${YADISK_MOUNT}/backup/vaultwarden-backups/"

echo "   Очистка старых бэкапов..."
find "${BACKUP_DIR}" -type f -name "vw_backup_*.tar.gz" -mtime +7 -delete 2>/dev/null
find "${YADISK_MOUNT}/backup/vaultwarden-backups" -type f -name "vw_backup_*.tar.gz" -mtime +30 -delete 2>/dev/null

echo "[${DATE}] Резервное копирование Vaultwarden завершено!"

Инструкция по настройке монтирования Яндекс.Диска

  1. Установить davfs2:
sudo apt install davfs2
  1. Получить пароль приложения:
  • Открыть https://id.yandex.ru/security
  • В разделе "Пароли приложений" создать новый пароль с доступом к WebDAV
  1. Создать точку монтирования и группу:
sudo mkdir -p /mnt/yandex-disk
sudo groupadd davfs2 2>/dev/null || true
sudo usermod -aG davfs2 $USER

Перелогиниться после добавления в группу.

  1. Настроить учетные данные:
sudo nano /etc/davfs2/secrets

Добавить строку (заменить на свои данные):

/mnt/yandex-disk  login@yandex.ru  пароль_приложения

Установить права:

sudo chmod 600 /etc/davfs2/secrets
  1. Добавить в /etc/fstab:
https://webdav.yandex.ru  /mnt/yandex-disk  davfs  _netdev,auto,rw,uid=1000,file_mode=600,dir_mode=700  0  0

Заменить uid=1000 на ваш UID (узнать через id -u).

  1. Смонтировать:
sudo mount /mnt/yandex-disk

Проверка:

mountpoint -q /mnt/yandex-disk && echo "OK" || echo "FAIL"

Настройка регулярного резервного копирования

Для автоматического запуска скрипта ежедневно в 03:00 используется cron.

  1. Открыть crontab для root:
sudo crontab -e
  1. Добавить строку:
0 3 * * * /opt/vw/backup.sh >> /var/log/vw-backup.log 2>&1

Разбор строки:

  • 0 3 * * * - время запуска: 03:00 ежедневно
  • /opt/vw/backup.sh - путь к скрипту
  • >> /var/log/vw-backup.log 2>&1 - перенаправление вывода в лог-файл (stdout и stderr)
  1. Сделать скрипт исполняемым:
sudo chmod +x /opt/vw/backup.sh
  1. Проверить, что cron запущен:
sudo systemctl status cron
  1. Проверить логи после первого запуска:
sudo tail -f /var/log/vw-backup.log

Особенности

  • davfs2 работает медленно на множестве мелких файлов из-за особенностей WebDAV
  • Для бэкапов это приемлемо, так как архив tar.gz представляет собой один файл
  • При проблемах с монтированием проверить: sudo mount -v /mnt/yandex-disk
  • Локальные бэкапы хранятся 7 дней, на Яндекс.Диске - 30 дней
  • Контейнер останавливается на время создания архива для обеспечения целостности SQLite базы данных