commit 247f20602b0ce4628c83b7ff5083813bdd4cc71e Author: duffyduck Date: Sun Jul 26 19:34:07 2026 +0200 UniFi Network Application Docker-Setup mit Update-, Backup- und Restore-Skripten Co-Authored-By: Claude Fable 5 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..32ad024 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +data/ +backups/ +data.vor-restore.*/ +.env diff --git a/README.md b/README.md new file mode 100644 index 0000000..12993ee --- /dev/null +++ b/README.md @@ -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://: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 `:8082` eintragen, **oder** +- pro Gerät per SSH: `set-inform http://: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_.tar.gz # Komplett-Restore +./restore.sh backups/autobackup_/.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) +``` diff --git a/backup.sh b/backup.sh new file mode 100755 index 0000000..322f889 --- /dev/null +++ b/backup.sh @@ -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 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..5b6e0c9 --- /dev/null +++ b/docker-compose.yml @@ -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://: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 diff --git a/mongo-init/init-mongo.sh b/mongo-init/init-mongo.sh new file mode 100755 index 0000000..3d6eb35 --- /dev/null +++ b/mongo-init/init-mongo.sh @@ -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}" < System -> Backups +# ausgewählt und wiederhergestellt werden kann. +set -euo pipefail +cd "$(dirname "$0")" + +if [[ $# -ne 1 ]]; then + echo "Aufruf: $0 " + 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 diff --git a/update.sh b/update.sh new file mode 100755 index 0000000..3ec8dd5 --- /dev/null +++ b/update.sh @@ -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"