Files
vwar.nixg.ru/backup.md
T

148 lines
5.1 KiB
Markdown

```markdown
# Резервное копирование 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:
```bash
sudo apt install davfs2
```
2. Получить пароль приложения:
- Открыть https://id.yandex.ru/security
- В разделе "Пароли приложений" создать новый пароль с доступом к WebDAV
3. Создать точку монтирования и группу:
```bash
sudo mkdir -p /mnt/yandex-disk
sudo groupadd davfs2 2>/dev/null || true
sudo usermod -aG davfs2 $USER
```
Перелогиниться после добавления в группу.
4. Настроить учетные данные:
```bash
sudo nano /etc/davfs2/secrets
```
Добавить строку (заменить на свои данные):
```
/mnt/yandex-disk login@yandex.ru пароль_приложения
```
Установить права:
```bash
sudo chmod 600 /etc/davfs2/secrets
```
5. Добавить в /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`).
6. Смонтировать:
```bash
sudo mount /mnt/yandex-disk
```
Проверка:
```bash
mountpoint -q /mnt/yandex-disk && echo "OK" || echo "FAIL"
```
## Настройка регулярного резервного копирования
Для автоматического запуска скрипта ежедневно в 03:00 используется cron.
1. Открыть crontab для root:
```bash
sudo crontab -e
```
2. Добавить строку:
```
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)
3. Сделать скрипт исполняемым:
```bash
sudo chmod +x /opt/vw/backup.sh
```
4. Проверить, что cron запущен:
```bash
sudo systemctl status cron
```
5. Проверить логи после первого запуска:
```bash
sudo tail -f /var/log/vw-backup.log
```
## Особенности
- davfs2 работает медленно на множестве мелких файлов из-за особенностей WebDAV
- Для бэкапов это приемлемо, так как архив tar.gz представляет собой один файл
- При проблемах с монтированием проверить: `sudo mount -v /mnt/yandex-disk`
- Локальные бэкапы хранятся 7 дней, на Яндекс.Диске - 30 дней
- Контейнер останавливается на время создания архива для обеспечения целостности SQLite базы данных
```