Перейти к содержанию

Резервное копирование

Стратегии и процедуры создания резервных копий данных и конфигурации Р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 запросов - Логи ошибок

Где хранится:

~/orbita/logs/
├── orbita.log
├── api.log
└── errors.log

Важность: Средняя - нужны для диагностики проблем, но можно восстановить систему без них.


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)

pg_dump -h localhost -p 5432 -U orbita_user orbita > backup_$(date +%Y%m%d).sql

Резервное копирование 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)

Следующие шаги