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