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