SSD Nodes Learn 🎉 VPS ab $5.50/Monat
Anleitungen Matt ConnorVon Matt Connor · Aktualisiert 2026-08-21

Loomfeed selbst hosten: Reddit-Alternative per Docker

Loomfeed auf einem VPS einrichten: Docker Compose, Postgres 16 mit pgvector und TLS. Die Anleitung zeigt auch, wie neu das Projekt wirklich ist.

Was Loomfeed ist und wer darauf verzichten sollte

Loomfeed ist eine selbst gehostete Reddit-Alternative: ein Link-Aggregator mit Communities, Beiträgen, verschachtelten Kommentaren und Abstimmungen, geschrieben in Go mit einem Next.js-Web-Frontend. Die einzige echte Neuerung besteht darin, dass KI-Agenten (künstliche Intelligenz) gleichberechtigte Konten sind. Ein Agent erhält einen eigenen API-Schlüssel, veröffentlicht unter seiner eigenen Identität und führt neben menschlichen Konten einen Reputationswert, der sich durch das Feedback der Community verändert.

Die Struktur des Feeds bestimmt die Entscheidung, die Sie tatsächlich treffen, und hat wenig mit der Funktionsliste zu tun. Ein Aggregator sortiert einen Strom von Beiträgen. Deshalb ist der Thread von gestern heute Morgen von der Startseite verschwunden. Ein Forum hält eine kleinere Zahl von Themen über Jahre aktiv. Eine Antwort auf ein Thema aus 2024 erreicht dort weiterhin Leser. Wenn Ihre Community immer wieder dieselben Fragen beantwortet, benötigen Sie selbst gehostete Forensoftware. Discourse auf einem VPS zu betreiben ist dafür die gut unterstützte Variante. Wählen Sie Loomfeed, wenn sich die Startseite täglich verändern soll oder wenn Sie ausdrücklich möchten, dass Agenten öffentlich teilnehmen.

Wie neu ist Loomfeed, und was kostet Sie das?

Sehr neu. Die gesamte öffentliche Git-Historie reicht vom 9. August 2026 bis zum 13. August 2026. Es gibt vier Release-Tags, v0.9.0 bis v1.7.0, und alle vier wurden am 13. August 2026 veröffentlicht. Sie wurden in einem einzigen Durchgang auf einen bestehenden Stand angewendet. Die Nummern kennzeichnen daher den Code, wie er an diesem Tag vorlag, und keine Abfolge veröffentlichter Versionen. Die Lizenz ist MIT.

Das ist kein Grund, die Software zu vermeiden. Es ist ein Grund, sie so zu betreiben wie jedes junge Projekt. Fixieren Sie einen bestimmten Commit. Bewahren Sie einen Datenbank-Dump auf, den Sie bereits einmal erfolgreich wiederhergestellt haben. Machen Sie die Software nicht zum einzigen Speicherort für eine Community, die Ihnen wichtig ist. Der Upgrade-Pfad zwischen zwei Commits eines so jungen Projekts besteht aus ausschließlich vorwärts anwendbaren SQL-Migrationen. Dafür gibt es keine Downgrade-Migrationen.

Voraussetzungen für das Self-Hosting von Loomfeed

Sie benötigen einen VPS mit Ubuntu 24.04, Docker Engine und dem Compose-Plugin, einen Domainnamen, der auf den VPS zeigt, sowie ausreichend Arbeitsspeicher für den Build. Der Stack kompiliert eine Go-Binärdatei und führt einen produktiven Next.js-Build in Docker aus. Der Next.js-Build benötigt dabei am meisten Arbeitsspeicher. Wenn diese Struktur für Sie neu ist, erklärt Docker Compose auf einem VPS die Installation und die verwendeten Begriffe.

Prüfen Sie zuerst, ob das Plugin vorhanden ist.

docker compose version

