Mac-Reihe · Kurs 4

Der eigene Server dazu

Mac, iPad und Windows-PC arbeiten schon zusammen. Jetzt kommt ein gemieteter Linux-Server dazu, der nie schläft. Er vermittelt, nimmt Aufträge an, hält Dateien bereit und meldet, ob zu Hause alles läuft. In zwölf Stufen richtest Du ihn so ein, dass jeder neue Weg ins Heimnetz eng begrenzt ist und sich wieder schließen lässt.

Worum geht's?

Im Kurs „Mac, iPad und 3090-PC“ hast Du den PC über Tailscale erreicht, ihn aus der Ferne geweckt und auf seiner Grafikkarte gerechnet. Das klappt, solange Du selbst am Mac sitzt und der PC mitspielt. Schläft der PC, kommt nichts an. Willst Du vom iPad aus einen Auftrag abgeben, während Du im Zug sitzt, fehlt jemand, der ihn annimmt.

Diese Lücke füllt ein Server: eine kleine gemietete Maschine im Rechenzentrum, mit fester Adresse und Docker. Sie hat keine Grafikkarte und soll auch keine haben. Sie ist Vermittler, Briefkasten und Wächter.

Das Beispiel aus den Vorgängerkursen zieht sich weiter durch: Ein Tipp auf das iPad-Pult schickt den Render-Auftrag für die Nordwerk-Figur an den Server. Der weckt den PC, reicht den Auftrag weiter, passt auf die Temperatur auf und legt das Ergebnis in den Sync-Ordner, auch wenn Mac und iPad gerade unterwegs sind.

Selbstlern-Kurs zum Mitmachen. Dein Fortschritt wird nur in Deinem Browser gespeichert.

? Für wen ist das interessant?

🧳
Wer viel unterwegs ist
und die Rechenleistung zu Hause nutzen will, ohne dass der PC rund um die Uhr läuft.
🖧
Wer schon einen Server hat
etwa für n8n, eine Website oder Nextcloud, und ihn mit den eigenen Geräten verbinden will.
🔐
Wer weniger fremde Dienste will
Koordination, Fernzugriff und Dateiablage auf eigener Hardware statt in fremden Konten.

↗ Was Du brauchst

  1. Den Aufbau aus Kurs 3: Mac, iPad und Windows-PC, verbunden über Tailscale, OpenSSH-Server auf dem PC mit Schlüssel-Anmeldung, Syncthing-Ordner „Nordwerk-Figur“. Der Kurs ist Mac, iPad und 3090-PC. Wer ihn nicht gemacht hat, kommt mit Kenntnissen aus SSH von Anfang an und Docker trotzdem zurecht.
  2. Einen Linux-Server (VPS) mit Ubuntu oder Debian, Root- oder sudo-Zugang per SSH-Schlüssel, Docker mit Compose und eine eigene Domain, unter der Du eine Subdomain anlegen darfst. Wie man so einen Server mietet und einrichtet, zeigt Self-Hosting & VPS. 2 GB Arbeitsspeicher reichen für diesen Kurs.
  3. Einen Reverse Proxy mit TLS auf dem Server (Caddy, Nginx Proxy Manager oder Traefik). Er bekommt in Stufe 3 genau einen neuen Eintrag.
  4. Für Stufe 7 (freiwillig): n8n auf dem Server, wie im Kurs n8n eingerichtet. Ohne n8n geht die Übung auch mit einem kleinen Skript.
  5. Für Stufe 6 (freiwillig): einen Raspberry Pi oder ein anderes kleines Linux-Gerät, das zu Hause dauerhaft am Netz hängt.
  6. Zeit: etwa 6 bis 8 Stunden, am besten auf mehrere Abende verteilt. Jede Stufe endet in einem Zustand, in dem Du aufhören kannst.
⚠️ Der Server steht im Internet. Alles andere in dieser Reihe lag hinter Deinem Router. Der Server nicht. Deshalb ist Stufe 2 Pflicht, bevor irgendein Dienst dazukommt, und jede Stufe sagt, welcher Weg neu aufgeht und wie Du ihn wieder schließt.

📚 Die zwölf Stufen

ℹ Stand der Dinge

Geschrieben im Oktober 2026 für einen Ubuntu-Server mit Docker, macOS 27, iPadOS 27 und Windows 11. Die Befehle für Headscale, Syncthing, n8n und RustDesk sind gegen deren Dokumentation geschrieben. Versionen ändern sich schnell; jede Stelle mit Versionsbezug trägt einen Hinweis, wo Du den aktuellen Stand nachsiehst.

Ehrlich gesagt: Einige Wege in diesem Kurs sind noch nicht am echten Aufbau durchgespielt: der Umzug von Tailscale auf Headscale mit dem iPad, das Wecken über einen Weck-Knoten bzw. die FRITZ!Box und Syncthing mit verschlüsseltem Server-Knoten auf dem iPad. Diese Stellen sind mit einem gestrichelten Kasten markiert. Messwerte gibt es dort noch keine, und es stehen auch keine erfundenen drin.

Bilder mit dem Hinweis „KI-Bild“ sind Symbolbilder. Sie zeigen die Situation, nicht die echte Oberfläche. Die echten Bildschirmfotos folgen, sobald der Aufbau steht.

Stufe 1 · Teil A

Ein viertes Gerät

Der Server ist immer an und immer erreichbar. Er hat keine Grafikkarte und steht offen im Internet. Aus diesen zwei Sätzen folgt fast alles, was er tun soll und was nicht.

1 Vier Geräte, vier Rollen

GerätStärkeSchwächeRolle
MacBildschirm, Akku, Schnitt, Codeschwache GPU für große KI-ModelleArbeitsplatz
iPadStift, Touch, leichtkein Blender, kein Terminal-AlltagTablett, Pult, Skizzenblock
Windows-PCGPU, viel Arbeitsspeichersteht zu Hause, schläft oftRechenwerk
Serverimmer an, feste Adressekeine GPU, öffentlich erreichbarVermittler, Briefkasten, Wächter

Was auf den Server gehört: alles, was ständig erreichbar sein muss, aber wenig rechnet. Koordination des VPN, ein Briefkasten für Aufträge und Dateien, eine Statusseite, Benachrichtigungen. Was nicht auf den Server gehört: Sprachmodelle, Rendern, Videoexport. Ein Server mit Grafikkarte kostet im Monat schnell so viel wie die Grafikkarte selbst.

KI-Symbolbild: Laptop, Tablet mit Stift und ein Desktop-PC auf einem Schreibtisch, im Hintergrund das Licht eines Server-Schranks
KI-Bild Symbolbild, lokal mit Qwen-Image erzeugt. Das echte Bild zeigt später den Aufbau mit allen vier Geräten.

2 Was geht wohin?

Ordne jede Aufgabe dem Gerät zu, das sie übernehmen sollte. Danach siehst Du die Begründung.

