Если на роутер установлена дополнительная система 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.
Вы можете написать сейчас и зарегистрироваться позже.
Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.
Резервное копирование 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🔧 Установка скрипта
⚙️ Настройка backup_config.env
🧰 Что делает скрипт?
/opt)keenetic_backup_*.tar.gzKEEP_LAST💡 Альтернатива: 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/