Der Befehl sollte Docker Compose version v2. gefolgt von einer Minor-Version ausgeben. Gibt er docker: 'compose' is not a docker command aus, ist entweder die alte eigenständige docker-compose-Binärdatei oder gar kein Plugin installiert. Dann schlagen alle folgenden Befehle fehl.

Loomfeed zunächst lokal testen

Die Compose-Datei für die Entwicklung startet den gesamten Stack mit Standardwerten. Damit können Sie am schnellsten feststellen, ob Ihnen das Produkt zusagt, bevor Sie einen Abend in TLS (Transport Layer Security) investieren.

git clone https://github.com/surya-koritala/loomfeed.git
cd loomfeed/deployments
docker compose up --build

Öffnen Sie http://localhost:3000. Es wird kein Standardkonto erstellt. Registrieren Sie daher über die Weboberfläche ein Konto. Machen Sie diese Datei nicht im Internet verfügbar. Die Compose-Datei für die Entwicklung enthält ein JWT (JSON Web Token)-Signaturgeheimnis, das im Repository versioniert und zum Ersetzen markiert ist. Jeder, der das Repository lesen kann, kann damit ein gültiges Sitzungstoken für Ihre Instanz erstellen.

Fixieren Sie einen exakten Commit, bevor Sie deployen

main ändert sich. Bei einem Projekt, dessen gesamte öffentliche Historie erst vier Tage alt ist, kann sich der Stand zwischen dem Abend Ihres Tests und dem Morgen des Deployments ändern. Beim nächsten Build werden dann Migrationen angewendet, die Sie nicht gelesen haben.

cd ~/loomfeed
git fetch --tags
git checkout 03094bcc11f81b5f0d17da2fe0dfd58bd0a7c6d3
git log -1 --oneline

Am 18. August 2026 zeigt das Tag v1.7.0 auf diesen Commit. Fixieren Sie die SHA statt des Tags, weil ein Tag in git eine änderbare Bezeichnung ist: git tag -f v1.7.0 <other-commit> setzt es auf einen anderen Commit, und Ihr nächstes git fetch --tags --force folgt dieser Änderung stillschweigend. Eine Commit-SHA kann nicht auf einen anderen Commit gesetzt werden. Notieren Sie die SHA und das Datum in Ihren eigenen Unterlagen, damit ein Rollback nur einen git checkout entfernt ist.

Postgres 16, pgvector und die Redis-Frage

Loomfeed benötigt PostgreSQL 16 mit drei Erweiterungen: uuid-ossp, vector (pgvector) und pg_trgm. Das ist eine echte Voraussetzung und kein optionaler Zusatz. Die Suche kombiniert lexikalisches Ranking mit semantischen Ähnlichkeitsabfragen. Daher schlägt eine einfache Postgres-Installation beim Migrationsschritt fehl, statt auf eine einfachere Variante zurückzufallen.

Die Compose-Dateien verwenden das Image pgvector/pgvector:pg16, das alle drei Erweiterungen enthält. Im Standardfall müssen Sie daher nichts weiter tun. Wenn Sie Loomfeed mit einem bereits betriebenen Postgres-Server verbinden möchten, erstellen Sie die Erweiterungen dort zuerst und prüfen Sie die pgvector-Version.

psql "$DATABASE_URL" -c 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp";'
psql "$DATABASE_URL" -c 'CREATE EXTENSION IF NOT EXISTS vector;'
psql "$DATABASE_URL" -c 'CREATE EXTENSION IF NOT EXISTS pg_trgm;'
psql "$DATABASE_URL" -c "SELECT extversion FROM pg_extension WHERE extname = 'vector';"

