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

300 lines
9.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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