Fork de la implementación de referencia del Protocolo AT con AppView optimizado para rendimiento, indexador de firehose basado en Rust, almacenamiento en caché Redis y características comunitarias para redes sociales autoalojadas a escala.
Esta es una bifurcación (fork) de Blacksky de la implementación de referencia del AT Protocol de Bluesky Social PBC. Impulsa el AppView en api.blacksky.community.
Publicamos esto por transparencia y para que otras comunidades puedan beneficiarse del trabajo. Este repositorio no acepta contribuciones, issues ni PRs. Si desea la implementación canónica de atproto, use bluesky-social/atproto.
Todos los cambios están en packages/bsky (lógica de AppView), services/bsky (configuración de ejecución) y una migración personalizada. Todo lo demás es upstream.
El dataplane upstream incluye un consumidor de firehose TypeScript (subscription.ts) que indexa eventos directamente. Lo reemplazamos con rsky-wintermute, un indexador Rust, por varias razones:
El dataplane y el AppView de este repositorio siguen funcionando tal cual. Leen de la base de datos PostgreSQL que escribe wintermute. Simplemente no iniciamos la suscripción de firehose integrada.
Estas son ampliamente útiles para cualquiera que aloje su propio AppView a escala.
Optimización de consultas LATERAL JOIN (packages/bsky/src/data-plane/server/routes/feeds.ts)
getTimeline y getListFeed reescritos con LATERAL JOIN de PostgreSQL para forzar el uso de índices por usuario en lugar de escaneos completos de tabla. Mejora importante para usuarios que siguen a miles de cuentas.Capa de caché Redis (packages/bsky/src/data-plane/server/cache/)
Timestamp pierden su método .toDate() después de un round-trip JSON a través de Redis, causando una hidratación de perfil incompleta en aciertos de caché. Actualmente ejecutamos con la caché Redis deshabilitada. La solución es serializar los timestamps como cadenas ISO al escribir en caché y reconstruirlos al leer.Aplicación del lado del servidor de preferencias de notificaciones (packages/bsky/src/api/app/bsky/notification/listNotifications.ts)
reasons, el servidor aplica las preferencias de notificaciones guardadas del usuario. Sin esto, las preferencias solo se aplican del lado del cliente y no tienen efecto.Corrección de clave de firma obsoleta en verificador de autenticación (packages/bsky/src/auth-verifier.ts)
forceRefresh), omite la caché de identidad en memoria del dataplane y resuelve el documento DID directamente desde el directorio PLC. Soluciona fallos de autenticación después de la migración de cuentas donde la clave de firma rota pero la caché mantiene la clave antigua.Sanitización JSON (packages/bsky/src/data-plane/server/routes/records.ts)
\u0000) y caracteres de control de los registros almacenados antes del análisis JSON. Estos son válidos según RFC 8259 pero rechazados por JSON.parse() de Node.js, lo que provoca fallos silenciosos de rowToRecord en el dataplane que se manifiestan como publicaciones faltantes.Infraestructura para publicaciones comunitarias privadas que residen en el AppView en lugar de PDS individuales. Específico de cómo funciona Blacksky, pero podría servir como referencia para otras comunidades.
community.blacksky.feed.* con endpoints para enviar, obtener, eliminar, timeline y vistas de hiloscommunity_post (migración: 20260202T120000000Z-add-community-post.ts)getPostThreadV2 para hilos mixtos de publicaciones estándar y comunitariasBLACKSKY_MEMBERSHIP_DB_URL)Bluesky Relay (bsky.network)
|
v
rsky-wintermute -----> PostgreSQL 17 <----- Palomar
(indexador Rust) | (búsqueda Go)
- consumidor firehose | |
- reindexador | v
- indexador de etiquetas | OpenSearch
- indexador directo |
v
bsky-dataplane (gRPC :2585) <--- Redis (opcional)
|
v
bsky-appview (HTTP :2584)
|
v
Proxy inverso (Caddy/nginx)
| Componente | Fuente | Propósito |
|---|---|---|
| rsky-wintermute | blacksky-algorithms/rsky | Indexador de firehose en Rust: consume eventos, reindexa repositorios, indexa registros en PostgreSQL |
| rsky-relay | blacksky-algorithms/rsky | Relay del AT Protocol para recibir etiquetas de moderación de servicios etiquetadores |
| rsky-video | blacksky-algorithms/rsky | Servicio de subida de vídeo: transcode vía Bunny Stream CDN, sube referencias de blobs a los PDS de los usuarios |
| bsky-dataplane | Este repositorio (services/bsky) | Capa de datos gRPC sobre PostgreSQL |
| bsky-appview | Este repositorio (services/bsky) | Servidor API HTTP para endpoints XRPC de app.bsky.* |
| Palomar | blacksky-algorithms/indigo | Búsqueda de texto completo: indexa perfiles y publicaciones en OpenSearch con potenciación por número de seguidores |
| palomar-sync | blacksky-algorithms/rsky | Sincroniza conteos de seguidores y puntuaciones PageRank desde PostgreSQL a OpenSearch |
Wintermute es un servicio monolítico en Rust con cuatro rutas de procesamiento paralelo:
bsky.network vía WebSocket, escribe eventos en colas Fjall (almacén clave-valor incrustado)ON CONFLICT para idempotencia