Files
second-mind-aep/💡 Идеи/💡 Проекты/Second Mind Pipeline/Backup стратегия.md
2025-08-09 22:56:15 +04:00

9.8 KiB
Raw Blame History

created, updated, tags, parent, status, priority
created updated tags parent status priority
2024-12-19 2024-12-19
backup
безопасность
катастрофоустойчивость
автоматизация
Second Mind Pipeline/index планирование высокий

💾 Backup стратегия Second Mind Pipeline

🎯 Цели резервного копирования

Защита от потерь

  • Данные: Git репозитории, заметки, конфигурации
  • Конфигурации: Docker Compose, Nginx, Quartz настройки
  • Состояние: базы данных, пользовательские настройки
  • Секреты: SSH ключи, пароли, токены

Требования восстановления

  • RTO (Recovery Time Objective): <4 часа
  • RPO (Recovery Point Objective): <1 час
  • Тестирование: ежемесячно
  • Документация: пошаговые инструкции

📊 Анализ критичности данных

Критический уровень (Tier 1)

  • Git репозитории - основные данные заметок
  • SSH ключи - доступ к системе
  • Базы данных - метаданные Gitea
  • Конфигурации Docker - настройки сервисов

Важный уровень (Tier 2)

  • Собранные сайты - можно пересобрать
  • Логи системы - для анализа проблем
  • Кеши Nginx - для оптимизации

Вспомогательный уровень (Tier 3)

  • Временные файлы - можно пересоздать
  • Docker образы - скачиваются заново

🔄 Стратегия резервного копирования

3-2-1 Правило

  • 3 копии данных (оригинал + 2 backup)
  • 2 разных типа носителей (локальный + облако)
  • 1 offsite копия (удаленное хранение)

Типы backup'ов

graph TB
    A[Ежедневные инкрементальные] --> B[Еженедельные полные]
    B --> C[Ежемесячные архивные]
    C --> D[Квартальные долгосрочные]
    
    A --> E[Локальное хранение]
    B --> F[Cloud Storage]
    C --> G[External Drive]
    D --> H[Offsite Archive]

🔧 Техническая реализация

1. Автоматизация через Cron

# /etc/crontab - расписание backup'ов
# Ежедневно в 2:00 - инкрементальный backup
0 2 * * * root /opt/scripts/backup-daily.sh

# Еженедельно в воскресенье в 3:00 - полный backup
0 3 * * 0 root /opt/scripts/backup-weekly.sh

# Ежемесячно 1 числа в 4:00 - архивный backup
0 4 1 * * root /opt/scripts/backup-monthly.sh

2. Backup скрипты

backup-daily.sh (инкрементальный)

#!/bin/bash
set -e

BACKUP_DIR="/backups/daily"
DATE=$(date +%Y%m%d)
LOG_FILE="/var/log/backup-daily.log"

echo "[$(date)] Starting daily backup" >> $LOG_FILE

# Git репозитории
rsync -av --link-dest=/backups/daily/latest \
    /DOCKER/second-mind/obsidian_repo/ \
    $BACKUP_DIR/$DATE/git-repo/ >> $LOG_FILE 2>&1

# Конфигурации Docker
rsync -av --link-dest=/backups/daily/latest \
    /DOCKER/second-mind/ \
    $BACKUP_DIR/$DATE/docker-config/ >> $LOG_FILE 2>&1

# База данных Gitea
docker exec second_mind_db pg_dump -U gitea gitea > \
    $BACKUP_DIR/$DATE/gitea-db.sql

# Обновление ссылки latest
rm -f $BACKUP_DIR/latest
ln -s $DATE $BACKUP_DIR/latest

echo "[$(date)] Daily backup completed" >> $LOG_FILE

backup-weekly.sh (полный)

#!/bin/bash
set -e

BACKUP_DIR="/backups/weekly"
DATE=$(date +%Y%m%d)
CLOUD_BUCKET="s3://second-mind-backups"

# Создание полного архива
tar -czf $BACKUP_DIR/second-mind-$DATE.tar.gz \
    /DOCKER/second-mind/ \
    /backups/daily/latest/

# Загрузка в облако
aws s3 cp $BACKUP_DIR/second-mind-$DATE.tar.gz \
    $CLOUD_BUCKET/weekly/

# Очистка старых backup'ов (старше 8 недель)
find $BACKUP_DIR -name "*.tar.gz" -mtime +56 -delete

