Backup der Konfiguration eines UniFi CloudKeys

Der UniFi CloudKey kann in regelmäßigen Abständen die aktuelle Konfiguration auf ein lokales Medium (SD-Karte) sichern. Diese Sicherungen liegen jedoch immer noch auf dem CloudKey, also kein richtiges Backup. Mit einem einfachen Skript können diese Dateien auf einen "Backupserver" kopiert werden.

Vorbereitung auf dem CloudKey

Am CloudKey via SSH ubnt@CLOUDKEY-IP oder admin@CLOUDKEY-IP (Passwort ist dasjenige welches beim Einrichten vergeben wurde) anmelden und folgende Befehle ausführen um den SSH-Key des Backupbenutzers zu hinterlegen:

[user@host:~]$ ssh admin@CLOUDKEY-IP
root@UniFi-CloudKey:~$ mkdir .ssh
root@UniFi-CloudKey:~$ cd .ssh
root@UniFi-CloudKey:~$ echo "ssh-rsa xyz..." >> authorized_keys
root@UniFi-CloudKey:~$ exit
# Test
[user@host:~]$ ssh -i /PATH/TO/id_rsa admin@CLOUDKEY-IP
root@UniFi-CloudKey:~$ exit

Backupserver

Konfiguratoinsdatei anlegen

Die Konfigurationsdatei für das eigentliche Backupskript kann unter /etc/ubnt-ck-backup.cfg oder im home-Verzeichnis (/home/USER/.ubnt-ck-backup.cfg) des Benutzers als versteckte Datei angelegt werden:

#!/bin/bash

# Where to find the private SSH_KEY
SSH_KEY="/root/rsnapshot-ssh/id_rsa"

# User to login at the CloudKey (ubnt or admin )
TRGT_USER=ubnt

# IP- of the CloudKey
TRGT_IP="xxx.yyy.zzz.aaa"

# The directory to backup - this you have to check
SRC_DIR="/srv/unifi/data/backup"

# The directory for saving the files
TRGT_DIR="/storage/tmp/"

# HO long should we keep the files
RETENTIONTIME=14

Das Skript

Leider ist auf dem UniFi Cloudkey kein rsync installiert, so dass nur via scp gesichert werden kann. Das bedeutet, dass immer nur neue Dateien hinzukommen. Um die Menge der Dateien nicht zu groß werden zu lassen kann über die Variable RETENTIONTIME angegeben werden ab welchem Alter Dateien gelöscht werden sollen.

#!/bin/bash

function set_config {
        if [ -r /etc/ubnt-ck-backup.cfg ]; then
                # Check if configuration is found in /etc. If yes set configvar
                BACKUPCFG=/etc/ubnt-ck-backup.cfg
        elif [ -r ~/.ubnt-ck-backup.cfg ]; then
                # If config is found in the backupuser home directory set it into the configvar
                BACKUPCFG=~/.ubnt-ck-backup.cfg
        else
                echo "No configuration file is found, please create one" | /usr/bin/logger -s -i -t "Unifi CloudKey BackuP"
        exit 1
        fi
}

function run_backup {
    scp -i $SSH_KEY -r $TRGT_USER@$TRGT_IP:$SRC_DIR $TRGT_DIR
}

function check_preq {
    if [ -d $TRGT_DIR ]; then
        RUN=TRUE
    else
        mkdir $TRGT_DIR
    fi
}

function clenaup {
    if [ $RETENTIONTIME -gt 0 ]; then
            find $TRGT_DIR -mtime +$RETENTIONTIME -delete
    fi
}

function main {
    set_config
    source $BACKUPCFG
    check_preq
    run_backup
    cleanup
}
main

Getestet wurde das Skript mit einem CloudKey der ersten Generation und mit ein paar wenigen Anpassungen der Konfiguration auf einem CloudKey der zweiten Generation.