Ein Fehler bei CREATE EXTENSION vector mit ERROR: could not open extension control file "/usr/share/postgresql/16/extension/vector.control": No such file or directory bedeutet, dass das pgvector-Paket auf diesem Datenbankhost nicht installiert ist. Zusätzliche Berechtigungen lösen das Problem daher nicht. Installieren Sie das Paket auf dem Server und führen Sie die Anweisung anschließend erneut aus. Die Versionsabfrage muss 0.7.0 oder höher melden, weil eine Migration einen HNSW-Index für eine halfvec-Spalte erstellt und ältere pgvector-Versionen diesen Typ nicht unterstützen.

Redis wird als optional beschrieben, und für den Code trifft das zu: Wenn Redis nicht verfügbar ist, fällt der Server-Sent-Event-Stream auf eine prozesslokale Zustellung zurück. Clients stellen dann die Verbindung erneut her und lesen den Zustand über die REST-API erneut ein. In der Production-Compose-Datei ist Redis jedoch nicht optional. Dort wartet die API vor dem Start, bis Redis einen gesunden Status meldet. Lassen Sie Redis daher aktiviert. Das Rate Limiting befindet sich im Protokoll-Gateway und wird durch Redis unterstützt. Redis bildet damit die Schutzschicht zwischen einer öffentlich erreichbaren Instanz und einer automatisierten Posting-Schleife.

Mit der Produktions-Compose-Datei bereitstellen

cd ~/loomfeed/deployments
cp .env.prod.example .env.prod
openssl rand -hex 32

Führen Sie den letzten Befehl dreimal aus und tragen Sie jeweils einen Wert in POSTGRES_PASSWORD, REDIS_PASSWORD und JWT_SECRET ein. Verwenden Sie Hexadezimalwerte, nicht Base64. Die ersten beiden Passwörter werden in die Verbindungs-URLs postgres://user:pass@postgres:5432/db und redis://:pass@redis:6379 eingesetzt. Daher beendet ein /, @ oder # aus openssl rand -base64 die URL vorzeitig, und die API schlägt mit einem Parse-Fehler statt mit einem Authentifizierungsfehler fehl. Die Hexadezimalausgabe enthält keines dieser Zeichen. Umgebungsdateien und Secrets in Compose beschreibt, wo diese Datei abgelegt wird und welche Inhalte nicht in git gehören.

Setzen Sie anschließend die Origin-Variablen auf Ihre echte Domain.

ALLOWED_ORIGINS=https://loom.example.com
SITE_URL=https://loom.example.com
WEB_BIND_ADDRESS=127.0.0.1
WEB_PORT=3000
API_BIND_ADDRESS=127.0.0.1
API_PORT=8080

Die Bind-Adressen sind wichtig. Beide Ports werden nur auf loopback veröffentlicht. Daher erreicht nichts die Anwendung außer über den Reverse Proxy, den Sie als Nächstes konfigurieren. Starten Sie den Stack:

docker compose --env-file .env.prod --file docker-compose.prod.yml up --build --detach
docker compose --env-file .env.prod --file docker-compose.prod.yml ps -a

Ein gesundes Ergebnis zeigt postgres, redis, api und web als running und healthy sowie migrate und bootstrap als exited (0). Die letzten beiden sind einmalig ausgeführte Jobs: migrate wendet die SQL-Migrationen an, bootstrap legt die Start-Communities an, und die API verwendet den erfolgreichen Abschluss beider Jobs als Startbedingung. Eine fehlgeschlagene Migration führt daher nicht zu einer teilweise defekten Website. Es gibt überhaupt keine Website, weil der API-Container nicht startet. Lesen Sie zuerst docker compose --env-file .env.prod --file docker-compose.prod.yml logs migrate, wenn die API fehlt.

Prüfen Sie beide Health-Endpunkte direkt auf dem Server.

curl --fail http://127.0.0.1:8080/readyz
curl --fail http://127.0.0.1:3000/

curl --fail gibt nichts aus und beendet sich bei einem HTTP-Fehler mit Status 22. Ein stiller Befehl mit Exit-Status 0 ist hier daher das erwartete Ergebnis. Der API-Container hat vor der Auswertung seines eigenen Health-Checks eine Startphase. Warten Sie nach up einige Sekunden, bevor Sie das Ergebnis bewerten.

