infra/scripts/backup.sh
#!/bin/bash
# ═══════════════════════════════════════════════════════════
# Главный скрипт бэкапов
# ═══════════════════════════════════════════════════════════
#
# Использование:
#   ./backup.sh              # Полный бэкап (db + etc)
#   ./backup.sh --db         # Только БД
#   ./backup.sh --etc        # Только конфиги
#   ./backup.sh --check      # Проверить статус бэкапов
#
# ═══════════════════════════════════════════════════════════

# Загрузка переменных платформы
source /opt/claude-workspace/system/config/platform-vars.sh 2>/dev/null || {
    DATASPACE=${DATASPACE:-/mnt/beget-s3}
}

set -e

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BACKUP_DIR="$DATASPACE/backups"

# Цвета
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

log() {
    echo -e "${BLUE}[BACKUP]${NC} $1"
}

header() {
    echo ""
    echo -e "${YELLOW}═══════════════════════════════════════════${NC}"
    echo -e "${YELLOW} $1${NC}"
    echo -e "${YELLOW}═══════════════════════════════════════════${NC}"
    echo ""
}

# Проверка статуса бэкапов
check_status() {
    header "Статус бэкапов"

    echo "Директория: $BACKUP_DIR"
    echo ""

    if [ ! -d "$BACKUP_DIR" ]; then
        echo -e "${RED}Директория не существует!${NC}"
        exit 1
    fi

    echo "=== БД ==="
    if [ -d "$BACKUP_DIR/db" ]; then
        LATEST_DB=$(find "$BACKUP_DIR/db" -name "*.sql.gz" -type f -printf '%T@ %p\n' 2>/dev/null | sort -n | tail -1 | cut -d' ' -f2-)
        if [ -n "$LATEST_DB" ]; then
            AGE=$(( ($(date +%s) - $(stat -c %Y "$LATEST_DB")) / 3600 ))
            SIZE=$(du -h "$LATEST_DB" | cut -f1)
            echo -e "  Последний: $(basename "$LATEST_DB")"
            echo -e "  Возраст: ${AGE}ч"
            echo -e "  Размер: $SIZE"
        else
            echo -e "  ${RED}Нет бэкапов${NC}"
        fi
    else
        echo -e "  ${RED}Директория не существует${NC}"
    fi

    echo ""
    echo "=== Конфиги ==="
    if [ -d "$BACKUP_DIR/etc" ]; then
        LATEST_ETC=$(find "$BACKUP_DIR/etc" -name "etc_*.tar.gz" -type f -printf '%T@ %p\n' 2>/dev/null | sort -n | tail -1 | cut -d' ' -f2-)
        if [ -n "$LATEST_ETC" ]; then
            AGE=$(( ($(date +%s) - $(stat -c %Y "$LATEST_ETC")) / 3600 ))
            SIZE=$(du -h "$LATEST_ETC" | cut -f1)
            echo -e "  Последний: $(basename "$LATEST_ETC")"
            echo -e "  Возраст: ${AGE}ч"
            echo -e "  Размер: $SIZE"
        else
            echo -e "  ${RED}Нет бэкапов${NC}"
        fi
    else
        echo -e "  ${RED}Директория не существует${NC}"
    fi

    echo ""
    echo "=== Общий размер ==="
    du -sh "$BACKUP_DIR"/* 2>/dev/null || echo "  Пусто"
}

# Бэкап БД
backup_db() {
    header "Бэкап PostgreSQL"
    bash "$SCRIPT_DIR/backup_db.sh"
}

# Бэкап конфигов
backup_etc() {
    header "Бэкап конфигураций"
    bash "$SCRIPT_DIR/backup_etc.sh"
}

# Полный бэкап
backup_full() {
    log "Запуск полного бэкапа..."
    backup_db
    backup_etc

    header "Готово"
    check_status
}

# Разбор аргументов
case "${1:-}" in
    --db)
        backup_db
        ;;
    --etc)
        backup_etc
        ;;
    --check)
        check_status
        ;;
    --help|-h)
        echo "Использование: $0 [--db|--etc|--check|--help]"
        echo ""
        echo "  --db     Бэкап только PostgreSQL"
        echo "  --etc    Бэкап только конфигов"
        echo "  --check  Показать статус бэкапов"
        echo "  (пусто)  Полный бэкап"
        ;;
    *)
        backup_full
        ;;
esac