
Fork der AT Protocol-Referenzimplementierung mit leistungsoptimierter AppView, Rust-basiertem Firehose-Indexer, Redis-Caching und Community-Funktionen für selbstgehostete soziale Netzwerke in großem Maßstab.
Dies ist der Fork des AT Protocol Reference Implementation von Blacksky, der von Bluesky Social PBC erstellt wurde. Er betreibt die AppView unter api.blacksky.community.
Wir veröffentlichen dies aus Transparenzgründen und damit andere Gemeinschaften von der Arbeit profitieren können. Dieses Repository akzeptiert keine Beiträge, Issues oder PRs. Wenn Sie die kanonische atproto-Implementierung wünschen, verwenden Sie bluesky-social/atproto.
Alle Änderungen befinden sich in packages/bsky (AppView-Logik), services/bsky (Laufzeitkonfiguration) und einer benutzerdefinierten Migration. Alles andere ist Upstream.
Die Upstream-Datenebene enthält einen TypeScript-Firehose-Consumer (subscription.ts), der Ereignisse direkt indiziert. Wir haben ihn aus mehreren Gründen durch rsky-wintermute, einen Rust-Indexer, ersetzt:
Die Datenebene und die AppView aus diesem Repository laufen weiterhin unverändert. Sie lesen aus der PostgreSQL-Datenbank, die Wintermute beschreibt. Wir starten nur das eingebaute Firehose-Abonnement nicht.
Diese sind allgemein für jeden nützlich, der eine AppView in großem Maßstab selbst hostet.
LATERAL-JOIN-Abfrageoptimierung (packages/bsky/src/data-plane/server/routes/feeds.ts)
getTimeline und getListFeed wurden mit PostgreSQL LATERAL JOINs umgeschrieben, um die Indexnutzung pro Benutzer zu erzwingen, anstatt vollständige Tabellenscans durchzuführen. Große Verbesserung für Benutzer, die Tausenden von Konten folgen.Redis-Caching-Layer (packages/bsky/src/data-plane/server/cache/)
Timestamp-Objekte nach JSON-Roundtrip durch Redis ihre .toDate()-Methode verlieren, was bei Cache-Treffern zu unvollständiger Profilhydrierung führt. Wir betreiben Redis-Caching derzeit deaktiviert. Die Lösung besteht darin, Zeitstempel beim Cache-Schreiben als ISO-Strings zu serialisieren und beim Lesen zu rekonstruieren.Serverseitige Durchsetzung von Benachrichtigungseinstellungen (packages/bsky/src/api/app/bsky/notification/listNotifications.ts)
reasons angibt, wendet der Server die gespeicherten Benachrichtigungseinstellungen des Benutzers an. Ohne dies werden die Einstellungen nur clientseitig durchgesetzt und haben keine Wirkung.Auth-Verifier-Problem mit abgelaufenem Signaturschlüssel (packages/bsky/src/auth-verifier.ts)
forceRefresh) wird der In-Memory-Identity-Cache der Datenebene umgangen und das DID-Dokument direkt aus dem PLC-Verzeichnis aufgelöst. Behebt Authentifizierungsfehler nach Kontomigration, bei der der Signaturschlüssel rotiert, der Cache aber den alten Schlüssel enthält.JSON-Bereinigung (packages/bsky/src/data-plane/server/routes/records.ts)
\u0000) und Steuerzeichen aus gespeicherten Datensätzen vor der JSON-Analyse. Diese sind gemäß RFC 8259 gültig, werden aber von Node.js JSON.parse() abgelehnt, was zu stillen rowToRecord-Analysefehlern in der Datenebene führt, die sich als fehlende Posts äußern.Infrastruktur für private Community-Beiträge, die auf der AppView und nicht auf einzelnen PDSes leben. Spezifisch für die Funktionsweise von Blacksky, könnte aber als Referenz für andere Gemeinschaften dienen.
community.blacksky.feed.* mit Endpunkten zum Einreichen, Abrufen, Löschen, für Timeline und Thread-Ansichtencommunity_post-Tabelle (Migration: 20260202T120000000Z-add-community-post.ts)getPostThreadV2 für gemischte Standard-/Community-Post-ThreadsBLACKSKY_MEMBERSHIP_DB_URL)Bluesky Relay (bsky.network)
|
v
rsky-wintermute -----> PostgreSQL 17 <----- Palomar
(Rust-Indexer) | (Go-Suche)
- Firehose-Consumer | |
- Backfiller | v
- Label-Indexer | OpenSearch
- Direkt-Indexer |
v
bsky-dataplane (gRPC :2585) <--- Redis (optional)
|
v
bsky-appview (HTTP :2584)
|
v
Reverse-Proxy (Caddy/nginx)
| Komponente | Quelle | Zweck |
|---|---|---|
| rsky-wintermute | blacksky-algorithms/rsky | Rust-Firehose-Indexer: verarbeitet Ereignisse, backfillt Repos, indiziert Datensätze in PostgreSQL |
| rsky-relay | blacksky-algorithms/rsky | AT Protocol Relay zum Empfangen von Moderationslabels von Labeler-Diensten |
| rsky-video | blacksky-algorithms/rsky | Video-Upload-Dienst: transkodiert über Bunny Stream CDN, lädt Blob-Referenzen auf Benutzer-PDSes hoch |
| bsky-dataplane | Dieses Repo (services/bsky) | gRPC-Datenebene über PostgreSQL |
| bsky-appview | Dieses Repo (services/bsky) | HTTP-API-Server für app.bsky.* XRPC-Endpunkte |
| Palomar | blacksky-algorithms/indigo | Volltextsuche: indiziert Profile und Posts in OpenSearch mit Follower-Anzahl-Boosting |
| palomar-sync | blacksky-algorithms/rsky | Synchronisiert Follower-Anzahlen und PageRank-Scores von PostgreSQL nach OpenSearch |
Wintermute ist ein monolithischer Rust-Dienst mit vier parallelen Verarbeitungspfaden:
bsky.network-Firehose per WebSocket her, schreibt Ereignisse in Fjall (eingebetteter Key-Value-Store) WarteschlangenON CONFLICT für Idempotenz in PostgreSQL