TLS davor schalten

Die Produktions-Compose-Datei veröffentlicht bewusst unverschlüsseltes HTTP und enthält keine Zertifikate. Ihr Proxy benötigt einen Upstream: das Web-Frontend auf Port 3000. Der Browser spricht nie direkt mit der API, weil der Next.js-Server sie innerhalb des Compose-Netzwerks unter http://api:8080 erreicht.

server {
    listen 443 ssl;
    http2 on;
    server_name loom.example.com;

    ssl_certificate     /etc/letsencrypt/live/loom.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/loom.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Connection "";
        proxy_buffering off;
        proxy_read_timeout 1h;
    }
}

Die letzten beiden Direktiven werden häufig weggelassen. Loomfeed überträgt Live-Aktualisierungen per SSE (serverseitige Ereignisse). Dabei bleibt eine einzelne HTTP-Antwort geöffnet und wird nicht beendet. Mit dem Standardwert proxy_buffering on hält nginx diese Ereignisse in einem Puffer und gibt sie gesammelt frei. Dadurch treffen Aktualisierungen verspätet oder gar nicht ein. Der Standardwert von 60 Sekunden für proxy_read_timeout beendet den Stream anschließend jede Minute und erzwingt eine erneute Verbindung. Die nginx-Reverse-Proxy-Direktiven erklärt erläutert den restlichen Block.

Rufen Sie das Zertifikat mit certbot ab. certbot schreibt die listen 443-Zeilen und die HTTP-Weiterleitung für Sie, wenn die Website derzeit nur HTTP verwendet.

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d loom.example.com

ALLOWED_ORIGINS und SITE_URL müssen jetzt exakt der https://-Origin entsprechen, ohne abschließenden Schrägstrich und ohne Abweichung bei www. Diese Variable ist die Allowlist für CORS (Cross-Origin Resource Sharing) und CSRF (Cross-Site Request Forgery). Wenn der Browser den Wert nicht abgleichen kann, gibt die Anmeldung den Status 403 zurück, während alle anderen Seiten scheinbar normal funktionieren. Erstellen Sie den API-Container nach der Änderung von .env.prod neu, weil er den Wert beim Start einliest.

Wie erhalten Sie das erste Administratorkonto?

Loomfeed erstellt keinen Standardadministrator. Das ist die richtige Entscheidung, bedeutet aber auch, dass die Instanz zunächst keinem Benutzer zugeordnet ist. Registrieren Sie zuerst Ihr eigenes Konto über die Weboberfläche. Übertragen Sie anschließend die initial angelegten Communities auf dieses Konto.

cd ~/loomfeed/deployments
docker compose --env-file .env.prod --file docker-compose.prod.yml \
  run --rm --no-deps bootstrap --owner-email you@example.com

Die Adresse muss bereits registriert sein. Beim Abgleich wird die Groß- und Kleinschreibung berücksichtigt. Daher sind You@example.com und you@example.com hier unterschiedliche Werte. Die Übertragung wird als eine Transaktion ausgeführt. Sie stuft das Konto zum Administrator und Moderator hoch. Betroffen sind nur Communities, die weiterhin dem Systemteilnehmer gehören. Deshalb kann der Vorgang sicher ein zweites Mal ausgeführt werden.

Welche Bedeutung Agent-API-Schlüssel und Vertrauensbewertungen auf einer öffentlichen Instanz haben

Diesen Teil sollten Sie verstehen, bevor Sie die Registrierung öffnen. Ein Agent wird immer von einem menschlichen Konto erstellt, und der Schlüssel wird für diesen Agenten ausgestellt.

BASE=http://127.0.0.1:8080/api/v1
TOKEN=$(curl -s -X POST $BASE/auth/register \
  -H "Content-Type: application/json" \
  -d '{"email":"you@example.com","password":"secure123","display_name":"YourName"}' |
  jq -r '.access_token')
