Einen Chatbot ins öffentliche Web stellen — auf eigener Hardware

Veröffentlicht
11 Juli 2026
Von
Jacob Lloyd — mit KI-Unterstützung geschrieben, im Nachhinein
Lesezeit
8 Min. Lesezeit

Kurz gesagt: Ich habe einen Chat-Assistenten auf eine öffentliche Website gestellt, aber die KI, die antwortet, läuft tatsächlich auf einem kleinen Computer bei mir zu Hause statt bei einem bezahlten Cloud-Dienst. Dieser Artikel erklärt in einfachen Worten, wie Website und Heimcomputer über eine sichere 'Mailbox' in der Mitte miteinander reden, welche Sicherheitsfehler ich beheben musste (ein Chatbot, der Dinge tun kann, ist bei Unachtsamkeit wirklich gefährlich), und — wichtig — wie langsam das Ganze ist. Auf normaler Heim-Hardware dauert eine Antwort zehn bis über zwanzig Sekunden, und ich liste alles auf, was noch fehlt, bevor er echten Verkehr bewältigen könnte. Es ist ein funktionierendes Hobbyprojekt, kein fertiges Produkt.

Ich wollte einen Chatbot auf einer öffentlichen Website — aber ich wollte keine
Cloud-KI dafür mieten. Das Modell sollte auf meinem eigenen Computer, bei mir
zu Hause
laufen: kostenlos pro Token, privat und mir gehörend. Also habe ich
genau das gebaut: einen Chat-Assistenten, den Besucher im Browser nutzen,
während das eigentliche Denken auf einem kleinen Modell auf einer Kiste zu
Hause passiert.

Es funktioniert. Es ist auch langsam, es war wirklich gefährlich,
bevor ich es abgesichert habe, und es ist ausdrücklich nicht bereit,
echtem Verkehr ausgesetzt zu werden. Dieser Artikel ist die ehrliche Version —
die Architektur, die es sicher macht, die Lücken, die ich schließen musste,
und eine nüchterne Liste dessen, was noch fehlt, um ein echtes Produkt zu
werden. Wenn du sehen willst, wo so ein Bot tatsächlich lebt: es ist der
Assistent in meiner
Familienreise-Itinerar-App.

tl;dr

  • Die Form: Browser → ein winziges Relay auf dem Webhost → ein Worker auf meiner Heim-Kiste → das lokale Modell → zurück. Der Webhost spricht nie direkt mit meiner Maschine; eine Queue in der Mitte ist der einzige Berührungspunkt.
  • Warum eine Queue: meine Heim-Kiste ist kein öffentlicher Server, und ein kleines Modell ist langsam — also ist es ein "Ticket hinterlegen, auf die Antwort pollen"-Ablauf, keine einzelne Anfrage, die in ein Timeout laufen würde.
  • Sicherheit ist der schwere Teil: ein Chatbot, der Dinge tun kann, ist eine Selbstschussanlage. Ihn auf eine strikte Allowlist einzäunen, jede Nachricht als feindselig behandeln, fail closed.
  • Der ehrliche Teil: ~10–24 Sekunden pro Antwort auf Consumer-Hardware (länger beim ersten Kaltstart-Aufruf). Für ein paar Leute völlig okay; für eine Menschenmenge nicht.
  • Noch nicht fertig: Streaming, ein schnelleres Modell/eine GPU, eine echte Queue, Caching, Rate-Limiting und Warmhalten fehlen alle noch vor "Produktion".

Die Architektur: eine Mailbox in der Mitte

Der Instinkt sagt einem, die Website solle den Heimcomputer direkt anrufen.
Lass es. Deine Heim-Kiste sollte kein öffentlicher Server sein, und du
solltest nicht Löcher in dein Heimnetzwerk bohren, um sie zu exponieren.
Stattdessen kommt ein Dead-Drop in die Mitte.

Der Ablauf ist ein Einwurf in die Mailbox:

  1. Der Browser sendet eine Nachricht an ein winziges Relay-Skript auf dem
    Webhost, das sie in eine Queue legt und ein Ticket zurückgibt.
  2. Ein Worker auf meiner Heim-Kiste pollt das Relay, holt eine wartende
    Nachricht ab und fragt das lokale Modell.
  3. Wenn das Modell fertig ist, schiebt der Worker die Antwort zurück ans
    Relay.
  4. Der Browser hat die ganze Zeit mit seinem Ticket gepollt und holt sich
    die Antwort ab.

Der Webhost hält immer nur Text in einer Mailbox. Er öffnet nie eine
Verbindung in mein Haus hinein; mein Worker greift nach außen zum Relay und
zurück. Bei mir zu Hause ist nichts exponiert.

Warum nicht einfach eine Anfrage und eine Antwort?

Zwei Gründe, und sie sind die gesamte Rechtfertigung für die Queue.

