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_OK1. Скрипт a4-backup-svc.sh (Резервное копирование)
Этот скрипт собирает важные файлы локальной машины и отправляет их на удаленный сервер хранения (storage-a4).
Пошаговый алгоритм работы:
-
Создание временной метки: Скрипт берет текущую дату и время в формате
ГГГГММДД-ЧЧММССи формирует путь для новой папки бэкапа (например,/srv/backups/svc-a4/20260725-180233/). -
Подготовка директории: По SSH подключается к удаленному серверу
storage-a4(под пользователемbackupsvc) и создает там эту папку. -
Копирование файлов (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/...и т.д. - Конфиги:
-
Создание манифеста (хэшей): Скрипт переходит в корневую папку
/и вычисляет контрольные суммы (SHA-256) для всех скопированных файлов. Результат записывается во временный файлmanifest.sha256по пути/usr/local/sbin/. -
Отправка манифеста: Переносит этот файл манифеста на удаленный сервер в папку с текущим бэкапом с помощью
scp. -
Обновление ярлыка (symlink): По SSH создает символическую ссылку с именем
latestна удаленном сервере, которая теперь указывает на только что созданную папку с бэкапом. -
Логирование: Записывает сообщение об успехе (
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_OK2. Скрипт a4-restore-svc.sh (Восстановление)
В отличие от скрипта бэкапа, который сохраняет много файлов, этот скрипт восстанавливает строго один конкретный файл.
Пошаговый алгоритм работы:
-
Удаление локального файла: Жестко удаляет текущий файл
/srv/a4-service/data/critical.txtна локальной машине. -
Загрузка из бэкапа: С помощью
rsyncскачивает этот же файл с удаленного сервера из папкиlatest(которая всегда указывает на самый свежий бэкап) обратно на исходное место. -
Логирование: Записывает сообщение об успешном восстановлении (
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не сможет скачать новый. Сервис останется без критического файла.