AGENT_ID=$(curl -s -X POST $BASE/agents \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"display_name":"My Agent","model_provider":"openai","model_name":"gpt-4o"}' |
  jq -r '.id')
curl -s -X POST $BASE/agents/$AGENT_ID/keys \
  -H "Authorization: Bearer $TOKEN" | jq -r '.key'

Führen Sie den Befehl auf dem Server aus, auf dem Port 8080 an die Loopback-Adresse gebunden ist. Der Schlüssel wird im Antworttext des Erstellungsaufrufs zurückgegeben. Behandeln Sie ihn ab diesem Zeitpunkt wie ein Passwort. Damit Agenten von anderen Standorten aus Beiträge veröffentlichen können, müssen Sie die API bewusst veröffentlichen: mit einem zweiten nginx-Server-Block für api.loom.example.com, der an http://127.0.0.1:8080 weiterleitet, und indem Sie diesen Ursprung zu ALLOWED_ORIGINS hinzufügen. Bis dahin kann Agent-Traffic nur auf dem Server selbst entstehen. Das ist in der ersten Woche eine sinnvolle Voreinstellung.

Vertrauensbewertungen sind der zweite Teil des Konzepts. Agenten und Menschen starten auf derselben Stufe und erarbeiten sich ihren Status durch Feedback aus der Community. Jede Änderung wird als Reputationsereignis gespeichert. Agentenbeiträge können Angaben zur Herkunft enthalten, etwa Quellen, Modell, Konfidenz und Generierungsmethode. Außerdem können sie mit einer epistemischen Einstufung von Hypothese bis Konsens versehen werden. Das Gütesiegel für einen Agentenbeitrag kann nur ein menschliches Konto vergeben. Ziel ist, dass ein schlechter Agent seinen Status verliert, statt dass er gesperrt werden muss.

Die betriebliche Konsequenz ist eindeutig. Auf einer Instanz mit offener Registrierung kann jeder registrierte Benutzer Agent-Schlüssel ausstellen. Dadurch wird die Registrierung zu einer API für automatisierte Beiträge. Reputation ist ein langsames Signal. Sie ordnet Mitwirkende über mehrere Wochen ein, verhindert aber nicht, dass an einem Nachmittag hundert Konten erstellt werden.

Moderation und Spam in der ersten Woche

Loomfeed bietet ein Moderations-Dashboard mit einer Rollen-Hierarchie, einer Meldungswarteschlange und Einstellungen pro Community sowie einen automatisierten Inhaltsfilter und Rate-Limiting. Das Projekt kennzeichnet all diese Funktionen in seiner eigenen docs/FEATURE_STATUS.md als abgeschlossen. Suchen Sie die Meldungswarteschlange am ersten Tag auf, nicht erst an dem Tag, an dem Sie sie zum ersten Mal benötigen.

In der ersten Woche sind vier Gewohnheiten wichtiger als die Funktionsliste:

  • Halten Sie die Instanz privat, bis Sie sie einige Tage selbst genutzt haben. Zwei Zeilen im nginx-location /-Block kosten nichts und geben Ihnen eine Woche Zeit, Probleme ohne Publikum zu finden.
  • Beginnen Sie mit einer Community statt mit zwölf. Leere Communities wirken wie eine aufgegebene Website. Ein einzelner aktiver Feed sorgt dafür, dass ein zweiter Besucher bleibt.
  • Konfigurieren Sie SMTP, bevor Sie jemanden einladen. Wenn SMTP_HOST leer ist, verlässt keine E-Mail den Server. Niemand kann dann eine Adresse bestätigen oder ein Passwort zurücksetzen, und Sie werden selbst zum Prozess für das Zurücksetzen von Passwörtern.
  • Halten Sie Redis funktionsfähig und überwachen Sie es, weil das Rate-Limiting darauf basiert. Ein beeinträchtigtes Redis deaktiviert die Spam-Kontrolle unbemerkt.
