diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..d2d7840 --- /dev/null +++ b/.env.example @@ -0,0 +1,5 @@ +MONGO_USER=unifi +MONGO_PASS=hier-ein-langes-zufaelliges-passwort +MONGO_DBNAME=unifi +# MONGO_VERSION wird von start.sh automatisch passend zur CPU gesetzt. +# Nur von Hand setzen, wenn man genau weiß, was man tut. diff --git a/README.md b/README.md index 12993ee..098d600 100644 --- a/README.md +++ b/README.md @@ -4,13 +4,18 @@ 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!) +- Datenbank: MongoDB — die Version wird von `start.sh` beim ersten Start + automatisch passend zur CPU gewählt und in `.env` gepinnt: + x86_64/ARM mit AVX bzw. ARMv8.2 → **7.0**, ältere CPUs ohne AVX → **4.4** + (Mongo 5+ startet dort nicht). Danach den Pin **nicht** von Hand erhöhen — + eine bestehende Datenbank läuft nicht ohne Migration unter einer neueren + Major-Version. ## Erster Start ```bash -docker-compose up -d +cp .env.example .env # und MONGO_PASS auf ein eigenes Passwort setzen +./start.sh # wählt die MongoDB-Version und startet den Stack docker-compose logs -f unifi-network-application # warten bis der Start durch ist ``` diff --git a/docker-compose.yml b/docker-compose.yml index 5b6e0c9..c444c01 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.8" services: unifi-db: - image: mongo:4.4 + image: mongo:${MONGO_VERSION:-4.4} container_name: unifi-db restart: unless-stopped environment: diff --git a/start.sh b/start.sh new file mode 100755 index 0000000..f98ff63 --- /dev/null +++ b/start.sh @@ -0,0 +1,52 @@ +#!/bin/bash +# Startet den Stack und wählt beim allerersten Start automatisch die passende +# MongoDB-Version für diese CPU: +# +# x86_64 mit AVX -> mongo:7.0 +# x86_64 ohne AVX -> mongo:4.4 (Mongo 5+ startet ohne AVX nicht) +# aarch64 mit ARMv8.2 -> mongo:7.0 (z.B. Raspberry Pi 5, Apple Silicon) +# aarch64 ohne ARMv8.2 -> mongo:4.4 (z.B. Raspberry Pi 4) +# +# Die gewählte Version wird in .env als MONGO_VERSION festgeschrieben und +# danach NIE automatisch geändert: eine bestehende Datenbank kann nicht +# einfach unter einer neueren Major-Version starten (Migration nötig). +set -euo pipefail +cd "$(dirname "$0")" + +detect_mongo_version() { + local arch flags + arch="$(uname -m)" + flags="$(grep -m1 -iE '^(flags|Features)' /proc/cpuinfo 2>/dev/null || true)" + case "$arch" in + x86_64) + if grep -qw avx <<< "$flags"; then echo "7.0"; else echo "4.4"; fi ;; + aarch64|arm64) + # asimddp ist ein ARMv8.2-Merkmal; Mongo 5+ braucht ARMv8.2-A + if grep -qw asimddp <<< "$flags"; then echo "7.0"; else echo "4.4"; fi ;; + *) + echo "4.4" ;; + esac +} + +if [[ ! -f .env ]]; then + echo "FEHLER: .env fehlt (MONGO_USER/MONGO_PASS/MONGO_DBNAME)." >&2 + exit 1 +fi + +if grep -q '^MONGO_VERSION=' .env; then + echo "==> MongoDB-Version ist bereits gepinnt: $(grep '^MONGO_VERSION=' .env)" +else + if [[ -d data/mongodb ]] && [[ -n "$(ls -A data/mongodb 2>/dev/null)" ]]; then + # Bestehende Datenbank ohne Pin: Stand vor dieser Automatik -> 4.4 festschreiben + VERSION="4.4" + echo "==> Bestehende Datenbank gefunden, pinne bisherige Version: mongo:$VERSION" + else + VERSION="$(detect_mongo_version)" + echo "==> CPU-Erkennung ($(uname -m)): verwende mongo:$VERSION" + fi + echo "MONGO_VERSION=$VERSION" >> .env +fi + +docker-compose up -d +echo "" +echo "Stack gestartet. Logs: docker-compose logs -f unifi-network-application"