#!/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 "$@"