#!/bin/bash # Скрипт резервного копирования VESTI (краулер, веб, publisher, медиа, БД, доки) с отправкой на Яндекс.Диск # По образцу /opt/icq/backup.sh (и /opt/netbox/backup.sh) PROJECT_DIR="/opt/vesti" BACKUP_DIR="${PROJECT_DIR}/backups" YADISK_MOUNT="/mnt/yandex-disk" YADISK_TARGET="${YADISK_MOUNT}/backup/vesti-backups" DATE=$(date +%Y%m%d_%H%M%S) # Папки/файлы проекта, которые бэкапим (из /opt/vesti) INCLUDE="db media bundles sources crawler classifier web services publisher scripts openspec .env docker-compose.yml README.md STATUS.md PRD.md TODO.md WALKTHROUGH.md AGENT.MD" mkdir -p ${BACKUP_DIR} echo "🔄 [$(date)] Начинаем резервное копирование VESTI..." # Проверяем, примонтирован ли Яндекс.Диск (не падаем, если нет — копия локально) if timeout 10 mountpoint -q ${YADISK_MOUNT}; then YADISK_UP=1 mkdir -p ${YADISK_TARGET} 2>/dev/null else echo " ⚠️ Яндекс.Диск не примонтирован — копия только локально" YADISK_UP=0 fi # 1. Бэкап проекта одним архивом ARCHIVE="${BACKUP_DIR}/vesti_${DATE}.tar.gz" echo " → Архив проекта..." tar czf ${ARCHIVE} -C ${PROJECT_DIR} ${INCLUDE} 2>/dev/null if [ -s "${ARCHIVE}" ]; then echo " ✅ Архив: $(du -h ${ARCHIVE} | cut -f1)" # Копирование на ЯД только если архив <= 2GiB (больше — вешает davfs/systemd1) archive_size=$(stat -c %s "${ARCHIVE}" 2>/dev/null || echo 0) if [ "${YADISK_UP}" = "1" ] && [ "${archive_size}" -le $((2 * 1024 * 1024 * 1024)) ]; then echo " ☁️ Копирование на Яндекс.Диск..." timeout 3600 cp ${ARCHIVE} ${YADISK_TARGET}/ && echo " ✅ скопирован на ЯД (${YADISK_TARGET}/)" else echo " 📦 архив ${archive_size}B — НЕ копирую на ЯД (>2GiB или ЯД офлайн), остаётся локально" fi else echo " ❌ Ошибка создания архива!" fi # 2. Очистка старых бэкапов # Локально: оставляем 7 дней find ${BACKUP_DIR} -type f -name "vesti_*" -mtime +7 -delete 2>/dev/null # На Яндекс.Диске: оставляем 30 дней (только если смонтирован) if [ "${YADISK_UP}" = "1" ]; then timeout 60 find ${YADISK_TARGET} -type f -name "vesti_*" -mtime +30 -delete 2>/dev/null fi echo "✅ [$(date)] Резервное копирование завершено!" # Показываем список созданных бэкапов echo "" echo "📊 Созданные бэкапы:" ls -lh ${BACKUP_DIR}/vesti_${DATE}.* 2>/dev/null || echo " (нет файлов)"