Перейти к содержанию

Резервное копирование роутера Keenetik


Рекомендуемые сообщения

  • Эксперты

Резервное копирование Keenetic + Entware

Если на роутер установлена дополнительная система Entware, можно использовать скрипт, создающий резервную копию настроек роутера, прошивки и Entware с настройками. После выполнения — приходит Telegram-уведомление.

Скрипт создан на основе обсуждения на форуме Keenetic Community: форум.

📦 Скрипт

#!/opt/bin/bash

set -x

export PATH=/opt/bin:/opt/sbin:/bin:/usr/bin:/usr/sbin:/sbin

# =========== НАСТРОЙКИ ============
CONFIG_FILE="/opt/etc/backup_config.env"

if [[ ! -f $CONFIG_FILE ]]; then
    echo "❌ Конфигурационный файл $CONFIG_FILE отсутствует!"
    exit 1
fi

# Импорт конфигурации
source "$CONFIG_FILE"

DATE=$(date +%Y-%m-%d_%H-%M-%S)
ARCHIVE_NAME="keenetic_backup_${DATE}.tar.gz"
ARCHIVE_PATH="${LOCAL_TMP_DIR}/${ARCHIVE_NAME}"

# Логирование в syslog
log() {
    logger "[BACKUP]: $1"
    echo "$(date +%Y-%m-%d_%H:%M:%S) $1" | tee -a "$LOG_FILE"
}

# Отправка Telegram уведомлений
send_telegram() {
    MESSAGE=$(echo -e "$1" | sed 's/$/%0A/g')
    curl -s -X POST "https://api.telegram.org/bot$TELEGRAM_TOKEN/sendMessage" \
        -d chat_id="$TELEGRAM_CHAT_ID" \
        -d message_thread_id="$TELEGRAM_THREAD_ID" \
        -d parse_mode="Markdown" \
        -d text="$MESSAGE"
}

