SSH-Ausführungs-Backends
Standardmäßig führt ein Runner jede beanspruchte Aufgabe in einem Container auf
seinem eigenen lokalen Docker-Host aus
(SUPACLOUD_RUNNER_EXECUTION_BACKEND=docker). ADR 0046 Phase 3 ergänzt zwei
SSH-Ausführungs-Backends, sodass ein Runner stattdessen einen entfernten
Host ansteuern kann. Wähle ein Backend mit
SUPACLOUD_RUNNER_EXECUTION_BACKEND:
| Wert | Funktion | Isolation | Status |
|---|---|---|---|
docker |
Lokaler Docker-Host (Standard). | Volle Container-Caps. | GA |
ssh-docker |
Entfernter Docker-Daemon über SSH. | Voll — identische Container-Caps auf dem entfernten Host. | Experimentell (siehe Vorbehalte) |
raw-ssh-exec |
Agent als roher entfernter Prozess über SSH. | Keine — kein Container, keine Ressourcen-Limits. | Experimentell, doppelt abgesichert |
Empfohlen: ssh-docker (entferntes Docker, Isolation bleibt erhalten)
Abschnitt betitelt „Empfohlen: ssh-docker (entferntes Docker, Isolation bleibt erhalten)“Ein auf einen entfernten Daemon gerichteter DockerManager lässt dieses Backend
jede Aufgabe über denselben Code-Pfad wie ein lokaler Lauf ausführen — also
bleiben cap_drop=ALL, no-new-privileges, ein read-only Rootfs, tmpfs-Mounts
und die Memory-/CPU-/pids-Limits auf dem entfernten Host erhalten.
-
Installiere einen SSH-Client auf dem Runner-Host. bollards SSH-Transport ruft das System-
ssh-Binary auf (docker system dial-stdio). Das SupaCloud-Server-Image bringtopenssh-clientmit; ein eigenes Runner-Image möglicherweise nicht — installiere es (apt-get install -y openssh-client), sonst kann das Backend nicht verbinden. -
Konfiguriere die Host-Key-Prüfung in deinem System-ssh-Client (Pflicht). Bei
ssh-dockerkann SupaCloud den Host-Key nicht selbst erzwingen — bollards SSH-Transport ruft das System-ssh-Binary auf und bietet nur einen Schlüsselpfad, keine-o-Optionen. Du musst diesen Client so konfigurieren, dass er den Host pinnt, und die Delegation anschließend bestätigen. Trage den Host-Key in eineknown_hosts-Datei ein und richte das ssh des Runners mit strikter Prüfung darauf aus, z. B. in der~/.ssh/configdes Runner-Users:Host remote-host.exampleStrictHostKeyChecking yesUserKnownHostsFile /etc/supacloud/known_hostsSetze dann die Backend-Env inklusive der expliziten Delegations-Bestätigung:
SUPACLOUD_RUNNER_EXECUTION_BACKEND=ssh-dockerSUPACLOUD_SSH_HOST=ssh://docker@remote-host.example:22SUPACLOUD_SSH_KEY_PATH=/etc/supacloud/id_ed25519SUPACLOUD_SSH_KNOWN_HOSTS=/etc/supacloud/known_hostsSUPACLOUD_SSH_DOCKER_HOSTKEY_DELEGATED=trueDer Runner startet nur, wenn beides gesetzt ist:
SUPACLOUD_SSH_KNOWN_HOSTS(vorhanden, nicht leer) undSUPACLOUD_SSH_DOCKER_HOSTKEY_DELEGATED=true.
Bekannte Lücken (ssh-docker)
Abschnitt betitelt „Bekannte Lücken (ssh-docker)“- Live-Event-Relay. Die Agent-Bridge ist nur im Agent-Netz des entfernten
Hosts erreichbar, sodass der Live-UI-Fortschritt einen
ssh -L-Forward benötigt, den v1 nicht einrichtet. Der Lauf meldetdone/failedweiterhin korrekt — nur der Live-Stream fehlt. - Der Live-Round-Trip ist nicht in der CI. Es gibt im Test-Image keinen
entfernten Docker-Daemon (und kein System-ssh), daher wird der
End-to-End-Remote-Lauf nur durch einen umgebungsgesteuerten Test geprüft
(
SUPACLOUD_TEST_SSH_DOCKER_HOST).
raw-ssh-exec (nicht sandboxed, doppelt abgesichert)
Abschnitt betitelt „raw-ssh-exec (nicht sandboxed, doppelt abgesichert)“Dieses Backend führt den Agenten als rohen entfernten Prozess aus — kein
Container, keine Ressourcen-Limits, kein Event-Relay. Es existiert nur, um die
ADR-0046-Entscheidung zu erfüllen, beide SSH-Varianten auszuliefern. Bevorzuge
ssh-docker, sofern du es nicht ausdrücklich brauchst.
Es ist doppelt abgesichert — beide Opt-ins sind erforderlich, sonst schlägt es fail-closed fehl:
- GATE 1 (Runner-Boot):
SUPACLOUD_RUNNER_ALLOW_UNSANDBOXED=true. Dieses Backend ohne dieses Flag zu wählen ist ein harter Boot-Fehler. - GATE 2 (Dispatch): der Runner muss bei der Registrierung
capabilities.backends: ["ssh-exec"]annoncieren und die Aufgabe muss zumssh-exec-Backend aufgelöst werden. Eine Standardaufgabe (docker) landet nie auf einem reinen ssh-exec-Runner, und eine ssh-exec-Aufgabe nie auf einem reinen docker-Runner.
Da das Work-Payload keinen Agent-Entrypoint trägt (der normalerweise im Container-Image liegt), musst du ein kuratiertes Startkommando angeben:
SUPACLOUD_RUNNER_EXECUTION_BACKEND=raw-ssh-execSUPACLOUD_RUNNER_ALLOW_UNSANDBOXED=trueSUPACLOUD_SSH_HOST=ssh://agent@remote-host.example:22SUPACLOUD_SSH_KEY_PATH=/etc/supacloud/id_ed25519SUPACLOUD_SSH_KNOWN_HOSTS=/etc/supacloud/known_hostsSUPACLOUD_SSH_EXEC_AGENT_CMD="run-agent --image {image} --type {agent_type}"{image} und {agent_type} werden shell-quoted eingesetzt, und die Umgebung
der Aufgabe wird über ein quoted Prolog exportiert — jeder Wert gilt als
nicht vertrauenswürdig und wird escaped, sodass ein bösartiger Image-Name oder
Env-Wert kein Kommando einschleusen kann.