Flux installieren
In einer Viertelstunde von null zum ersten Drucker in der App. Gilt für die geschlossene Beta.
1. Was brauchst du?
- Einen Rechner, der dauerhaft läuft (Linux, macOS oder Windows) mit Docker und Docker Compose v2.24 oder neuer (
docker compose version). - Einen 64-Bit-Intel/AMD-Rechner (linux/amd64). Das Beta-Image gibt es nur für diese Architektur. Raspberry Pi und andere ARM-Geräte folgen.
- Rund 500 MB Speicherplatz für das Image.
- Drucker im selben Netzwerk. Laut Server-Doku unterstützt: Klipper/Moonraker, Prusa (PrusaLink) und Bambu Lab.
- Ein iPhone oder iPad mit TestFlight.
- Optional: Home Assistant (Steckdosen) und Spoolman (Spulen).
Ohne Server ausprobieren: Auf dem Anmeldebildschirm der App gibt es „Demo ausprobieren“. Das läuft komplett in der App mit Beispieldaten, ohne Netzwerk. Es wird nichts an echte Geräte gesendet.
Wichtig vorab: Der Server spricht nur unverschlüsseltes HTTP und ist nur fürs Heimnetz gedacht. Gib den Port nicht im Router frei. Für unterwegs: VPN (z. B. Tailscale oder WireGuard) oder ein Reverse Proxy mit HTTPS. Dann zusätzlich FLUX_LOCAL_PAIRING=false in einer .env setzen.
2. Server installieren
Flux wird als fertiges Docker-Image verteilt: ghcr.io/schallerje/flux-server (Tag beta). Quellcode und Build sind nicht nötig.
- Ordner anlegen und die folgende Datei als
docker-compose.ymldarin speichern:# Flux server - self-hosting from the public image (no source code, no build). # # mkdir flux && cd flux # (save this file as docker-compose.yml) # mkdir -p data && sudo chown 1000:1000 data # Linux: the container user has UID 1000 # docker compose up -d # docker compose logs flux | grep "Setup token" # one-time setup token for the first owner # # Update: docker compose pull && docker compose up -d # Beta: only linux/amd64 (x86_64). Raspberry Pi / ARM follows. # Requires Docker Compose v2.24 or newer. See SELF-HOSTING.md. services: flux: image: ghcr.io/schallerje/flux-server:beta container_name: flux-backend restart: unless-stopped ports: # host:container - the app inside the container listens on 3020. # Reverse proxy on the same machine in front? Bind to loopback only so the plain-HTTP # port is not reachable from the network: - "127.0.0.1:${FLUX_PORT:-3021}:3020" - "${FLUX_PORT:-3021}:3020" volumes: - ./data:/app/data # Optional settings from .env (APNs, Home Assistant, secrets, ...) are # passed through; the file may be absent. The explicit values below win. env_file: - path: .env required: false environment: PORT: "3020" FLUX_DATA_PATH: /app/data FLUX_SHADOW_MODE: "false" FLUX_ACTIVE_JOBS: "true" # true: any client whose connection comes from a private address (typical home-network addresses) # may request a one-time pairing code without signing in. Behind a reverse proxy every # visitor arrives from the proxy's private address and would look local, so set # FLUX_LOCAL_PAIRING=false in .env there (or when Flux is reachable from outside your LAN). FLUX_LOCAL_PAIRING: ${FLUX_LOCAL_PAIRING:-true} healthcheck: test: - CMD - node - -e - "fetch('http://127.0.0.1:3020/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))" interval: 30s timeout: 5s start_period: 15s retries: 3 - Nur Linux: Datenordner für den Container-User (UID 1000) beschreibbar machen:
mkdir -p data sudo chown 1000:1000 data - Hinter einem Reverse Proxy oder von außerhalb des LANs erreichbar? Vor dem ersten Start:
echo 'FLUX_LOCAL_PAIRING=false' > .env - Starten (keine
.envund keine Schlüssel nötig, die werden beim ersten Start erzeugt):
Der Server lauscht auf Host-Port 3021 (änderbar mitdocker compose up -d docker compose ps # STATUS sollte "healthy" werden curl http://localhost:3021/healthFLUX_PORTin der.env). - Setup-Token aus dem Log holen:
Er sieht aus wiedocker compose logs flux | grep "Setup token"7K2QX-9M4VD-BH3TNund verhindert, dass jemand anderes im Netz deinen frischen Server übernimmt. - Im Browser
http://<deine-server-ip>:3021/öffnen (auf dem Server selbst geht auchhttp://localhost:3021/). Setup-Token eingeben, die Beta-Nutzungsbedingungen bestätigen und „Server übernehmen“ drücken. Dein Browser ist jetzt der Besitzer. - Der Einrichtungsassistent startet. Jeder Schritt lässt sich überspringen und später unter Einstellungen › Allgemein neu starten:
- Drucker hinzufügen und mit Verbindung testen prüfen. Der Test liest nur den Status, es wird nichts gesendet. Passwörter und Zugangscodes sind nur schreibbar und werden nie wieder angezeigt.
- Home Assistant (optional): Adresse und Zugriffstoken, dann pro Drucker eine Steckdose. Flux schlägt eine vor und speichert erst nach „Vorschlag übernehmen“.
- Benachrichtigungen (optional), siehe Abschnitt 4.
- App koppeln: erzeugt den QR-Code, siehe Abschnitt 3.
Stoppen: docker compose down (die Daten in ./data bleiben). Update: docker compose pull && docker compose up -d.
Backup: Der Ordner data/ enthält deine Schlüssel (data/secrets.json). Behandle Backups wie ein Passwort und poste sie nie in Bugreports. Geht secrets.json verloren, werden alle gekoppelten Geräte abgemeldet.
3. App installieren und koppeln
- TestFlight installieren und den Beta-Link öffnen: <TESTFLIGHT-LINK> (erhältst du im Discord-Beta-Kanal).
- Der erste Besitzer muss vorher im Webportal eingerichtet sein (siehe Abschnitt 2). Danach koppelst du das iPhone.
Weg A: QR-Code
- Im Assistenten bei App koppeln die Adresse deines Servers eintragen, so wie dein iPhone ihn erreicht (nicht
localhost), und „Code erzeugen“ drücken. - In der App QR-Code scannen und die Kamera auf den Code im Browser halten (Kamerazugriff erlauben).
- Die App fragt „Mit … koppeln?“. Mit „Koppeln“ bestätigen.
Der Code gilt nur kurz und nur einmal. Einen neuen kannst du jederzeit erzeugen.
Weg B: Code von Hand
Serveradresse in der App eingeben und den Einmalcode aus dem Webportal verwenden („Mit Code koppeln“). Das ist auch der Weg, wenn der QR-Scan nicht klappt.
Weitere Geräte
Nach dem ersten Besitzer wird kein Gerät mehr ohne Zustimmung gekoppelt:
- Das neue Gerät tippt „Koppeln anfragen“ und zeigt einen 4-stelligen Prüfcode.
- Auf einem schon gekoppelten Gerät (Webportal › Geräte › offene Kopplungsanfragen) erscheint die Anfrage mit Gerätename, Adresse und demselben Code. Codes vergleichen, dann Erlauben oder Ablehnen.
- Nach der Freigabe erhält das neue Gerät seine Sitzung automatisch. Unbeantwortete Anfragen laufen nach 5 Minuten ab.
Alternativ erzeugt ein gekoppeltes Gerät direkt einen Code für das neue (Webportal › Geräte › „Create a code for a new device“).
Hinter Docker-NAT oder Reverse Proxy sehen alle Geräte wie eine Adresse aus. Nutze dann die Kopplung per Code von einem gekoppelten Gerät.
4. Push-Mitteilungen
Apple-Push braucht einen Schlüssel, der nicht in deinen Server gehört. Deshalb gibt es optional den Flux-Vermittler, der von Jens Schaller betrieben wird und nur mit Einladung nutzbar ist:
- Webportal › Einstellungen › Benachrichtigungen › „Push über Flux-Vermittler“.
- Einladungscode eintragen: <EINLADUNGSCODE> (erhältst du im Discord-Beta-Kanal). Er wird auf deinem Server gespeichert und nie wieder angezeigt.
- Einwilligung ankreuzen und Aktivieren drücken.
Was übertragen wird: Druckername, Jobname, Ereignis (z. B. „Druck fertig“), das Push-Token deines Geräts und eine zufällige Kennung. Bei Kopplungsanfragen zusätzlich Gerätename, Adresse und Prüfcode, bei Druckfotos die Adresse deines Servers. Empfänger ist Jens Schaller als Betreiber, danach Apple. Details: Datenschutz-Hinweis zum Push-Vermittler.
Ohne Vermittler (ohne Einladungscode) unter Einstellungen › Benachrichtigungen:
- ntfy (ntfy.sh oder eigener Server; bei ntfy.sh ein langes zufälliges Topic wählen, es wirkt wie ein Passwort)
- Discord-Webhook
- Home Assistant (
notify.mobile_app_…) - Webhook (eigener Dienst)
Ereignisse: Druck fertig, Druckfehler, Pause, Kopplungsanfrage. Mit „Send test“ prüfst du jeden Kanal.
5. Feedback
- TestFlight: Screenshot machen, Feedback senden und kurz beschreiben, was passiert ist.
- Discord: im Beta-Kanal.
- Bei Serverproblemen hilft
docker compose logs flux. Prüfe die Ausgabe vor dem Teilen auf Zugangsdaten.
6. Bekannte Einschränkungen
- Beta: Bugs sind erwartbar. Lass nie einen Drucker wegen einer Flux-Mitteilung (oder weil sie ausbleibt) unbeaufsichtigt.
- Live Activities über den Vermittler sind aktuell nicht verfügbar. Normale Push-Mitteilungen gehen.
- Pausengrund hängt vom Drucker ab. Nicht jeder Drucker liefert einen Grund.
- Spule per Foto (AI-Etikettenscan) ist standardmäßig aus. Dafür trägst du in der
.envdeinen eigenen Anthropic-API-Key ein (ANTHROPIC_API_KEY=..., danachdocker compose up -d). Die Etikettenfotos gehen dann direkt an Anthropic und kosten dich API-Guthaben. Ohne Key legst du Spulen manuell oder per RFID an. - Nicht dabei: Slicer und Modellbrowser.
- Der Server ist nur für das Heimnetz gedacht (siehe oben). Das Beta-Image läuft nur auf linux/amd64.
- Nutzungsbedingungen: nur privat und nicht-kommerziell, nichts weitergeben. Siehe Beta-Bedingungen.
- Hilfe gibt es für den Flux-Teil, nicht für Netzwerk-, Docker- oder Drucker-Grundeinrichtung.