Setup Server
Selfhost auf einem Hetzner-Server.
SETUP-SERVER – MFC auf einem Hetzner-Server (Debian/Ubuntu)
Kurz-Anleitung, um MFC + Gateway (/ws/core, Handy/PWA-Fernsteuerung) auf einem frischen Server als Selfhost zu betreiben. Ein Skript macht die Arbeit: Docker installieren, .env mit allen Pflicht-Geheimnissen erzeugen, TLS terminieren, Firewall setzen, starten. Reproduzierbar und idempotent.
> Den eigenen Server lieber ganz ohne Kommandozeile einrichten? Der > Einrichtungs-Assistent (Link aus deiner Kauf-Bestätigung) kann unter > „Eigenen Server anlegen" einen Hetzner-Server komplett automatisch für > dich anlegen und einrichten – kein SSH, kein Terminal, nur ein > Hetzner-API-Token einfügen. Diese Seite hier ist für alle, die bereits > einen eigenen Server haben oder die Einrichtung lieber selbst per SSH > steuern möchten.
Der Standardweg führt zu https:///wss://, nicht zu http://
Der dokumentierte Standardweg terminiert TLS automatisch über Caddy:
- Eine echte Domain per DNS auf den Server zeigen lassen und
MFC_DOMAIN
setzen → Caddy holt automatisch ein Let's-Encrypt-Zertifikat.
- Keine Domain vorhanden (z. B. Erstlauf nur mit IP) → Caddy erzeugt ein
selbstsigniertes lokales Zertifikat. Browser/Clients zeigen dann eine Vertrauenswarnung, aber die Verbindung läuft bereits über echtes TLS 1.3, nicht mehr über Klartext – sobald eine Domain existiert, einfach mit MFC_DOMAIN erneut ausführen, dann läuft automatisch ein vertrauenswürdiges Zertifikat.
Voraussetzungen
- Frischer Debian- oder Ubuntu-Server (Hetzner CX/CPX), SSH-Zugang als root.
- Eine Domäne ist nicht zwingend (siehe oben – selbstsigniertes Zertifikat als
Fallback), aber empfohlen für ein vertrauenswürdiges Zertifikat ohne Warnmeldung.
Einmalig: EIN Befehl nach dem SSH-Login
Per SSH auf den frischen Server einloggen (ssh root@<Server-IP>), dann diesen einen Block einfügen (ohne Domain – für eine Domain siehe unten):
mkdir mfc && curl -fsSL https://mfc.domenicmoran.de/api/download-server | tar xz -C mfc --strip-components=1 && cd mfc && bash scripts/server-setup.sh
Mit echter Domain (automatisches Let's-Encrypt-Zertifikat statt selbstsigniertem):
mkdir mfc && curl -fsSL https://mfc.domenicmoran.de/api/download-server | tar xz -C mfc --strip-components=1 && cd mfc && MFC_DOMAIN=mfc.deine-domain.tld bash scripts/server-setup.sh
Kein git clone nötig (das Repository ist bewusst privat, ein Klon würde ohne GitHub-Zugriff scheitern; /api/download-server liefert denselben Quellcode als Archiv, ohne dass du selbst Zugriff auf GitHub brauchst), kein separates chmod +x (der Aufruf über bash <script> braucht kein Ausführungsrecht auf der Datei).
Das Skript:
1. Installiert Docker + Compose-Plugin über den offiziellen Installer (get.docker.com) – überspringt, falls Docker schon da ist. 2. Erzeugt .env aus .env.example und setzt alle von docker-compose.yml zwingend verlangten Geheimnisse zufällig (MFC_API_TOKEN, MFC_GATEWAY_SECRET, MFC_KNOTEN_TOKEN, ein Platzhalter für MFC_LICENSE_PUBLIC_KEY). Ein bereits vorhandener Wert wird nie überschrieben – Geheimnisse bleiben über mehrere Läufe stabil. Du musst dafür nichts eintippen. 3. Öffnet 80/443 in ufw (falls aktiv) – nicht 3000/4872 direkt. 4. Startet mfc + gateway + caddy mit docker compose -f docker-compose.yml -f docker/docker-compose.tls.yml up -d --build.
Danach
- MFC ist unter
https://<Domain-oder-Server-IP>erreichbar (siehe oben zum
Zertifikatstyp), das Gateway unter wss://<Domain-oder-Server-IP>/ws/core.
- Im Browser-Dashboard den Token aus
.env(MFC_API_TOKEN) unter
Einstellungen → Selfhost-Token eintragen – die Schreib-APIs verlangen ihn als Header X-MFC-Token (sonst 403). Zum Anzeigen auf dem Server: grep MFC_API_TOKEN .env (im Repo-Verzeichnis, z. B. ~/mfc).
- Autonomie einschalten: Dashboard → Einstellungen → Autonome Schleife →
„Autonom weiterarbeiten" an.
- Handy koppeln: Dashboard → Einrichtung/Mobil – QR-Code scannen oder Code
eintragen. Läuft über denselben wss://-Weg wie die Web-PWA, mit JWT- und Geräte-Fingerabdruck-Handschlag.
Der Server startet nicht / meldet fehlende Einstellungen
Vier Geheimnisse sind Pflicht, und der Start scheitert absichtlich ohne sie, statt unsicher weiterzulaufen: MFC_API_TOKEN, MFC_GATEWAY_SECRET (mindestens 32 Zeichen), MFC_KNOTEN_TOKEN und MFC_LICENSE_PUBLIC_KEY. Nutzt du das Setup-Skript oder den Einrichtungs-Assistenten, werden diese automatisch gesetzt – bei komplett manueller Einrichtung musst du sie selbst festlegen (siehe „Manuell" unten).
Neustarts & Boot (restart-policy / systemd)
docker-compose.ymlsetztrestart: unless-stopped– ein abgestürzter
Container startet nach Absturz oder Reboot automatisch neu.
- Ein hängender, aber noch laufender Prozess wird davon NICHT erkannt –
dafür gibt es echte HEALTHCHECK-Direktiven je Dienst (sichtbar über docker compose ps).
- Der Docker-Installationsweg aktiviert
docker.servicebeim Boot (systemd).
Zusätzlich sind keine eigenen Unit-Dateien nötig.
Manuell (ohne Skript)
export MFC_API_TOKEN="ein-langer-zufallswert" # Pflicht – ohne startet Compose nicht
export MFC_GATEWAY_SECRET="ein-anderer-langer-wert" # Pflicht, mind. 32 Zeichen
export MFC_KNOTEN_TOKEN="noch-ein-zufallswert" # Pflicht (Fleet-Steuerung)
export MFC_LICENSE_PUBLIC_KEY="$(node -e "console.log(require('crypto').randomBytes(32).toString('hex'))")" # Pflicht (Platzhalter reicht für den Start)
export ANTHROPIC_API_KEY="sk-ant-..." # Claude-CLI-Auth (alternativ CLAUDE_CODE_OAUTH_TOKEN)
export MFC_DOMAIN="mfc.deine-domain.tld" # optional – leer = selbstsigniertes Zertifikat
docker compose -f docker-compose.yml -f docker/docker-compose.tls.yml up --build mfc gateway caddy
Siehe auch SETUP.md (Abschnitt „Server-Modus") und docker/README.md.