infra/scripts/archive-logs.sh
#!/bin/bash
# ═══════════════════════════════════════════════════════════════════════════════
# АРХИВИРОВАНИЕ ЛОГОВ
# Еженедельное архивирование логов старше 7 дней
# ═══════════════════════════════════════════════════════════════════════════════
#
# Версия: 1.0.0
# Дата: 2026-02-14
#
# ПРАВИЛО:
# - Логи за последнюю неделю (0-7 дней) → оставляем в /var/log
# - Логи старше недели (>7 дней) → архивируем в S3
#
# РАСПИСАНИЕ: Еженедельно (воскресенье 03:00)
# ЗАПУСК: Через system/scheduler (НЕ cron!)
#
# ═══════════════════════════════════════════════════════════════════════════════

# Загрузка переменных платформы
source /opt/claude-workspace/system/config/platform-vars.sh 2>/dev/null || true

set -e

# ═══════════════════════════════════════════════════════════════════════════════
# КОНФИГУРАЦИЯ
# ═══════════════════════════════════════════════════════════════════════════════

# Переменные окружения (с дефолтами для совместимости)
INFRA=${INFRA:-/mnt/beget-infra}
ARCHIVE_DIR="$INFRA/logs/archive"
LOG_DIR="/var/log"

# Параметры
DAYS_TO_KEEP=7              # Хранить логи за последние 7 дней
DATE_ARCHIVE=$(date +%Y-%m)  # Архив по месяцам (2026-02)

# Telegram уведомления (опционально)
NOTIFY=${NOTIFY:-false}

# ═══════════════════════════════════════════════════════════════════════════════
# ФУНКЦИИ
# ═══════════════════════════════════════════════════════════════════════════════

log() {
  echo "[$(date +'%Y-%m-%d %H:%M:%S')] $*"
}

error() {
  echo "[$(date +'%Y-%m-%d %H:%M:%S')] ERROR: $*" >&2
}

notify_telegram() {
  if [ "$NOTIFY" = "true" ] && [ -f "$WORKSPACE/library/connectors/api/telegram/notify.sh" ]; then
    bash "$WORKSPACE/library/connectors/api/telegram/notify.sh" "$1"
  fi
}

# ═══════════════════════════════════════════════════════════════════════════════
# ОСНОВНАЯ ЛОГИКА
# ═══════════════════════════════════════════════════════════════════════════════

main() {
  log "Начало архивирования логов"
  log "Параметры:"
  log "  - Хранить последние: $DAYS_TO_KEEP дней"
  log "  - Архив: $ARCHIVE_DIR/$DATE_ARCHIVE/"

  # Создать структуру архива
  mkdir -p "$ARCHIVE_DIR/$DATE_ARCHIVE"

  # Счетчики
  local archived_count=0
  local archived_size=0

  # Найти логи старше $DAYS_TO_KEEP дней
  log "Поиск логов старше $DAYS_TO_KEEP дней..."

  # Архивировать rotated логи (.1, .2, .gz и т.д.)
  while IFS= read -r logfile; do
    if [ -f "$logfile" ]; then
      local basename=$(basename "$logfile")
      local size=$(du -sh "$logfile" | cut -f1)

      # Копировать в архив (если еще не там)
      if [ ! -f "$ARCHIVE_DIR/$DATE_ARCHIVE/$basename" ]; then
        cp "$logfile" "$ARCHIVE_DIR/$DATE_ARCHIVE/"
        log "  ✅ Архивирован: $basename ($size)"
        ((archived_count++))
      fi

      # Удалить оригинал
      rm -f "$logfile"
    fi
  done < <(find "$LOG_DIR" -type f \( \
    -name "*.log.*" -o \
    -name "*.gz" -o \
    -name "*.1" -o \
    -name "*.2" -o \
    -name "*.3" -o \
    -name "*.4" \) \
    -mtime +$DAYS_TO_KEEP 2>/dev/null)

  # Подсчитать размер архива
  archived_size=$(du -sh "$ARCHIVE_DIR/$DATE_ARCHIVE" 2>/dev/null | cut -f1 || echo "0")

  # Отчет
  log "Завершено:"
  log "  - Файлов архивировано: $archived_count"
  log "  - Размер архива: $archived_size"
  log "  - Расположение: $ARCHIVE_DIR/$DATE_ARCHIVE/"

  # Уведомление
  if [ $archived_count -gt 0 ]; then
    notify_telegram "📦 Логи архивированы: $archived_count файлов ($archived_size)"
  fi

  # Очистка журналов systemd (ограничить 500MB)
  log "Очистка журналов systemd..."
  journalctl --vacuum-size=500M 2>&1 | grep -E "freed|Vacuuming" || true

  log "Архивирование завершено"
  return 0
}

# ═══════════════════════════════════════════════════════════════════════════════
# ПРОВЕРКА ПЕРЕД ЗАПУСКОМ
# ═══════════════════════════════════════════════════════════════════════════════

# Проверить что INFRA примонтирован
if ! mountpoint -q "$INFRA"; then
  error "INFRA не примонтирован: $INFRA"
  error "Запустите: systemctl start infra-mount.service"
  exit 1
fi

# Проверить права
if [ "$(id -u)" -ne 0 ]; then
  error "Требуются права root"
  exit 1
fi

# ═══════════════════════════════════════════════════════════════════════════════
# ЗАПУСК
# ═══════════════════════════════════════════════════════════════════════════════

main "$@"