Проект: Marketplace MVP (mp1)
Последнее обновление: 2025-11-08
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
Когда: Каждую неделю (воскресенье, 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
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
Вариант 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!"
Сценарий: Сервер полностью потерян
Шаги:
# 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
Когда: Раз в квартал
Цель: Проверить полное восстановление
Шаги: См. "Полное восстановление" выше
#!/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
#!/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 -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"
В случае потери данных:
Ответственный за бэкапы: Admin
Emergency контакт: +7-XXX-XXX-XX-XX
Последнее обновление: 2025-11-08
Последнее тестирование восстановления: 2025-11-08