MAC-Adresse, SSID, Gerätename oder Site — das SearchTool durchsucht alle Network Controller gleichzeitig und liefert Ergebnisse in Sekunden.

Alle konfigurierten Network Controller werden gleichzeitig durchsucht — eine Anfrage, alle Ergebnisse.
Flexibler Suchbegriff: MAC-Adresse, SSID, Gerätename oder Site-Name — findet alles was passt.
Ergebnisse direkt als strukturierte CSV-Datei oder formatiertes PDF exportieren — für Berichte und Kundendokumentation.
Controller-Passwörter werden Fernet-verschlüsselt gespeichert. Kein Klartext in der Datenbank.
Admin und reguläre Benutzer mit eigenem Login. Admins verwalten Controller — Benutzer haben Such-Zugriff.
Läuft lokal per Docker — keine Cloud, keine externen Abhängigkeiten. Daten bleiben im eigenen Netzwerk.
Durchsucht mehrere UniFi-Controller gleichzeitig nach MAC-Adressen, SSIDs, Sitenamen oder Gerätenamen. Läuft vollständig via Docker.
---
| Anforderung | Details | |---|---| | Docker | ≥ 24.x | | Docker Compose | ≥ v2 (Plugin docker compose) | | Python 3 | Für manage.sh (Update-Logik, kein unzip nötig) | | RAM | Minimal (< 512 MB) |
---
searchtool/ ← Installationsordner
├── manage.sh ← Management-Skript
├── docker-compose.yaml
├── .env ← aus .env.example angelegt (beim ersten Update)
├── .env.example ← Vorlage (nie manuell anpassen!)
├── app.py
├── templates/
├── static/
└── data/ ← persistente Daten (wird nie überschrieben)
├── users.json Benutzer-Zugangsdaten
├── controllers.json Verschlüsselte Controller-Zugangsdaten
├── .secret_key Flask-Session-Key
└── .fernet.key Verschlüsselungs-Key für Controller-Passwörter
---
mkdir -p /opt/searchtool
cd /opt/searchtool
UGREEN/Synology NAS: Empfohlener Pfad: /volume1/docker/searchtool
Die searchtool_release.zip und manage.sh in den Installationsordner kopieren.
/opt/searchtool/
├── searchtool_release.zip
└── manage.sh
chmod +x manage.sh
./manage.sh update
Das Skript:
unzip nötig).env aus .env.example an (nur beim ersten Mal – bestehende .env bleibt unangetastet)nano .env
Wichtige Werte:
TZ=Europe/Berlin
APP_PORT=5050
# Zufälligen Wert generieren: python3 -c "import secrets; print(secrets.token_hex(32))"
SECRET_KEY=change_me_to_a_random_secret
# Controller als JSON-Array (einzeilig)
# Jeder Controller braucht: name, url, username, password
# verify (optional, Standard: true) – auf false setzen bei self-signed Zertifikaten
CONTROLLERS=[{"name":"mein-controller","url":"https://unifi.example.com","username":"readonly","password":"geheim","verify":true}]
# Optionale Feineinstellungen
# REQUEST_TIMEOUT=12
# SEARCH_WORKERS=8
# PDF_MAX_ROWS=1500
# JOB_MAX_AGE_SECONDS=3600
Wichtig:SECRET_KEYmuss ein langer zufälliger Wert sein — ohne eigenenSECRET_KEYgeneriert die App beim ersten Start automatisch einen persistenten Schlüssel unterdata/.secret_key.
Die Controller aus CONTROLLERS werden beim ersten Start einmalig in data/controllers.json importiert (verschlüsselt). Danach lassen sie sich bequem über die Weboberfläche unter Admin verwalten (hinzufügen, bearbeiten, löschen, per JSON-Datei importieren) — CONTROLLERS in der .env wird danach nicht mehr benötigt.
./manage.sh restart
---
| Dienst | URL | |---|---| | UniFi Search Tool | http://<IP-Adresse>:5055 |
Standard-Login: admin / admin — bitte nach dem ersten Login sofort über Admin → Benutzer ändern.
---
searchtool_release.zip in den Installationsordner legen./manage.sh update
Was passiert beim Update:
app.py, templates/, static/, …) werden aktualisiert.env bleibt unverändert (wird nicht überschrieben)data/-Ordner wird nicht berührt (Benutzer, Controller, Schlüssel bleiben erhalten)*.deployed_<Zeitstempel>.zip)---
Der Watch-Modus prüft alle 30 Sekunden, ob eine neue searchtool_release.zip vorhanden ist, und deployt sie automatisch.
./manage.sh watch
Zum Starten als Hintergrunddienst:
nohup ./manage.sh watch > logs/watch.log 2>&1 &
---
./manage.sh update # Update aus searchtool_release.zip
./manage.sh update datei.zip # Update aus bestimmter ZIP
./manage.sh watch # Watch-Modus: neue ZIP → auto deploy
./manage.sh start # Container starten
./manage.sh stop # Container stoppen
./manage.sh restart # Container neu starten
./manage.sh status # Container-Status anzeigen
./manage.sh logs # Logs anzeigen (live)
---
/etc/shadow) möglich---
./manage.sh logs
Admin-Zugangsdaten liegen in data/users.json (bcrypt-Hash). Neuen Hash erzeugen:
python3 -c "import bcrypt; print(bcrypt.hashpw(b'neues_passwort', bcrypt.gensalt()).decode())"
und in data/users.json beim gewünschten Benutzer eintragen, danach ./manage.sh restart.
https://unifi.example.com:8443 inkl. Port sein, ohne abschließenden /)./manage.sh status
docker compose ps
docker compose nicht gefundendocker compose version
# Falls nicht vorhanden, Docker aktualisieren oder Compose-Plugin installieren
chmod +x manage.sh
# Oder direkt ausführen:
sh manage.sh update
---
./manage.sh stop
docker compose down --volumes --rmi all
Achtung:--volumeslöscht alle persistenten Daten inkl. Benutzer und Controller-Zugangsdaten. Ohne--volumesbleiben die Daten imdata/-Ordner erhalten.
Preis zzgl. 19% MwSt. Einmalzahlung, keine Abo-Kosten, self-hosted.