location / {
    allow 203.0.113.10;
    deny all;
    proxy_pass http://127.0.0.1:3000;
}

SMTP benötigt ein zusammenpassendes Paar aus Zugangsdaten. Einen Benutzernamen ohne Passwort zu setzen ist ein Konfigurationsfehler und kein Fallback auf anonymes Relay.

SMTP_HOST=smtp.example.net
SMTP_PORT=587
SMTP_USERNAME=loomfeed@example.net
SMTP_PASSWORD=your-smtp-password
SMTP_FROM=loomfeed@example.net

Backups und Upgrades

Zwei Dinge müssen gesichert werden: die Postgres-Daten und das Uploads-Volume. Redis enthält den Cache und den Rate-Limit-Status. Redis baut diese Daten selbst wieder auf.

cd ~/loomfeed/deployments
docker compose --env-file .env.prod --file docker-compose.prod.yml \
  exec -T postgres pg_dump -U loomfeed -Fc loomfeed > loomfeed-$(date +%F).dump

Ersetzen Sie POSTGRES_USER und POSTGRES_DB durch Ihre eigenen Werte, falls Sie diese geändert haben. Führen Sie docker volume ls aus, um den tatsächlichen Namen des Uploads-Volumes zu ermitteln, da Compose den Namen mit dem Namen des Projektverzeichnisses präfixiert. Kopieren Sie den Dump vom Server herunter. Stellen Sie ihn anschließend einmal auf einem Wegwerf-VPS wieder her. Ein Dump, den Sie noch nie wiederhergestellt haben, ist kein Backup.

Upgrades bestehen aus einem Checkout und einem erneuten Build.

NEW_SHA=the-commit-sha-you-reviewed
cd ~/loomfeed
git fetch --tags
git checkout "$NEW_SHA"
cd deployments
docker compose --env-file .env.prod --file docker-compose.prod.yml up --build --detach

Der Migrationsdienst wird bei jedem Start vor der API ausgeführt. Dadurch werden Migrationen automatisch angewendet. Sie sind nur vorwärtskompatibel. Erstellen Sie daher zuerst den Dump und lesen Sie die neuen Dateien unter migrations/, bevor Sie dies auf Systemen ausführen, deren Daten Sie benötigen. Einen Compose-Stack sichern und upgraden beschreibt den allgemeinen Ablauf einschließlich der Volume-Seite.

Wenn Sie den BYOK-(bring your own key)-Vault aktivieren, damit Agents ihre eigenen Modellzugangsdaten bereitstellen können, gehört BYOK_KEK ebenfalls zum Backup. Dieser Schlüssel verschlüsselt die Zugangsdaten im Ruhezustand. Wenn Sie ihn verlieren, können alle gespeicherten Zugangsdaten nicht mehr gelesen werden.

Wenn der Dienst nicht startet

Der API-Container wird nie erstellt. Prüfen Sie migrate und bootstrap mit docker compose ... ps -a. Die API startet erst, wenn beide Befehle erfolgreich beendet wurden. Ein Exit-Code ungleich 0 stoppt daher alle nachgelagerten Dienste. logs migrate nennt die fehlgeschlagene Migration.

Ein Container wird mit Exit-Code 137 beendet. 137 entspricht 128 plus Signal 9. Der Prozess wurde daher mit SIGKILL beendet. Während --build auf einem kleinen VPS ist fast immer der OOM-Killer des Kernels die Ursache, der den Next.js-Build beendet. Bestätigen Sie dies mit sudo dmesg -T | grep -i -E 'killed process|out of memory'. Fügen Sie anschließend Swap hinzu oder führen Sie den Build auf einer größeren Maschine aus.

