Резервное копирование Odoo: автоматизация через bash-скрипты и cron

18.12.2025
18:32

Резервное копирование — критически важная задача для любой 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
Содержание:
Закажите новый VPS со скидкой 15%
Любая локация на выбор. Стабильный сервер для ваших проектов по выгодной цене.
Выбрать VPS

Другие статьи

18.12.2025
267
База знаний / Инструкции
Установка Odoo с Docker на Ubuntu: полное руководство
18.12.2025
229
База знаний / Автоустановка скриптов
Как установить Odoo на VPS всего за пару минут