# Очистка локальной директории
cleanup_local() {
    log "🧹 Очистка локальной директории $LOCAL_BACKUP_DIR..."
    rm -rf "$LOCAL_BACKUP_DIR"/* || log "⚠️ Не удалось очистить $LOCAL_BACKUP_DIR."
    log "🧹 Очистка локальной директории $LOCAL_TMP_DIR..."
    rm -rf "$LOCAL_TMP_DIR"/* || log "⚠️ Не удалось очистить $LOCAL_TMP_DIR."
}

# Бэкап Entware
backup_entware() {
    log "📦 Создание бэкапа Entware..."
    tar cvzf ${LOCAL_BACKUP_DIR}/entware_backup_${DATE}.tar.gz -C /opt . > /dev/null
}

# Бэкап прошивки
backup_firmware() {
    log "🔧 Создание бэкапа прошивки..."
    REL=$(ndmc -c 'show version' | grep 'release:' | awk '{print $2}')
    ndmc -c "copy flash:/firmware ${FW_BACKUP_DIR}/firmware-${REL}_${DATE}.bin"
    log "✅ Создан бэкап прошивки: ${FW_BACKUP_DIR}/firmware-${REL}_${DATE}.bin"
}

# Бэкап конфига
backup_config() {
    log "🛠️ Создание бэкапа конфигурации..."
    ndmc -c "show running-config" > ${LOCAL_BACKUP_DIR}/config_${DATE}.cfg
    log "✅ Создан бэкап конфигурации: ${LOCAL_BACKUP_DIR}/config_${DATE}.cfg"
}

# Архивация бэкапов
create_archive() {
    log "📦 Создание архива $ARCHIVE_NAME..."
    tar cvzf ${ARCHIVE_PATH} -C ${LOCAL_BACKUP_DIR} . > /dev/null || return 1
    log "✅ Архив создан: $ARCHIVE_PATH"
}

# Копирование на Nextcloud
upload_to_nextcloud() {
    log "☁️ Копирование $ARCHIVE_PATH на Nextcloud..."
    curl -T ${ARCHIVE_PATH} -u ${NEXTCLOUD_USER}:${NEXTCLOUD_PASS} {$BACKUP_DIR_URL}/${ARCHIVE_NAME}
	log "✅ Архив отправлен на Nextloud: $BACKUP_DIR_URL/${ARCHIVE_NAME}"
}

# Ротация бэкапов
rotate_backups() {
    log "📁 Получаем список бэкапов в Nextcloud..."

    # Получаем список бэкапов
    file_list=$(curl -s -u "$NEXTCLOUD_USER:$NEXTCLOUD_PASS" -X PROPFIND "$BACKUP_DIR_URL" -H "Depth: 1" \
        | grep -oE "/remote.php/dav/files/[^<]*keenetic_backup_[^<]*\.tar\.gz")

    if [ -z "$file_list" ]; then
        log "ℹ️ Нет доступных бэкапов для ротации."
        return 0
    fi

    echo "$file_list" | sort > /tmp/backups_sorted.txt
    total=$(wc -l < /tmp/backups_sorted.txt)
	
	# Удалим на один больше так как делаем новый бекап
    target_keep=$((KEEP_LAST - 1))
	
    if [ "$total" -le "$target_keep"]; then
        log "👍 Пока удалять нечего — всего $total бэкапов."
        return 0
    fi

    delete_count=$((total - target_keep))
    log "🗑️ Удаляем $delete_count старых бэкапов..."

    head -n "$delete_count" /tmp/backups_sorted.txt | while read -r path; do
        filename=$(basename "$path")
        full_url="${BACKUP_DIR_URL}/${filename}"
        echo "➡️ Удаление: $full_url"
        curl -s -u ${NEXTCLOUD_USER}:${NEXTCLOUD_PASS} -X DELETE ${full_url}
    done

    log "✅ Ротация завершена."
}

# =========== ОСНОВНОЙ СКРИПТ ============
main() {
    log "=== 🚀 Начало резервного копирования ==="
    cleanup_local
    mkdir -p "$LOCAL_BACKUP_DIR"
	mkdir -p "$LOCAL_TMP_DIR"

    # Выполнение шагов
    backup_entware
    backup_firmware
    backup_config
	
	# Упаковка в единый архив
    create_archive
	
    # Ротация
    rotate_backups

    # Копирование на хранилища
    upload_to_nextcloud

    # Отправка отчета
    send_report

    log "🧹 Очистка локальной директории $LOCAL_TMP_DIR..."
    rm -rf "$LOCAL_TMP_DIR"/* || log "⚠️ Не удалось очистить $LOCAL_TMP_DIR."
	
	send_telegram "✅ Создана [резервная копия]($BACKUP_DIR_URL/$ARCHIVE_NAME) настроек роутера."
	
    log "=== ✅ Завершено ==="
}

main

🔧 Установка скрипта

# Путь к скрипту
/opt/usr/bin/backup

# Путь к конфигурации
/opt/etc/backup_config.env

# Сделать скрипт исполняемым
chmod +x /opt/usr/bin/backup

# Добавить в cron (ежедневно в 11:00)
0 11 * * * /opt/bin/bash /opt/usr/bin/backup

⚙️ Настройка backup_config.env

KEEP_LAST=3
LOCAL_BACKUP_DIR="/tmp/mnt/Router/backups"
FW_BACKUP_DIR="Router:/backups"
LOCAL_TMP_DIR="/tmp/mnt/Router/tmp"
LOG_FILE="/tmp/mnt/Router/backup.log"

NEXTCLOUD_USER="user"
NEXTCLOUD_PASS="password"
BACKUP_DIR_URL="https://cloud.domain.ru/remote.php/dav/files/user/folder"

TELEGRAM_TOKEN="token"
TELEGRAM_CHAT_ID="CHAT_ID"
# TELEGRAM_THREAD_ID="THREAD_ID" — удалить строку из скрипта, если не используете

🧰 Что делает скрипт?

  • Чистит временные директории
  • Создаёт бэкап Entware (/opt)
  • Создаёт бэкап прошивки
  • Сохраняет текущую конфигурацию роутера
  • Архивирует всё в keenetic_backup_*.tar.gz
  • Отправляет архив на Nextcloud через WebDAV
  • Удаляет старые резервные копии, оставляя только последние KEEP_LAST
  • Отправляет Telegram-уведомление

💡 Альтернатива: rclone (не рекомендуется)

Можно заменить curl на rclone для загрузки архива на облачные хранилища, например Google Drive. Однако, это сильно нагружает роутер.

# Копирование на Google Drive
upload_to_google_drive() {
    log "☁️ Копирование $ARCHIVE_PATH на Google Drive..."
    attempt_command "rclone copy $ARCHIVE_PATH $GDRIVE_REMOTE" "Копирование на Google Drive"
}

# Ротация бэкапов
rotate_backups() {
    log "♻️ Ротация бэкапов старше $RETENTION_DAYS дней..."
    rclone delete --min-age "${RETENTION_DAYS}d" "$GDRIVE_REMOTE" && log "✅ Ротация на GDrive завершена."
    rclone delete --min-age "${RETENTION_DAYS}d" "$MEGA_REMOTE" && log "✅ Ротация на Mega завершена."
}

🔁 Восстановление

Архив содержит три файла:

  • config_* — конфигурация роутера
  • firmware-* — прошивка роутера
  • entware_backup_*.tar.gz — образ Entware со всеми настройками

Для восстановления Entware — заменить стандартный архив установкой содержимого в install.

✅ Готово! Скрипт работает стабильно и регулярно делает резервные копии всех важных компонентов Keenetic + Entware.

 

 

Если будут изменения, искать в оригинальной репе:
https://deniom.ru/zametki/rezervnoe-kopirovanie-routera-keenetik/

 

 

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...

Важная информация

Вы принимаете наши Условия использования, Политика конфиденциальности, Правила. А также использование Мы разместили cookie-файлы на ваше устройство, чтобы помочь сделать этот сайт лучше. Вы можете изменить свои настройки cookie-файлов, или продолжить без изменения настроек.

Яндекс.Метрика