From 920cf30bae3ebf7a50f9cfff3c5347db2d5151a3 Mon Sep 17 00:00:00 2001 From: erjemin Date: Wed, 30 Apr 2025 00:01:52 +0300 Subject: [PATCH] mod: backup k3s ...... --- kubernetes/k3s-backup.md | 69 +++++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 36 deletions(-) diff --git a/kubernetes/k3s-backup.md b/kubernetes/k3s-backup.md index ee1977a..77397fa 100644 --- a/kubernetes/k3s-backup.md +++ b/kubernetes/k3s-backup.md @@ -25,8 +25,6 @@ SAMBA_PASSWORD="" # Лучше использовать фай SAMBA_SHARE="///" # Каталог для резервных копий на SAMBA BACKUP_DIR="${MOUNT_POINT}/k3s-backup" -# Временный файл журнала на SAMBA -LOG_FILE="${BACKUP_DIR}/backup.log" # Каталог с манифестами K3s MANIFESTS_DIR="/home/opi/k3s" # Каталог со снапшотами etcd K3s @@ -37,6 +35,8 @@ USER_HOME="/home/opi" RETENTION_DAYS=14 # Формат даты для имен файлов и записей в журнале DATE_FORMAT='%F--%H-%M-%S' +# Файл журнала на SAMBA +LOG_FILE="${BACKUP_DIR}/-backup---"$(date +${DATE_FORMAT})".log" # --- Вспомогательные функции --- # Функция для записи сообщения в журнал и на консоль @@ -45,14 +45,24 @@ log_message() { local timestamp timestamp=$(date +'%F %R:%S') # Выводим на консоль и дописываем в файл журнала (если он уже доступен) - echo -e "${timestamp} - ${message}" | tee -a "${LOG_FILE}" + # Добавляем проверку, существует ли каталог для лога, на случай ошибки монтирования + if [ -d "$(dirname "${LOG_FILE}")" ]; then + echo -e "${timestamp} - ${message}" | tee -a "${LOG_FILE}" + else + # Если каталог недоступен (например, до монтирования или после размонтирования), пишем только в консоль + echo -e "${timestamp} - ${message}" + fi } # Функция для вывода разделителя в журнал и на консоль log_separator() { local timestamp timestamp=$(date +'%F %R:%S') - echo -e "${timestamp} - =========================" | tee -a "${LOG_FILE}" + if [ -d "$(dirname "${LOG_FILE}")" ]; then + echo -e "${timestamp} - =========================" | tee -a "${LOG_FILE}" + else + echo -e "${timestamp} - =========================" + fi } # Функция для завершения скрипта и размонтирования SAMBA @@ -61,12 +71,12 @@ cleanup_and_exit() { local timestamp timestamp=$(date +'%F %R:%S') - # Логируем код завершения *до* попытки размонтирования, пока лог-файл доступен + # Логируем код завершения *до* попытки размонтирования, пока лог-файл (возможно) доступен log_message "Скрипт завершился с кодом ${exit_code}." # Пытаемся размонтировать SAMBA, если она примонтирована if mountpoint -q "${MOUNT_POINT}"; then - log_message "Размонтирование SAMBA ресурса '${MOUNT_POINT}'..." # Это сообщение еще попадет в лог + log_message "Размонтирование SAMBA ресурса '${MOUNT_POINT}'..." # Это сообщение еще (возможно) попадет в лог log_separator # И это тоже if umount "${MOUNT_POINT}"; then @@ -75,10 +85,8 @@ cleanup_and_exit() { echo "${timestamp} - SAMBA ресурс успешно размонтирован." else # Ошибка размонтирования. Лог-файл может быть еще доступен, а может и нет. - # Надежнее вывести ошибку в консоль. Можно попытаться записать и в лог, но без гарантии. + # Надежнее вывести ошибку в консоль. echo "${timestamp} - ОШИБКА: Не удалось размонтировать SAMBA ресурс '${MOUNT_POINT}'." - # При желании, можно раскомментировать следующую строку, чтобы попытаться записать ошибку и в лог: - # log_message "ОШИБКА: Не удалось размонтировать SAMBA ресурс '${MOUNT_POINT}'." fi else # Ресурс не был примонтирован, лог-файл на нем недоступен @@ -92,38 +100,38 @@ trap cleanup_and_exit EXIT # --- Основной скрипт --- -log_message "Запуск скрипта резервного копирования K3s..." -log_separator +echo "Запуск скрипта резервного копирования K3s..." # Это сообщение только в консоль # Проверяем, что скрипт запущен от имени root (нужно для mount, доступа к /var/lib/rancher) if [[ $EUID -ne 0 ]]; then - log_message "ОШИБКА: Этот скрипт должен быть запущен от имени root (используй sudo)." + echo "ОШИБКА: Этот скрипт должен быть запущен от имени root (используй sudo)." exit 1 fi # 1. Подготовка точки монтирования -log_message "Проверка и создание локальной точки монтирования '${MOUNT_POINT}'..." +echo "Проверка и создание локальной точки монтирования '${MOUNT_POINT}'..." # Только консоль if [ ! -d "${MOUNT_POINT}" ]; then if mkdir -p "${MOUNT_POINT}"; then - log_message "Точка монтирования '${MOUNT_POINT}' создана." + echo "Точка монтирования '${MOUNT_POINT}' создана." # Только консоль else - log_message "ОШИБКА: Не удалось создать точку монтирования '${MOUNT_POINT}'." + echo "ОШИБКА: Не удалось создать точку монтирования '${MOUNT_POINT}'." exit 1 fi fi -log_separator +echo "=========================" # Только консоль # 2. Монтирование SAMBA ресурса -log_message "Монтирование SAMBA ресурса '${SAMBA_SHARE}' в '${MOUNT_POINT}'..." +echo "Монтирование SAMBA ресурса '${SAMBA_SHARE}' в '${MOUNT_POINT}'..." # Только консоль # Для безопасности лучше использовать файл credentials: -o credentials=/путь/к/.smbcreds,uid=1000,gid=1000 и т.д. if ! mount -t cifs -o username="${SAMBA_USER}",password="${SAMBA_PASSWORD}" "${SAMBA_SHARE}" "${MOUNT_POINT}"; then - log_message "ОШИБКА: Не удалось примонтировать SAMBA ресурс." + echo "ОШИБКА: Не удалось примонтировать SAMBA ресурс." exit 1 fi -log_message "SAMBA ресурс успешно примонтирован." +log_message "SAMBA ресурс успешно примонтирован." log_separator # 3. Подготовка каталога для резервных копий на SAMBA +# Теперь можно использовать log_message, т.к. каталог BACKUP_DIR должен быть доступен log_message "Проверка и создание каталога для резервных копий '${BACKUP_DIR}' на SAMBA..." if [ ! -d "${BACKUP_DIR}" ]; then if mkdir -p "${BACKUP_DIR}"; then @@ -136,9 +144,8 @@ fi log_separator # Начинаем полноценное логирование в файл на примонтированном ресурсе -# (Начальные сообщения выводились только в консоль, пока монтирование не было подтверждено) -echo -e "\n\n$(date +'%F %R:%S') - Начало процесса резервного копирования..." >> "${LOG_FILE}" -echo -e "$(date +'%F %R:%S') - =========================" >> "${LOG_FILE}" +log_message "Начало процесса резервного копирования (лог: ${LOG_FILE})..." +log_separator # Переходим в домашний каталог пользователя (если нужно для относительных путей, хотя сейчас используются абсолютные) @@ -232,7 +239,8 @@ log_separator log_message "Очистка старых резервных копий старше ${RETENTION_DAYS} дней в '${BACKUP_DIR}'..." # Ищем и удаляем старые zip-файлы и файлы журналов, соответствующие шаблонам # Используем -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 log_message "Удалены старые файлы резервных копий:" @@ -248,20 +256,9 @@ ls -alhcrt "${BACKUP_DIR}" >> "${LOG_FILE}" # Записываем подроб ls -alhcrt "${BACKUP_DIR}" # Показываем список на консоли log_separator -# 10. Ротация файла журнала -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) +# 10. Размонтирование и выход (Обрабатывается через trap) log_message "Процесс резервного копирования завершен. Размонтирование произойдет при выходе." -# механизм `trap cleanup_and_exit EXIT` размонтирует SAMBA при выходе из скрипта. -# и поэтому явный `umount "${MOUNT_POINT}"` не нужен. +log_separator # Явный выход с кодом 0, если мы дошли до сюда без ошибок exit 0