Fork de l'implémentation de référence du protocole AT avec un AppView optimisé pour les performances, un indexeur firehose basé sur Rust, un cache Redis et des fonctionnalités communautaires pour un réseau social auto-hébergé à grande échelle.
Voici le fork de Blacksky de l'implémentation de référence du protocole AT par Bluesky Social PBC. Il alimente l’AppView à l’adresse api.blacksky.community.
Nous publions ce code par souci de transparence et pour que d’autres communautés puissent bénéficier de ce travail. Ce dépôt n’accepte ni contributions, ni issues, ni PRs. Si vous souhaitez l’implémentation canonique d’atproto, utilisez bluesky-social/atproto.
Toutes les modifications se trouvent dans packages/bsky (logique AppView), services/bsky (configuration d’exécution) et une migration personnalisée. Tout le reste provient de l’amont.
Le dataplane en amont inclut un consumer Firehose TypeScript (subscription.ts) qui indexe les événements directement. Nous l’avons remplacé par rsky-wintermute, un indexeur Rust, pour plusieurs raisons :
Le dataplane et l’appview de ce dépôt fonctionnent toujours tels quels. Ils lisent depuis la base de données PostgreSQL que wintermute écrit. Nous ne démarrons simplement pas l’abonnement Firehose intégré.
Ces correctifs sont largement utiles à toute personne hébergeant elle-même une AppView à grande échelle.
Optimisation des requêtes LATERAL JOIN (packages/bsky/src/data-plane/server/routes/feeds.ts)
getTimeline et getListFeed réécrites avec des LATERAL JOIN PostgreSQL pour forcer l’utilisation d’index par utilisateur au lieu de parcourir toutes les tables. Amélioration majeure pour les utilisateurs qui suivent des milliers de comptes.Couche de cache Redis (packages/bsky/src/data-plane/server/cache/)
Timestamp perdent leur méthode .toDate() après un aller-retour JSON via Redis, ce qui provoque une hydration incomplète du profil lors d’un hit dans le cache. Nous utilisons actuellement le cache Redis désactivé. La correction consiste à sérialiser les timestamps en chaînes ISO lors de l’écriture dans le cache et à les reconstruire à la lecture.Application côté serveur des préférences de notification (packages/bsky/src/api/app/bsky/notification/listNotifications.ts)
reasons, le serveur applique les préférences de notification enregistrées par l’utilisateur. Sans cela, les préférences ne sont appliquées que côté client et restent sans effet.Correction de la clé de signature obsolète dans le vérificateur d’authentification (packages/bsky/src/auth-verifier.ts)
forceRefresh), contourne le cache d’identité en mémoire du dataplane et résout le document DID directement depuis le répertoire PLC. Corrige les échecs d’authentification après une migration de compte où la clé de signature change mais le cache conserve l’ancienne clé.Nettoyage JSON (packages/bsky/src/data-plane/server/routes/records.ts)
\u0000) et les caractères de contrôle des enregistrements stockés avant le parsing JSON. Ces caractères sont valides selon RFC 8259 mais rejetés par JSON.parse() de Node.js, provoquant des échecs silencieux de parsing rowToRecord dans le dataplane, qui se manifestent par des publications manquantes.Infrastructure pour les publications privées de communauté qui résident sur l’AppView plutôt que sur des PDS individuels. Spécifique au fonctionnement de Blacksky, mais peut servir de référence pour d’autres communautés.
community.blacksky.feed.* avec points de terminaison pour soumettre, obtenir, supprimer, timeline et fils de discussioncommunity_post séparée (migration : 20260202T120000000Z-add-community-post.ts)getPostThreadV2 pour des fils mixtes publications standard/communautairesBLACKSKY_MEMBERSHIP_DB_URL)Bluesky Relay (bsky.network)
|
v
rsky-wintermute -----> PostgreSQL 17 <----- Palomar
(Indexeur Rust) | (Recherche Go)
- consumer firehose | |
- backfilleur | v
- indexeur de labels | OpenSearch
- indexeur direct |
v
bsky-dataplane (gRPC :2585) <--- Redis (optionnel)
|
v
bsky-appview (HTTP :2584)
|
v
Proxy inverse (Caddy/nginx)
| Composant | Source | Objectif |
|---|---|---|
| rsky-wintermute | blacksky-algorithms/rsky | Indexeur Firehose Rust : consomme les événements, backfill des dépôts, indexe les enregistrements dans PostgreSQL |
| rsky-relay | blacksky-algorithms/rsky | Relais du protocole AT pour recevoir les labels de modération des services de labellisation |
| rsky-video | blacksky-algorithms/rsky | Service de téléchargement vidéo : transcodage via Bunny Stream CDN, télécharge les références de blobs vers les PDS des utilisateurs |
| bsky-dataplane | Ce dépôt (services/bsky) | Couche de données gRPC sur PostgreSQL |
| bsky-appview | Ce dépôt (services/bsky) | Serveur d’API HTTP pour les points de terminaison XRPC app.bsky.* |
| Palomar | blacksky-algorithms/indigo | Recherche en texte intégral : indexe les profils et publications dans OpenSearch avec pondération basée sur le nombre d’abonnés |
| palomar-sync | blacksky-algorithms/rsky | Synchronise les compteurs d’abonnés et les scores PageRank de PostgreSQL vers OpenSearch |
Wintermute est un service Rust monolithique avec quatre chemins de traitement parallèles :