3. Cloud Storage интеграция

AWS S3 конфигурация

# ~/.aws/config
[default]
region = eu-west-1
output = json

# ~/.aws/credentials
[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY

Rclone для альтернативных облаков

# Настройка rclone для Yandex.Disk/Google Drive
rclone config

# Синхронизация с облаком
rclone sync /backups/weekly/ yandex:SecondMind/backups/

📱 Мониторинг backup'ов

Health checks

#!/bin/bash
# backup-monitor.sh

LAST_BACKUP=$(ls -t /backups/daily/ | head -1)
BACKUP_AGE=$((($(date +%s) - $(date -d $LAST_BACKUP +%s)) / 3600))

if [ $BACKUP_AGE -gt 25 ]; then
    # Отправка алерта в Telegram
    curl -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
        -d chat_id=$CHAT_ID \
        -d text="🚨 Backup устарел! Последний backup: $LAST_BACKUP"
fi

Размер backup'ов

# Мониторинг размера backup'ов
du -sh /backups/daily/latest/ | awk '{print "📊 Размер daily backup: " $1}'
du -sh /backups/weekly/ | awk '{print "📊 Размер weekly backups: " $1}'

🔒 Безопасность backup'ов

Шифрование

# Шифрование backup'а перед отправкой в облако
gpg --cipher-algo AES256 --compress-algo 2 --symmetric \
    --output backup-encrypted.tar.gz.gpg backup.tar.gz

# Расшифрование
gpg --decrypt backup-encrypted.tar.gz.gpg > backup.tar.gz

Ротация паролей

  • Ежемесячная смена ключей шифрования
  • Разные ключи для разных типов backup'ов
  • Хранение ключей в отдельном защищенном хранилище

🚨 Процедуры восстановления

Сценарий 1: Восстановление отдельного сервиса

# Остановка поврежденного контейнера
docker-compose stop gitea

# Восстановление данных
rsync -av /backups/daily/latest/docker-config/ /DOCKER/second-mind/

# Запуск сервиса
docker-compose up -d gitea

Сценарий 2: Полное восстановление системы

# 1. Установка Docker на новом сервере
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

# 2. Восстановление конфигураций
tar -xzf second-mind-backup.tar.gz -C /

# 3. Восстановление данных
docker-compose up -d db
docker exec -i second_mind_db psql -U gitea gitea < gitea-db.sql

# 4. Запуск всех сервисов
docker-compose up -d

Сценарий 3: Точечное восстановление Git репозитория

# Восстановление конкретного commit'а
cd /DOCKER/second-mind/obsidian_repo
git reset --hard COMMIT_HASH

# Или восстановление из backup'а
rsync -av /backups/daily/YYYYMMDD/git-repo/ ./

📋 Чеклист внедрения

Фаза 1: Базовая автоматизация

  • Создать директории для backup'ов
  • Написать скрипты ежедневного backup'а
  • Настроить cron задачи
  • Протестировать восстановление

Фаза 2: Облачное хранение

  • Настроить AWS S3 или альтернативу
  • Добавить еженедельные full backup'ы
  • Настроить шифрование
  • Автоматизировать очистку старых backup'ов

Фаза 3: Мониторинг и алерты

  • Добавить мониторинг backup'ов
  • Настроить алерты в Telegram
  • Создать dashboard в Grafana
  • Документировать процедуры восстановления

Фаза 4: Disaster Recovery

  • Протестировать полное восстановление
  • Создать offsite копии
  • Автоматизировать проверку целостности
  • Провести drill восстановления

💰 Оценка затрат

Хранение

  • Локальное: 100GB SSD (~$20)
  • AWS S3: 50GB (~$1.15/месяц)
  • Bandwidth: ~$0.50/месяц

Время

  • Настройка: 8-12 часов
  • Поддержка: 2 часа/месяц
  • Тестирование: 4 часа/квартал

🎯 Метрики успеха

KPI backup'ов

  • Успешность: >99% успешных backup'ов
  • Время выполнения: <30 минут для daily
  • Размер: <500MB для daily, <2GB для weekly
  • Время восстановления: <4 часа для полного

Тестирование

  • Ежемесячно: восстановление отдельных файлов
  • Ежеквартально: полное восстановление на тестовом сервере
  • Ежегодно: disaster recovery drill

Связано с: Second Mind Pipeline/index Приоритет: Высокий | Срок: 3 недели