Резервное копирование¶
Стратегии и процедуры создания резервных копий данных и конфигурации Р13.Орбита.
Обязательное требование
Резервное копирование обязательно перед любым обновлением системы.
Что нужно резервировать¶
1. Конфигурация¶
Что включает: - Файл .env с переменными окружения - Директория domains/ с конфигурациями доменов - Файл docker-compose.yml (если используется)
Где хранится:
~/orbita/
├── .env
├── domains/
│ ├── ecommerce.yaml
│ ├── logistics.yaml
│ └── films.yaml
└── docker-compose.yml
Важность: Критическая - без этих файлов система не запустится.
2. База данных метаданных¶
Что включает: - Сохраненные чаты и сообщения - Датасеты пользователей - Визуализации - Настройки пользователей
Где хранится: - PostgreSQL: база данных orbita на вашем PostgreSQL сервере - SQLite: файл ~/.orbita/metadata.db (если используете SQLite)
Важность: Высокая - потеря этих данных означает потерю истории работы пользователей.
3. Логи¶
Что включает: - Логи приложения - Логи API запросов - Логи ошибок
Где хранится:
Важность: Средняя - нужны для диагностики проблем, но можно восстановить систему без них.
4. Docker образы (опционально)¶
Что включает: - Текущая версия Docker образа Р13.Орбита
Важность: Низкая - можно повторно загрузить из registry, но сохранение ускоряет откат.
Стратегии резервного копирования¶
Стратегия 1: Полное ежедневное резервирование (рекомендуется)¶
Для кого: Production окружения с активным использованием
Расписание: - Полное резервное копирование: ежедневно в 02:00 - Инкрементальное: каждые 6 часов - Хранение: 30 дней
Команда:
#!/bin/bash
# backup-full.sh
BACKUP_DIR="/backups/orbita/$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"
# Резервное копирование конфигурации
cp -r ~/orbita/.env ~/orbita/domains/ ~/orbita/docker-compose.yml "$BACKUP_DIR/"
# Резервное копирование PostgreSQL
docker exec postgres-metadata pg_dump -U orbita_user orbita > "$BACKUP_DIR/metadata.sql"
# Резервное копирование логов
cp -r ~/orbita/logs/ "$BACKUP_DIR/logs/"
# Создание архива
tar -czf "$BACKUP_DIR.tar.gz" -C "$BACKUP_DIR" .
rm -rf "$BACKUP_DIR"
echo "Backup completed: $BACKUP_DIR.tar.gz"
Стратегия 2: Резервирование перед обновлением¶
Для кого: Все окружения перед обновлением версии
Когда: Непосредственно перед обновлением
Команда:
#!/bin/bash
# backup-before-update.sh
VERSION_OLD=$(docker exec orbita cat /app/VERSION)
BACKUP_DIR="/backups/orbita/pre-update-$VERSION_OLD-$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"
# Резервное копирование конфигурации
cp -r ~/orbita/.env ~/orbita/domains/ "$BACKUP_DIR/"
# Резервное копирование БД метаданных
docker exec postgres-metadata pg_dump -U orbita_user orbita > "$BACKUP_DIR/metadata.sql"
# Создание snapshot Docker контейнера
docker commit orbita "orbita-backup:$VERSION_OLD"
# Архивирование
tar -czf "$BACKUP_DIR.tar.gz" -C "$BACKUP_DIR" .
rm -rf "$BACKUP_DIR"
echo "Pre-update backup completed: $BACKUP_DIR.tar.gz"
echo "Docker snapshot: orbita-backup:$VERSION_OLD"
Стратегия 3: Минимальное резервирование (dev/test)¶
Для кого: Development и staging окружения
Расписание: По требованию, перед значительными изменениями
Команда:
# Быстрое резервное копирование только конфигурации
cp -r ~/orbita/.env ~/orbita/domains/ /tmp/orbita-backup-$(date +%Y%m%d)/
Автоматизация резервного копирования¶
Настройка cron для автоматического резервирования¶
# Редактировать crontab
crontab -e
# Добавить задачи:
# Полное резервное копирование каждый день в 02:00
0 2 * * * /path/to/backup-full.sh
# Инкрементальное резервное копирование каждые 6 часов
0 */6 * * * /path/to/backup-incremental.sh
# Удаление старых резервных копий (старше 30 дней)
0 3 * * * find /backups/orbita/ -name "*.tar.gz" -mtime +30 -delete
Процедуры резервного копирования¶
Резервное копирование PostgreSQL¶
Вариант 1: Через Docker
# Полный дамп базы данных
docker exec postgres-metadata pg_dump -U orbita_user orbita > backup_$(date +%Y%m%d).sql
# С сжатием
docker exec postgres-metadata pg_dump -U orbita_user orbita | gzip > backup_$(date +%Y%m%d).sql.gz
# Дамп только схемы (без данных)
docker exec postgres-metadata pg_dump -U orbita_user --schema-only orbita > schema_$(date +%Y%m%d).sql
# Дамп только данных (без схемы)
docker exec postgres-metadata pg_dump -U orbita_user --data-only orbita > data_$(date +%Y%m%d).sql
Вариант 2: Напрямую (если PostgreSQL вне Docker)
Резервное копирование SQLite¶
Если используете SQLite вместо PostgreSQL:
# Копирование файла БД
cp ~/.orbita/metadata.db ~/.orbita/metadata.db.backup_$(date +%Y%m%d)
# Или с использованием встроенной команды SQLite
sqlite3 ~/.orbita/metadata.db ".backup '/path/to/backup/metadata_$(date +%Y%m%d).db'"
Резервное копирование конфигурации¶
# Создание архива всех конфигурационных файлов
tar -czf orbita-config-$(date +%Y%m%d).tar.gz \
-C ~/orbita \
.env \
domains/ \
docker-compose.yml
# Верификация архива
tar -tzf orbita-config-$(date +%Y%m%d).tar.gz
Резервное копирование Docker контейнера¶
# Создание snapshot текущего контейнера
docker commit orbita orbita-snapshot-$(date +%Y%m%d)
# Экспорт snapshot в файл
docker save orbita-snapshot-$(date +%Y%m%d) | gzip > orbita-snapshot-$(date +%Y%m%d).tar.gz
# Просмотр всех snapshots
docker images | grep orbita-snapshot
Хранение резервных копий¶
Локальное хранение¶
Структура директории:
/backups/orbita/
├── 20260120_020000/
│ ├── metadata.sql
│ ├── .env
│ ├── domains/
│ └── logs/
├── 20260121_020000/
│ └── ...
└── archives/
├── 20260120_020000.tar.gz
└── 20260121_020000.tar.gz
Политика хранения: - Ежедневные: 30 дней - Еженедельные: 12 недель - Ежемесячные: 12 месяцев
Удаленное хранение¶
Вариант 1: Сетевое хранилище (NAS/NFS)¶
# Монтирование NAS
mount -t nfs nas.company.com:/backups /mnt/backups
# Копирование резервной копии
cp /backups/orbita/latest.tar.gz /mnt/backups/orbita/
Вариант 2: Облачное хранилище (S3-compatible)¶
# Использование rclone для загрузки в облако
rclone copy /backups/orbita/ remote:orbita-backups/
# Или AWS CLI (для S3)
aws s3 cp /backups/orbita/ s3://company-backups/orbita/ --recursive
Вариант 3: Резервный сервер¶
# Копирование через rsync
rsync -avz /backups/orbita/ backup-server:/backups/orbita/
# С сжатием и удалением старых файлов
rsync -avz --delete /backups/orbita/ backup-server:/backups/orbita/
Верификация резервных копий¶
Проверка целостности¶
# Проверка архива
tar -tzf backup.tar.gz > /dev/null && echo "Archive OK" || echo "Archive corrupted"
# Проверка SQL дампа
head -n 20 backup.sql
# Должен содержать заголовок PostgreSQL dump
# Проверка размера
ls -lh backup.tar.gz
# Сравните с ожидаемым размером
Тестовое восстановление¶
Рекомендация: Ежемесячно проводите тестовое восстановление на staging окружении.
# Создать тестовую директорию
mkdir -p /tmp/restore-test
cd /tmp/restore-test
# Распаковать резервную копию
tar -xzf /backups/orbita/latest.tar.gz
# Запустить тестовый контейнер
docker run -d \
--name orbita-restore-test \
-p 8001:8000 \
--env-file .env \
-v $(pwd)/domains:/app/domains \
your-registry.company.com/orbita:latest
# Проверить работоспособность
curl http://localhost:8001/health
# Очистить
docker stop orbita-restore-test
docker rm orbita-restore-test
cd ~ && rm -rf /tmp/restore-test
Скрипт полного резервного копирования¶
Готовый скрипт для production использования:
#!/bin/bash
# /usr/local/bin/orbita-backup.sh
set -e # Прервать при ошибке
# Конфигурация
BACKUP_ROOT="/backups/orbita"
ORBITA_DIR="$HOME/orbita"
RETENTION_DAYS=30
# Создание директории с timestamp
BACKUP_DIR="$BACKUP_ROOT/$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"
echo "Starting Р13.Орбита backup to $BACKUP_DIR"
# 1. Конфигурация
echo "Backing up configuration..."
cp -r "$ORBITA_DIR/.env" "$BACKUP_DIR/"
cp -r "$ORBITA_DIR/domains" "$BACKUP_DIR/"
[ -f "$ORBITA_DIR/docker-compose.yml" ] && cp "$ORBITA_DIR/docker-compose.yml" "$BACKUP_DIR/"
# 2. База данных метаданных
echo "Backing up metadata database..."
if docker ps | grep -q postgres-metadata; then
docker exec postgres-metadata pg_dump -U orbita_user orbita > "$BACKUP_DIR/metadata.sql"
elif [ -f "$HOME/.orbita/metadata.db" ]; then
cp "$HOME/.orbita/metadata.db" "$BACKUP_DIR/metadata.db"
fi
# 3. Логи
echo "Backing up logs..."
[ -d "$ORBITA_DIR/logs" ] && cp -r "$ORBITA_DIR/logs" "$BACKUP_DIR/"
# 4. Версия
echo "Recording version..."
docker exec orbita cat /app/VERSION > "$BACKUP_DIR/VERSION" 2>/dev/null || echo "unknown" > "$BACKUP_DIR/VERSION"
# 5. Архивирование
echo "Creating archive..."
tar -czf "$BACKUP_DIR.tar.gz" -C "$BACKUP_DIR" .
rm -rf "$BACKUP_DIR"
# 6. Удаление старых резервных копий
echo "Cleaning up old backups (older than $RETENTION_DAYS days)..."
find "$BACKUP_ROOT" -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete
# 7. Проверка
BACKUP_SIZE=$(du -h "$BACKUP_DIR.tar.gz" | cut -f1)
echo "Backup completed successfully: $BACKUP_DIR.tar.gz ($BACKUP_SIZE)"
# Опционально: отправить уведомление
# curl -X POST https://monitoring.company.com/webhook \
# -d "Р13.Орбита backup completed: $BACKUP_DIR.tar.gz"
Использование:
# Сделать скрипт исполняемым
chmod +x /usr/local/bin/orbita-backup.sh
# Запустить вручную
/usr/local/bin/orbita-backup.sh
# Добавить в cron
crontab -e
# 0 2 * * * /usr/local/bin/orbita-backup.sh >> /var/log/orbita-backup.log 2>&1
Мониторинг резервного копирования¶
Проверка успешности¶
# Проверить последнюю резервную копию
ls -lht /backups/orbita/*.tar.gz | head -1
# Проверить логи cron
grep orbita-backup /var/log/cron
# Проверить размер последней резервной копии
du -h /backups/orbita/*.tar.gz | tail -1
Уведомления о сбоях¶
Добавьте в конец скрипта резервного копирования:
if [ $? -eq 0 ]; then
echo "Backup successful" | mail -s "Р13.Орбита Backup OK" admin@company.com
else
echo "Backup failed!" | mail -s "Р13.Орбита Backup FAILED" admin@company.com
fi
Контрольный список резервного копирования¶
Перед обновлением или критическими изменениями:
- Создана резервная копия
.envфайла - Создана резервная копия директории
domains/ - Создан дамп базы данных метаданных
- Создан snapshot Docker контейнера
- Резервная копия сохранена в безопасном месте
- Проверена целостность архива
- Зафиксирована текущая версия системы
- Протестировано восстановление (для production)
Следующие шаги¶
- Восстановление - процедуры восстановления из резервной копии
- Обновление версии - обновление с использованием резервных копий
- Решение проблем - диагностика проблем с резервным копированием