С Firebird 2.5 в Ubuntu Server 24.04 есть важный нюанс: утилита gbak требует правильного окружения, а сам процесс бэкапа «на лету» лучше делать через создание копии, чтобы не блокировать транзакции.
Ниже готовый Bash-скрипт. Он делает бэкап, пакует его в tar.gzотправляет по FTP (через ncftp или curl) и по SSH (через scp), а также удаляет старые локальные бэкапы, чтобы не забивать диск.
Шаг 1. Подготовка сервера
Перед запуском скрипта нужно установить пару утилит для отправки файлов:
sudo apt install curl openssh-client -y
Для SSH-копирования без ввода пароля важно настроить SSH-ключи (ssh-keygen и ssh-copy-id пользователь@удаленный_хост).
Шаг 2. Скрипт бэкапа (backup_firebird.sh)
Создай файл, например, в /opt/backup_firebird.sh:
sudo nano /opt/backup_firebird.sh
Вставь в него следующий код, заменив значения переменных в секции НАСТРОЙКИ на свои:
#!/bin/bash
# ==========================================
# НАСТРОЙКИ
# ==========================================
# Пути к Firebird и базе
FB_USER="SYSDBA"
FB_PASSWORD="your_sysdba_password"
DB_PATH="/var/lib/firebird/2.5/data/your_db.fdb" # Путь к твоей БД
# Локальные директории
BACKUP_DIR="/var/backups/firebird"
DATE=$(date +%Y-%m-%d_%H-%M-%S)
LOG_FILE="$BACKUP_DIR/backup_log.log"
# Имена файлов
GBK_FILE="$BACKUP_DIR/db_$DATE.fbk"
ARCHIVE_FILE="$BACKUP_DIR/db_$DATE.tar.gz"
# Удаленный хост (SSH / SCP)
SSH_USER="remote_user"
SSH_HOST="remote_ssh_server_ip"
SSH_DIR="/home/remote_user/backups/"
# Удаленный хост (FTP)
FTP_USER="ftp_user"
FTP_PASS="ftp_password"
FTP_HOST="ftp.server.com"
FTP_DIR="/backups/" # Папка на FTP (должна существовать)
# Сколько дней хранить бэкапы локально
KEEP_DAYS=7
# ==========================================
# ПРОЦЕСС БЭКАПА
# ==========================================
mkdir -p "$BACKUP_DIR"
echo "[$(date)] --- Начало резервного копирования ---" >> "$LOG_FILE"
# 1. Создание бэкапа через gbak
echo "[$(date)] Запуск gbak..." >> "$LOG_FILE"
/usr/bin/gbak -b -v -user $FB_USER -password $FB_PASSWORD $DB_PATH $GBK_FILE >> "$LOG_FILE" 2>&1
if [ $? -eq 0 ]; then
echo "[$(date)] Gbak успешно завершен. Архивация..." >> "$LOG_FILE"
# 2. Сжатие в tar.gz
tar -czf "$ARCHIVE_FILE" -C "$BACKUP_DIR" "$(basename "$GBK_FILE")"
rm "$GBK_FILE" # Удаляем несжатый fbk, оставляя только архив
# 3. Копирование по SSH (SCP)
echo "[$(date)] Отправка по SSH..." >> "$LOG_FILE"
scp -i /root/.ssh/id_rsa "$ARCHIVE_FILE" "$SSH_USER@$SSH_HOST:$SSH_DIR" >> "$LOG_FILE" 2>&1
if [ $? -eq 0 ]; then
echo "[$(date)] SSH копирование успешно." >> "$LOG_FILE"
else
echo "[$(date)] ОШИБКА SSH копирования!" >> "$LOG_FILE"
fi
# 4. Копирование по FTP
echo "[$(date)] Отправка по FTP..." >> "$LOG_FILE"
curl --ftp-create-dirs -T "$ARCHIVE_FILE" -u "$FTP_USER:$FTP_PASS" "ftp://$FTP_HOST$FTP_DIR$(basename "$ARCHIVE_FILE")" >> "$LOG_FILE" 2>&1
if [ $? -eq 0 ]; then
echo "[$(date)] FTP копирование успешно." >> "$LOG_FILE"
else
echo "[$(date)] ОШИБКА FTP копирования!" >> "$LOG_FILE"
fi
# 5. Очистка старых локальных бэкапов
echo "[$(date)] Очистка старых локальных бэкапов (старше $KEEP_DAYS дней)..." >> "$LOG_FILE"
find "$BACKUP_DIR" -type f -name "db_*.tar.gz" -mtime +$KEEP_DAYS -exec rm {} \;
else
echo "[$(date)] КРИТИЧЕСКАЯ ОШИБКА: gbak не смог создать бэкап!" >> "$LOG_FILE"
fi
echo "[$(date)] --- Конец процесса ---" >> "$LOG_FILE"