architect/_archive/2025-11-09-marketplace-old/marketplace-mvp/BACKUP.md

💾 BACKUP - Стратегия резервного копирования

Проект: Marketplace MVP (mp1)
Последнее обновление: 2025-11-08


📑 СОДЕРЖАНИЕ

  1. Стратегия бэкапов
  2. Что бэкапим
  3. Расписание
  4. Хранение
  5. Восстановление
  6. Тестирование
  7. Автоматизация

🎯 СТРАТЕГИЯ БЭКАПОВ {#стратегия-бэкапов}

Принцип 3-2-1

RTO и RPO

RTO (Recovery Time Objective): 1 час
- Сколько времени допустимо на восстановление
- Например: 1 час, 4 часа, 1 день

RPO (Recovery Point Objective): 1 час
- Сколько данных можем потерять
- Например: 1 час данных, 1 день данных


📦 ЧТО БЭКАПИМ {#что-бэкапим}

База данных (критично!)

# PostgreSQL
DATABASE_NAME=mp1_db
BACKUP_PATH=/backup/postgresql/

# Что включено:
- Все таблицы
- Indexes
- Sequences
- Stored procedures

Код приложения

APPLICATION_PATH=/opt/Marketplace MVP (mp1)/
BACKUP_PATH=/backup/application/

# Что включено:
- Весь код
- Конфигурационные файлы
- .env (зашифрованно!)

Пользовательские файлы

UPLOADS_PATH=/opt/Marketplace MVP (mp1)/uploads/
BACKUP_PATH=/backup/uploads/

# Что включено:
- Загруженные файлы пользователей
- Медиа
- Документы

Конфигурация системы

# Nginx
/etc/nginx/sites-available/Marketplace MVP (mp1)

# Systemd
/etc/systemd/system/Marketplace MVP (mp1).service

# Cron
crontab -l > /backup/system/crontab.txt

📅 РАСПИСАНИЕ {#расписание}

Полный бэкап (Full)

Когда: Каждую неделю (воскресенье, 02:00)

Что: Всё (БД + код + файлы + конфиги)

Retention: 4 недели (хранить 4 последних)

# Cron
0 2 * * 0 /opt/Marketplace MVP (mp1)/scripts/backup-full.sh

Инкрементальный бэкап (БД)

Когда: Каждый день (04:00)

Что: Только БД

Retention: 30 дней

# Cron
0 4 * * * /opt/Marketplace MVP (mp1)/scripts/backup-db.sh

Моментальный снимок (перед изменениями)

Когда: Перед каждым обновлением

Что: БД + код

Retention: 7 дней

# Вручную перед deploy
./scripts/backup-snapshot.sh

💿 ХРАНЕНИЕ {#хранение}

Локальное хранилище (Primary)

BACKUP_DIR=/backup/

Структура:
/backup/
├── postgresql/
│   ├── daily/
│      ├── db_20251108.sql.gz
│      └── ...
│   └── weekly/
│       ├── db_20251103_full.sql.gz
│       └── ...
├── application/
│   └── app_20251103.tar.gz
└── uploads/
    └── uploads_20251103.tar.gz

Права доступа:

chmod 700 /backup
chown claude-helper:claude-helper /backup

Удалённое хранилище (Offsite)

Вариант 1: Другой сервер

REMOTE_SERVER=backup-server.example.com
REMOTE_PATH=/backup-storage/Marketplace MVP (mp1)/

# Rsync
rsync -avz /backup/ user@backup-server:/backup-storage/Marketplace MVP (mp1)/

Вариант 2: S3 (AWS/MinIO)

S3_BUCKET=s3://backups/Marketplace MVP (mp1)/

# AWS CLI
aws s3 sync /backup/ s3://backups/Marketplace MVP (mp1)/

Вариант 3: Облако (Google Drive, Dropbox)

# rclone
rclone sync /backup/ gdrive:Marketplace MVP (mp1)-backups/

Шифрование бэкапов

# Зашифровать backup (GPG)
gpg --symmetric --cipher-algo AES256 backup.tar.gz
# Создаст backup.tar.gz.gpg

# Расшифровать
gpg backup.tar.gz.gpg

♻️ ВОССТАНОВЛЕНИЕ {#восстановление}

Восстановление БД

#!/bin/bash
# scripts/restore-db.sh

BACKUP_FILE=$1

if [ -z "$BACKUP_FILE" ]; then
    echo "Usage: ./restore-db.sh /backup/postgresql/db_20251108.sql.gz"
    exit 1
fi

# 1. Остановить приложение
systemctl stop Marketplace MVP (mp1)

# 2. Создать backup текущей БД (на всякий случай)
sudo -u postgres pg_dump mp1_db > /tmp/backup_before_restore.sql

# 3. Восстановить
gunzip < $BACKUP_FILE | sudo -u postgres psql mp1_db

# 4. Запустить приложение
systemctl start Marketplace MVP (mp1)

# 5. Проверить
curl http://localhost:8501/health

echo "Restore completed!"

Использование:

chmod +x scripts/restore-db.sh
./scripts/restore-db.sh /backup/postgresql/daily/db_20251108.sql.gz

Восстановление приложения

#!/bin/bash
# scripts/restore-app.sh

BACKUP_FILE=$1

# 1. Остановить
systemctl stop Marketplace MVP (mp1)

# 2. Сохранить текущую версию
mv /opt/Marketplace MVP (mp1) /opt/Marketplace MVP (mp1).old

# 3. Восстановить
tar -xzf $BACKUP_FILE -C /opt/

# 4. Запустить
systemctl start Marketplace MVP (mp1)

echo "Application restored!"

Полное восстановление (Disaster Recovery)

Сценарий: Сервер полностью потерян

Шаги:

# 1. Новый сервер с чистой ОС
# 2. Установить зависимости
apt update
apt install -y postgresql nginx python3 python3-venv

# 3. Скачать последний full backup
scp backup-server:/backup/Marketplace MVP (mp1)/weekly/latest.tar.gz /tmp/

# 4. Распаковать
tar -xzf /tmp/latest.tar.gz -C /

# 5. Восстановить БД
gunzip < /backup/postgresql/weekly/db_latest.sql.gz | sudo -u postgres psql mp1_db

# 6. Восстановить конфиги
cp /backup/system/nginx.conf /etc/nginx/sites-available/Marketplace MVP (mp1)
cp /backup/system/Marketplace MVP (mp1).service /etc/systemd/system/

# 7. Запустить
systemctl daemon-reload
systemctl enable Marketplace MVP (mp1)
systemctl start Marketplace MVP (mp1)
systemctl enable nginx
systemctl start nginx

# 8. Проверить
curl https://mp1.local/health

✅ ТЕСТИРОВАНИЕ {#тестирование}

Ежемесячный тест восстановления

Когда: 1-го числа каждого месяца

Цель: Убедиться что бэкапы рабочие

Процедура:

# 1. Поднять тестовый контейнер
docker run -d --name test-restore -p 5433:5432 postgres:15

# 2. Восстановить последний бэкап
gunzip < /backup/postgresql/daily/latest.sql.gz | docker exec -i test-restore psql -U postgres

# 3. Проверить данные
docker exec test-restore psql -U postgres -c "SELECT count(*) FROM orders;"

# 4. Удалить тестовый контейнер
docker rm -f test-restore

# 5. Записать результат
echo "$(date): Backup test PASSED" >> /var/log/backup-tests.log

Критерии успеха:
- ✅ Бэкап восстанавливается без ошибок
- ✅ Данные корректные (количество записей совпадает)
- ✅ Время восстановления < RTO

Disaster Recovery Drill

Когда: Раз в квартал

Цель: Проверить полное восстановление

Шаги: См. "Полное восстановление" выше


🤖 АВТОМАТИЗАЦИЯ {#автоматизация}

Скрипт: backup-db.sh

#!/bin/bash
# scripts/backup-db.sh

set -e

DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR=/backup/postgresql/daily
DB_NAME=mp1_db
RETENTION_DAYS=30

# Создать папку если нет
mkdir -p $BACKUP_DIR

# Backup
sudo -u postgres pg_dump $DB_NAME | gzip > $BACKUP_DIR/db_$DATE.sql.gz

# Проверить что backup создан
if [ ! -f "$BACKUP_DIR/db_$DATE.sql.gz" ]; then
    echo "ERROR: Backup failed!"
    # Отправить алерт
    exit 1
fi

# Удалить старые бэкапы (старше 30 дней)
find $BACKUP_DIR -name "db_*.sql.gz" -mtime +$RETENTION_DAYS -delete

# Log
echo "$(date): Backup completed: db_$DATE.sql.gz" >> /var/log/backup.log

# Отправить на remote сервер (опционально)
# rsync -avz $BACKUP_DIR/db_$DATE.sql.gz backup-server:/backup/Marketplace MVP (mp1)/

echo "Backup completed successfully!"

Установка:

chmod +x /opt/Marketplace MVP (mp1)/scripts/backup-db.sh

Скрипт: backup-full.sh

#!/bin/bash
# scripts/backup-full.sh

set -e

DATE=$(date +%Y%m%d)
BACKUP_DIR=/backup/weekly
PROJECT_DIR=/opt/Marketplace MVP (mp1)
DB_NAME=mp1_db

mkdir -p $BACKUP_DIR

# 1. Backup БД
sudo -u postgres pg_dump $DB_NAME | gzip > /tmp/db_$DATE.sql.gz

# 2. Backup приложения (без venv)
tar --exclude='venv' --exclude='*.pyc' --exclude='__pycache__' \
    -czf /tmp/app_$DATE.tar.gz $PROJECT_DIR

# 3. Backup конфигов
mkdir -p /tmp/configs_$DATE
cp /etc/nginx/sites-available/Marketplace MVP (mp1) /tmp/configs_$DATE/
cp /etc/systemd/system/Marketplace MVP (mp1).service /tmp/configs_$DATE/
crontab -l > /tmp/configs_$DATE/crontab.txt
tar -czf /tmp/configs_$DATE.tar.gz -C /tmp configs_$DATE

# 4. Объединить всё
mkdir -p /tmp/full_backup_$DATE
mv /tmp/db_$DATE.sql.gz /tmp/full_backup_$DATE/
mv /tmp/app_$DATE.tar.gz /tmp/full_backup_$DATE/
mv /tmp/configs_$DATE.tar.gz /tmp/full_backup_$DATE/

tar -czf $BACKUP_DIR/full_backup_$DATE.tar.gz -C /tmp full_backup_$DATE

# 5. Очистка
rm -rf /tmp/full_backup_$DATE /tmp/configs_$DATE

# 6. Retention (хранить 4 недели)
find $BACKUP_DIR -name "full_backup_*.tar.gz" -mtime +28 -delete

# 7. Отправить offsite
# rsync -avz $BACKUP_DIR/full_backup_$DATE.tar.gz backup-server:/backup/

echo "Full backup completed: full_backup_$DATE.tar.gz"

Crontab конфигурация

# crontab -e

# Ежедневный backup БД (04:00)
0 4 * * * /opt/Marketplace MVP (mp1)/scripts/backup-db.sh >> /var/log/backup.log 2>&1

# Еженедельный full backup (воскресенье, 02:00)
0 2 * * 0 /opt/Marketplace MVP (mp1)/scripts/backup-full.sh >> /var/log/backup.log 2>&1

# Проверка места на диске (ежедневно, 05:00)
0 5 * * * df -h /backup | mail -s "Backup disk usage" admin@example.com

Мониторинг бэкапов

#!/bin/bash
# scripts/check-backups.sh

# Проверить что есть свежий backup (< 25 часов)
LATEST_BACKUP=$(find /backup/postgresql/daily -name "db_*.sql.gz" -mtime -1 | wc -l)

if [ $LATEST_BACKUP -eq 0 ]; then
    echo "WARNING: No fresh backup found!"
    # Отправить алерт
    # telegram-send "⚠️ Marketplace MVP (mp1): No backup in 24 hours!"
    exit 1
fi

echo "✅ Fresh backup exists"

📋 CHECKLIST

Ежедневно

Еженедельно

Ежемесячно

Ежеквартально


🆘 EMERGENCY CONTACTS

В случае потери данных:

  1. Не паниковать!
  2. Немедленно остановить приложение (чтобы не перезаписать данные)
  3. Позвонить: {ТЕЛЕФОН_ОТВЕТСТВЕННОГО}
  4. Следовать процедуре восстановления

Ответственный за бэкапы: Admin
Emergency контакт: +7-XXX-XXX-XX-XX


Последнее обновление: 2025-11-08
Последнее тестирование восстановления: 2025-11-08