--- 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 недели*