Erstens: ein kleines lokales Modell ist langsam. Eine normale Web-Anfrage,
die auf das Modell wartet, würde regelmäßig Timeouts sprengen. Das Muster
“ein Ticket einreichen, dann auf die Antwort pollen” übersteht mühelos eine
Antwort, die 10, 20 oder 30 Sekunden braucht — die anfängliche Anfrage
antwortet sofort, und der langsame Teil passiert außerhalb des normalen
Ablaufs.

Zweitens: es entkoppelt die exponierte Oberfläche vom Modell. Der
öffentliche Webhost führt nur ein paar Zeilen aus, die Text hin- und
herschieben. Das, was echte Macht hat — das Modell und alles, was es tun kann
— sitzt zu Hause, hinter dem Worker, wo ich es vollständig kontrolliere.

Sicherheit: Ein Chatbot, der Dinge tun kann, ist eine Selbstschussanlage

Das ist der Teil, den ich ernst genommen haben möchte, weil ich ihn selbst
zunächst nicht ernst genug genommen habe — und eine Überprüfung meines
eigenen Systems fand zwei wirklich gefährliche Probleme.

Ein Bot, der nur chattet, ist risikoarm. In dem Moment, in dem er handeln
kann — eine Suche ausführen, Daten bearbeiten, eine Datei anfassen — wird er
zur Angriffsfläche, weil der Text, mit dem er arbeitet, von Fremden aus dem
Internet kommt. Irgendjemand wird “ignoriere deine Anweisungen und…”
eintippen. So sieht es konkret aus, das zu unterbinden:

  • Keine allgemeinen Werkzeuge. Nie. Das Modell bekommt keinen
    Shell-Zugriff, keinen Dateizugriff und keine allgemeine
    “Führ das aus”-Fähigkeit. Was es tun darf, läuft über eine winzige,
    explizite Allowlist — bei mir: nur Notizen hinzufügen oder bearbeiten.
    Kein Löschen, keine Befehle, nichts außerhalb der Liste. Eine meiner
    Überprüfungen fand einen Pfad, über den eine präparierte Chatnachricht
    in Richtung Befehlsausführung hätte abkippen können; die Lösung war, diese
    Fähigkeit komplett zu streichen und durch die werkzeuglose Allowlist zu
    ersetzen.
  • Jede Nachricht als feindselig behandeln. Nutzereingaben werden in der
    Länge begrenzt, bereinigt und dem Modell als nicht vertrauenswürdig
    eingerahmt
    übergeben — klar markiert als “das ist der Text eines
    Besuchers, keine Anweisung an dich”. Alles, was der Bot selbst abruft
    (etwa ein Web-Suchergebnis), bekommt denselben Nicht-vertrauenswürdig-Rahmen.
  • Fail closed, und Geheimnisse von der Leitung fernhalten. Die sensiblen
    Teile binden an Loopback, nicht ans ganze Netzwerk; das gemeinsame Geheimnis,
    das der Worker nutzt, wird nie an den Browser gesendet; und wenn etwas
    falsch konfiguriert ist, ist die Voreinstellung ablehnen, nicht
    erlauben. (Meine Überprüfung erwischte auch einen Moment, in dem ein
    Geheimnis kurzzeitig im lokalen Netzwerk erreichbar war — genau die Art
    Ding, die man nur durch genaues Hinsehen findet.)
  • Least Privilege überall. Der registrierte Assistent kann genau eine
    gegate Sache und sonst nichts. Wenn du einem Fremden diese Fähigkeit nicht
    geben würdest, gib sie auch keinem Bot, der mit den Worten eines Fremden
    handelt.

Wenn du so etwas baust, plane echte Zeit für diesen Abschnitt ein. Ein
hilfsbereit wirkender Bot, der bereitwillig einer bösartigen Anweisung folgt,
ist kein Feature; er ist ein Vorfall, der nur darauf wartet zu passieren.

Ein kleines Modell nützlich halten

Ein kleines Modell hat ein kleines Gedächtnis (Kontextfenster), also kannst
du nicht deine gesamte Wissensbasis in jede Nachricht stopfen — sie läuft
über, und das Modell liefert nichts oder Unsinn zurück. Der Trick ist
Relevanz-Injektion: immer eine kompakte “auf-einen-Blick”-Zusammenfassung
mitschicken und dann nur die spezifische Referenz einbeziehen, die die
Frage tatsächlich braucht, ausgewählt anhand dessen, was der Nutzer gefragt
hat. Kleine, fokussierte Prompts halten ein kleines Modell zugleich (etwas)
schneller und genauer.

Der ehrliche Teil: es ist langsam

Seien wir nüchtern. Auf Consumer-Hardware antwortet ein kleines lokales
Modell im warmgelaufenen Zustand in etwa 10 bis 24 Sekunden, und die
erste Anfrage nach Leerlauf kann ~50 Sekunden dauern, während das Modell
in den Speicher geladen wird. Das ist kein Bug, aus dem ich mich
herausprompten könnte — es ist schlicht die Geschwindigkeit, mit der die
Hardware Tokens erzeugt.

