💾 Вариант 1: Локальные бэкапы с ротацией (базовый)¶
Автоматизированное резервное копирование данных Vaultwarden с хранением архивов и очисткой устаревших файлов.
- Останавливает контейнер для консистентности БД
- Создаёт сжатый архив с данными
- Запускает контейнер обратно
- Удаляет бэкапы старше заданного периода
- Ведёт логирование всех операций
1️⃣ Создайте скрипт бэкапа¶
sudo nano /usr/local/bin/vaultwarden-backup.sh
Вставьте содержимое:
#!/bin/bash
# Vaultwarden Backup Script
# Резервное копирование данных Vaultwarden
set -e # Выход при ошибке
=== НАСТРОЙКИ ===¶
SOURCE_DIR="/root/vaultwarden/data" # Источник данных
BACKUP_DIR="/root/vaultwarden/backups" # Куда сохранять бэкапы
RETENTION_DAYS=30 # Сколько дней хранить бэкапы
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="vaultwarden_backup_${TIMESTAMP}.tar.gz"
LOG_FILE="/var/log/vaultwarden-backup.log"
Создаем папку для бэкапов если нет¶
mkdir -p "$BACKUP_DIR"
Логирование¶
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
log "=== Начало бэкапа ==="
Останавливаем контейнер для консистентности БД (опционально, но рекомендуется)¶
log "Остановка контейнера vaultwarden..."
docker stop vaultwarden 2>/dev/null || true
Создаем архив¶
log "Создание архива: $BACKUP_FILE"
tar -czf "${BACKUP_DIR}/${BACKUP_FILE}" -C "$(dirname "$SOURCE_DIR")" "$(basename "$SOURCE_DIR")"
Запускаем контейнер обратно¶
log "Запуск контейнера vaultwarden..."
docker start vaultwarden 2>/dev/null || true
Удаляем старые бэкапы¶
log "Удаление бэкапов старше $RETENTION_DAYS дней..."
find "$BACKUP_DIR" -name "vaultwarden_backup_*.tar.gz" -type f -mtime +$RETENTION_DAYS -delete -print | tee -a "$LOG_FILE"
Показываем размер и список бэкапов¶
log "Размер нового бэкапа: $(du -h "${BACKUP_DIR}/${BACKUP_FILE}" | cut -f1)"
log "Бэкапы в хранилище:"
ls -lh "$BACKUP_DIR"/*.tar.gz 2>/dev/null | tee -a "$LOG_FILE"
log "=== Бэкап завершен успешно ==="
2️⃣ Сделайте скрипт исполняемым¶
sudo chmod +x /usr/local/bin/vaultwarden-backup.sh
3️⃣ Протестируйте вручную¶
sudo /usr/local/bin/vaultwarden-backup.sh
Проверьте, что файл появился:
ls -lh /root/vaultwarden/backups/
total 1.2M
-rw-r--r-- 1 root root 1.2M Jun 22 03:00 vaultwarden_backup_20260622_030001.tar.gz
4️⃣ Настройте автоматизацию через Cron¶
Откройте crontab root-пользователя:
sudo crontab -e
Добавьте строку для ежедневного бэкапа в 3:00 ночи:
0 3 * * * /usr/local/bin/vaultwarden-backup.sh
-
0 2 * * 0— каждое воскресенье в 2:00 -
0 */6 * * *— каждые 6 часов -
30 4 1 * *— 1-го числа каждого месяца в 4:30
❓ Почему с остановкой контейнера?¶
🔧 Полезные команды для управления бэкапами¶
# Просмотр логов бэкапа
tail -f /var/log/vaultwarden-backup.log
Ручной запуск бэкапа с выводом в реальном времени¶
sudo /usr/local/bin/vaultwarden-backup.sh
Проверка статуса cron-задачи¶
sudo systemctl status cron
Тестовый прогон cron (сухой запуск)¶
sudo run-parts --test /etc/cron.daily
Восстановление из бэкапа (пример)¶
tar -xzf /root/vaultwarden/backups/vaultwarden_backup_20260622_030001.tar.gz -C /root/vaultwarden/
🗂️ Структура после настройки¶
/root/vaultwarden/
├── data/ # Рабочие данные Vaultwarden
├── backups/ # Папка для архивов
│ ├── vaultwarden_backup_20260620_030001.tar.gz
│ ├── vaultwarden_backup_20260621_030001.tar.gz
│ └── vaultwarden_backup_20260622_030001.tar.gz ← последний
├── docker-compose.yml
└── ...
/var/log/
└── vaultwarden-backup.log # Лог-файл скрипта
🔄 Альтернатива: бэкап без остановки контейнера¶
Если простой сервиса недопустим, можно использовать docker exec для копирования "на лету":
# Заменить секцию остановки/запуска контейнера на:
log "Копирование данных без остановки..."
docker exec vaultwarden tar -czf - /data > "${BACKUP_DIR}/${BACKUP_FILE}"
⚠️ Используйте этот метод только если понимаете риски: при активной записи в БД архив может быть неполным.
Обновлено Redmine Admin 5 месяца назад · 1 изменени(я, ий)