#!/bin/bash # Копирование данных Vaultwarden (пароли) из контейнера 103 на диск бэкапов. # Для выгрузки в Yandex — включить каталог в источники restic. # Запускать на хосте Proxmox под root. Использует pct exec. # Результат: /mnt/backup/other/vaultwarden/vaultwarden-data-YYYYMMDD-HHMM.tar.gz set -e export PATH="/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:${PATH:-}" CT_ID=103 REMOTE_PATH="/opt/docker/vaultwarden/data" BACKUP_DIR="/mnt/backup/other/vaultwarden" RETENTION_DAYS=14 if [ "$(id -u)" -ne 0 ]; then echo "Запускайте под root." exit 1 fi # Минимальный размер архива (байт). Пустой tar.gz ≈ 20 байт — значит каталог пуст или путь неверный. MIN_BACKUP_BYTES=512 mkdir -p "$BACKUP_DIR" DATE=$(date +%Y%m%d-%H%M) OUTPUT="$BACKUP_DIR/vaultwarden-data-$DATE.tar.gz" ERR=$(mktemp) trap "rm -f '$ERR'" EXIT pct exec $CT_ID -- tar cf - -C /opt/docker/vaultwarden data 2>"$ERR" | gzip > "$OUTPUT" SIZE_BYTES=$(stat -c%s "$OUTPUT" 2>/dev/null || echo 0) if [ -s "$OUTPUT" ] && [ "$SIZE_BYTES" -ge "$MIN_BACKUP_BYTES" ]; then chmod 600 "$OUTPUT" echo "Создан: $OUTPUT ($(du --apparent-size -h "$OUTPUT" | cut -f1))" else echo "Ошибка: архив пустой или слишком мал (${SIZE_BYTES} байт). Проверьте путь /opt/docker/vaultwarden/data в CT $CT_ID." [ -s "$ERR" ] && cat "$ERR" >&2 rm -f "$OUTPUT" exit 1 fi find "$BACKUP_DIR" -name 'vaultwarden-data-*.tar.gz' -mtime +$RETENTION_DAYS -delete NOTIFY_SCRIPT="${NOTIFY_SCRIPT:-/root/scripts/notify-telegram.sh}" if [ -x "$NOTIFY_SCRIPT" ]; then SIZE=$(du --apparent-size -h "$OUTPUT" | cut -f1) SIZE_BYTES=$(stat -c%s "$OUTPUT" 2>/dev/null || echo 0) BODY="Резервное копирование завершено. Объекты: данные Vaultwarden (пароли). Размер копии: ${SIZE}." [ "$SIZE_BYTES" -lt 10240 ] 2>/dev/null && BODY="${BODY} ⚠️ Подозрительно малый размер — проверьте /opt/docker/vaultwarden/data в CT 103." "$NOTIFY_SCRIPT" "🔐 Vaultwarden" "$BODY" || true fi