mod: backup k3s ......
This commit is contained in:
parent
18d396991e
commit
920cf30bae
@ -25,8 +25,6 @@ SAMBA_PASSWORD="<secret-password>" # Лучше использовать фай
|
|||||||
SAMBA_SHARE="//<NAS-IP>/<FOLDER>"
|
SAMBA_SHARE="//<NAS-IP>/<FOLDER>"
|
||||||
# Каталог для резервных копий на SAMBA
|
# Каталог для резервных копий на SAMBA
|
||||||
BACKUP_DIR="${MOUNT_POINT}/k3s-backup"
|
BACKUP_DIR="${MOUNT_POINT}/k3s-backup"
|
||||||
# Временный файл журнала на SAMBA
|
|
||||||
LOG_FILE="${BACKUP_DIR}/backup.log"
|
|
||||||
# Каталог с манифестами K3s
|
# Каталог с манифестами K3s
|
||||||
MANIFESTS_DIR="/home/opi/k3s"
|
MANIFESTS_DIR="/home/opi/k3s"
|
||||||
# Каталог со снапшотами etcd K3s
|
# Каталог со снапшотами etcd K3s
|
||||||
@ -37,6 +35,8 @@ USER_HOME="/home/opi"
|
|||||||
RETENTION_DAYS=14
|
RETENTION_DAYS=14
|
||||||
# Формат даты для имен файлов и записей в журнале
|
# Формат даты для имен файлов и записей в журнале
|
||||||
DATE_FORMAT='%F--%H-%M-%S'
|
DATE_FORMAT='%F--%H-%M-%S'
|
||||||
|
# Файл журнала на SAMBA
|
||||||
|
LOG_FILE="${BACKUP_DIR}/-backup---"$(date +${DATE_FORMAT})".log"
|
||||||
|
|
||||||
# --- Вспомогательные функции ---
|
# --- Вспомогательные функции ---
|
||||||
# Функция для записи сообщения в журнал и на консоль
|
# Функция для записи сообщения в журнал и на консоль
|
||||||
@ -45,14 +45,24 @@ log_message() {
|
|||||||
local timestamp
|
local timestamp
|
||||||
timestamp=$(date +'%F %R:%S')
|
timestamp=$(date +'%F %R:%S')
|
||||||
# Выводим на консоль и дописываем в файл журнала (если он уже доступен)
|
# Выводим на консоль и дописываем в файл журнала (если он уже доступен)
|
||||||
|
# Добавляем проверку, существует ли каталог для лога, на случай ошибки монтирования
|
||||||
|
if [ -d "$(dirname "${LOG_FILE}")" ]; then
|
||||||
echo -e "${timestamp} - ${message}" | tee -a "${LOG_FILE}"
|
echo -e "${timestamp} - ${message}" | tee -a "${LOG_FILE}"
|
||||||
|
else
|
||||||
|
# Если каталог недоступен (например, до монтирования или после размонтирования), пишем только в консоль
|
||||||
|
echo -e "${timestamp} - ${message}"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Функция для вывода разделителя в журнал и на консоль
|
# Функция для вывода разделителя в журнал и на консоль
|
||||||
log_separator() {
|
log_separator() {
|
||||||
local timestamp
|
local timestamp
|
||||||
timestamp=$(date +'%F %R:%S')
|
timestamp=$(date +'%F %R:%S')
|
||||||
|
if [ -d "$(dirname "${LOG_FILE}")" ]; then
|
||||||
echo -e "${timestamp} - =========================" | tee -a "${LOG_FILE}"
|
echo -e "${timestamp} - =========================" | tee -a "${LOG_FILE}"
|
||||||
|
else
|
||||||
|
echo -e "${timestamp} - ========================="
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Функция для завершения скрипта и размонтирования SAMBA
|
# Функция для завершения скрипта и размонтирования SAMBA
|
||||||
@ -61,12 +71,12 @@ cleanup_and_exit() {
|
|||||||
local timestamp
|
local timestamp
|
||||||
timestamp=$(date +'%F %R:%S')
|
timestamp=$(date +'%F %R:%S')
|
||||||
|
|
||||||
# Логируем код завершения *до* попытки размонтирования, пока лог-файл доступен
|
# Логируем код завершения *до* попытки размонтирования, пока лог-файл (возможно) доступен
|
||||||
log_message "Скрипт завершился с кодом ${exit_code}."
|
log_message "Скрипт завершился с кодом ${exit_code}."
|
||||||
|
|
||||||
# Пытаемся размонтировать SAMBA, если она примонтирована
|
# Пытаемся размонтировать SAMBA, если она примонтирована
|
||||||
if mountpoint -q "${MOUNT_POINT}"; then
|
if mountpoint -q "${MOUNT_POINT}"; then
|
||||||
log_message "Размонтирование SAMBA ресурса '${MOUNT_POINT}'..." # Это сообщение еще попадет в лог
|
log_message "Размонтирование SAMBA ресурса '${MOUNT_POINT}'..." # Это сообщение еще (возможно) попадет в лог
|
||||||
log_separator # И это тоже
|
log_separator # И это тоже
|
||||||
|
|
||||||
if umount "${MOUNT_POINT}"; then
|
if umount "${MOUNT_POINT}"; then
|
||||||
@ -75,10 +85,8 @@ cleanup_and_exit() {
|
|||||||
echo "${timestamp} - SAMBA ресурс успешно размонтирован."
|
echo "${timestamp} - SAMBA ресурс успешно размонтирован."
|
||||||
else
|
else
|
||||||
# Ошибка размонтирования. Лог-файл может быть еще доступен, а может и нет.
|
# Ошибка размонтирования. Лог-файл может быть еще доступен, а может и нет.
|
||||||
# Надежнее вывести ошибку в консоль. Можно попытаться записать и в лог, но без гарантии.
|
# Надежнее вывести ошибку в консоль.
|
||||||
echo "${timestamp} - ОШИБКА: Не удалось размонтировать SAMBA ресурс '${MOUNT_POINT}'."
|
echo "${timestamp} - ОШИБКА: Не удалось размонтировать SAMBA ресурс '${MOUNT_POINT}'."
|
||||||
# При желании, можно раскомментировать следующую строку, чтобы попытаться записать ошибку и в лог:
|
|
||||||
# log_message "ОШИБКА: Не удалось размонтировать SAMBA ресурс '${MOUNT_POINT}'."
|
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
# Ресурс не был примонтирован, лог-файл на нем недоступен
|
# Ресурс не был примонтирован, лог-файл на нем недоступен
|
||||||
@ -92,38 +100,38 @@ trap cleanup_and_exit EXIT
|
|||||||
|
|
||||||
# --- Основной скрипт ---
|
# --- Основной скрипт ---
|
||||||
|
|
||||||
log_message "Запуск скрипта резервного копирования K3s..."
|
echo "Запуск скрипта резервного копирования K3s..." # Это сообщение только в консоль
|
||||||
log_separator
|
|
||||||
|
|
||||||
# Проверяем, что скрипт запущен от имени root (нужно для mount, доступа к /var/lib/rancher)
|
# Проверяем, что скрипт запущен от имени root (нужно для mount, доступа к /var/lib/rancher)
|
||||||
if [[ $EUID -ne 0 ]]; then
|
if [[ $EUID -ne 0 ]]; then
|
||||||
log_message "ОШИБКА: Этот скрипт должен быть запущен от имени root (используй sudo)."
|
echo "ОШИБКА: Этот скрипт должен быть запущен от имени root (используй sudo)."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 1. Подготовка точки монтирования
|
# 1. Подготовка точки монтирования
|
||||||
log_message "Проверка и создание локальной точки монтирования '${MOUNT_POINT}'..."
|
echo "Проверка и создание локальной точки монтирования '${MOUNT_POINT}'..." # Только консоль
|
||||||
if [ ! -d "${MOUNT_POINT}" ]; then
|
if [ ! -d "${MOUNT_POINT}" ]; then
|
||||||
if mkdir -p "${MOUNT_POINT}"; then
|
if mkdir -p "${MOUNT_POINT}"; then
|
||||||
log_message "Точка монтирования '${MOUNT_POINT}' создана."
|
echo "Точка монтирования '${MOUNT_POINT}' создана." # Только консоль
|
||||||
else
|
else
|
||||||
log_message "ОШИБКА: Не удалось создать точку монтирования '${MOUNT_POINT}'."
|
echo "ОШИБКА: Не удалось создать точку монтирования '${MOUNT_POINT}'."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
log_separator
|
echo "=========================" # Только консоль
|
||||||
|
|
||||||
# 2. Монтирование SAMBA ресурса
|
# 2. Монтирование SAMBA ресурса
|
||||||
log_message "Монтирование SAMBA ресурса '${SAMBA_SHARE}' в '${MOUNT_POINT}'..."
|
echo "Монтирование SAMBA ресурса '${SAMBA_SHARE}' в '${MOUNT_POINT}'..." # Только консоль
|
||||||
# Для безопасности лучше использовать файл credentials: -o credentials=/путь/к/.smbcreds,uid=1000,gid=1000 и т.д.
|
# Для безопасности лучше использовать файл credentials: -o credentials=/путь/к/.smbcreds,uid=1000,gid=1000 и т.д.
|
||||||
if ! mount -t cifs -o username="${SAMBA_USER}",password="${SAMBA_PASSWORD}" "${SAMBA_SHARE}" "${MOUNT_POINT}"; then
|
if ! mount -t cifs -o username="${SAMBA_USER}",password="${SAMBA_PASSWORD}" "${SAMBA_SHARE}" "${MOUNT_POINT}"; then
|
||||||
log_message "ОШИБКА: Не удалось примонтировать SAMBA ресурс."
|
echo "ОШИБКА: Не удалось примонтировать SAMBA ресурс."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
log_message "SAMBA ресурс успешно примонтирован."
|
log_message "SAMBA ресурс успешно примонтирован."
|
||||||
log_separator
|
log_separator
|
||||||
|
|
||||||
# 3. Подготовка каталога для резервных копий на SAMBA
|
# 3. Подготовка каталога для резервных копий на SAMBA
|
||||||
|
# Теперь можно использовать log_message, т.к. каталог BACKUP_DIR должен быть доступен
|
||||||
log_message "Проверка и создание каталога для резервных копий '${BACKUP_DIR}' на SAMBA..."
|
log_message "Проверка и создание каталога для резервных копий '${BACKUP_DIR}' на SAMBA..."
|
||||||
if [ ! -d "${BACKUP_DIR}" ]; then
|
if [ ! -d "${BACKUP_DIR}" ]; then
|
||||||
if mkdir -p "${BACKUP_DIR}"; then
|
if mkdir -p "${BACKUP_DIR}"; then
|
||||||
@ -136,9 +144,8 @@ fi
|
|||||||
log_separator
|
log_separator
|
||||||
|
|
||||||
# Начинаем полноценное логирование в файл на примонтированном ресурсе
|
# Начинаем полноценное логирование в файл на примонтированном ресурсе
|
||||||
# (Начальные сообщения выводились только в консоль, пока монтирование не было подтверждено)
|
log_message "Начало процесса резервного копирования (лог: ${LOG_FILE})..."
|
||||||
echo -e "\n\n$(date +'%F %R:%S') - Начало процесса резервного копирования..." >> "${LOG_FILE}"
|
log_separator
|
||||||
echo -e "$(date +'%F %R:%S') - =========================" >> "${LOG_FILE}"
|
|
||||||
|
|
||||||
|
|
||||||
# Переходим в домашний каталог пользователя (если нужно для относительных путей, хотя сейчас используются абсолютные)
|
# Переходим в домашний каталог пользователя (если нужно для относительных путей, хотя сейчас используются абсолютные)
|
||||||
@ -232,7 +239,8 @@ log_separator
|
|||||||
log_message "Очистка старых резервных копий старше ${RETENTION_DAYS} дней в '${BACKUP_DIR}'..."
|
log_message "Очистка старых резервных копий старше ${RETENTION_DAYS} дней в '${BACKUP_DIR}'..."
|
||||||
# Ищем и удаляем старые zip-файлы и файлы журналов, соответствующие шаблонам
|
# Ищем и удаляем старые zip-файлы и файлы журналов, соответствующие шаблонам
|
||||||
# Используем -maxdepth 1, чтобы случайно не удалить файлы во вложенных каталогах
|
# Используем -maxdepth 1, чтобы случайно не удалить файлы во вложенных каталогах
|
||||||
deleted_files=$(/usr/bin/find "${BACKUP_DIR}" -maxdepth 1 -type f \( -name "etcd-------*.zip" -o -name "manifests--*.zip" -o -name "secrets----*.zip" -o -name "log-backup-*.log" \) -mtime +"${RETENTION_DAYS}" -print -delete)
|
# Обновляем шаблон для лог-файлов: backup-*.log
|
||||||
|
deleted_files=$(/usr/bin/find "${BACKUP_DIR}" -maxdepth 1 -type f \( -name "etcd-------*.zip" -o -name "manifests--*.zip" -o -name "secrets----*.zip" -o -name "-backup---*.log" \) -mtime +"${RETENTION_DAYS}" -print -delete)
|
||||||
|
|
||||||
if [[ -n "$deleted_files" ]]; then
|
if [[ -n "$deleted_files" ]]; then
|
||||||
log_message "Удалены старые файлы резервных копий:"
|
log_message "Удалены старые файлы резервных копий:"
|
||||||
@ -248,20 +256,9 @@ ls -alhcrt "${BACKUP_DIR}" >> "${LOG_FILE}" # Записываем подроб
|
|||||||
ls -alhcrt "${BACKUP_DIR}" # Показываем список на консоли
|
ls -alhcrt "${BACKUP_DIR}" # Показываем список на консоли
|
||||||
log_separator
|
log_separator
|
||||||
|
|
||||||
# 10. Ротация файла журнала
|
# 10. Размонтирование и выход (Обрабатывается через trap)
|
||||||
log_message "Ротация файла журнала..."
|
|
||||||
log_backup_file="${BACKUP_DIR}/log-backup-$(date +"${DATE_FORMAT}").log"
|
|
||||||
if mv "${LOG_FILE}" "${log_backup_file}"; then
|
|
||||||
log_message "Файл журнала перемещен в ${log_backup_file}."
|
|
||||||
else
|
|
||||||
log_message "ОШИБКА: Не удалось переместить файл журнала ${LOG_FILE}."
|
|
||||||
fi
|
|
||||||
log_separator
|
|
||||||
|
|
||||||
# 11. Размонтирование и выход (Обрабатывается через trap)
|
|
||||||
log_message "Процесс резервного копирования завершен. Размонтирование произойдет при выходе."
|
log_message "Процесс резервного копирования завершен. Размонтирование произойдет при выходе."
|
||||||
# механизм `trap cleanup_and_exit EXIT` размонтирует SAMBA при выходе из скрипта.
|
log_separator
|
||||||
# и поэтому явный `umount "${MOUNT_POINT}"` не нужен.
|
|
||||||
|
|
||||||
# Явный выход с кодом 0, если мы дошли до сюда без ошибок
|
# Явный выход с кодом 0, если мы дошли до сюда без ошибок
|
||||||
exit 0
|
exit 0
|
||||||
|
Loading…
x
Reference in New Issue
Block a user