#!/usr/bin/env bash
# ============================================================================
# Off-site бэкап Vaultwarden: VPS 46.17.99.183 → ragserver 192.168.1.200
# ============================================================================
# Задача 17. Синхронизирует локальные GPG-архивы `/opt/vaultwarden/backups/*.gpg`
# в ragserver через SSH+VPN (AmneziaWG, ragserver = 10.8.1.12).
#
# Ставится на VPS: /opt/vaultwarden/backups/offsite.sh
# Cron: 03:35 (через 20 мин после локального backup.sh 03:15)
#
# Требования:
#   - SSH-ключ VPS root -> oswold@ragserver, без пароля
#   - На ragserver: /home/oswold/backups/vaultwarden/, chmod 700, chown oswold
#   - Vaultwarden VPN peer настроен (10.8.1.1 VPS ↔ 10.8.1.12 ragserver)
#
# Что делает:
#   1. rsync --delete всех *.gpg на ragserver (только новые/изменённые)
#   2. Retention на ragserver: 90 дней (втрое больше локального 30)
#   3. Логирует размер и число архивов
#   4. Всё в /var/log/vaultwarden-offsite.log
# ============================================================================

set -euo pipefail

# --- Config ---
SRC="/opt/vaultwarden/backups/"
REMOTE_USER="oswold"
REMOTE_HOST="10.8.1.12"          # ragserver через AmneziaWG
REMOTE_DIR="/home/oswold/backups/vaultwarden"
LOG="/var/log/vaultwarden-offsite.log"
RETENTION_DAYS=90

# --- Helpers ---
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG"
}

# --- 1. Проверки ---
[[ -d "$SRC" ]] || { log "FATAL: $SRC не существует"; exit 1; }

# --- 2. Проверить достижимость ragserver ---
if ! ping -c 1 -W 3 "$REMOTE_HOST" >/dev/null 2>&1; then
    log "FATAL: $REMOTE_HOST не пингуется. VPN AmneziaWG упал?"
    exit 2
fi

# --- 3. Проверить что удалённая директория готова ---
if ! ssh -o ConnectTimeout=5 -o BatchMode=yes "${REMOTE_USER}@${REMOTE_HOST}" \
        "test -d '$REMOTE_DIR' && test -w '$REMOTE_DIR'" 2>>"$LOG"; then
    log "FATAL: $REMOTE_DIR на $REMOTE_HOST не готова (не существует или нет прав)"
    exit 3
fi

# --- 4. rsync только .gpg файлов ---
log "Старт rsync ${SRC}*.gpg → ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/"

rsync -avz --delete \
    --include='*.gpg' \
    --exclude='*' \
    -e "ssh -o ConnectTimeout=10 -o BatchMode=yes" \
    "$SRC" "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/" 2>&1 | tee -a "$LOG"

# --- 5. Retention на remote (90 дней) ---
log "Retention: удаляю бэкапы старше $RETENTION_DAYS дней на ragserver"
ssh -o BatchMode=yes "${REMOTE_USER}@${REMOTE_HOST}" \
    "find '$REMOTE_DIR' -name '*.gpg' -mtime +${RETENTION_DAYS} -delete -print" 2>&1 | tee -a "$LOG"

# --- 6. Отчёт ---
REMOTE_COUNT=$(ssh -o BatchMode=yes "${REMOTE_USER}@${REMOTE_HOST}" \
    "find '$REMOTE_DIR' -name '*.gpg' | wc -l")
REMOTE_SIZE=$(ssh -o BatchMode=yes "${REMOTE_USER}@${REMOTE_HOST}" \
    "du -sh '$REMOTE_DIR' | cut -f1")

log "OK: на ragserver сейчас $REMOTE_COUNT архивов, суммарно $REMOTE_SIZE"
log "======================================================================"
