bash backup

a4-backup-svc.sh

#!/bin/bash
 
TIME=$(date +%Y%m%d-%H%M%S)
DIR_PATH=/srv/backups/svc-a4/$TIME/
ssh backupsvc@storage-a4 "mkdir -p $DIR_PATH"
 
rsync -R /srv/a4-service/config/* /srv/a4-service/data/* /etc/fstab /etc/rsyslog.conf /etc/rsyslog.d/* backupsvc@storage-a4:$DIR_PATH
 
cd /
 
sha256sum srv/a4-service/config/* > /usr/local/sbin/manifest.sha256
sha256sum srv/a4-service/data/* >> /usr/local/sbin/manifest.sha256
sha256sum etc/fstab >> /usr/local/sbin/manifest.sha256
sha256sum etc/rsyslog.conf >> /usr/local/sbin/manifest.sha256
sha256sum etc/rsyslog.d/* >> /usr/local/sbin/manifest.sha256
 
cd /usr/local/sbin/
 
scp -rp manifest.sha256 backupsvc@storage-a4:$DIR_PATH
 
ssh backupsvc@storage-a4 "ln -s $DIR_PATH /srv/backups/svc-a4/latest "
 
echo "A4_BACKUP_OK" >> /var/log/a4-service/backup.log
logger -t Backup A4_BACKUP_OK

1. Скрипт a4-backup-svc.sh (Резервное копирование)

Этот скрипт собирает важные файлы локальной машины и отправляет их на удаленный сервер хранения (storage-a4).

Пошаговый алгоритм работы:

  1. Создание временной метки: Скрипт берет текущую дату и время в формате ГГГГММДД-ЧЧММСС и формирует путь для новой папки бэкапа (например, /srv/backups/svc-a4/20260725-180233/).

  2. Подготовка директории: По SSH подключается к удаленному серверу storage-a4 (под пользователем backupsvc) и создает там эту папку.

  3. Копирование файлов (rsync): Копирует на удаленный сервер:

    • Конфиги: /srv/a4-service/config/*
    • Данные: /srv/a4-service/data/*
    • Системные файлы: /etc/fstab, /etc/rsyslog.conf, /etc/rsyslog.d/*

    Важно: Благодаря флагу -R (relative), утилита rsync сохраняет полную структуру папок. На удаленном сервере файлы будут лежать по пути .../20260725-180233/srv/a4-service/config/... и т.д.

  4. Создание манифеста (хэшей): Скрипт переходит в корневую папку / и вычисляет контрольные суммы (SHA-256) для всех скопированных файлов. Результат записывается во временный файл manifest.sha256 по пути /usr/local/sbin/.

  5. Отправка манифеста: Переносит этот файл манифеста на удаленный сервер в папку с текущим бэкапом с помощью scp.

  6. Обновление ярлыка (symlink): По SSH создает символическую ссылку с именем latest на удаленном сервере, которая теперь указывает на только что созданную папку с бэкапом.

  7. Логирование: Записывает сообщение об успехе (A4_BACKUP_OK) в локальный файл лога /var/log/a4-service/backup.log и в системный журнал (syslog) с помощью команды logger.

a4-restore-svc.sh

#!/bin/bash
 
rm /srv/a4-service/data/critical.txt
 
rsync backupsvc@storage-a4:/srv/backups/svc-a4/latest/srv/a4-service/data/critical.txt /srv/a4-service/data/critical.txt
 
echo "A4_RESTORE_OK" >> /var/log/a4-service/backup.log
logger -t Backup A4_RESTORE_OK

2. Скрипт a4-restore-svc.sh (Восстановление)

В отличие от скрипта бэкапа, который сохраняет много файлов, этот скрипт восстанавливает строго один конкретный файл.

Пошаговый алгоритм работы:

  1. Удаление локального файла: Жестко удаляет текущий файл /srv/a4-service/data/critical.txt на локальной машине.

  2. Загрузка из бэкапа: С помощью rsync скачивает этот же файл с удаленного сервера из папки latest (которая всегда указывает на самый свежий бэкап) обратно на исходное место.

  3. Логирование: Записывает сообщение об успешном восстановлении (A4_RESTORE_OK) в локальный лог и системный журнал.

⚠️ Архитектурные замечания и возможные ошибки

Как эксперт, я вижу несколько мест в коде, которые могут привести к проблемам в будущем:

  • Проблема с ярлыком (symlink): Команда ln -s $DIR_PATH /srv/backups/svc-a4/latest при повторном запуске отработает некорректно. Если папка/ссылка latest уже существует, ln -s либо выдаст ошибку, либо создаст ссылку внутри папки latest. Чтобы ссылка именно перезаписывалась, нужно использовать флаги: ln -snf ....

  • Странное место для манифеста: Скрипт сохраняет manifest.sha256 в /usr/local/sbin/. Эта системная директория предназначена для исполняемых бинарных файлов администратора. Для временных файлов правильнее использовать /tmp/.

  • Слепое удаление при восстановлении: В скрипте восстановления rm /srv/a4-service/data/critical.txt выполняется без проверки. Если сервер недоступен, файл удалится, а rsync не сможет скачать новый. Сервис останется без критического файла.