Нужно настроить резервное копирование для OpenWrt роутера. Расскажу как это сделано у меня на момент написания этой заметки.

Точка доступа

Есть китайский роутер (китайский он аж до формы вилки) Xiaomi Redmi AX6. С недавних пор на него стала доступна официальная прошивка OpenWrt 23.05. До этого была не официальная бета прошивка, бекап для которой еще более актуален.

Скрипт для OpenWrt

Основной скрипт простой:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env zsh

BACKUP_PATH="$HOME/backup-sync"

backup_ax6 () {
    HOST="ax6.home"
    SSH_CONNECT="root@$HOST"
    FILE="/tmp/backup-$HOST-$(date +%F_%H-%M-%S).tar.gz"

    ssh $SSH_CONNECT sysupgrade -b "$FILE"
    scp -O $SSH_CONNECT:$FILE $BACKUP_PATH
    ssh $SSH_CONNECT rm $FILE
    echo "ax6 backup finish"
}

backup_ax6

clear_old () {
    find $BACKUP_PATH -maxdepth 1 -type f -mtime +30 -delete
    echo "old backup clean finish"
}

clear_old

Тут мы указываем:

  • BACKUP_PATH - путь, куда складывать бекап (на текущей машине это syncthing папка);
  • HOST - домен (или адрес) точки доступа.

Имя файла с бекапом будет состоять из названия хоста и даты-времени создания бекапа. Так же есть маленький вспомогательный скрипт, который удаляет все бекапы старше 30 дней. Теперь запустим этот скрипт можно сделать бекап, скачать его, удалить старые бекапы.

Автоматизация запуска

На текущий момент этот процесс происходит с рабочей станции. Тут есть несколько причин почему, но основные две:

  • включаю я рабочую станцию чаще, чем меняю настройки точки доступа (обычно с нее и меняю);
  • на момент настройки бекапа не было ничего кроме точки доступа и рабочей станции.

Из-за этих особенностей пришлось дописать еще небольшую обвязку поверх systemd и его таймеров. Сервис, который запускает бекап, выглядит так:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[Unit]
Description=Backup ax6.home config
Wants=ax6-backup.timer

[Service]
Type=oneshot
ExecStart=/usr/bin/zsh /home/user/.local/bin/ax6-backup

[Install]
WantedBy=default.target

Тут указано, что это “одноразовый” скрипт и путь к его запуску. Так же для его запуска имеется таймер:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[Unit]
Description=Backup ax6.home config timer
Requires=ax6-backup.timer

[Timer]
Unit=iot-backup.service
OnBootSec=15min
OnUnitActiveSec=1d

[Install]
WantedBy=timers.target

В таймер срабатывает через 15 минут после загрузки системы и далее раз в сутки в это время, если компьютер не выключался.