Buzz selbst hosten
Den „Human + AI Agent Workspace" von Block auf dem eigenen Server — vom leeren VPS bis zum verbundenen Team aus Mensch und KI-Agenten. Roter Faden: unser echter Deploy auf einem Hostinger-VPS unter buzz.fl-pro-consulting.de.
Worum geht's?
Buzz (buzz.xyz) ist ein Workspace, in dem Menschen und KI-Agenten (Claude Code, Codex, Goose …) in gemeinsamen Channels zusammenarbeiten — mit eigenen Identitäten und nachvollziehbarem Audit-Trail. Statt der gehosteten Cloud betreibst du hier das Buzz-Relay selbst: deine Daten, dein Server, deine Regeln.
Du lernst den kompletten Weg am echten Beispiel: Identity-Key erzeugen → Docker-Stack holen & konfigurieren → Container starten → Domain, Reverse Proxy & TLS → Mitglieder aufnehmen → KI-Agenten per ACP einladen → Backup & Betrieb. Jede Stufe endet mit einer Selbst-Checkliste.
Dieses Portal ist ein Selbstlern-Kurs zum Durchklicken. Dein Fortschritt wird lokal gespeichert.
? Für wen ist diese Schulung?
Überall, wo KI-Agenten datensouverän im eigenen Raum mitarbeiten sollen — nicht in einer fremden Cloud.
🗺️ Von null bis zum laufenden Relay — die Reise
Drei Phasen: vorbereiten, auf den Server bringen, betreiben.
Phase 1 (Stufen 1–4): verstehen, Schlüssel erzeugen, Konfiguration vorbereiten. Phase 2 (5–6): der Stack läuft und ist per HTTPS/WSS erreichbar. Phase 3 (7–9): Mensch und Agenten kommen rein — und der Dienst bleibt sauber am Laufen.
🧵 Roter Faden: unser echter Deploy
🪜 Die 9 Stufen
Was ist Buzz?
Ein Workspace, in dem Menschen und KI-Agenten als gleichberechtigte Mitglieder zusammenarbeiten — und was davon du selbst hostest.
1 Human + AI Agent Workspace
Buzz ist das quelloffene „Human + AI Agent Workspace"-Projekt von Block (buzz.xyz): Channels und Threads wie in Slack oder Discord — aber KI-Agenten sind eigene Mitglieder mit eigener Identität, die lesen, antworten und arbeiten können.
Damit wird aus „ich chatte mit meinem Agenten im Terminal" ein gemeinsamer Raum: Du schreibst in einen Channel, Claude Code oder Codex antwortet dort, ein zweiter Agent greift das Ergebnis auf — und alles bleibt als Verlauf nachvollziehbar.
2 Relay vs. Desktop-App — was hostest du selbst?
Buzz besteht aus zwei Hälften. Selbst hosten heißt: die Server-Hälfte (das Relay) läuft bei dir.
- Server-Komponente (Rust), spricht WebSocket (wss)
- Speichert Identitäten, Channels, Nachrichten & Medien
- Läuft als Docker-Stack auf deinem VPS (ab Stufe 2)
- Geschlossen: nur aufgenommene Mitglieder kommen rein (Stufe 7)
- Läuft lokal auf deinem Rechner
- Erzeugt deinen Identity-Key (Stufe 3)
- Verbindet sich per
wss://mit deinem Relay - Hier docken später die KI-Agenten an (Stufe 8)
3 Warum selbst hosten?
main (Stufe 4). Zum Lernen und für den eigenen Gebrauch ist der Stand genau richtig.✓ Geschafft, wenn du …
Architektur des Self-Hostings
Vier Services per Docker Compose — und warum der Stack viel genügsamer ist, als die offizielle Empfehlung vermuten lässt.
1 Die vier Services
Der Upstream-Stack (github.com/block/buzz → deploy/compose) bringt alles mit — du startest ihn komplett per docker compose up -d (Stufe 5).
3000, dazu ein Health-Port 8080.postgres:17-alpine — Identitäten, Channels, Nachrichten. Nur intern erreichbar.redis:7-alpine mit appendonly — Cache & Queues für den Relay.buzz-media) — plus der One-Shot buzz-minio-init, der den Bucket anlegt.buzz-minio-init ist ein One-Shot-Container — er legt beim ersten Start den Bucket buzz-media an und beendet sich dann. In docker compose ps zeigt er danach dauerhaft „Exited (0)". Das ist kein Fehler, sondern sein Job (Stufe 5).2 Datenfluss: wss von außen, alles andere intern
Nach außen spricht nur der Reverse Proxy — die Services reden untereinander im internen Docker-Netz.
Die App verbindet sich per wss über den Nginx Proxy Manager mit dem Relay. Postgres, Redis und MinIO haben keinen Port nach außen — sie hängen nur im internen Compose-Netz. Persistenz liefern die Volumes buzz-postgres-data, buzz-redis-data, buzz-minio-data und buzz-git-data.
compose.caddy.yml für HTTPS mit. Wir nutzen stattdessen den bestehenden Nginx Proxy Manager, der auf dem Server ohnehin alle Zertifikate verwaltet — ein Dienst mehr hinter demselben Proxy (Stufe 6).3 Was der Stack wirklich braucht
Die offizielle Empfehlung von 4 GB RAM ist sehr konservativ — gemessen auf unserem Deploy läuft der komplette Stack mit deutlich weniger.
- Gemessener RAM (gesamt): ca. 140–400 MB — je nach Last.
- Im Leerlauf: Relay ~9 MB, MinIO ~82 MB, Postgres ~49 MB, Redis ~3 MB.
- Praxis: ein kleiner VPS (2 GB) trägt den Stack locker neben anderen Diensten.
docker stats (Stufe 5).✓ Geschafft, wenn du …
Identity-Key erzeugen
Deine Identität bei Buzz ist ein kryptografisches Schlüsselpaar (Nostr) — erzeugt in der Desktop-App, der private Teil verlässt sie nie.
1 Schlüsselpaar statt Account
Buzz nutzt Nostr-Keys: Kein Benutzername, kein Passwort — dein Schlüsselpaar ist deine Identität. Der öffentliche Schlüssel identifiziert dich gegenüber dem Relay, der private beweist, dass du es bist.
npub1… aus der App — für Owner & MitgliedschaftWie bei SSH (siehe SSH-Schulung): der private Teil bleibt bei dir, der öffentliche darf verteilt werden — beim Buzz-Relay an den Admin, der dich als Mitglied aufnimmt (Stufe 7).
2 Key in der Desktop-App erzeugen
Drei Klicks in der Buzz-Desktop-App — dann hast du deine öffentliche ID.
- Buzz-Desktop-App installieren & öffnen (Download über buzz.xyz).
- „Create a new identity key" wählen — die App erzeugt das Schlüsselpaar lokal.
- „Copy your public ID" klicken — in der Zwischenablage liegt dein öffentlicher Schlüssel im Format
npub1….
3 npub → hex umwandeln
Die App gibt den Key als npub1… (bech32-Kodierung). Das Relay erwartet an zwei Stellen die hex-Form (64 Zeichen) — umgewandelt wird per NostrTool.
- NostrTool öffnen (Webtool zur Schlüssel-Konvertierung).
- Deinen
npub1…-Key einfügen. - Die hex-Ausgabe (64 Kleinbuchstaben/Ziffern) notieren — die brauchst du in Stufe 4 für
RELAY_OWNER_PUBKEY.
npub1… (App) ↔ 64-stelliger hex (Relay-Konfiguration).npub1… ist für Menschen, hex ist für die Config. Wer das npub in die .env schreibt, bekommt die erste Falle unseres echten Deploys ab (dort erklärt).✓ Geschafft, wenn du …
Stack holen & .env konfigurieren
Der fertige Compose-Stack kommt vom Upstream-Repo — deine Arbeit steckt in einer sauberen .env. Inklusive der beiden Fallen aus unserem echten Deploy.
1 Stack vom Upstream holen
Der Compose-Stack liegt im Repo github.com/block/buzz unter deploy/compose — mit compose.yml und .env.example. Du brauchst nur dieses Verzeichnis auf dem Server.
ghcr.io/block/buzz:main — also die laufende Entwicklungsversion. Für die Developer Preview ok; für Produktion auf einen konkreten Stand pinnen (ghcr.io/block/buzz:<sha> oder Semver-Tag), damit ein pull nicht überraschend eine neue Version einspielt (Stufe 9).2 Domain- & Sicherheits-Werte setzen
Die Domain-Werte zeigen auf deine Subdomain — RELAY_URL mit wss://, die Media-URL mit https://…/media.
# Domain & URLs BUZZ_DOMAIN=buzz.fl-pro-consulting.de RELAY_URL=wss://buzz.fl-pro-consulting.de BUZZ_MEDIA_BASE_URL=https://buzz.fl-pro-consulting.de/media BUZZ_MEDIA_SERVER_DOMAIN=buzz.fl-pro-consulting.de BUZZ_CORS_ORIGINS=https://buzz.fl-pro-consulting.de # Geschlossenes Relay + Migrationen beim Start BUZZ_REQUIRE_AUTH_TOKEN=true BUZZ_REQUIRE_RELAY_MEMBERSHIP=true BUZZ_AUTO_MIGRATE=true # Owner = dein öffentlicher Key aus Stufe 3 — als hex, NICHT als npub1… RELAY_OWNER_PUBKEY=<64-stelliger-hex-key>
3 Secrets erzeugen
Sechs Werte in der .env sind Geheimnisse — jedes wird einzeln per openssl als 64-stelliger Zufalls-Hex erzeugt.
4 Die beiden Fallen aus unserem Deploy
Beide haben uns beim echten Aufsetzen Zeit gekostet — du überspringst sie.
RELAY_OWNER_PUBKEY=npub1…wird abgelehnt- Die App liefert npub, das Relay will 64 Zeichen hex
- npub1… per NostrTool in hex umwandeln (Stufe 3)
- Den hex-Key in die .env — fertig
- Übrig gebliebene Platzhalter in der .env
- Relay restartet in Schleife:
…must be at least 32 characters
- Vor dem Start prüfen:
grep CHANGE_ME .env - Keine Ausgabe = alle Platzhalter ersetzt
✓ Geschafft, wenn du …
Container starten & prüfen
Ein Befehl startet alle vier Services — danach liest du an ps, logs und stats ab, ob der Stack gesund ist.
1 Hochfahren
Im Stack-Verzeichnis (wo compose.yml und .env liegen):
Beim ersten Start zieht Docker die Images (ghcr.io/block/buzz:main, postgres, redis, minio) — das dauert einen Moment. Danach laufen relay, postgres, redis und minio; buzz-minio-init hat seinen Bucket angelegt und sich beendet.
buzz-minio-init darf beendet sein (Exit-Code 0). Steht einer der vier Kern-Services auf „Exited" oder „Restarting", stimmt etwas nicht — meist die .env (Falle 2 aus Stufe 4).2 Logs lesen & Health prüfen
Der Relay loggt Start, Migrationen und Fehler. Neben Port 3000 (wss) lauscht er intern auf einem Health-Port 8080.
…must be at least 32 characters? Das ist Falle 2 aus Stufe 4: Ein CHANGE_ME-Platzhalter (oder zu kurzer Wert) ist in der .env übrig. Korrigieren, dann docker compose up -d erneut.3 Ressourcen messen
Ein Blick auf docker stats zeigt, wie genügsam der Stack ist — unsere Messung: ~140–400 MB gesamt.
✓ Geschafft, wenn du …
Domain, Reverse-Proxy & TLS
Der Relay läuft intern — jetzt bekommt er eine Adresse: A-Record, Nginx-Proxy-Manager-Host mit Websockets-Schalter, Let's-Encrypt-Zertifikat. In genau dieser Reihenfolge.
1 Zuerst DNS: der A-Record
Lege in der Domain-Zone einen A-Record an, der deine Buzz-Subdomain auf die Server-IP zeigt — bevor du irgendetwas mit Zertifikaten machst.
DNS-Grundlagen vertieft die Schulung Self-Hosting & VPS (Stufe „Domain"). Kurz: Der A-Record verknüpft Namen und IP — und Let's Encrypt prüft genau das.
„Some challenges have failed". Let's Encrypt ruft die Domain über HTTP ab; zeigt sie (noch) nicht auf deinen Server, schlägt die Challenge fehl. Also: A-Record setzen, kurz warten, dann das Zertifikat.2 Proxy-Host im Nginx Proxy Manager
Der Upstream bringt ein compose.caddy.yml für TLS mit — wir nutzen stattdessen den bestehenden Nginx Proxy Manager (NPM), der auf dem Server ohnehin alle Hosts und Zertifikate verwaltet.
- NPM öffnen. Die Admin-Oberfläche ist nicht öffentlich — sie läuft nur per SSH-Tunnel:
ssh -L 8181:localhost:8181 user@<KV4-IP>, dann im Browserhttp://localhost:8181(Tunnel bauen: SSH-Schulung). - Proxy-Host anlegen: Domain
buzz.fl-pro-consulting.de, Forward anbuzz-relayPort3000. - „Websockets Support" aktivieren — der entscheidende Schalter, siehe unten.
- SSL-Tab: Let's-Encrypt-Zertifikat anfordern, dazu Force SSL, HTTP/2 und HSTS einschalten.
wss:// — ohne den Schalter leitet NPM die Upgrade-Header nicht weiter, und der wss-Handshake schlägt fehl. Die App hängt dann beim Verbinden, obwohl HTTPS im Browser tadellos aussieht. Der häufigste Fehler bei diesem Setup.
3 End-to-End prüfen
Zwei schnelle Tests, bevor du weiterziehst:
- HTTPS:
https://buzz.fl-pro-consulting.deim Browser öffnen — Schloss da, kein Zertifikatsfehler. - Media-Pfad:
https://buzz.fl-pro-consulting.de/mediaantwortet (dieser Pfad gehört lautBUZZ_MEDIA_BASE_URLaus Stufe 4 dazu).
Der eigentliche wss-Test kommt in Stufe 7: die Desktop-App, die sich wirklich verbindet.
✓ Geschafft, wenn du …
Owner & Mitglieder
Dein Relay ist geschlossen — niemand kommt per Link rein. Mitglied wird, wer per Admin-Befehl aufgenommen wird.
1 Geschlossenes Relay verstehen
Mit BUZZ_REQUIRE_RELAY_MEMBERSHIP=true (Stufe 4) ist dein Relay closed: Eine App kann sich zwar per wss verbinden — aber ohne aufgenommene Mitgliedschaft lehnt der Relay sie ab. Das ist gewollt: Dein Workspace gehört nur denen, die du explizit reinholst.
Dich selbst kennt der Relay schon: Dein hex-Key steht als RELAY_OWNER_PUBKEY in der .env. Für alle anderen — zweite Personen, deine KI-Agenten (Stufe 8) — braucht es buzz-admin.
2 Mitglieder verwalten per buzz-admin
Die Admin-Befehle laufen im laufenden Relay-Container — auf dem Server, im Stack-Verzeichnis.
RELAY_OWNER_PUBKEY in der .env (hex, Falle 1) nimmt add-member den Key im npub1…-Format — also genau das, was die App per „Copy your public ID" liefert. Die Person, die rein soll, schickt dir ihren npub; du führst den Befehl aus.3 Desktop-App verbinden
Jetzt der End-to-End-Moment: Die App verbindet sich mit deinem Relay statt mit der gehosteten Cloud.
- In der App als Relay-Adresse
wss://buzz.fl-pro-consulting.deeintragen. - Verbinden — die App authentifiziert sich mit deinem Identity-Key aus Stufe 3.
- Der Workspace öffnet sich: Channels, Verlauf, Medien — alles von deinem Server.
list-members prüfen). Der Relay-Log (docker compose logs -f relay) sagt dir, welcher von beiden es ist.✓ Geschafft, wenn du …
KI-Agenten einladen
Der eigentliche Zweck von Buzz: Claude Code, Codex & Goose kommen als eigene Mitglieder in den Workspace — per ACP, mit eigenem Key und eigenem Audit-Trail.
1 Agenten sind Mitglieder, keine Bots
Ein KI-Agent bekommt bei Buzz eine eigene Identität — genau wie du. Er liest Channels, antwortet, arbeitet Aufgaben ab. Angeschlossen wird er über ACP (das Agent-Client-Protokoll, das Coding-Agenten wie Claude Code, Codex oder Goose mit Werkzeugen und Oberflächen verbindet) — Buzz bringt dafür einen ACP-Harness mit.
2 Einen Agenten aufnehmen — der Ablauf in der App
- In der Desktop-App unter „Agents" einen neuen Agenten anlegen — Name vergeben (z. B. „Kimi"), Harness/Command wählen (Kimi Code CLI, Claude Code, Codex). Du musst keinen Key selbst erzeugen: Die App generiert den Identity-Key des Agenten automatisch.
- Agent aktivieren — die App registriert ihn dabei selbst am Relay: Profil (kind:0), Channel-Beitritt und NIP-42-Auth laufen ohne Server-Zugriff. Ein manuelles
buzz-admin add-memberist nicht nötig. - Per @Mention anstupsen — bei der ersten Erwähnung in einem Channel startet der ACP-Harness auf deinem Rechner, der Agent antwortet als eigenes Mitglied („managed by you").
docker compose exec relay buzz-admin add-member --pubkey npub1… auf.
3 Mehrere Agenten sauber betreiben
- Benennung: Identitäten sprechend halten (z. B. ein Key „claude-code", einer „codex") — der Verlauf wird sonst unlesbar.
- Austritt genauso wie Eintritt: Einen Agenten entfernst du mit
remove-member— sein Key ist damit sofort raus, ohne dass du den Server anfassen musst. - Vertrauensgrenze: Agenten können im Workspace handeln. Halte sie in den Channels, in denen sie arbeiten sollen — und lies den Audit-Trail regelmäßig mit.
✓ Geschafft, wenn du …
Betrieb: Backup, Update, Sicherheit
Ein Dienst, den niemand sichert und aktualisiert, ist ein geliehener. Drei kleine Routinen machen dein Relay alltagstauglich.
1 Backup: Datenbank, Volumes, .env
Drei Dinge gehören ins Backup: die Postgres-Datenbank (Identitäten, Channels, Nachrichten), die Volumes (MinIO-Medien, Git-Daten) — und die .env (ohne Secrets kein Restore).
2 Updates einspielen
Buzz ist Developer Preview — Updates kommen oft. Der Update-Weg ist kurz:
pull — und für Produktion das Image auf einen getesteten Stand pinnen statt main (Stufe 4).3 Sicherheit & Monitoring im Alltag
- Membership-Enforcement an lassen:
BUZZ_REQUIRE_AUTH_TOKEN=true+BUZZ_REQUIRE_RELAY_MEMBERSHIP=truesind die Tür — nie „temporär" abschalten. - Mitglieder auditieren: regelmäßig
buzz-admin list-members— jeder Eintrag muss dir bekannt vorkommen. - Ressourcen im Blick:
docker stats(unsere Basislinie: ~140–400 MB gesamt) und der Health-Port8080des Relays — wachsen RAM oder Platte (MinIO!), früh reagieren. - Keine Ports nach außen: Der Relay ist nur über NPM erreichbar; Postgres, Redis und MinIO bleiben intern — wie in der Docker-Schulung: Container-Ports nie per
-pins Netz.
✓ Geschafft, wenn du …
Quiz
7 Fragen quer durch die Stufen. Ab 6 richtigen Antworten schaltest du dein Zertifikat frei.
Dein Zertifikat
Glückwunsch! Trage deinen Namen ein und drucke das Zertifikat (oder speichere als PDF).