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.yml setzt restart: 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.service beim 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.