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:
@@ -0,0 +1,4 @@
|
|||||||
|
data/
|
||||||
|
backups/
|
||||||
|
data.vor-restore.*/
|
||||||
|
.env
|
||||||
@@ -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)
|
||||||
|
```
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
Executable
+21
@@ -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
@@ -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
|
||||||
@@ -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"
|
||||||
Reference in New Issue
Block a user