Technical guide

ImmortalWrt Smart Automatic Backup

This script set provides a stable daily backup workflow for ImmortalWrt routers:

2 min readUpdated Aug 10, 2026
On this page
  1. Overview
  2. Why This Approach
  3. Setup Steps
  4. 1. Install Dependencies
  5. 2. Configure SSH Key
  6. 3. Deploy Backup Script
  7. 4. Configure Cron
  8. 5. Optional Boot Auto-Run
  9. Logs and Status
  10. Restore
  11. 1) Full Restore via .tar.gz
  12. 2) Restore a Single Config File
  13. 3) Review Change History
  14. FAQ
  15. Why no new backup was pushed?
  16. Push failed (network/SSH)?
  17. Can I force a backup?

ImmortalWrt Smart Automatic Backup

Overview

This script set provides a stable daily backup workflow for ImmortalWrt routers:

  • Backup only when real config changes are detected
  • Keep both restore archives (.tar.gz) and extracted config snapshots
  • Push backup history to GitHub
  • Keep local/remote retention under control

Why This Approach

  • Avoid meaningless duplicate backups
  • Keep change history reviewable with Git diff
  • Make restore operations faster and more predictable
  • Reduce unnecessary SD card writes

Setup Steps

1. Install Dependencies

First identify your OpenWrt branch:

  • OpenWrt 24.10 and earlier stable releases: use opkg
  • OpenWrt 25.12 and newer: use apk

For 24.10 and earlier:

opkg update
opkg install git openssh-client openssh-keygen ca-bundle ca-certificates

For 25.12 and newer:

apk update
apk add git openssh-client openssh-keygen ca-bundle ca-certificates

2. Configure SSH Key

# Generate key if not exists
ssh-keygen -t ed25519 -f /root/.ssh/id_ed25519 -N ""

# Add the public key to GitHub
cat /root/.ssh/id_ed25519.pub

# Optional: force SSH over 443 (when port 22 is blocked)
cat > /root/.ssh/config <<'EOF'
Host github.com
  HostName ssh.github.com
  Port 443
  User git
  IdentityFile ~/.ssh/id_ed25519
  StrictHostKeyChecking accept-new
EOF

chmod 600 /root/.ssh/config
chmod 700 /root/.ssh
chmod 600 /root/.ssh/id_ed25519
chmod 644 /root/.ssh/id_ed25519.pub

# Connection test
ssh -T git@github.com

3. Deploy Backup Script

wget -O /root/smart_backup.sh https://raw.githubusercontent.com/YOUR_USERNAME/YOUR_REPO/master/scripts/smart_backup.sh
chmod +x /root/smart_backup.sh
vi /root/smart_backup.sh

Main config fields:

GIT_REMOTE="git@github.com:YOUR_USERNAME/YOUR_BACKUP_REPO.git"
BRANCH="master"
BACKUP_DIR="/root/immortalwrt-backup"
MAX_LOCAL_BACKUPS=3
MAX_REMOTE_BACKUPS=30

4. Configure Cron

# Run every day at 15:00
echo "0 15 * * * /root/smart_backup.sh >> /root/smart_backup.log 2>&1" >> /etc/crontabs/root
/etc/init.d/cron restart

5. Optional Boot Auto-Run

vi /etc/rc.local
# Add before exit 0:
/root/smart_backup.sh &
exit 0

Logs and Status

# Backup log
tail -n 50 /root/smart_backup.log

# Cron entries
crontab -l

# Manual test
/root/smart_backup.sh

Restore

1) Full Restore via .tar.gz

Use LuCI:

  • System -> Backup / Flash Firmware -> Restore backup

Or via CLI:

sysupgrade -r backup_YYYYMMDD_HHMMSS.tar.gz
reboot

2) Restore a Single Config File

If only one config is broken (for example network), copy the target file from repository configs/ and overwrite:

vi /etc/config/network
/etc/init.d/network restart

3) Review Change History

cd /root/immortalwrt-backup
git log --oneline configs/network
git show <commit>:configs/network

FAQ

Why no new backup was pushed?

The script skips backup when no effective config change is detected. This is expected behavior.

Push failed (network/SSH)?

Check:

  • SSH key and ~/.ssh/config
  • connectivity to GitHub (ssh -T git@github.com)
  • repository permissions and remote URL

Can I force a backup?

Yes, run manually:

/root/smart_backup.sh