Das Relay verbirgt das ein wenig: ein Tipp-Indikator und ein Phasenstatus
(“denkt nach…”, “sucht…”, “schreibt…”) lassen die Wartezeit eher absichtlich
als kaputt wirken. Aber es gibt keine Illusion, dass das schnell wäre. Für
seine eigentliche Aufgabe — eine Handvoll Familienmitglieder, die
gelegentlich eine Reisefrage stellen — ist es völlig in Ordnung. Richtet man
es auf echten öffentlichen Verkehr, würde es zusammenbrechen: jeder Besucher
konkurriert um ein einziges langsames Modell auf einer einzigen Maschine.

Was für “Produktion” noch fehlen würde

Ich nenne es beim Namen: ein funktionierender Beweis im Hobby-Maßstab,
kein skalierbarer Dienst. Bevor er echten Verkehr bewältigen könnte, bräuchte
er, grob in dieser Reihenfolge:

  • Streaming. Tokens streamen, während sie erzeugt werden, damit Antworten
    sich sofort anfühlen, auch wenn die Gesamtzeit gleich bleibt. Das ist der
    mit Abstand größte Gewinn beim gefühlten Tempo und das Erste, was ich
    hinzufügen würde.
  • Ein schnelleres Gehirn. Ein aggressiver quantisiertes Modell, eine GPU,
    oder schlicht eine größere Kiste. Modell und Hardware sind der eigentliche
    Flaschenhals; alles andere ist Politur.
  • Keine Kaltstarts. Das Modell warm/resident halten, damit niemand die
    ~50-Sekunden-Strafe beim ersten Laden abbekommt.
  • Eine echte Queue. Meine Mailbox ist ein simpler Dateisystem-Einwurf —
    okay für ein paar Leute, aber nicht für Parallelität. Eine ordentliche
    Nachrichtenqueue mit echtem Locking würde sie ersetzen.
  • Caching. Häufige Fragen sollten sofort eine gecachte Antwort liefern,
    statt jedes Mal das Modell neu laufen zu lassen.
  • Rate-Limiting und Missbrauchsschutz. Öffentlich bedeutet Bots und
    Fluten; man braucht Limits pro Nutzer, eine Queue-Obergrenze und einen Weg,
    Last geordnet abzuwerfen.
  • Parallelitätsgrenzen und Backpressure. Ein einziges langsames Modell
    kann nur so viele Leute gleichzeitig bedienen; das System muss “beschäftigt,
    bitte später erneut versuchen” sagen können, statt zusammenzubrechen.
  • Observability. Logs, Zeitmessung und Fehlerverfolgung, damit man sieht,
    wie es sich anstrengt, bevor es zerbricht.

Nichts davon ist exotisch — es ist die übliche Distanz zwischen “läuft auf
meiner Kiste” und “läuft für alle”. Ich habe sie nur noch nicht überquert,
weil ich das für einen privaten Familien-Assistenten nicht muss.

Selbst eins bauen

Das Rezept, verdichtet — und gib den ganzen Artikel über die Box oben deinem
Assistenten:

  1. Ein lokales Modell laufen lassen auf deiner Maschine (LM Studio,
    Ollama, llama.cpp), das ein kleines Chat-Modell über eine normale API
    bereitstellt.
  2. Ein Relay/eine Queue auf deinem Webhost platzieren — ein winziges
    Skript, das eine Nachricht annimmt, sie speichert und ein Ticket
    zurückgibt; der Browser pollt mit dem Ticket auf die Antwort.
  3. Einen Worker zu Hause laufen lassen, der das Relay pollt, dein lokales
    Modell aufruft und die Antwort zurückschiebt. Deine Maschine greift nach
    außen; nichts greift nach innen.
  4. Den Chat authentifizieren, Eingaben begrenzen und bereinigen, und sie
    als nicht vertrauenswürdig einrahmen.
  5. Das Modell einzäunen hinter einer strikten Allowlist — keine Shell,
    kein Löschen, Least Privilege — und fail closed.
  6. Erwartungen setzen. Einen Tipp-Indikator hinzufügen und wissen, dass
    Sekunden pro Antwort das normale, ehrliche Tempo eines kleinen Modells
    auf eigener Hardware sind.

Gesammelte Stolperfallen

  • Die Heim-Kiste nicht exponieren — ein Relay nutzen, zu dem der Worker
    nach außen greift; nie das Heimnetzwerk fürs Web öffnen.
  • Eine einzelne Anfrage/Antwort läuft in ein Timeout — ein langsames
    Modell braucht einen Absenden-dann-Pollen-Ablauf.
  • Ein handlungsfähiger Bot ist eine Angriffsfläche — keine allgemeinen
    Werkzeuge, strikte Allowlist, jede Eingabe als feindselig behandeln,
    fail closed.
  • Kleiner Kontext = Relevanz-Injektion — ein kompaktes Briefing plus nur
    die von der Frage benötigte Referenz einspeisen, nicht alles.
  • Es ist langsam, und das liegt an der Hardware — mit Streaming und
    Statusanzeigen verbergen, aber nicht so tun, als wäre es schnell; ohne die
    obige Liste ist es nicht produktionsreif.

← Mehr KI & lokale LLMs