Vier-Geräte-Zuordnung
    Noch nicht geprüft.

    3 Wege zählen, bevor ein neuer dazukommt

    Jeder Dienst, über den jemand von außen an Deinen PC kommt, ist ein Weg ins Heimnetz. Viele Haushalte haben mehr davon, als ihnen klar ist: eine Fernwartungs-App von früher, Windows-Remotedesktop, das VPN des Routers, das Tailnet aus Kurs 3. Kreuze an, was bei Dir läuft.

    Weg-Zähler
    Kreuze an, was bei Dir aktiv ist.
    💡 Ein Weg je Zweck. Ziel des Kurses ist nicht, Wege hinzuzufügen, sondern sie zu ordnen: Am Ende soll es für jeden Zweck genau einen geben, und alles andere ist zu. In Stufe 9 fällt zum Beispiel eine Fernwartungs-App weg, weil der eigene Vermittler sie ersetzt.

    4 Was der Kurs nie tut

    • Keine Portfreigabe im Router. Der PC zu Hause bleibt von außen unsichtbar. Alles läuft über Verbindungen, die von innen nach außen aufgebaut werden.
    • Geräte, die nicht ins Netz gehören, bleiben ausgesperrt. Ein 3D-Drucker, eine Heizungssteuerung, eine Kamera: nicht im Tailnet, nicht auf dem Pult, nicht in einem Webhook. Wer heizen oder drucken kann, braucht jemanden daneben.
    • Keine GPU-Volllast ohne Aufsicht. Ein Render-Auftrag aus der Ferne läuft nur mit einem Wächter, der bei zu hoher Temperatur oder zu langer Laufzeit abbricht, und nicht über Nacht in einem leeren Haus.

    ✓ Kurz geprüft

    Stufe 2 · Teil A

    Den Server absichern

    Bevor ein einziger neuer Dienst dazukommt: Anmeldung nur mit Schlüssel, Firewall mit drei offenen Ports, automatische Sicherheitsupdates. Und die eine Falle, an der die meisten scheitern.

    1 Rückweg zuerst

    Bevor Du SSH änderst: Öffne eine zweite SSH-Sitzung und lass sie offen. Ändert sich etwas an der Anmeldung, testest Du mit einer dritten Sitzung. Klappt die nicht, machst Du die Änderung über die noch offene zweite Sitzung rückgängig. Außerdem bieten die meisten Anbieter eine Notfall-Konsole im Browser an. Such sie jetzt, nicht erst, wenn Du ausgesperrt bist.

    2 SSH nur mit Schlüssel

    Wie Du einen Schlüssel erzeugst und auf den Server bringst, steht in SSH von Anfang an. Hier geht es nur noch darum, die Passwort-Anmeldung abzuschalten. Auf aktuellen Ubuntu-Versionen legst Du dafür eine eigene Datei an, statt die Hauptdatei zu bearbeiten:

    1Auf dem Server · /etc/ssh/sshd_config.d/10-nur-schluessel.conf
    PasswordAuthentication no
    KbdInteractiveAuthentication no
    PermitRootLogin prohibit-password
    prohibit-password erlaubt Root nur noch mit Schlüssel. Wer einen eigenen sudo-Benutzer hat, setzt hier no. Danach mit sudo sshd -t die Syntax prüfen und mit sudo systemctl reload ssh übernehmen (der Dienst heißt unter Ubuntu ssh, unter Debian teils sshd).
    ⚠️ Reihenfolge der Dateien: OpenSSH nimmt bei doppelten Einstellungen den ersten Wert, den es liest. Manche Anbieter legen eine eigene Datei wie 50-cloud-init.conf mit PasswordAuthentication yes an. Deine Datei beginnt deshalb mit 10-, damit sie vorher gelesen wird. Kontrolle: sudo sshd -T | grep -i passwordauth muss no zeigen.

    3 Firewall mit drei offenen Ports

    2Auf dem Server · ufw einrichten
    sudo ufw default deny incoming
    sudo ufw default allow outgoing
    sudo ufw allow 22/tcp
    sudo ufw allow 80/tcp
    sudo ufw allow 443/tcp
    sudo ufw enable
    sudo ufw status verbose
    22 für SSH, 80 und 443 für den Reverse Proxy mit TLS. Sonst nichts. Erst allow 22, dann enable, sonst sperrst Du Dich aus. In Stufe 9 kommen die RustDesk-Ports dazu, und nur die.

    Automatische Sicherheitsupdates: sudo apt install unattended-upgrades und sudo dpkg-reconfigure -plow unattended-upgrades. Auf vielen Ubuntu-Servern ist das schon aktiv; systemctl status unattended-upgrades zeigt es.

    4 Die Falle: Docker umgeht ufw

    Startest Du einen Container mit -p 8080:8080 oder ports: - "8080:8080", trägt Docker eigene Regeln in die Firewall des Systems ein, und zwar vor denen von ufw. Der Port ist dann aus dem Internet erreichbar, obwohl ufw status ihn nicht nennt. Probier es aus:

    Simulator: Ist der Dienst von außen erreichbar?

    Die Regel daraus: Jeder Container bindet seine Ports an 127.0.0.1 (dann erreicht ihn nur der Reverse Proxy auf demselben Server) oder an die Tailnet-Adresse (Stufe 4). Dienste, die nur andere Container brauchen, bekommen gar keine ports:-Zeile.

    Vertiefung: ufw und Docker doch zusammenbringen

    Docker wertet vor seinen eigenen Regeln die Kette DOCKER-USER aus. Dort lassen sich Regeln eintragen, die auch für veröffentlichte Container-Ports gelten. Das Projekt ufw-docker automatisiert das. Beides ist mehr Pflegeaufwand als die einfache Regel oben und gehört in die Docker-Dokumentation („Packet filtering and firewalls“), nicht in diesen Kurs.

    5 Übung: von außen scannen

    📍
    Ausgangslage
    ufw ist aktiv, Deine Container laufen. Auf dem Mac ist nmap installiert (brew install nmap, Homebrew aus Kurs 1).
    👉
    Deine Handlung
    Am Mac, nicht im Tailnet (Tailscale kurz trennen): nmap -Pn -p 1-65535 dein-server.example. Dauert einige Minuten. Statt dein-server.example die Adresse Deines Servers.
    ✅
    Das siehst Du danach
    Als open stehen nur 22, 80 und 443. Alle anderen sind filtered oder fehlen in der Liste.
    🛟
    Wenn es anders aussieht
    Ein weiterer Port ist offen: sudo ss -tlnp | grep :<port> zeigt, welcher Prozess lauscht, meist docker-proxy. In der Compose-Datei dieses Dienstes die Portzeile auf 127.0.0.1: umstellen, docker compose up -d, neu scannen.
    KI-Symbolbild: Ein Server-Schrank im Rechenzentrum, an einer Tür ein geschlossenes Vorhängeschloss
    KI-Bild Symbolbild, lokal mit Qwen-Image erzeugt. Das echte Bildschirmfoto zeigt später die nmap-Ausgabe mit drei offenen Ports.

    ✓ Kurz geprüft

    Stufe 3 · Teil A

    Headscale statt Konto

    Tailscale besteht aus zwei Teilen: den Apps auf Deinen Geräten und einem Koordinationsserver beim Anbieter. Headscale ersetzt den zweiten Teil durch einen eigenen. Die Apps bleiben dieselben.

    1 Was sich ändert und was nicht

    Bleibt gleich
    • Die Tailscale-Apps auf Mac, iPad und PC
    • Die Verbindungen selbst laufen direkt zwischen den Geräten, verschlüsselt mit WireGuard
    • Die Regeln, wer welchen Port erreicht (ACL)
    Ändert sich
    • Wer die Geräte kennt und Schlüssel verteilt: Dein Server statt des Anbieters
    • Anmeldung per Befehl am Server statt per Google- oder Apple-Konto
    • Updates und Ausfälle betreffen Dich: Ist Headscale weg, kommen keine neuen Geräte dazu, bestehende Verbindungen halten eine Weile
    💡 Kein Muss. Wenn Dir Tailscale aus Kurs 3 reicht, überspring diese Stufe. Die anderen Stufen funktionieren mit beiden. Der Gewinn von Headscale: keine Geräte-Liste bei einem Dritten, keine Grenzen eines Gratis-Tarifs, alles in Deiner Hand. Der Preis: Du pflegst einen Dienst mehr.

    2 Headscale starten

    Headscale braucht eine eigene Subdomain mit TLS, etwa vpn.dein-server.example. Lege den DNS-Eintrag an, bevor Du startest.

    1Auf dem Server · /opt/headscale/compose.yml
    services:
      headscale:
        image: headscale/headscale:<version>   # feste Version, z. B. die neueste stabile
        container_name: headscale
        command: serve
        restart: unless-stopped
        ports:
          - "127.0.0.1:8085:8080"   # nur für den Reverse Proxy
        volumes:
          - ./config:/etc/headscale
          - ./data:/var/lib/headscale
    Statt <version> die aktuelle stabile Version von der Release-Seite (github.com/juanfont/headscale/releases) eintragen, nicht latest. Der Port hängt an 127.0.0.1 (Stufe 2). Der Reverse Proxy leitet https://vpn.dein-server.example auf 127.0.0.1:8085 weiter.

    Die Konfigurationsdatei holst Du Dir als Vorlage aus dem Repository (config-example.yaml passend zu Deiner Version) und speicherst sie als config/config.yaml. Ändern musst Du nur wenige Zeilen:

    2Ausschnitt · config/config.yaml
    server_url: https://vpn.dein-server.example
    listen_addr: 0.0.0.0:8080
    
    dns:
      magic_dns: true
      base_domain: heim.intern     # darf nicht die Domain von server_url sein
    
    policy:
      mode: file
      path: /etc/headscale/acl.hujson
    listen_addr ist die Adresse im Container; nach außen schützt die 127.0.0.1-Bindung aus der Compose-Datei. Versionsstand: Schlüsselnamen geprüft gegen die Beispielkonfiguration der 0.2x-Reihe, Oktober 2026. Ändert ein Update die Namen, gilt die Vorlage Deiner Version.
    Server
    $ cd /opt/headscale && docker compose up -d $ docker exec headscale headscale users create ich $ curl -s https://vpn.dein-server.example/health {"status":"pass"}

    3 Die Regeln mitnehmen

    Die ACL aus Kurs 3 ziehst Du in eine Datei auf dem Server um. Headscale versteht dasselbe Format wie Tailscale (HuJSON: JSON mit Kommentaren). So sieht die Fassung aus, die nur erlaubt, was die Reihe braucht:

    3config/acl.hujson
    {
      "tagOwners": {
        "tag:pc":     ["ich@"],
        "tag:server": ["ich@"],
        "tag:weck":   ["ich@"]
      },
      "acls": [
        // Mac und iPad (Benutzer ich) erreichen am PC: SSH, LM Studio, Moonlight
        { "action": "accept", "src": ["ich@"],
          "dst": ["tag:pc:22,1234,47984,47989,47998-48010"] },
        // Mac und iPad erreichen am Server: SSH und die Verwaltungsoberflächen (Stufe 4)
        { "action": "accept", "src": ["ich@"], "dst": ["tag:server:22,5678,8090"] },
        // Der Server darf den PC per SSH erreichen (Aufträge, Stufe 7) und den Weck-Knoten (Stufe 6)
        { "action": "accept", "src": ["tag:server"], "dst": ["tag:pc:22", "tag:weck:22"] }
      ]
    }
    Was nicht in der Liste steht, ist verboten. Ein 3D-Drucker, ein NAS, die Router-Oberfläche tauchen nirgends auf und sind damit aus dem Tailnet unerreichbar. ich@ ist die Schreibweise für einen Benutzer in neueren Headscale-Versionen; ältere schreiben den Namen ohne @. Prüfe die Syntax gegen die ACL-Seite der Headscale-Doku Deiner Version. Die Moonlight-Ports gelten nur, wenn Du den PC-Bildschirm aus Kurs 3 auch unterwegs holen willst.

    4 Die Geräte umziehen

    Jedes Gerät meldet sich einmal bei Tailscale ab und bei Headscale an. Fang mit dem Gerät an, an dem Du nicht gerade sitzt, damit Du die Verbindung zum Server behältst.

    GerätSo meldest Du es an
    Windows-PCEingabeaufforderung als Administrator: tailscale logout, dann tailscale up --login-server https://vpn.dein-server.example --advertise-tags=tag:pc. Im Browser öffnet sich eine Seite mit einem Befehl.
    MacTerminal: tailscale logout, dann tailscale up --login-server https://vpn.dein-server.example. Fehlt der Befehl, ist die App aus dem App Store installiert: In deren Einstellungen gibt es einen Eintrag für einen eigenen Koordinationsserver (Ort je nach Version verschieden).
    iPadIn der Tailscale-App abmelden. Den eigenen Server trägst Du je nach App-Version entweder in der App beim Anmelden ein oder in den iPad-Einstellungen bei Tailscale. Danach die App neu starten und anmelden.
    ServerTailscale auf dem Host installieren (Anleitung auf tailscale.com/download/linux), dann sudo tailscale up --login-server https://vpn.dein-server.example --advertise-tags=tag:server.

    Die Seite, die sich beim Anmelden öffnet, zeigt einen Befehl der Form headscale nodes register … --key … bzw. headscale auth register …. Den führst Du auf dem Server mit docker exec headscale davor aus. Die genaue Form hängt von der Version ab; nimm die von der Seite.

    Stand: noch nicht am echten Aufbau geprüft. Wo genau die iPad-App den eigenen Koordinationsserver erwartet, hat sich zwischen Versionen geändert. Headscale liefert unter https://vpn.dein-server.example/apple eine Seite mit der Anleitung für Apple-Geräte aus. Die gilt für Deine Server-Version und geht im Zweifel vor.
    Rückweg: Auf jedem Gerät tailscale logout bzw. in der App abmelden und wieder normal bei Tailscale anmelden. Die ACL aus Kurs 3 liegt bei Tailscale noch, solange Du sie dort nicht löschst. Headscale stoppen: docker compose down in /opt/headscale, Proxy-Eintrag und DNS-Eintrag entfernen.

    5 Übung: alle im eigenen Tailnet

    📍
    Ausgangslage
    Headscale läuft, die Health-Abfrage meldet pass, die ACL-Datei liegt im Konfigurationsordner.
    👉
    Deine Handlung
    Alle vier Geräte anmelden. Dann am Mac: tailscale status. Danach versuchen, vom Mac aus einen Port am PC zu erreichen, der nicht in der ACL steht, z. B. nc -vz pc 3389.
    ✅
    Das siehst Du danach
    Die Liste zeigt PC, iPad, Server (und später den Weck-Knoten) mit Adressen aus 100.64.0.0/10. ssh pc klappt, der Test auf 3389 läuft in eine Zeitüberschreitung.
    🛟
    Wenn es anders aussieht
    Gerät fehlt: Registrierungsbefehl am Server noch nicht ausgeführt, docker exec headscale headscale nodes list prüfen. Alles ist erreichbar: Die ACL wird nicht geladen. Ohne Richtlinie erlaubt Headscale alles. policy.path in config.yaml prüfen und docker logs headscale lesen (oft ein Komma in der Datei). Namen lösen nicht auf: magic_dns prüfen.
    KI-Symbolbild: Laptop, Tablet, Desktop-PC und ein Server, verbunden durch leuchtende Linien zu einem Netz
    KI-Bild Symbolbild, lokal mit Qwen-Image erzeugt. Das echte Bildschirmfoto zeigt später tailscale status mit allen Geräten im eigenen Tailnet.

    ✓ Kurz geprüft

    Stufe 4 · Teil A

    Der Server im Tailnet

    Der Server ist jetzt selbst ein Knoten im Tailnet. Damit kann alles, was nur Du brauchst, aus dem öffentlichen Netz verschwinden: n8n, Portainer, die Oberfläche des Reverse Proxy.

    1 Zwei Arten von Diensten

    Öffentlich (über den Proxy)
    • Deine Website
    • Headscale selbst (die Geräte müssen es von überall finden)
    • Webhooks, die fremde Dienste aufrufen
    Nur im Tailnet
    • Verwaltungsoberflächen: n8n-Editor, Portainer, Proxy-Admin
    • Webhooks für Dein eigenes Pult (Stufe 10)
    • Statusseite (Stufe 11)

    Ein Dienst „nur im Tailnet“ bindet seinen Port an die Tailnet-Adresse des Servers statt an 0.0.0.0. Die Adresse zeigt tailscale ip -4 auf dem Server, z. B. 100.64.0.5.

    1Beispiel · Portzeile von n8n
        ports:
          - "100.64.0.5:5678:5678"   # vorher: "5678:5678" oder hinter dem öffentlichen Proxy
    Dann erreichst Du den Editor unter http://server:5678 von Mac und iPad, aber nicht aus dem Internet. Die Verbindung ist durch WireGuard verschlüsselt, TLS ist hier keine Pflicht.
    ⚠️ Startreihenfolge: Docker kann nur an eine Adresse binden, die es beim Start gibt. Startet der Container vor Tailscale (nach einem Neustart des Servers), bricht er mit „cannot assign requested address“ ab. Abhilfe: restart: unless-stopped versucht es erneut, sobald Tailscale da ist. Wer sicher gehen will, lässt den Docker-Dienst per systemd erst nach tailscaled starten.
    Vertiefung: tailscale serve statt Portbindung

    Tailscale bringt mit tailscale serve eine eigene Weiterleitung mit, die einen lokalen Port ins Tailnet stellt, sogar mit Zertifikat. Mit Headscale funktionieren nicht alle Funktionen davon; die Portbindung oben ist der einfachere, überall gleiche Weg.

    2 Übung: eine Oberfläche umziehen

    📍
    Ausgangslage
    Eine Verwaltungsoberfläche (n8n-Editor, Portainer oder Proxy-Admin) ist bisher öffentlich erreichbar.
    👉
    Deine Handlung
    Den Eintrag im Reverse Proxy entfernen, die Portzeile auf die Tailnet-Adresse umstellen, docker compose up -d. Dann am iPad im Tailnet http://server:<port> öffnen, und zum Vergleich mit Tailscale aus.
    ✅
    Das siehst Du danach
    Im Tailnet öffnet sich die Oberfläche. Ohne Tailnet lädt die Seite nicht, und die alte öffentliche Adresse gibt einen Fehler.
    🛟
    Wenn es anders aussieht
    Im Tailnet kein Zugriff: Der Port fehlt in der ACL (tag:server:…). Container startet nicht: siehe Startreihenfolge oben. n8n meldet falsche Webhook-Adressen: WEBHOOK_URL in der .env anpassen.
    Rückweg: Portzeile zurück auf 127.0.0.1:… und Proxy-Eintrag wieder anlegen.

    ✓ Kurz geprüft

    Stufe 5 · Teil B

    Der Rückkanal

    Manchmal soll ein Dienst des PCs auf dem Server auftauchen, als liefe er dort, aber nur für einen einzigen Empfänger. Dafür baut der PC selbst eine SSH-Verbindung zum Server auf und gibt genau einen Port frei.

    1 Zwei Wege zum PC

    Direkt im TailnetRückkanal per SSH
    Wer baut auf?beide über Headscaleder PC, von innen nach außen
    Was wird sichtbar?alles, was die ACL erlaubtgenau ein Port, an genau einer Adresse auf dem Server
    Wer kann zugreifen?Geräte laut ACLnur, wer auf dem Server an diese Adresse kommt (z. B. ein Container)
    Braucht Tailscale auf dem PC?janein
    Gut fürSSH, Moonlight, alles Interaktiveeinen Dienst, den ein Server-Programm nutzen soll

    Hauptweg in diesem Kurs ist das Tailnet. Den Rückkanal lernst Du trotzdem, weil er ohne VPN auskommt und sich auf den Port genau begrenzen lässt. Beispiel: Ein Container auf dem Server soll das Sprachmodell des PCs nutzen (LM Studio, Port 1234), und sonst nichts vom PC sehen.

    KI-Symbolbild: Ein einzelnes leuchtendes Kabel führt von einem Desktop-PC zu Hause durch ein Fenster in die Nacht
    KI-Bild Symbolbild, lokal mit Qwen-Image erzeugt. Das echte Bildschirmfoto zeigt später den Test des Rückkanals auf dem Server.

    2 Ein eigenes Konto ohne Shell

    Auf dem Server legst Du ein Konto an, das nichts darf außer diesem einen Rückkanal. Der PC bekommt ein eigenes Schlüsselpaar dafür, nicht Deinen normalen Schlüssel.

    PC · PowerShell
    PS> ssh-keygen -t ed25519 -f $HOME\.ssh\rueckkanal -C "rueckkanal@pc" -N '""'
    Server
    $ sudo adduser --disabled-password --shell /usr/sbin/nologin --gecos "" rueckkanal $ sudo install -d -m 700 -o rueckkanal -g rueckkanal /home/rueckkanal/.ssh $ sudo nano /home/rueckkanal/.ssh/authorized_keys
    1/home/rueckkanal/.ssh/authorized_keys · eine Zeile
    restrict,port-forwarding,permitlisten="127.0.0.1:11234" ssh-ed25519 AAAA…Inhalt von rueckkanal.pub… rueckkanal@pc
    restrict verbietet alles: Shell, Terminal, Weiterleitungen, Agent. port-forwarding erlaubt Weiterleitungen wieder, und permitlisten beschränkt sie auf genau einen Port auf dem Server, den der PC öffnen darf. Danach sudo chown rueckkanal: /home/rueckkanal/.ssh/authorized_keys und chmod 600. Versionsstand: permitlisten gibt es seit OpenSSH 7.8; jeder aktuelle Server hat es.
    💡 permitlisten oder permitopen? permitlisten gilt für Weiterleitungen, die auf dem Server einen Port öffnen (ssh -R), also für den Rückkanal. permitopen gilt für die Gegenrichtung (ssh -L). Wer die beiden verwechselt, bekommt eine Verbindung, die zwar steht, aber nichts weiterleitet.

    3 Der PC öffnet den Kanal

    2PC · PowerShell
    ssh -N -i $HOME\.ssh\rueckkanal `
        -o ExitOnForwardFailure=yes -o ServerAliveInterval=15 -o ServerAliveCountMax=3 `
        -R 127.0.0.1:11234:127.0.0.1:1234 rueckkanal@dein-server.example
    -N: keine Befehle, nur der Kanal. -R 127.0.0.1:11234:127.0.0.1:1234: Port 11234 auf dem Server führt zu Port 1234 auf dem PC. ExitOnForwardFailure beendet die Verbindung, wenn die Weiterleitung verweigert wird, statt still weiterzulaufen. Die Keepalive-Optionen merken nach etwa 45 Sekunden, dass die Gegenseite weg ist.

    Damit der Kanal nach einem Neustart oder Abbruch wiederkommt, legst Du in der Windows-Aufgabenplanung eine Aufgabe an: Trigger „Bei Anmeldung“, Aktion ein kleines PowerShell-Skript, das den Befehl oben in einer Schleife mit 30 Sekunden Pause neu startet.

    Vertiefung: Der Rückkanal für einen Container

    Ein Port auf 127.0.0.1 des Servers ist für Container nicht sichtbar, die haben ihr eigenes 127.0.0.1. Soll ein Container den Dienst nutzen, setzt man einen winzigen sshd-Container ins selbe Docker-Netz und lässt den PC dorthin verbinden, per ProxyJump über den Host. In dessen sshd_config stehen dann AllowTcpForwarding remote, GatewayPorts clientspecified und PermitTTY no, und in authorized_keys ein permitlisten="0.0.0.0:11234". Der Container erreicht den PC-Dienst dann über den Namen des Tunnel-Containers. Das ist mehr Aufwand als das Tailnet und lohnt sich, wenn auf dem PC kein VPN laufen soll.

    4 Übung: genau ein Dienst, genau ein Empfänger

    📍
    Ausgangslage
    LM Studio läuft auf dem PC mit eingeschaltetem lokalen Server auf Port 1234 (Kurs LM Studio), ein Modell ist geladen.
    👉
    Deine Handlung
    Am PC den Kanal öffnen. Auf dem Server: curl -s http://127.0.0.1:11234/v1/models. Dann am Mac (außerhalb des Tailnet): nc -vz dein-server.example 11234. Zum Schluss am PC versuchen, einen zweiten Port weiterzuleiten, z. B. -R 127.0.0.1:12222:127.0.0.1:22.
    ✅
    Das siehst Du danach
    Auf dem Server antwortet LM Studio mit der Modelliste. Vom Mac aus ist 11234 nicht erreichbar. Der zweite Port wird verweigert, und wegen ExitOnForwardFailure bricht die Verbindung mit einer Fehlermeldung ab.
    🛟
    Wenn es anders aussieht
    Permission denied: Rechte von .ssh (700) und authorized_keys (600), Besitzer rueckkanal. remote port forwarding failed beim ersten Port: Tippfehler in permitlisten, oder der Port ist noch von einer alten Sitzung belegt (45 Sekunden warten). curl hängt: LM Studio hört nur auf einer anderen Adresse, in den Server-Einstellungen prüfen.
    Rückweg: Aufgabe in der Aufgabenplanung löschen, die Zeile in authorized_keys entfernen, das Konto mit sudo deluser --remove-home rueckkanal löschen.

    ✓ Kurz geprüft

    Stufe 6 · Teil B

    Den PC wecken lassen

    Ein schlafender PC hört nur auf ein Signal im eigenen Netzwerk, das „magische Paket“. Der Server steht aber im Rechenzentrum. Er braucht also einen Helfer zu Hause, der das Paket für ihn abschickt.

    1 Warum der Server nicht direkt wecken kann

    Wake-on-LAN schickt ein Paket an die Broadcast-Adresse des Heimnetzes. Router leiten so etwas nicht ins Internet weiter, und auch das Tailnet transportiert keine Broadcasts. Wer wecken will, muss im selben Netz stehen wie der PC. Dafür gibt es zwei Wege:

    Hauptweg: Weck-Knoten
    • Ein Raspberry Pi oder anderes kleines Gerät, dauerhaft an, im Tailnet
    • Der Server meldet sich per SSH an und ruft wakeonlan auf
    • Funktioniert mit jedem Router
    Vertiefung: der Router weckt
    • Viele FRITZ!Boxen können Geräte über ihre Schnittstelle TR-064 wecken
    • Der Server müsste dafür ins VPN der FRITZ!Box oder die Schnittstelle aus dem Internet erreichen
    • Kein Zusatzgerät, aber eine weitere Tür in den Router

    Voraussetzung in beiden Fällen ist, was Kurs 3 in der Stufe „PC aufwecken“ eingerichtet hat: Wake-on-LAN im BIOS und im Netzwerkadapter eingeschaltet, Windows-Schnellstart aus.

    2 Der Weck-Knoten

    Weck-Knoten (Raspberry Pi OS)
    $ sudo apt install wakeonlan $ sudo tailscale up --login-server https://vpn.dein-server.example --advertise-tags=tag:weck $ wakeonlan AA:BB:CC:DD:EE:FF Sending magic packet to 255.255.255.255:9 with AA:BB:CC:DD:EE:FF

    Statt AA:BB:CC:DD:EE:FF die MAC-Adresse der Netzwerkkarte des PCs (am PC: getmac /v, die Zeile mit dem Kabel-Adapter). Damit der Server nur wecken und sonst nichts tun darf, bekommt sein Schlüssel auf dem Weck-Knoten einen festen Befehl:

    1Weck-Knoten · ~/.ssh/authorized_keys
    restrict,command="/usr/bin/wakeonlan AA:BB:CC:DD:EE:FF" ssh-ed25519 AAAA…Schlüssel des Servers… wecken@server
    Egal, was der Server bei der Anmeldung als Befehl mitschickt: Ausgeführt wird nur dieser eine. Ein gestohlener Schlüssel kann also höchstens den PC wecken.

    Auf dem Server weckst Du dann mit ssh -i ~/.ssh/wecken weck-knoten. Ob der PC wach ist, zeigt tailscale ping pc oder ssh pc echo wach.

    KI-Symbolbild: Ein kleiner Einplatinenrechner neben einem Router auf einem Regalbrett, ein Netzwerkkabel verbindet beide
    KI-Bild Symbolbild, lokal mit Qwen-Image erzeugt. Das echte Foto zeigt später den Weck-Knoten am Router.
    Stand: noch nicht am echten Aufbau geprüft. Ob die Netzwerkkarte Deines PCs aus dem Standby (S3) oder auch aus dem Ruhezustand (S4) aufwacht, hängt von BIOS und Treiber ab. Miss es einmal von Hand, bevor Du Dich darauf verlässt: PC schlafen legen, wecken, Zeit bis ssh pc echo wach notieren.
    Vertiefung: Wecken über die FRITZ!Box (TR-064)

    Die FRITZ!Box bietet über ihre Schnittstelle TR-064 im Dienst Hosts eine Aktion zum Wecken eines Geräts per MAC-Adresse an (bei AVM als X_AVM-DE_WakeOnLANByMACAddress dokumentiert). Dafür braucht der Server einen eigenen FRITZ!Box-Benutzer mit genau dieser Berechtigung und einen Weg zur Box, am saubersten als Teilnehmer im WireGuard-VPN der Box. Die Schnittstelle aus dem Internet freizugeben ist eine Portfreigabe und damit gegen die Regel dieses Kurses. Prüfe die Aktion gegen die TR-064-Dokumentation von AVM für Dein Modell und Deine FRITZ!OS-Version.

    3 Übung: über den Server wecken

    📍
    Ausgangslage
    Weck-Knoten im Tailnet, Schlüssel des Servers mit festem Befehl eingetragen, PC läuft.
    👉
    Deine Handlung
    PC in den Energiesparmodus schicken. Zwei Minuten warten. Auf dem Server: ssh -i ~/.ssh/wecken weck-knoten, dann alle zehn Sekunden ssh pc echo wach.
    ✅
    Das siehst Du danach
    Nach einiger Zeit antwortet der PC mit wach. Notier Dir, wie lange es gedauert hat; diese Zahl braucht der Auftrag in Stufe 7 als Wartezeit.
    🛟
    Wenn es anders aussieht
    Der Weck-Knoten meldet das Paket, der PC bleibt aus: WoL im BIOS/Adapter (Kurs 3), Kabel statt WLAN, Schnellstart aus. Die Anmeldung am Weck-Knoten scheitert: ACL-Regel tag:server → tag:weck:22 fehlt.
    Rückweg: Zeile in authorized_keys des Weck-Knotens löschen, den Knoten mit docker exec headscale headscale nodes delete … aus dem Tailnet nehmen.

    ✓ Kurz geprüft

    Stufe 7 · Teil B

    Aufträge an die GPU

    Jetzt kommt alles zusammen: Ein Auftrag kommt beim Server an, der weckt den PC, startet den Render und wartet auf das Ergebnis. Auf dem PC passt ein Wächter auf, dass die Grafikkarte nicht unbeaufsichtigt überhitzt.

    1 Der Ablauf

    Ein Auftrag, Schritt für Schritt
    1. Webhook mit Token kommt bei n8n an
    2. n8n fragt: Ist der PC wach? Wenn nicht, Weck-Knoten aufrufen
    3. Warten, bis der PC antwortet (höchstens die gemessene Aufwachzeit plus Reserve)
    4. n8n startet per SSH den Wächter auf dem PC, der startet Blender
    5. Wächter prüft alle 10 Sekunden Temperatur, Laufzeit und Stopp-Datei
    6. Blender schreibt das Bild in den Sync-Ordner
    7. n8n meldet „fertig“ ans iPad
    Klick auf „Nächster Schritt“.

    2 Der Wächter auf dem PC

    Der Wächter ist ein PowerShell-Skript im Übungsordner C:\Nordwerk. Er startet Blender ohne Oberfläche, beobachtet die Grafikkarte und bricht ab, wenn eine von drei Grenzen erreicht ist: Temperatur, Laufzeit oder eine Stopp-Datei, die das Pult anlegen kann (Stufe 10).

    1PC · C:\Nordwerk\waechter.ps1
    param([int]$MaxGrad = 83, [int]$MaxMinuten = 20)
    $blender = 'C:\Program Files\Blender Foundation\Blender 5.2\blender.exe'
    $stopp   = 'C:\Nordwerk\STOPP'
    Remove-Item $stopp -ErrorAction SilentlyContinue
    $liste = '-b', 'C:\Nordwerk\figur.blend', '-o', 'C:\Nordwerk\Sync\render\figur_####', '-F', 'PNG', '-f', '1'
    $p = Start-Process -FilePath $blender -ArgumentList $liste -PassThru -WindowStyle Hidden
    $start = Get-Date
    while (-not $p.HasExited) {
      $grad = [int](nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits)
      $min  = ((Get-Date) - $start).TotalMinutes
      if ($grad -ge $MaxGrad)   { Stop-Process -Id $p.Id -Force; "ABBRUCH Temperatur $grad Grad"; exit 2 }
      if ($min -gt $MaxMinuten) { Stop-Process -Id $p.Id -Force; "ABBRUCH Laufzeit"; exit 3 }
      if (Test-Path $stopp)     { Stop-Process -Id $p.Id -Force; "ABBRUCH Stopp-Datei"; exit 4 }
      Start-Sleep -Seconds 10
    }
    "FERTIG Exitcode $($p.ExitCode)"
    Der Blender-Pfad hängt von Deiner Version ab. -f 1 rendert genau ein Bild (Frame 1); für das Turntable-Video aus Kurs 2 wäre es -a. C:\Nordwerk\Sync ist der Syncthing-Ordner. Die Grenze von 83 Grad ist ein Beispiel; nimm die Warnschwelle, die für Deine Karte gilt. nvidia-smi liegt mit dem NVIDIA-Treiber im Pfad.
    ⚠️ Ein Wächter ersetzt keinen Menschen in der Nähe. Er bricht bei Überhitzung ab, aber er löscht keinen Kabelbrand und merkt keinen ausgefallenen Lüfter, solange die Temperatur noch stimmt. Lange Aufträge startest Du nur, wenn jemand im Haus ist oder Du über die Statusseite (Stufe 11) zusehen kannst. Nie über Nacht in ein leeres Haus.

    3 Der Auftrag in n8n

    Der Workflow besteht aus wenigen Knoten. Bau ihn im n8n-Editor (jetzt im Tailnet, Stufe 4) nach:

    1. Webhook, Methode POST, Pfad figur-rendern, Authentifizierung Header Auth mit einem Zugang, dessen Name X-Pult-Token ist und dessen Wert eine lange Zufallszeichenkette (openssl rand -hex 32). Antwortmodus: sofort antworten („Auftrag angenommen“).
    2. SSH (Befehl ausführen) auf dem Weck-Knoten, Zugang mit dem Weck-Schlüssel aus Stufe 6. Der Befehl ist egal, ausgeführt wird ohnehin wakeonlan.
    3. Wait so lange wie Deine gemessene Aufwachzeit plus eine Minute.
    4. SSH auf dem PC (Tailnet-Adresse, Benutzer und Schlüssel aus Kurs 3), Befehl: powershell -NoProfile -ExecutionPolicy Bypass -File C:\Nordwerk\waechter.ps1.
    5. IF: Enthält die Ausgabe FERTIG? Ja → Nachricht „fertig“, nein → Nachricht mit dem Abbruchgrund (beides in Stufe 11).
    💡 Adresse statt Name: Trag im SSH-Knoten die Tailnet-Adresse des PCs ein (100.64.…), nicht den Namen. Ob ein Container auf dem Server die Tailnet-Namen auflösen kann, hängt davon ab, wie Docker das DNS des Hosts übernimmt. Mit der Adresse gibt es die Frage nicht.
    2Mac · Terminal · den Auftrag auslösen
    curl -X POST -H "X-Pult-Token: $PULT_TOKEN" http://server:5678/webhook/figur-rendern
    Vorher in derselben Sitzung export PULT_TOKEN=…, damit der Token nicht im Verlauf der Shell landet. http://server:5678 geht nur im Tailnet, und genau so soll es sein. Versionsstand: Knotennamen nach n8n 2.4x, Oktober 2026.
    KI-Symbolbild: Ein Desktop-PC mit leuchtender Grafikkarte, davor auf dem Tisch eine kleine 3D-gedruckte Figur
    KI-Bild Symbolbild, lokal mit Qwen-Image erzeugt. Das echte Bildschirmfoto zeigt später den Workflow in n8n.

    4 Übung: Render per Webhook

    📍
    Ausgangslage
    Workflow aktiv, figur.blend aus Kurs 2 (oder aus dessen demo/) liegt in C:\Nordwerk. Du bist zu Hause oder siehst den PC über Moonlight. Der PC schläft.
    👉
    Deine Handlung
    Vom Mac aus den curl-Befehl oben absenden. In n8n unter „Executions“ zusehen. Danach einmal mit -MaxMinuten 0 im SSH-Befehl wiederholen, um den Abbruch zu sehen.
    ✅
    Das siehst Du danach
    Der PC wacht auf, nach einigen Sekunden bis Minuten liegt figur_0001.png in Sync\render und kurz darauf auch am Mac. Der zweite Lauf endet mit ABBRUCH Laufzeit.
    🛟
    Wenn es anders aussieht
    401/403 beim curl: Token oder Header-Name falsch. SSH-Knoten läuft in eine Zeitüberschreitung: PC noch nicht wach, Wartezeit erhöhen. nvidia-smi nicht gefunden: vollen Pfad eintragen. Der SSH-Knoten wird beim Abbruch rot: Der Wächter endet dann mit Exitcode 2 bis 4; in den Knoteneinstellungen „On Error: Continue“ wählen, damit der IF-Knoten den Grund auswerten kann. Bild fehlt am Mac: Syncthing (Stufe 8 und Kurs 3).
    Rückweg: Workflow deaktivieren. Der Webhook ist dann sofort tot, auch wenn jemand den Token kennt. Den Zugang mit dem Token in n8n löschen.

    ✓ Kurz geprüft

    Stufe 8 · Teil B

    Der Datei-Briefkasten

    Syncthing gleicht Dateien direkt zwischen Geräten ab, aber nur, wenn zwei davon gleichzeitig online sind. Ein Server, der immer da ist, schließt die Lücke. Und er bekommt die Dateien nur verschlüsselt zu sehen.

    1 Das Problem aus Kurs 3

    Du exportierst unterwegs die Nordwerk-Figur aus Nomad Sculpt und legst sie in den Sync-Ordner auf dem iPad bzw. dem Mac. Der PC zu Hause schläft. Klappst Du den Mac zu, bevor der PC aufwacht, liegt die Datei nirgends außer auf dem Mac. Mit dem Server als drittem Teilnehmer geht sie sofort dorthin, und der PC holt sie ab, sobald er wach ist.

    WerOrdnertyp in SyncthingSieht die Inhalte?
    Mac, PCSenden & Empfangenja
    ServerVerschlüsselt empfangen (Receive Encrypted)nein, nur verschlüsselte Blöcke ohne lesbare Dateinamen

    Syncthing nennt das „nicht vertrauenswürdige Geräte“. Das Passwort für die Verschlüsselung kennen nur Mac und PC. Wird der Server übernommen, findet der Angreifer dort nur Datensalat.

    ⚠️ Beta-Funktion. Die Syncthing-Dokumentation führt verschlüsselte Geräte als Funktion im Beta-Stadium (Stand beim Schreiben). Behalte immer eine zweite Sicherung der wichtigen Dateien, die nicht über Syncthing läuft.

    2 Syncthing auf dem Server

    1Server · /opt/syncthing/compose.yml
    services:
      syncthing:
        image: syncthing/syncthing:<version>   # feste Version von der Release-Seite
        container_name: syncthing
        restart: unless-stopped
        environment:
          - PUID=1000
          - PGID=1000
        ports:
          - "100.64.0.5:8384:8384"   # Oberfläche nur im Tailnet
          - "22000:22000/tcp"        # Abgleich
          - "22000:22000/udp"
        volumes:
          - ./daten:/var/syncthing
    Die Oberfläche (8384) hängt an der Tailnet-Adresse. Der Abgleichport 22000 ist öffentlich, sonst finden Mac und PC den Server unterwegs nur über fremde Relais. Dafür in ufw sudo ufw allow 22000 (TCP und UDP). Alternativ bindest Du auch 22000 an die Tailnet-Adresse, dann läuft der Abgleich nur über das Tailnet. Das ist enger, aber dann müssen alle Geräte im Tailnet sein.

    In der Oberfläche unter http://server:8384 zuerst unter „Aktionen → Einstellungen → GUI“ einen Benutzer und ein Passwort setzen.

    3 Den Ordner verschlüsselt teilen

    1. Auf dem Mac in Syncthing den Server als Gerät hinzufügen (Geräte-ID aus der Server-Oberfläche, „Aktionen → ID anzeigen“).
    2. Beim Ordner „Nordwerk-Figur“ auf „Bearbeiten → Teilen“ gehen, den Server anhaken und im Feld daneben ein Verschlüsselungspasswort eintragen. Dieses Passwort gibst Du auf dem PC beim selben Ordner für den Server ebenfalls ein, genau gleich.
    3. Auf dem Server erscheint die Anfrage, den Ordner anzunehmen. Als Ordnertyp „Verschlüsselt empfangen“ wählen.
    ⚠️ Das Passwort gehört nie auf den Server. Wer es dort einträgt, macht den Server zu einem normalen, vertrauenswürdigen Gerät, und die Dateien liegen im Klartext. Notiere es in Deinem Passwort-Manager; ohne es kannst Du die Daten auf dem Server nicht zurückgewinnen.
    KI-Symbolbild: Laptop und Tablet auf dem Tisch eines Zugabteils, draußen zieht eine Landschaft in der Dämmerung vorbei
    KI-Bild Symbolbild, lokal mit Qwen-Image erzeugt. Das echte Bildschirmfoto zeigt später den Ordner mit verschlüsseltem Server-Gerät in Syncthing.

    4 Und das iPad?

    Syncthing gibt es nicht von den Entwicklern für iPadOS. Zwei Wege, die Datei vom iPad in den Ordner zu bekommen:

    Hauptweg: über den Mac
    • Export aus Nomad per AirDrop auf den Mac, dort in den Sync-Ordner ziehen
    • Kostet nichts, klappt immer, wenn der Mac in der Nähe ist
    Vertiefung: Möbius Sync
    • Eine kostenpflichtige iPad-App mit Syncthing im Inneren, Ordner über die Dateien-App erreichbar
    • Das iPad wird ein eigenes Gerät im Abgleich, unabhängig vom Mac
    Stand: noch nicht am echten Aufbau geprüft. Ob Möbius Sync mit einem Server als verschlüsseltem Gerät zusammenarbeitet und wie zuverlässig der Abgleich läuft, wenn die App im Hintergrund ist, ist hier noch nicht getestet. iPadOS beendet Hintergrund-Apps nach eigenem Ermessen; rechne damit, dass Du die App zum Abgleichen kurz öffnen musst.

    5 Übung: abgeben, während der PC schläft

    📍
    Ausgangslage
    Der Ordner ist zwischen Mac, PC und Server geteilt, der Server als verschlüsseltes Gerät. Der PC schläft.
    👉
    Deine Handlung
    Eine Datei (z. B. den Nomad-Export figur-v2.obj) am Mac in den Ordner legen. Warten, bis Syncthing am Mac „Aktuell“ für den Server zeigt. Mac zuklappen. Dann den PC wecken (Stufe 6).
    ✅
    Das siehst Du danach
    Kurz nach dem Aufwachen liegt die Datei auf dem PC, obwohl der Mac zu ist. Auf dem Server findest Du unter /opt/syncthing/daten/ nur Ordner mit kryptischen Namen, keine .obj-Datei.
    🛟
    Wenn es anders aussieht
    Server bleibt „Getrennt“: Port 22000 in ufw fehlt, oder Geräte-ID vertippt. Auf dem PC kommt nichts an: Dort wurde für den Server ein anderes Passwort eingetragen; Syncthing zeigt dann einen Fehler beim Ordner.
    Rückweg: Am Mac und am PC den Server aus dem Ordner entfernen, auf dem Server den Ordner löschen, docker compose down, ufw-Regel für 22000 löschen.

    ✓ Kurz geprüft

    Stufe 9 · Teil B

    Eigener Fernzugriff

    Für Fernhilfe und den schnellen Blick auf den PC gibt es RustDesk. Den Vermittlungsserver, über den sich die Geräte finden, kannst Du selbst betreiben. Und dafür einen fremden Weg abschalten.

    1 Was der Vermittler tut

    RustDesk besteht aus zwei Server-Diensten: hbbs vermittelt (welche ID ist gerade wo erreichbar) und hbbr leitet weiter, wenn zwei Geräte nicht direkt zueinander finden. Die Sitzung selbst ist Ende-zu-Ende verschlüsselt; der Vermittler sieht nicht, was auf dem Bildschirm passiert.

    WofürWeg
    Am PC arbeiten wie davor sitzend (Blender, Stift)Moonlight im Tailnet (Kurs 3). Läuft direkt, nicht über den Server.
    Schnell etwas nachsehen, jemandem helfen, NotfallRustDesk über den eigenen Vermittler
    Befehle, Skripte, AufträgeSSH im Tailnet

    2 hbbs und hbbr starten

    1Server · /opt/rustdesk/compose.yml
    services:
      hbbs:
        image: rustdesk/rustdesk-server:<version>
        command: hbbs -r 203.0.113.10:21117 -k _
        restart: unless-stopped
        ports:
          - "21115:21115"
          - "21116:21116"
          - "21116:21116/udp"
        volumes:
          - ./data:/root
        depends_on: [hbbr]
      hbbr:
        image: rustdesk/rustdesk-server:<version>
        command: hbbr -k _
        restart: unless-stopped
        ports:
          - "21117:21117"
        volumes:
          - ./data:/root
    -k _ lädt beim ersten Start ein Schlüsselpaar bzw. erzeugt es und lässt nur Geräte mit dem passenden öffentlichen Schlüssel zu. Beide Dienste brauchen es. Bei -r trägst Du die öffentliche IP Deines Servers ein (hier die Beispieladresse 203.0.113.10), nicht den Namen: Kann hbbs einen Namen beim Start nicht auflösen, verwirft es ihn ohne Fehlermeldung. Die Ports 21118/21119 (Web-Client) bleiben bewusst ungemappt.
    Server
    $ cd /opt/rustdesk && docker compose up -d $ sudo ufw allow 21115/tcp && sudo ufw allow 21116 && sudo ufw allow 21117/tcp $ docker compose logs hbbs | grep -E "relay-servers|Key" … relay-servers=["203.0.113.10:21117"] … Key: (der öffentliche Schlüssel, eine lange Zeichenkette) $ cat data/id_ed25519.pub
    ⚠️ data/ enthält den privaten Schlüssel. Nie in ein Git-Repository, aber sichern (Stufe 11). Geht er verloren, muss jedes Gerät neu eingerichtet werden.

    3 Die Geräte umstellen

    In RustDesk auf PC, Mac und iPad unter Einstellungen → Netzwerk (am PC mit „Netzwerkeinstellungen entsperren“) eintragen: ID-Server und Relay-Server rd.dein-server.example (ein DNS-Eintrag auf die Server-IP), API-Server leer, Key der öffentliche Schlüssel aus id_ed25519.pub.

    Am PC zusätzlich in den Sicherheitseinstellungen: Dateiübertragung und TCP-Tunnel aus, wenn Du sie nicht brauchst, und ein festes, langes Passwort für den unbeaufsichtigten Zugriff, oder besser gar keinen unbeaufsichtigten Zugriff.

    KI-Symbolbild: Ein Tablet zeigt den unscharfen Bildschirm eines Desktop-PCs, im Hintergrund ein Wohnzimmer am Abend
    KI-Bild Symbolbild, lokal mit Qwen-Image erzeugt. Das echte Bildschirmfoto zeigt später die Netzwerkeinstellungen in RustDesk.

    4 Ein Weg weniger

    Mit dem eigenen Vermittler brauchst Du eine Fernwartungs-App eines Anbieters nicht mehr. Deinstalliere sie, statt sie nur zu beenden: Viele starten als Dienst bei jedem Hochfahren. Prüfe danach im Weg-Zähler aus Stufe 1, wie viele Wege übrig sind.

    📍
    Ausgangslage
    hbbs und hbbr laufen, PC und Mac (oder iPad) sind auf den eigenen Vermittler umgestellt.
    👉
    Deine Handlung
    Vom Mac aus über RustDesk auf den PC verbinden. Auf dem Server docker compose logs --tail 20 hbbs. Dann auf einem Gerät den Key absichtlich falsch eintragen und erneut verbinden.
    ✅
    Das siehst Du danach
    Die erste Verbindung steht, im Log taucht die Registrierung der PC-ID auf. Mit falschem Key wird die Verbindung abgewiesen.
    🛟
    Wenn es anders aussieht
    Der Client zeigt weiter die öffentlichen RustDesk-Server: Einstellung nicht gespeichert, am PC Rechte entsperren. Verbindung ist zäh: Sie läuft über das Relais, im Log prüfen, ob relay-servers leer ist. Falscher Key wird angenommen: -k _ fehlt bei einem der beiden Dienste.
    Rückweg: In den Clients die Netzwerkfelder leeren (dann gelten wieder die öffentlichen Server), auf dem Server docker compose down und die ufw-Regeln für 21115–21117 löschen.

    ✓ Kurz geprüft

    Stufe 10 · Teil C

    Ein Pult für überall

    Das Bedienpult aus Kurs 2 und 3 schickte Tastenkürzel an Mac oder PC. Jetzt bekommt es eine Seite, deren Tasten Webhooks auf dem Server aufrufen. Die funktionieren auch im Zug, solange das iPad im Tailnet ist.

    1 Vier Tasten

    TasteRuft aufWas passiert
    PC weckenPOST /webhook/pc-weckenn8n ruft den Weck-Knoten auf (Stufe 6)
    Figur rendernPOST /webhook/figur-rendernder Ablauf aus Stufe 7
    Render abbrechenPOST /webhook/render-stoppn8n legt per SSH C:\Nordwerk\STOPP an, der Wächter bricht ab
    GPU-StatusPOST /webhook/gpu-statusn8n fragt per SSH nvidia-smi ab und antwortet mit Temperatur und Last

    Jeder Webhook bekommt einen eigenen Token. Wer den Token für „GPU-Status“ kennt, kann damit keinen Render starten.

    1SSH-Befehl im Knoten „Render abbrechen“
    powershell -NoProfile -Command "New-Item -ItemType File -Force C:\Nordwerk\STOPP | Out-Null; 'STOPP gesetzt'"
    2SSH-Befehl im Knoten „GPU-Status“
    nvidia-smi --query-gpu=temperature.gpu,utilization.gpu,memory.used --format=csv,noheader
    Ausgabe etwa 45, 3 %, 1024 MiB. Mit einem Knoten „Respond to Webhook“ gibst Du sie als Antwort zurück, dann zeigt das Pult sie an. Der Webhook braucht dafür den Antwortmodus „Using ‚Respond to Webhook‘ Node“.

    2 Die Tasten auf dem iPad

    Das Pult-Programm aus Kurs 2 muss Webhooks aufrufen können. Wenn Deines das nicht kann, nimm die App Kurzbefehle, die auf jedem iPad ist:

    1. Neuer Kurzbefehl, Aktion „Inhalte von URL abrufen“.
    2. URL http://server:5678/webhook/pc-wecken, Methode POST, unter Header einen Eintrag X-Pult-Token mit dem Token.
    3. Danach Aktion „Ergebnis anzeigen“, damit Du die Antwort siehst.
    4. Kurzbefehl benennen, Symbol wählen, „Zum Home-Bildschirm“. Das wiederholst Du für die anderen drei Tasten.
    ⚠️ Der Token steht dann im Kurzbefehl. Wer Dein entsperrtes iPad hat, hat ihn auch. Das ist für ein persönliches Gerät vertretbar, aber teile solche Kurzbefehle nie, auch nicht als Vorlage: Beim Teilen wandert der Token mit.
    KI-Symbolbild: Ein Tablet mit einem Raster aus vier großen farbigen Tasten ohne Beschriftung, auf einem Zugtisch
    KI-Bild Symbolbild, lokal mit Qwen-Image erzeugt. Das echte Foto zeigt später die Pultseite „Server“ auf dem iPad.

    3 Was nie aufs Pult kommt

    • Nichts, was heizt, druckt oder bewegt. Kein Webhook startet einen 3D-Drucker, eine Heizung, eine Maschine. Ein Fehlklick in der Hosentasche darf nichts Gefährliches auslösen.
    • Kein Webhook im öffentlichen Netz. Die Pult-Webhooks gehen nur über die Tailnet-Adresse. Ein Token schützt, aber ein Token, den niemand aus dem Internet erreicht, schützt besser.
    • Kein „alles erlaubt“-Knoten. Kein Webhook, der einen beliebigen Befehl aus der Anfrage per SSH ausführt. Jede Taste hat einen festen Befehl.

    4 Übung: vier Tasten von unterwegs

    📍
    Ausgangslage
    Vier Workflows in n8n aktiv, jeder mit eigenem Token. Das iPad ist im Tailnet. Jemand ist zu Hause oder Du siehst den PC über die Statusseite.
    👉
    Deine Handlung
    Das iPad vom Heim-WLAN trennen und über einen Handy-Hotspot verbinden. Dann nacheinander: „PC wecken“, „GPU-Status“, „Figur rendern“, nach einigen Sekunden „Render abbrechen“.
    ✅
    Das siehst Du danach
    „GPU-Status“ zeigt Werte des PCs. Der Render startet, und kurz nach „Render abbrechen“ meldet n8n ABBRUCH Stopp-Datei.
    🛟
    Wenn es anders aussieht
    Keine Antwort über den Hotspot, im WLAN aber schon: Tailscale auf dem iPad ist nicht verbunden. 401/403: Header-Name oder Token im Kurzbefehl. „Render abbrechen“ wirkt nicht: Wächter prüft die Datei erst nach bis zu zehn Sekunden.
    Rückweg: Workflows in n8n deaktivieren, Kurzbefehle löschen, Tokens in n8n löschen. Danach ist keine Taste mehr wirksam, egal wo sie noch liegt.

    ✓ Kurz geprüft

    Stufe 11 · Teil C

    Wächter und Nachrichten

    Wer aus der Ferne rendert, muss wissen, was zu Hause passiert. Eine Statusseite zeigt es auf einen Blick, und Nachrichten aufs iPad melden das Wichtige von selbst.

    1 Die Statusseite

    Die einfachste Statusseite ist ein weiterer n8n-Workflow: Ein Webhook mit Methode GET, der per SSH Temperatur und Last abfragt, den letzten Auftrag aus einer Data table liest und als kleine HTML-Seite zurückgibt. Er läuft auf der Tailnet-Adresse wie die Pult-Webhooks.

    AnzeigeQuelle
    PC an oder ausSSH-Knoten mit kurzer Zeitüberschreitung, echo wach
    GPU-Temperatur und -Lastnvidia-smi wie in Stufe 10
    Letzter Auftrag und ErgebnisData table auftraege, die der Render-Workflow am Ende beschreibt
    Zeitpunkt der Abfrage{{ $now }}

    Auf dem iPad öffnest Du die Seite in Safari und wählst „Teilen → Zum Home-Bildschirm“. Dann liegt sie wie eine App neben dem Pult.

    Vertiefung: fertige Überwachung statt Eigenbau

    Werkzeuge wie Uptime Kuma prüfen regelmäßig, ob Dienste antworten, und zeigen Verläufe. Für die Frage „Läuft der Server, antwortet Headscale, ist der Rückkanal da?“ lohnt sich das. Die GPU-Werte des PCs kennt so ein Werkzeug nicht ohne Zusatzarbeit; dafür bleibt der n8n-Weg.

    2 Nachrichten aufs iPad

    Drei Ereignisse sollen sich von selbst melden: Render fertig, Render abgebrochen (mit Grund) und PC nicht wach geworden. Dafür brauchst Du einen Dienst, der Push-Nachrichten schickt. Zwei übliche Wege:

    Hauptweg: ntfy
    • Kleine App fürs iPad, Nachrichten per einfacher HTTP-Anfrage
    • Öffentlicher Dienst mit geheimem Thema oder selbst auf dem Server betrieben
    • n8n-Knoten: HTTP Request, POST an das Thema
    Alternative: Messenger
    • Telegram-Bot oder Matrix-Raum, n8n hat Knoten dafür
    • Nachrichten landen dort, wo Du ohnehin liest
    • Ein weiterer Anbieter, der die Inhalte sieht
    1Test vom Server aus
    curl -d "Render fertig: figur_0001.png" https://ntfy.sh/dein-geheimes-thema-7f3a9c
    Beim öffentlichen Dienst ist das Thema das Passwort: Wer es kennt, liest mit. Also lang und zufällig wählen, und keine Dateinamen oder Inhalte schicken, die niemand sehen soll. Wer das nicht will, betreibt ntfy selbst auf dem Server, nach der Anleitung auf docs.ntfy.sh.
    💡 Der Testalarm gehört dazu. Eine Benachrichtigung, die Du nie gesehen hast, funktioniert vermutlich nicht. Löse jede der drei Meldungen einmal absichtlich aus.
    KI-Symbolbild: Ein Tablet auf einem Nachttisch, oben auf dem Bildschirm leuchtet eine Benachrichtigung ohne lesbaren Text
    KI-Bild Symbolbild, lokal mit Qwen-Image erzeugt. Das echte Foto zeigt später die Meldung „Render fertig“ auf dem iPad.

    3 Den Server selbst sichern

    Auf dem Server liegen jetzt Dinge, deren Verlust weh tut: die Headscale-Datenbank (alle Geräte), der RustDesk-Schlüssel, die n8n-Workflows und Zugänge. Die Syncthing-Daten nicht, die sind auf Mac und PC vollständig.

    2Server · /opt/sicherung.sh (Beispiel)
    #!/bin/sh
    set -e
    ziel=/root/sicherung/$(date +%F)
    mkdir -p "$ziel"
    tar czf "$ziel/headscale.tgz" -C /opt/headscale config data
    tar czf "$ziel/rustdesk.tgz"  -C /opt/rustdesk data
    # n8n: Export nach der Anleitung aus dem n8n-Kurs (Workflows, Zugänge, Volume, .env)
    find /root/sicherung -maxdepth 1 -type d -mtime +14 -exec rm -rf {} +
    Eine Sicherung auf demselben Server schützt vor Bedienfehlern, nicht vor dem Verlust des Servers. Hol die Archive regelmäßig auf den Mac oder ein anderes Ziel, zum Beispiel per scp von Hand oder mit einem Zeitplan auf dem PC. Für Headscale vorher kurz anhalten oder die Doku zur Sicherung der Datenbank lesen, damit die SQLite-Datei nicht mitten im Schreiben kopiert wird.

    4 Übung: Render mit Nachricht

    📍
    Ausgangslage
    Statusseite und Benachrichtigungen sind eingerichtet, die ntfy-App (oder Dein Messenger) ist auf dem iPad angemeldet.
    👉
    Deine Handlung
    Statusseite öffnen, dann „Figur rendern“ auf dem Pult. Danach einen Testalarm: im Wächter einmal -MaxGrad 30 setzen und erneut rendern.
    ✅
    Das siehst Du danach
    Die Statusseite zeigt den PC als „an“ und steigende Last. Erst kommt „Render fertig“, beim zweiten Lauf „Abbruch: Temperatur“.
    🛟
    Wenn es anders aussieht
    Keine Nachricht: In n8n die Ausführung öffnen, ob der Benachrichtigungs-Knoten lief. ntfy-App zeigt nichts: Mitteilungen für die App in den iPad-Einstellungen erlauben, Thema exakt gleich schreiben.

    ✓ Kurz geprüft

    Stufe 12 · Teil C

    Betrieb und Abschluss

    Was typischerweise kaputtgeht, was das Ganze im Monat kostet und wie Du alles wieder zumachst. Am Ende steht derselbe Scan wie in Stufe 2.

    1 Fehlerbilder

    Ordne jedem Symptom die wahrscheinlichste Ursache zu.

    Symptom → Ursache
      Noch nicht geprüft.

      2 Was es kostet

      PostenGrößenordnung
      Kleiner Linux-Server (2–4 GB RAM)einige Euro im Monat, je nach Anbieter
      Domainwenige Euro im Monat bzw. ein Jahresbetrag
      Weck-Knoten (Raspberry Pi)einmalig, Strom wenige Watt
      Headscale, Syncthing, RustDesk-Server, n8n, ntfykeine Lizenzkosten
      Möbius Sync (optional)einmaliger App-Kauf, Preis im App Store
      Deine ZeitUpdates aller Dienste, etwa einmal im Monat nachsehen

      Preise ändern sich; die Tabelle nennt bewusst keine Beträge, die morgen falsch sind. Der größte Posten ist meist die Zeit für Updates.

      3 Alles wieder schließen

      Jede Stufe hatte ihren Rückweg. Hier gesammelt, in der richtigen Reihenfolge, falls Du das Viereck wieder abbauen willst:

      1. n8n-Workflows für Pult, Aufträge und Status deaktivieren, Tokens löschen, Kurzbefehle auf dem iPad löschen.
      2. Rückkanal: Aufgabe am PC löschen, Konto rueckkanal auf dem Server löschen.
      3. Weck-Knoten: Schlüssel des Servers entfernen, Knoten aus dem Tailnet nehmen.
      4. Syncthing: Server aus dem Ordner entfernen, Container stoppen, ufw-Regel 22000 löschen.
      5. RustDesk: Clients zurückstellen oder deinstallieren, Container stoppen, ufw-Regeln 21115–21117 löschen.
      6. Headscale: Geräte zurück zu Tailscale oder ganz abmelden, Container stoppen, Proxy- und DNS-Eintrag löschen.
      7. Zum Schluss der Scan von außen.

      4 Abschluss-Übung: der Scan von außen

      📍
      Ausgangslage
      Dein Viereck läuft so, wie Du es behalten willst.
      👉
      Deine Handlung
      Am Mac, außerhalb des Tailnet: nmap -Pn -p 1-65535 dein-server.example und für UDP sudo nmap -sU -p 21116,22000 dein-server.example. Schreib Dir zu jedem offenen Port den Dienst dazu.
      ✅
      Das siehst Du danach
      Offen sind nur 22, 80, 443 und die Ports, die Du bewusst geöffnet hast: 21115–21117 für RustDesk, 22000 für Syncthing. Für jeden steht ein Dienst auf Deiner Liste.
      🛟
      Wenn es anders aussieht
      Ein Port ohne Dienst auf Deiner Liste: wie in Stufe 2 mit ss -tlnp suchen. Meist ein Container mit einer Portzeile ohne 127.0.0.1: oder Tailnet-Adresse.

      5 Rückblick: vier Geräte

      GerätVorher (Kurs 3)Jetzt
      Macstartet Aufträge selbst per SSHstartet sie per Webhook, auch wenn der PC schläft; Dateien gehen sofort in den Briefkasten
      iPadPult für Mac und PC im selben NetzPult und Statusseite, die von überall funktionieren; Meldungen kommen von selbst
      Windows-PCmuss wach sein, wenn Du etwas willstwird geweckt, rechnet unter Aufsicht des Wächters, holt Dateien nach
      Servergab es nichtkoordiniert das VPN, vermittelt Fernzugriff, nimmt Aufträge an, hält verschlüsselte Dateien

      Damit ist die Mac-Reihe durch. Wer weiterbauen will: Der Kurs n8n zeigt Freigaben und Sicherungen genauer, Self-Hosting & VPS den Betrieb mehrerer Dienste auf einem Server.

      ✓ Kurz geprüft

      Spickzettel

      Das Viereck auf einer Seite

      Befehle, Ports und Fehlerbilder aus dem Kurs. Zählt nicht zum Fortschritt.

      ⌨ Befehle

      WasBefehlWo
      Wirksame SSH-Einstellung prüfensudo sshd -T | grep -i passwordauthServer
      Firewall-Regeln ansehensudo ufw status verboseServer
      Wer lauscht auf welchem Portsudo ss -tlnpServer
      Von außen scannennmap -Pn -p 1-65535 dein-server.exampleMac, außerhalb des Tailnet
      Headscale: Geräte auflistendocker exec headscale headscale nodes listServer
      Gerät bei Headscale anmeldentailscale up --login-server https://vpn.dein-server.examplejedes Gerät
      Tailnet-Adresse des Serverstailscale ip -4Server
      Rückkanal öffnenssh -N -R 127.0.0.1:11234:127.0.0.1:1234 rueckkanal@…PC
      Rückkanal testencurl -s http://127.0.0.1:11234/v1/modelsServer
      PC weckenssh -i ~/.ssh/wecken weck-knotenServer
      Ist der PC wach?ssh pc echo wachServer, Mac
      GPU-Wertenvidia-smi --query-gpu=temperature.gpu,utilization.gpu --format=csv,noheaderPC
      Render abbrechenDatei C:\Nordwerk\STOPP anlegenPC (über Pult)
      Auftrag per Webhookcurl -X POST -H "X-Pult-Token: $PULT_TOKEN" http://server:5678/webhook/figur-rendernMac, Tailnet
      Token erzeugenopenssl rand -hex 32Mac oder Server
      RustDesk-Schlüssel anzeigencat /opt/rustdesk/data/id_ed25519.pubServer
      Testnachrichtcurl -d "Test" https://ntfy.sh/dein-geheimes-themaServer

      🔌 Ports

      PortDienstErreichbar
      22SSH Serveröffentlich, nur Schlüssel
      80, 443Reverse Proxy (Website, Headscale)öffentlich
      21115–21117 (21116 auch UDP)RustDesk hbbs/hbbröffentlich, nur mit Schlüssel
      22000 TCP/UDPSyncthing-Abgleichöffentlich oder nur Tailnet
      5678n8n (Editor und Pult-Webhooks)nur Tailnet
      8384Syncthing-Oberflächenur Tailnet
      8085Headscale internnur 127.0.0.1 (Proxy)
      11234Rückkanal zu LM Studionur 127.0.0.1 auf dem Server

      🩺 Fehlerbilder

      Du siehstWahrscheinliche UrsacheStufe
      Passwort-Anmeldung geht trotz EinstellungEine Datei mit kleinerer Nummer in sshd_config.d setzt yes2
      Port offen, obwohl ufw ihn nicht erlaubtDocker-Portzeile ohne 127.0.0.1:2
      Alle Ports im Tailnet erreichbarACL nicht geladen (Pfad in policy.path oder Syntaxfehler); ohne Richtlinie ist alles erlaubt3
      Container startet nach Server-Neustart nichtbindet an die Tailnet-Adresse, Tailscale war noch nicht da4
      remote port forwarding failedpermitlisten passt nicht, oder Port noch belegt5
      Paket gesendet, PC bleibt ausWoL in BIOS/Adapter aus, Schnellstart an, WLAN statt Kabel6
      Webhook antwortet 401/403Header-Name oder Token falsch7, 10
      Datei kommt am PC nicht anverschiedene Verschlüsselungspasswörter auf Mac und PC8
      RustDesk zeigt weiter fremde ServerNetzwerkeinstellung nicht gespeichert (am PC entsperren)9
      Pult geht im WLAN, nicht im HotspotTailscale auf dem iPad nicht verbunden10
      Lernkontrolle

      Quiz

      Zehn Situationen aus der Praxis. Ab acht richtigen Antworten ist das Quiz bestanden. Die Antworten stehen jedes Mal in anderer Reihenfolge.

      Frage 1 von 10
      …
      Abschluss

      Deine Teilnahmebestätigung

      Sie bestätigt, was Du wirklich getan hast: die Übungen gemacht und das Quiz bestanden.

      Das ist eine Vorschau. Die Bestätigung wird freigeschaltet, sobald alle Punkte unten erledigt sind. Bis dahin trägt sie das Wasserzeichen „Muster“ und lässt sich nicht drucken.
      Voraussetzungen
        FL
        Florian Ludwig
        AI Consultant · Kutzschbach INNOVATIONS
        Teilnahme
        Der eigene Server dazu
        Hiermit wird bestätigt, dass
        Dein Name hier
        den Selbstlern-Kurs „Der eigene Server dazu“ der Mac-Reihe durchgearbeitet, die Übungen der Stufen 2, 3, 5, 7 und 10 am eigenen Aufbau als erledigt markiert und das Quiz bestanden hat.
        —Datum
        ★BESTANDEN
        Florian LudwigAI Consultant · Kutzschbach INNOVATIONS