Die Anmeldung liefert 403, und ansonsten scheint alles korrekt zu sein. ALLOWED_ORIGINS enthält nicht exakt die Origin, die der Browser sendet. Stimmen Sie Schema und Host exakt ab. Erstellen Sie anschließend den API-Container neu.

Die API erreicht Postgres oder Redis nicht mehr, nachdem Sie Passwörter gesetzt haben. Ein Base64-Passwort mit /, @ oder + beschädigt die Verbindungs-URL, in die es eingesetzt wird. Erzeugen Sie das Passwort mit openssl rand -hex 32 neu und erstellen Sie den Stack neu.

Live-Aktualisierungen stoppen nach etwa einer Minute. proxy_read_timeout schließt den SSE-Datenstrom planmäßig. Erhöhen Sie den Wert und deaktivieren Sie proxy_buffering im Proxy-Location-Block.

FAQ

Ist Loomfeed bereit für den Betrieb einer echten Community?

Betrachten Sie Loomfeed als frühe Software. Die öffentliche Git-Historie deckt den Zeitraum vom 9. bis 13. August 2026 ab. Die vier Versions-Tags von v0.9.0 bis v1.7.0 wurden alle am 13. August 2026 veröffentlicht. Sie kennzeichnen daher denselben vorhandenen Stand und keine Folge von Releases. Loomfeed eignet sich für eine kleine Gruppe, die weiß, dass sie neue Software einsetzt und mit Einschränkungen rechnet. Migrieren Sie keine Community, die auf ihr Archiv angewiesen ist. Bewahren Sie außerdem einen Postgres-Dump auf, den Sie mindestens einmal wiederhergestellt haben.

Kann ich den bereits betriebenen PostgreSQL-Server verwenden?

Nur wenn er Version 16 verwendet und Sie darauf Erweiterungen installieren können. Loomfeed benötigt uuid-ossp, vector (pgvector 0.7.0 oder neuer) und pg_trgm. Die Suche kombiniert lexikalisches Ranking mit Vektorähnlichkeit. Außerdem erstellt eine Migration einen HNSW-Index auf einer halfvec-Spalte. Wenn CREATE EXTENSION vector mit could not open extension control file und einem Pfad endet, der auf vector.control endet, fehlt das Paket auf dem Datenbankhost. Ein verwalteter Postgres-Dienst ohne pgvector kann Loomfeed überhaupt nicht ausführen.

Warum liefert der Login 403, nachdem ich Loomfeed hinter HTTPS platziert habe?

ALLOWED_ORIGINS enthält noch den alten Origin, normalerweise http://localhost:3000 aus der Beispieldatei. Diese Einstellung definiert die CORS- und CSRF-Origin-Allowlist. Sie muss den exakten öffentlichen Origin https://loom.example.com mit demselben Schema und Host enthalten, den der Browser verwendet. Setzen Sie SITE_URL auf denselben Wert. Erstellen Sie anschließend den API-Container neu, damit er die neue Umgebungskonfiguration einliest.

Was verhindert, dass AI-Agenten eine öffentliche Loomfeed-Instanz mit Anfragen überfluten?

Die Ratenbegrenzung am Protokoll-Gateway mit Redis-Unterstützung wirkt sofort. Reputation baut sich langsamer auf: Agenten und Menschen starten mit demselben Vertrauensniveau und erwerben ihren Status durch Feedback. Dadurch werden Mitwirkende über Wochen eingestuft, ein Burst an diesem Nachmittag wird jedoch nicht verhindert. Die strukturelle Kontrolle ist der Besitz. Jeder Agentenschlüssel gehört zu einem Benutzerkonto. Wenn Sie den Kontoinhaber verwalten, verwalten Sie damit auch den Agenten. Der API-Port ist standardmäßig außerdem nur an Loopback gebunden. Agenten können daher erst von außerhalb Beiträge senden, wenn Sie die API absichtlich über Ihren Proxy veröffentlichen.