Резервное копирование — критически важная задача для любой ERP-системы. Потеря данных в Odoo может означать потерю истории транзакций, клиентской базы, финансовых отчётов и всего бизнес-процесса. Автоматизированные бэкапы гарантируют, что в случае сбоя оборудования, случайного удаления или кибератаки вы сможете восстановить систему с минимальными потерями.
В этом руководстве мы создадим полноценную систему автоматического резервного копирования Odoo: настроим bash-скрипты для бэкапа базы данных PostgreSQL и файлов, автоматизируем процесс через cron, организуем ротацию старых копий и настроим отправку бэкапов на удалённый сервер.
Предварительные требования
Для выполнения инструкций вам понадобится:
- Работающая установка Odoo (версия 14+)
- PostgreSQL база данных Odoo
- Root или sudo доступ к серверу
- Базовые знания bash и cron
- Дополнительное дисковое пространство (минимум 2x размера базы данных)
- Опционально: удалённый сервер для хранения бэкапов
Проверка текущего размера базы данных:
Войдите в PostgreSQL:
sudo -u postgres psql
Посмотрите размер базы:
\l+
Выход:
\q
Пример вывода:
List of databases
Name | Owner | Encoding | Collate | Ctype | Size
-----------+----------+----------+-------------+-------------+-----------
odoo | odoo | UTF8 | en_US.UTF-8 | en_US.UTF-8 | 2458 MB
Структура системы резервного копирования
Создайте основную директорию для бэкапов:
sudo mkdir -p /var/backups/odoo/{db,filestore}
Создайте директорию для скриптов:
sudo mkdir -p /opt/scripts
Назначьте права:
sudo chown -R $USER:$USER /var/backups/odoo
Структура директорий:
/var/backups/odoo/
├── db/ # Дампы базы данных PostgreSQL
└── filestore/ # Архивы файлов Odoo
Создание скрипта резервного копирования базы данных
Создадим главный скрипт для бэкапа PostgreSQL:
sudo nano /opt/scripts/odoo_backup_db.sh
Добавьте следующий код:
#!/bin/bash
#############################################
# Скрипт резервного копирования Odoo DB
# Автор: THE.Hosting
# Версия: 1.0
#############################################
# Конфигурация
DB_NAME="odoo" # Имя базы данных
DB_USER="odoo" # Пользователь PostgreSQL
BACKUP_DIR="/var/backups/odoo/db" # Директория для бэкапов
RETENTION_DAYS=7 # Хранить бэкапы N дней
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_${TIMESTAMP}.sql.gz"
LOG_FILE="/var/log/odoo_backup.log"
# Функция логирования
log_message() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
log_message "========================================="
log_message "Начало резервного копирования базы данных"
log_message "База данных: $DB_NAME"
# Проверка существования директории
if [ ! -d "$BACKUP_DIR" ]; then
log_message "ОШИБКА: Директория $BACKUP_DIR не существует"
exit 1
fi
# Создание дампа базы данных
log_message "Создание дампа базы данных..."
if sudo -u postgres pg_dump "$DB_NAME" | gzip > "$BACKUP_FILE"; then
BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
log_message "Дамп успешно создан: $BACKUP_FILE"
log_message "Размер бэкапа: $BACKUP_SIZE"
else
log_message "ОШИБКА: Не удалось создать дамп базы данных"
exit 1
fi
# Удаление старых бэкапов
log_message "Удаление бэкапов старше $RETENTION_DAYS дней..."
DELETED_COUNT=$(find "$BACKUP_DIR" -name "${DB_NAME}_*.sql.gz" -type f -mtime +$RETENTION_DAYS -print -delete | wc -l)
log_message "Удалено старых бэкапов: $DELETED_COUNT"
# Подсчёт общего количества бэкапов
TOTAL_BACKUPS=$(find "$BACKUP_DIR" -name "${DB_NAME}_*.sql.gz" -type f | wc -l)
log_message "Всего бэкапов в хранилище: $TOTAL_BACKUPS"
# Проверка доступного дискового пространства
DISK_USAGE=$(df -h "$BACKUP_DIR" | awk 'NR==2 {print $5}')
log_message "Использование диска: $DISK_USAGE"
log_message "Резервное копирование завершено успешно"
log_message "========================================="
exit 0
Сделайте скрипт исполняемым:
sudo chmod +x /opt/scripts/odoo_backup_db.sh
Тестирование скрипта:
sudo /opt/scripts/odoo_backup_db.sh
Ожидаемый вывод:
[2024-12-13 10:30:15] =========================================
[2024-12-13 10:30:15] Начало резервного копирования базы данных
[2024-12-13 10:30:15] База данных: odoo
[2024-12-13 10:30:15] Создание дампа базы данных...
[2024-12-13 10:30:48] Дамп успешно создан: /var/backups/odoo/db/odoo_20241213_103015.sql.gz
[2024-12-13 10:30:48] Размер бэкапа: 856M
[2024-12-13 10:30:48] Удаление бэкапов старше 7 дней...
[2024-12-13 10:30:48] Удалено старых бэкапов: 0
[2024-12-13 10:30:48] Всего бэкапов в хранилище: 1
[2024-12-13 10:30:48] Использование диска: 45%
[2024-12-13 10:30:48] Резервное копирование завершено успешно
[2024-12-13 10:30:48] =========================================
Создание скрипта для бэкапа файлов Odoo
Odoo хранит загруженные файлы (attachments, изображения продуктов, документы) в директории filestore. Эти файлы также нужно резервировать.
sudo nano /opt/scripts/odoo_backup_filestore.sh
Добавьте код:
#!/bin/bash
#############################################
# Скрипт резервного копирования Odoo Filestore
# Автор: THE.Hosting
# Версия: 1.0
#############################################
# Конфигурация
DB_NAME="odoo" # Имя базы (для имени архива)
ODOO_DATA_DIR="/var/lib/odoo/.local/share/Odoo" # Путь к данным Odoo
BACKUP_DIR="/var/backups/odoo/filestore" # Директория для бэкапов
RETENTION_DAYS=7 # Хранить бэкапы N дней
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="$BACKUP_DIR/filestore_${DB_NAME}_${TIMESTAMP}.tar.gz"
LOG_FILE="/var/log/odoo_backup.log"
# ВАЖНО: Путь ODOO_DATA_DIR зависит от способа установки Odoo
# Для пакетной установки (apt): /var/lib/odoo/.local/share/Odoo
# Для Docker: может быть /odoo/.local/share/Odoo или другой
# Проверьте параметр data_dir в файле odoo.conf
# Функция логирования
log_message() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
log_message "========================================="
log_message "Начало резервного копирования filestore"
log_message "Источник: $ODOO_DATA_DIR"
# Проверка существования директории с данными
if [ ! -d "$ODOO_DATA_DIR" ]; then
log_message "ОШИБКА: Директория $ODOO_DATA_DIR не существует"
exit 1
fi
# Проверка существования директории для бэкапов
if [ ! -d "$BACKUP_DIR" ]; then
log_message "ОШИБКА: Директория $BACKUP_DIR не существует"
exit 1
fi
# Создание архива
log_message "Создание архива filestore..."
if tar -czf "$BACKUP_FILE" -C "$(dirname "$ODOO_DATA_DIR")" "$(basename "$ODOO_DATA_DIR")"; then
BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
log_message "Архив успешно создан: $BACKUP_FILE"
log_message "Размер архива: $BACKUP_SIZE"
else
log_message "ОШИБКА: Не удалось создать архив"
exit 1
fi
# Удаление старых бэкапов
log_message "Удаление бэкапов старше $RETENTION_DAYS дней..."
DELETED_COUNT=$(find "$BACKUP_DIR" -name "filestore_${DB_NAME}_*.tar.gz" -type f -mtime +$RETENTION_DAYS -print -delete | wc -l)
log_message "Удалено старых бэкапов: $DELETED_COUNT"
# Подсчёт общего количества бэкапов
TOTAL_BACKUPS=$(find "$BACKUP_DIR" -name "filestore_${DB_NAME}_*.tar.gz" -type f | wc -l)
log_message "Всего бэкапов в хранилище: $TOTAL_BACKUPS"
log_message "Резервное копирование filestore завершено"
log_message "========================================="
exit 0
Сделайте скрипт исполняемым:
sudo chmod +x /opt/scripts/odoo_backup_filestore.sh
Тестирование скрипта:
sudo /opt/scripts/odoo_backup_filestore.sh
Создание объединённого скрипта для полного бэкапа
Создадим главный скрипт, который запускает оба процесса последовательно:
sudo nano /opt/scripts/odoo_backup_full.sh
#!/bin/bash
#############################################
# Главный скрипт полного резервного копирования Odoo
# Автор: THE.Hosting
# Версия: 1.0
#############################################
LOG_FILE="/var/log/odoo_backup.log"
log_message() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
log_message "========================================="
log_message "НАЧАЛО ПОЛНОГО РЕЗЕРВНОГО КОПИРОВАНИЯ ODOO"
log_message "========================================="
# Бэкап базы данных
log_message "Запуск резервного копирования базы данных..."
/opt/scripts/odoo_backup_db.sh
DB_EXIT_CODE=$?
if [ $DB_EXIT_CODE -eq 0 ]; then
log_message "Резервное копирование базы данных: УСПЕШНО"
else
log_message "Резервное копирование базы данных: ОШИБКА (код: $DB_EXIT_CODE)"
fi
# Бэкап filestore
log_message "Запуск резервного копирования filestore..."
/opt/scripts/odoo_backup_filestore.sh
FS_EXIT_CODE=$?
if [ $FS_EXIT_CODE -eq 0 ]; then
log_message "Резервное копирование filestore: УСПЕШНО"
else
log_message "Резервное копирование filestore: ОШИБКА (код: $FS_EXIT_CODE)"
fi
# Итоговый статус
log_message "========================================="
if [ $DB_EXIT_CODE -eq 0 ] && [ $FS_EXIT_CODE -eq 0 ]; then
log_message "ПОЛНОЕ РЕЗЕРВНОЕ КОПИРОВАНИЕ: ЗАВЕРШЕНО УСПЕШНО"
log_message "========================================="
exit 0
else
log_message "ПОЛНОЕ РЕЗЕРВНОЕ КОПИРОВАНИЕ: ЗАВЕРШЕНО С ОШИБКАМИ"
log_message "========================================="
exit 1
fi
Сделайте исполняемым:
sudo chmod +x /opt/scripts/odoo_backup_full.sh
Настройка автоматизации через cron
Настроим автоматический запуск бэкапов через cron.
Создание cron задачи:
sudo crontab -e
Добавьте следующие строки:
Полный бэкап Odoo каждый день в 2:00 ночи:
0 2 * * * /opt/scripts/odoo_backup_full.sh >> /var/log/odoo_backup_cron.log 2>&1
Альтернатива: бэкап базы каждые 6 часов:
0 */6 * * * /opt/scripts/odoo_backup_db.sh >> /var/log/odoo_backup_cron.log 2>&1
Альтернатива: бэкап только в рабочие дни:
0 2 * * 1-5 /opt/scripts/odoo_backup_full.sh >> /var/log/odoo_backup_cron.log 2>&1
Расшифровка cron расписания:
┌───────────── минута (0 - 59)
│ ┌─────────── час (0 - 23)
│ │ ┌───────── день месяца (1 - 31)
│ │ │ ┌─────── месяц (1 - 12)
│ │ │ │ ┌───── день недели (0 - 6) (Sunday=0)
│ │ │ │ │
│ │ │ │ │
* * * * * команда для выполнения
Примеры расписаний:
Каждый день в 3:30 утра:
30 3 * * * /opt/scripts/odoo_backup_full.sh
Каждое воскресенье в полночь:
0 0 * * 0 /opt/scripts/odoo_backup_full.sh
Каждые 12 часов:
0 */12 * * * /opt/scripts/odoo_backup_full.sh
Дважды в день (8:00 и 20:00):
0 8,20 * * * /opt/scripts/odoo_backup_full.sh
Первое число каждого месяца в 1:00:
0 1 1 * * /opt/scripts/odoo_backup_full.sh
Проверка активных cron задач:
sudo crontab -l
Проверка логов cron:
Системный лог cron:
sudo tail -f /var/log/syslog | grep CRON
Наш лог бэкапов:
tail -f /var/log/odoo_backup_cron.log
Отправка бэкапов на удалённый сервер
Для дополнительной безопасности настроим автоматическую отправку бэкапов на удалённый сервер через rsync.
Настройка SSH-ключей для автоматической аутентификации
Поскольку cron-задачи резервного копирования будут запускаться от root, создайте SSH-ключ от имени root:
Переключитесь на пользователя root:
sudo su -
Сгенерируйте SSH ключ:
ssh-keygen -t rsa -b 4096 -f /root/.ssh/backup_key -N ""
Скопируйте ключ на удалённый сервер:
ssh-copy-id -i /root/.ssh/backup_key.pub user@remote-server.com
Проверьте подключение:
ssh -i /root/.ssh/backup_key user@remote-server.com "echo 'Connection successful'"
Выйдите из root:
exit
Скрипт отправки на удалённый сервер
sudo nano /opt/scripts/odoo_backup_remote.sh
#!/bin/bash
#############################################
# Скрипт отправки бэкапов на удалённый сервер
# Автор: THE.Hosting
# Версия: 1.0
#############################################
# Конфигурация
LOCAL_BACKUP_DIR="/var/backups/odoo"
REMOTE_USER="backup"
REMOTE_HOST="backup-server.example.com"
REMOTE_DIR="/backups/odoo"
SSH_KEY="/root/.ssh/backup_key"
LOG_FILE="/var/log/odoo_backup.log"
log_message() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
log_message "========================================="
log_message "Начало отправки бэкапов на удалённый сервер"
# Проверка SSH подключения
if ! ssh -i "$SSH_KEY" -o BatchMode=yes -o ConnectTimeout=5 "${REMOTE_USER}@${REMOTE_HOST}" "echo 'Connected'" > /dev/null 2>&1; then
log_message "ОШИБКА: Не удалось подключиться к удалённому серверу"
exit 1
fi
# Синхронизация бэкапов базы данных
log_message "Синхронизация бэкапов базы данных..."
if rsync -avz --progress -e "ssh -i $SSH_KEY" \
"$LOCAL_BACKUP_DIR/db/" \
"${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/db/"; then
log_message "Бэкапы базы данных синхронизированы успешно"
else
log_message "ОШИБКА: Не удалось синхронизировать бэкапы БД"
fi
# Синхронизация бэкапов filestore
log_message "Синхронизация бэкапов filestore..."
if rsync -avz --progress -e "ssh -i $SSH_KEY" \
"$LOCAL_BACKUP_DIR/filestore/" \
"${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/filestore/"; then
log_message "Бэкапы filestore синхронизированы успешно"
else
log_message "ОШИБКА: Не удалось синхронизировать бэкапы filestore"
fi
log_message "Отправка на удалённый сервер завершена"
log_message "========================================="
exit 0
Сделайте исполняемым:
sudo chmod +x /opt/scripts/odoo_backup_remote.sh
Добавьте в crontab:
sudo crontab -e
Отправка на удалённый сервер через 30 минут после бэкапа:
30 2 * * * /opt/scripts/odoo_backup_remote.sh >> /var/log/odoo_backup_cron.log 2>&1
Восстановление из резервной копии
Восстановление базы данных
Посмотрите список доступных бэкапов:
ls -lh /var/backups/odoo/db/
Выберите нужный бэкап:
BACKUP_FILE="/var/backups/odoo/db/odoo_20241213_103015.sql.gz"
Остановите Odoo:
sudo systemctl stop odoo
Создайте резервную копию текущей базы на всякий случай:
sudo -u postgres pg_dump odoo | gzip > /tmp/odoo_before_restore.sql.gz
Удалите текущую базу:
sudo -u postgres dropdb odoo
Создайте новую пустую базу:
sudo -u postgres createdb -O odoo odoo
Восстановите из бэкапа:
gunzip -c "$BACKUP_FILE" | sudo -u postgres psql odoo
Проверьте успешность восстановления:
sudo -u postgres psql -d odoo -c "SELECT count(*) FROM res_users;"
Запустите Odoo:
sudo systemctl start odoo
Восстановление filestore
Остановите Odoo:
sudo systemctl stop odoo
Выберите нужный архив:
BACKUP_FILE="/var/backups/odoo/filestore/filestore_odoo_20241213_103020.tar.gz"
Создайте резервную копию текущего filestore:
sudo tar -czf /tmp/filestore_before_restore.tar.gz -C /var/lib/odoo/.local/share Odoo
Удалите текущий filestore:
sudo rm -rf /var/lib/odoo/.local/share/Odoo
Восстановите из архива:
sudo tar -xzf "$BACKUP_FILE" -C /var/lib/odoo/.local/share/
Восстановите права доступа:
sudo chown -R odoo:odoo /var/lib/odoo/.local/share/Odoo
Запустите Odoo:
sudo systemctl start odoo
Скрипт автоматического восстановления
sudo nano /opt/scripts/odoo_restore.sh
#!/bin/bash
#############################################
# Скрипт восстановления Odoo из резервной копии
# Автор: THE.Hosting
# Версия: 1.0
#############################################
# Использование: ./odoo_restore.sh <db_backup_file> <filestore_backup_file>
if [ $# -ne 2 ]; then
echo "Использование: $0 <db_backup.sql.gz> <filestore_backup.tar.gz>"
exit 1
fi
DB_BACKUP="$1"
FS_BACKUP="$2"
DB_NAME="odoo"
echo "========================================="
echo "ВОССТАНОВЛЕНИЕ ODOO ИЗ РЕЗЕРВНОЙ КОПИИ"
echo "========================================="
echo "База данных: $DB_BACKUP"
echo "Filestore: $FS_BACKUP"
echo ""
read -p "Продолжить? (yes/no): " CONFIRM
if [ "$CONFIRM" != "yes" ]; then
echo "Отменено пользователем"
exit 0
fi
# Остановка Odoo
echo "Остановка Odoo..."
sudo systemctl stop odoo
# Восстановление базы данных
echo "Восстановление базы данных..."
sudo -u postgres dropdb "$DB_NAME"
sudo -u postgres createdb -O odoo "$DB_NAME"
gunzip -c "$DB_BACKUP" | sudo -u postgres psql "$DB_NAME"
# Восстановление filestore
echo "Восстановление filestore..."
sudo rm -rf /var/lib/odoo/.local/share/Odoo
sudo tar -xzf "$FS_BACKUP" -C /var/lib/odoo/.local/share/
sudo chown -R odoo:odoo /var/lib/odoo/.local/share/Odoo
# Запуск Odoo
echo "Запуск Odoo..."
sudo systemctl start odoo
echo "========================================="
echo "ВОССТАНОВЛЕНИЕ ЗАВЕРШЕНО"
echo "========================================="
Сделайте исполняемым:
sudo chmod +x /opt/scripts/odoo_restore.sh
Использование:
sudo /opt/scripts/odoo_restore.sh \
/var/backups/odoo/db/odoo_20241213_103015.sql.gz \
/var/backups/odoo/filestore/filestore_odoo_20241213_103020.tar.gz
Проверка целостности бэкапов
Создайте скрипт для регулярной проверки бэкапов:
sudo nano /opt/scripts/odoo_backup_verify.sh
BACKUP_DIR="/var/backups/odoo"
LOG_FILE="/var/log/odoo_backup_verify.log"
log_message() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
log_message "========================================="
log_message "Начало проверки целостности бэкапов"
# Проверка бэкапов базы данных
log_message "Проверка бэкапов базы данных..."
DB_BACKUPS=$(find "$BACKUP_DIR/db" -name "*.sql.gz" -type f)
DB_COUNT=0
DB_CORRUPTED=0
for backup in $DB_BACKUPS; do
DB_COUNT=$((DB_COUNT + 1))
if gunzip -t "$backup" 2>/dev/null; then
log_message "✓ OK: $(basename $backup)"
else
log_message "✗ ПОВРЕЖДЕН: $(basename $backup)"
DB_CORRUPTED=$((DB_CORRUPTED + 1))
fi
done
log_message "Проверено бэкапов БД: $DB_COUNT, повреждённых: $DB_CORRUPTED"
# Проверка бэкапов filestore
log_message "Проверка бэкапов filestore..."
FS_BACKUPS=$(find "$BACKUP_DIR/filestore" -name "*.tar.gz" -type f)
FS_COUNT=0
FS_CORRUPTED=0
for backup in $FS_BACKUPS; do
FS_COUNT=$((FS_COUNT + 1))
if tar -tzf "$backup" >/dev/null 2>&1; then
log_message "✓ OK: $(basename $backup)"
else
log_message "✗ ПОВРЕЖДЕН: $(basename $backup)"
FS_CORRUPTED=$((FS_CORRUPTED + 1))
fi
done
log_message "Проверено бэкапов filestore: $FS_COUNT, повреждённых: $FS_CORRUPTED"
# Итоговый отчёт
TOTAL_CORRUPTED=$((DB_CORRUPTED + FS_CORRUPTED))
if [ $TOTAL_CORRUPTED -eq 0 ]; then
log_message "========================================="
log_message "ВСЕ БЭКАПЫ В ПОРЯДКЕ"
log_message "========================================="
exit 0
else
log_message "========================================="
log_message "ОБНАРУЖЕНЫ ПОВРЕЖДЁННЫЕ БЭКАПЫ: $TOTAL_CORRUPTED"
log_message "========================================="
exit 1
fi
Сделайте исполняемым:
sudo chmod +x /opt/scripts/odoo_backup_verify.sh
Добавьте проверку в crontab (еженедельно по понедельникам):
sudo crontab -e
Проверка целостности бэкапов каждый понедельник в 9:00:
0 9 * * 1 /opt/scripts/odoo_backup_verify.sh >> /var/log/odoo_backup_cron.log 2>&1
Мониторинг и уведомления
Настройка email-уведомлений при ошибках
Установите mail утилиту:
sudo apt install mailutils
Модифицируйте скрипт для отправки email:
sudo nano /opt/scripts/odoo_backup_notify.sh
#!/bin/bash
# Конфигурация
EMAIL="admin@example.com"
LOG_FILE="/var/log/odoo_backup.log"
# Проверка последнего статуса бэкапа
if tail -20 "$LOG_FILE" | grep -q "ЗАВЕРШЕНО УСПЕШНО"; then
echo "Резервное копирование Odoo завершено успешно" | mail -s "✓ Odoo Backup Success" "$EMAIL"
else
echo "ОШИБКА при резервном копировании Odoo. Проверьте логи: $LOG_FILE" | mail -s "✗ Odoo Backup FAILED" "$EMAIL"
fi
Добавьте в crontab после основного бэкапа:
Уведомление через 5 минут после бэкапа:
5 2 * * * /opt/scripts/odoo_backup_notify.sh
Уведомление через 5 минут после бэкапа:
5 2 * * * /opt/scripts/odoo_backup_notify.sh
Мониторинг через Prometheus (опционально)
Создайте файл с метриками:
sudo nano /opt/scripts/odoo_backup_metrics.sh
#!/bin/bash
# Экспорт метрик для Prometheus node_exporter textfile collector
METRICS_FILE="/var/lib/node_exporter/textfile_collector/odoo_backup.prom"
# Количество бэкапов
DB_COUNT=$(find /var/backups/odoo/db -name "*.sql.gz" | wc -l)
FS_COUNT=$(find /var/backups/odoo/filestore -name "*.tar.gz" | wc -l)
# Время последнего бэкапа (Unix timestamp)
LAST_BACKUP=$(find /var/backups/odoo/db -name "*.sql.gz" -printf '%T@\n' | sort -n | tail -1 | cut -d. -f1)
# Общий размер бэкапов (в байтах)
TOTAL_SIZE=$(du -sb /var/backups/odoo | awk '{print $1}')
# Запись метрик
cat > "$METRICS_FILE" << EOF
# HELP odoo_backup_db_count Number of database backups
# TYPE odoo_backup_db_count gauge
odoo_backup_db_count $DB_COUNT
# HELP odoo_backup_filestore_count Number of filestore backups
# TYPE odoo_backup_filestore_count gauge
odoo_backup_filestore_count $FS_COUNT
# HELP odoo_backup_last_timestamp Unix timestamp of last backup
# TYPE odoo_backup_last_timestamp gauge
odoo_backup_last_timestamp $LAST_BACKUP
# HELP odoo_backup_total_size_bytes Total size of all backups in bytes
# TYPE odoo_backup_total_size_bytes gauge
odoo_backup_total_size_bytes $TOTAL_SIZE
EOF
Добавьте в crontab (каждые 5 минут):
*/5 * * * * /opt/scripts/odoo_backup_metrics.sh
Устранение типичных проблем
Проблема: "Permission denied" при создании бэкапа
Решение:
Проверьте права на директорию бэкапов:
ls -la /var/backups/odoo
Исправьте права (750 безопаснее, чем 755, так как бэкапы содержат конфиденциальные данные):
sudo chown -R root:root /var/backups/odoo
sudo chmod -R 750 /var/backups/odoo
Проблема: pg_dump не находит базу данных
Решение:
Проверьте, что база данных существует:
sudo -u postgres psql -l | grep odoo
Проверьте подключение:
sudo -u postgres psql -d odoo -c "SELECT version();"
Если база в Docker контейнере:
docker exec -t container_name pg_dump -U odoo odoo | gzip > backup.sql.gz
Проблема: Недостаточно места на диске
Решение:
Проверьте свободное место:
df -h /var/backups
Очистите старые бэкапы вручную:
find /var/backups/odoo -name "*.gz" -mtime +30 -delete
Уменьшите retention в скрипте (измените RETENTION_DAYS=3 вместо 7)
Проблема: Бэкап занимает слишком много времени
Решение:
Установите pigz для параллельного сжатия вместо gzip:
sudo apt install pigz
Замените в скрипте gzip на pigz. Пример:
sudo -u postgres pg_dump odoo | pigz > backup.sql.gz
Проблема: Cron не запускается
Решение:
Проверьте, работает ли cron:
sudo systemctl status cron
Запустите cron:
sudo systemctl start cron
Проверьте синтаксис crontab:
crontab -l
Проверьте логи cron:
sudo tail -f /var/log/syslog | grep CRON
Чек-лист: быстрая настройка бэкапов
Шаг 1. Создайте директории:
sudo mkdir -p /var/backups/odoo/{db,filestore}
sudo mkdir -p /opt/scripts
Шаг 2. Создайте скрипты (скопируйте скрипты из руководства выше)
Шаг 3. Сделайте исполняемыми:
sudo chmod +x /opt/scripts/odoo_backup_*.sh
sudo chmod +x /opt/scripts/odoo_restore.sh
Шаг 4. Протестируйте вручную:
sudo /opt/scripts/odoo_backup_full.sh
Шаг 5. Настройте cron:
sudo crontab -e
Добавьте строку:
0 2 * * * /opt/scripts/odoo_backup_full.sh >> /var/log/odoo_backup_cron.log 2>&1
Шаг 6. Проверьте через несколько дней:
ls -lh /var/backups/odoo/db/
ls -lh /var/backups/odoo/filestore/
Заключение
Вы настроили полноценную систему автоматического резервного копирования Odoo. Теперь ваши данные защищены от потери, и в случае любого сбоя вы сможете быстро восстановить работу системы.
Рекомендации:
- Регулярно проверяйте логи:
tail -f /var/log/odoo_backup.log - Периодически тестируйте восстановление из бэкапа на тестовом сервере
- Храните как минимум один бэкап на удалённом сервере
- Настройте мониторинг успешности бэкапов
- Документируйте процедуру восстановления для вашей команды
Дополнительные улучшения:
- Настройте инкрементальные бэкапы для экономии места
- Используйте шифрование бэкапов с помощью GPG
- Интегрируйте с облачными хранилищами (S3, Google Cloud Storage)
- Настройте репликацию PostgreSQL для hot standby