Einen Coding-Agent rund um die Uhr auf dem Heimserver betreiben
Ein KI-Agent, der nur läuft solange der Desktop an ist, ist ein halbes Werkzeug. Wie ich meinen in einen Container auf dem Heimserver umgezogen habe und von überall erreichbar gemacht habe.
Einen Coding-Agent rund um die Uhr auf dem Heimserver betreiben
Was mich an KI-Coding-Agents gestört hat, war nicht das Modell. Es war,
dass der Agent in einem Terminal auf meinem Desktop lebte. Fenster zu,
Faden weg. Vom Rechner weggehen, Zugriff weg. Und wer etwas Langlaufendes
startet, muss den Gaming-PC die ganze Nacht anlassen.
Einen Heimserver betreibe ich sowieso, er läuft ohnehin. Den Agent dorthin
zu verlegen, hat alle drei Probleme auf einmal gelöst, und es hat einen
Abend gedauert.
Die Grundform der Lösung
Drei Bausteine, keiner davon raffiniert:
1. Ein Container mit der Agent-CLI und einer Toolchain darin
2. Eine persistente Terminal-Session, damit der Prozess Verbindungsabbrüche überlebt
3. Ein privater Netzwerkweg, über den ich vom Laptop oder Handy drankomme
Die interessanten Entscheidungen drehen sich alle darum, was der Container
tun darf. Dazu komme ich gleich.
Der Container
Ein minimales Image. Node für die CLI, git und die Runtimes, die die
Projekte brauchen.
Beim Start macht der Container nichts. Das ist Absicht: Ich hänge mich
selbst dran und starte Sessions von Hand, statt ihn von allein aufwachen
und unbeaufsichtigt Dinge tun zu lassen.
Compose, mit den Teilen, auf die es ankommt:
Vier Dinge darin tragen die Last:
Das Config-Volume. Ohne es muss man sich bei jedem Neustart des
Containers neu authentifizieren, und das hält man nicht lange aus.
Das Work-Volume ist die ganze Welt. Der Agent kann nur darin
schreiben. Sonst ist nichts vom Server gemountet. Soll er an einem Projekt
arbeiten, klone ich es nach work/. Das ist die nützlichste einzelne
Schutzmaßnahme in diesem Setup.
SSH-Keys nur lesbar. Er kann mit den Keys, die ich ihm gegeben habe,
pullen und pushen. Über einen normalen Schreibzugriff kann er sie weder
verändern noch abziehen.
Ressourcenlimits. Ein Agent, der beschließt, die komplette Testsuite
laufen zu lassen, soll nicht alles andere auf der Kiste ausbremsen
können.
Zeitzone. Klingt banal. Ist es nicht, sobald irgendetwas Geplantes
oder Log-Bezogenes im Spiel ist.
Sessions überleben lassen
Docker hält den Container am Leben. Es hält nicht die Session am Leben:
Schließt man die SSH-Verbindung, stirbt der Vordergrundprozess mit. Dafür
gibt es tmux.
-A heißt: anhängen, wenn sie existiert, sonst anlegen. Ein Befehl,
egal ob es die erste Verbindung des Tages ist oder die fünfte. Mit
Ctrl-b d löst man sich, und die Session läuft weiter.
Das ist der Baustein, der das Versprechen tatsächlich einlöst. Am
Schreibtisch ein langes Refactoring starten, den Laptop zuklappen, eine
Stunde später vom Sofa wieder andocken und nachlesen, was passiert ist.
Von außen erreichbar machen
SSH nicht per Port-Forwarding ins Internet stellen. Das braucht man nicht.
Ein Mesh-VPN, etwa Tailscale, Netbird oder direkt WireGuard, wenn man
Spaß daran hat, legt den Server in ein privates Netzwerk, das einem
überallhin folgt. Der Server ist von meinem Laptop und meinem Handy aus
erreichbar und von sonst nirgends. Keine offenen Ports, kein fail2ban,
um 3 Uhr nachts kein Log voller chinesischer Bots, die root/admin
probieren.
Vom Handy aus ist das mit einem anständigen SSH-Client wirklich nutzbar.
Zum Code-Schreiben ist es nicht bequem. Um nachzulesen, was der Agent
gemacht hat, und „ja, weiter“ oder „stopp“ zu tippen, reicht es völlig.
Was ich beim ersten Mal falsch gemacht habe
Ich habe zu viel gemountet. In der ersten Version steckte mein
gesamtes Projektverzeichnis drin, weil es bequem war. Bequem eben so
lange, bis ich darüber nachdachte, was „bequem“ bedeutet, und es auf einen
einzigen Work-Ordner zusammenstrich. Kein Vorfall, nur eine schlechte
Idee, die ich rechtzeitig bemerkt habe.
Ich habe ein Token mit mehr Reichweite vergeben, als nötig war. Derselbe
Fehler in anderer Form. Zugangsdaten auf das beschränken, was der
Container tatsächlich tun muss.
Ich habe erwartet, dass er autonom arbeitet. Tut er nicht, und ich
wollte es irgendwann auch nicht mehr. Was ich wollte, war Persistenz:
dass der Faden meine Aufmerksamkeitsspanne überlebt. Das klappt
einwandfrei. Die Fantasie, nach einer durchschlafenen Nacht zu fertiger
Arbeit zurückzukommen, ist ein anderes Produkt, und eines, dem ich
deutlich weniger trauen würde.
Hat es sich gelohnt
Das Setup dauert etwa einen Abend, und der Großteil davon geht für die
Entscheidung über die Mounts drauf, nicht fürs Schreiben von irgendetwas.
Dafür ist der Agent nicht mehr an einen Schreibtisch gebunden.
Der ehrliche Haken: Das verlegt nur, wo der Agent läuft, nicht, was er
kostet. Nutzungslimits hängen am Account, nicht an der Hardware. Wer sie
auf dem Desktop erreicht, erreicht sie auch auf dem Server. Das ist ein
anderes Problem und einen eigenen Beitrag wert.