diff --git a/💡 Идеи/💡 Проекты/Second Mind Pipeline/Backup стратегия.md b/💡 Идеи/💡 Проекты/Second Mind Pipeline/Backup стратегия.md new file mode 100644 index 0000000..bcc9094 --- /dev/null +++ b/💡 Идеи/💡 Проекты/Second Mind Pipeline/Backup стратегия.md @@ -0,0 +1,299 @@ +--- +created: 2024-12-19 +updated: 2024-12-19 +tags: + - backup + - безопасность + - катастрофоустойчивость + - автоматизация +parent: "[[Second Mind Pipeline/index|Second Mind Pipeline]]" +status: "планирование" +priority: "высокий" +--- + +# 💾 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'ов +```mermaid +graph TB + A[Ежедневные инкрементальные] --> B[Еженедельные полные] + B --> C[Ежемесячные архивные] + C --> D[Квартальные долгосрочные] + + A --> E[Локальное хранение] + B --> F[Cloud Storage] + C --> G[External Drive] + D --> H[Offsite Archive] +``` + +## 🔧 Техническая реализация + +### 1. Автоматизация через Cron +```bash +# /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 (инкрементальный) +```bash +#!/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 (полный) +```bash +#!/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 конфигурация +```bash +# ~/.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 для альтернативных облаков +```bash +# Настройка rclone для Yandex.Disk/Google Drive +rclone config + +# Синхронизация с облаком +rclone sync /backups/weekly/ yandex:SecondMind/backups/ +``` + +## 📱 Мониторинг backup'ов + +### Health checks +```bash +#!/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'ов +```bash +# Мониторинг размера backup'ов +du -sh /backups/daily/latest/ | awk '{print "📊 Размер daily backup: " $1}' +du -sh /backups/weekly/ | awk '{print "📊 Размер weekly backups: " $1}' +``` + +## 🔒 Безопасность backup'ов + +### Шифрование +```bash +# Шифрование 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: Восстановление отдельного сервиса +```bash +# Остановка поврежденного контейнера +docker-compose stop gitea + +# Восстановление данных +rsync -av /backups/daily/latest/docker-config/ /DOCKER/second-mind/ + +# Запуск сервиса +docker-compose up -d gitea +``` + +### Сценарий 2: Полное восстановление системы +```bash +# 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 репозитория +```bash +# Восстановление конкретного 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 недели*