UniFi Network Application Docker-Setup mit Update-, Backup- und Restore-Skripten

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
duffyduck
2026-07-26 19:34:07 +02:00
co-authored by Claude Fable 5
commit 247f20602b
7 changed files with 280 additions and 0 deletions
+4
View File
@@ -0,0 +1,4 @@
data/
backups/
data.vor-restore.*/
.env
+79
View File
@@ -0,0 +1,79 @@
# UniFi Network Application (Docker)
UniFi Network Application (Controller) mit MongoDB, alle persistenten Daten
liegen im Projektordner unter `./data/`.
- Image: [linuxserver/unifi-network-application](https://docs.linuxserver.io/images/docker-unifi-network-application/)
- Datenbank: MongoDB **4.4** (bewusst — die CPU dieses Rechners hat kein AVX,
MongoDB 5+ würde nicht starten. Nicht auf ein neueres Mongo-Image wechseln!)
## Erster Start
```bash
docker-compose up -d
docker-compose logs -f unifi-network-application # warten bis der Start durch ist
```
Danach im Browser: **https://<host-ip>:8443** (selbstsigniertes Zertifikat,
Warnung einmalig bestätigen). Im Einrichtungs-Assistenten kann auch direkt ein
vorhandenes Backup (`.unf`) eingespielt werden.
## Wichtig: Inform-Port ist 8082 (nicht 8080!)
Port 8080 ist auf diesem Host bereits belegt, deshalb lauscht der
Inform-Port für die Geräte-Adoption auf **8082**. Damit Geräte sich melden:
- In der Weboberfläche: *Einstellungen → System → Erweitert →
"Inform Host" überschreiben* aktivieren und `<host-ip>:8082` eintragen, **oder**
- pro Gerät per SSH: `set-inform http://<host-ip>:8082/inform`
## Ports
| Host-Port | Zweck |
|-----------|------------------------------------------|
| 8443 | Weboberfläche (HTTPS) |
| 8082 | Inform / Geräte-Adoption (→ 8080 intern) |
| 3478/udp | STUN |
| 10001/udp | Geräte-Discovery |
| 8843 | Gäste-Portal HTTPS (optional) |
| 8880 | Gäste-Portal HTTP (optional) |
| 6789 | Mobile Speedtest (optional) |
## Aktualisieren
```bash
./update.sh
```
Erstellt zuerst ein Backup, zieht dann die neuesten Images und startet die
Container neu. Alle Daten bleiben in `./data/` erhalten.
## Backups
```bash
./backup.sh # kopiert die UniFi-Autobackups (.unf) nach ./backups/
./backup.sh --full # Komplett-Backup von ./data als tar.gz (kurze Downtime)
```
Autobackups einmalig in der Weboberfläche aktivieren:
*Einstellungen → System → Backups → Automatische Sicherung*.
## Wiederherstellen
```bash
./restore.sh backups/unifi-full-backup_<datum>.tar.gz # Komplett-Restore
./restore.sh backups/autobackup_<datum>/<datei>.unf # .unf bereitstellen
```
`.unf`-Backups werden anschließend in der Weboberfläche eingespielt
(*Einstellungen → System → Backups → Wiederherstellen*) oder bei einer
Neuinstallation direkt im Einrichtungs-Assistenten.
## Verzeichnisstruktur
```
data/mongodb/ MongoDB-Datenbank
data/unifi/ UniFi-Konfiguration, Logs, Autobackups
backups/ von backup.sh erstellte Sicherungen
.env Zugangsdaten der Datenbank (nicht weitergeben)
```
Executable
+41
View File
@@ -0,0 +1,41 @@
#!/bin/bash
# Erstellt Backups der UniFi Network Application.
#
# ./backup.sh Kopiert die UniFi-Autobackups (.unf) nach ./backups/
# ./backup.sh --full Komplett-Backup: stoppt die Container und packt das
# gesamte ./data-Verzeichnis als tar.gz nach ./backups/
#
# .unf-Dateien lassen sich über die UniFi-Weboberfläche wiederherstellen,
# das Komplett-Backup über ./restore.sh
set -euo pipefail
cd "$(dirname "$0")"
BACKUP_DIR="./backups"
AUTOBACKUP_DIR="./data/unifi/data/backup/autobackup"
STAMP="$(date +%Y-%m-%d_%H-%M-%S)"
mkdir -p "$BACKUP_DIR"
if [[ "${1:-}" == "--full" ]]; then
echo "==> Komplett-Backup: Container werden kurz gestoppt..."
docker-compose stop
tar czf "$BACKUP_DIR/unifi-full-backup_${STAMP}.tar.gz" data
docker-compose start
echo "==> Fertig: $BACKUP_DIR/unifi-full-backup_${STAMP}.tar.gz"
else
if [[ -d "$AUTOBACKUP_DIR" ]] && compgen -G "$AUTOBACKUP_DIR/*.unf" > /dev/null; then
DEST="$BACKUP_DIR/autobackup_${STAMP}"
mkdir -p "$DEST"
cp "$AUTOBACKUP_DIR"/*.unf "$DEST/"
echo "==> UniFi-Autobackups kopiert nach: $DEST"
ls -lh "$DEST"
else
echo "Noch keine Autobackups vorhanden ($AUTOBACKUP_DIR)."
echo "Autobackups in der UniFi-Weboberfläche aktivieren:"
echo " Einstellungen -> System -> Backups -> Automatische Sicherung"
echo "Alternativ Komplett-Backup erstellen mit: ./backup.sh --full"
fi
fi
echo ""
echo "Vorhandene Backups in $BACKUP_DIR:"
ls -lh "$BACKUP_DIR" | tail -n +2 || true
+50
View File
@@ -0,0 +1,50 @@
version: "3.8"
services:
unifi-db:
image: mongo:4.4
container_name: unifi-db
restart: unless-stopped
environment:
- MONGO_USER=${MONGO_USER}
- MONGO_PASS=${MONGO_PASS}
- MONGO_DBNAME=${MONGO_DBNAME}
volumes:
- ./data/mongodb:/data/db
- ./mongo-init/init-mongo.sh:/docker-entrypoint-initdb.d/init-mongo.sh:ro
networks:
- unifi
unifi-network-application:
image: lscr.io/linuxserver/unifi-network-application:latest
container_name: unifi-network-application
restart: unless-stopped
depends_on:
- unifi-db
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Berlin
- MONGO_USER=${MONGO_USER}
- MONGO_PASS=${MONGO_PASS}
- MONGO_HOST=unifi-db
- MONGO_PORT=27017
- MONGO_DBNAME=${MONGO_DBNAME}
- MEM_LIMIT=1024
- MEM_STARTUP=1024
volumes:
- ./data/unifi:/config
ports:
- "8443:8443" # Web-UI (https://<host>:8443)
- "8082:8080" # Inform-Port für Geräte (Host-Port 8082, da 8080/8081 belegt!)
- "3478:3478/udp" # STUN
- "10001:10001/udp" # Geräte-Discovery
- "8843:8843" # Gäste-Portal HTTPS (optional)
- "8880:8880" # Gäste-Portal HTTP (optional)
- "6789:6789" # Mobile Speedtest (optional)
networks:
- unifi
networks:
unifi:
driver: bridge
+21
View File
@@ -0,0 +1,21 @@
#!/bin/bash
# Wird nur beim allerersten Start (leeres ./data/mongodb) automatisch ausgeführt
# und legt den Datenbank-Benutzer für die UniFi Network Application an.
if which mongosh > /dev/null 2>&1; then
mongo_init_bin='mongosh'
else
mongo_init_bin='mongo'
fi
"${mongo_init_bin}" <<EOF
db.getSiblingDB("${MONGO_DBNAME}").createUser({
user: "${MONGO_USER}",
pwd: "${MONGO_PASS}",
roles: [
{ db: "${MONGO_DBNAME}", role: "dbOwner" },
{ db: "${MONGO_DBNAME}_stat", role: "dbOwner" },
{ db: "${MONGO_DBNAME}_audit", role: "dbOwner" }
]
})
EOF
Executable
+64
View File
@@ -0,0 +1,64 @@
#!/bin/bash
# Stellt ein Backup wieder her.
#
# ./restore.sh backups/unifi-full-backup_XXXX.tar.gz
# Komplett-Restore: stoppt die Container, ersetzt ./data durch den
# Stand aus dem Archiv und startet die Container wieder.
#
# ./restore.sh backups/autobackup_XXXX/datei.unf
# Legt die .unf-Datei in den Autobackup-Ordner der UniFi-App, sodass sie
# in der Weboberfläche unter Einstellungen -> System -> Backups
# ausgewählt und wiederhergestellt werden kann.
set -euo pipefail
cd "$(dirname "$0")"
if [[ $# -ne 1 ]]; then
echo "Aufruf: $0 <backup-datei>"
echo " z.B.: $0 backups/unifi-full-backup_2026-07-26_20-00-00.tar.gz"
echo " oder: $0 backups/autobackup_2026-07-26_20-00-00/autobackup_9.1.120.unf"
exit 1
fi
FILE="$1"
if [[ ! -f "$FILE" ]]; then
echo "Datei nicht gefunden: $FILE"
exit 1
fi
case "$FILE" in
*.tar.gz)
echo "ACHTUNG: Das aktuelle ./data-Verzeichnis wird ersetzt!"
read -r -p "Fortfahren? [j/N] " answer
[[ "$answer" =~ ^[jJyY]$ ]] || { echo "Abgebrochen."; exit 1; }
echo "==> Container stoppen..."
docker-compose down
if [[ -d data ]]; then
SAFETY="data.vor-restore.$(date +%Y-%m-%d_%H-%M-%S)"
echo "==> Aktuelles ./data wird aufbewahrt als ./$SAFETY"
mv data "$SAFETY"
fi
echo "==> Backup entpacken..."
tar xzf "$FILE"
echo "==> Container starten..."
docker-compose up -d
echo "==> Fertig. Wenn alles läuft, kann ./$SAFETY gelöscht werden."
;;
*.unf)
DEST="./data/unifi/data/backup/autobackup"
mkdir -p "$DEST"
cp "$FILE" "$DEST/"
echo "==> $(basename "$FILE") wurde nach $DEST kopiert."
echo "Wiederherstellen in der Weboberfläche:"
echo " Einstellungen -> System -> Backups -> Wiederherstellen"
echo "(Bei einer Neuinstallation kann die Datei auch direkt im"
echo " Einrichtungs-Assistenten unter 'Restore from backup' gewählt werden.)"
;;
*)
echo "Unbekanntes Format. Erwartet: *.tar.gz (Komplett) oder *.unf (UniFi-Backup)"
exit 1
;;
esac
Executable
+21
View File
@@ -0,0 +1,21 @@
#!/bin/bash
# Aktualisiert die UniFi Network Application (und MongoDB-Patchlevel) auf die
# neueste Image-Version. Vorher wird automatisch ein Sicherheits-Backup erstellt.
set -euo pipefail
cd "$(dirname "$0")"
echo "==> Sicherheits-Backup vor dem Update..."
./backup.sh
echo "==> Neue Images laden..."
docker-compose pull
echo "==> Container mit neuen Images neu starten..."
docker-compose up -d
echo "==> Alte, ungenutzte Images aufräumen..."
docker image prune -f
echo ""
echo "Update abgeschlossen. Logs verfolgen mit:"
echo " docker-compose logs -f unifi-network-application"