vault backup: 2025-08-09 22:56:15
This commit is contained in:
299
💡 Идеи/💡 Проекты/Second Mind Pipeline/Backup стратегия.md
Normal file
299
💡 Идеи/💡 Проекты/Second Mind Pipeline/Backup стратегия.md
Normal file
@@ -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 недели*
|
||||||
Reference in New Issue
Block a user