vault backup: 2025-08-09 22:56:15

This commit is contained in:
Andrey Epifancev
2025-08-09 22:56:15 +04:00
parent 7741789246
commit 06f529c8f9

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