Форк эталонной реализации AT Protocol с оптимизированным по производительности AppView, индексером firehose на Rust, кэшированием Redis и функциями сообщества для самостоятельного хостинга социальных сетей в масштабе.
Это форк эталонной реализации AT Protocol от Blacksky, созданный компанией Bluesky Social PBC. Он обеспечивает работу AppView по адресу api.blacksky.community.
Мы публикуем этот код для прозрачности и чтобы другие сообщества могли воспользоваться нашей работой. Этот репозиторий не принимает вклады, issues или PR. Если вам нужна каноническая реализация atproto, используйте bluesky-social/atproto.
Все изменения находятся в packages/bsky (логика AppView), services/bsky (конфигурация времени выполнения) и одной пользовательской миграции. Всё остальное — из вышестоящего репозитория.
В вышестоящем dataplane входит потребитель firehose на TypeScript (subscription.ts), который индексирует события напрямую. Мы заменили его на rsky-wintermute — индексатор на Rust, по нескольким причинам:
Dataplane и AppView из этого репозитория по-прежнему работают как есть. Они читают из базы данных PostgreSQL, в которую пишет wintermute. Мы просто не запускаем встроенную подписку на firehose.
Эти исправления полезны всем, кто разворачивает AppView самостоятельно.
Оптимизация запросов с LATERAL JOIN (packages/bsky/src/data-plane/server/routes/feeds.ts)
getTimeline и getListFeed переписаны с использованием PostgreSQL LATERAL JOIN, чтобы принудительно использовать индексы по пользователям вместо полного сканирования таблиц. Значительное улучшение для пользователей, следящих за тысячами аккаунтов.Кэширующий слой Redis (packages/bsky/src/data-plane/server/cache/)
Timestamp теряют метод .toDate(), что приводит к неполной гидратации профилей при попадании в кэш. В настоящее время мы работаем с отключённым кэшированием Redis. Исправление: сериализовать метки времени как ISO-строки при записи в кэш и восстанавливать при чтении.Серверное применение предпочтений уведомлений (packages/bsky/src/api/app/bsky/notification/listNotifications.ts)
reasons, сервер применяет сохранённые предпочтения уведомлений пользователя. Без этого предпочтения применяются только на стороне клиента и не имеют эффекта.Исправление устаревшего ключа подписи в верификаторе аутентификации (packages/bsky/src/auth-verifier.ts)
forceRefresh) обходится кэш идентификаторов dataplane в памяти и DID-документ напрямую запрашивается из PLC-каталога. Исправляет ошибки аутентификации после миграции аккаунта, когда ключ подписи меняется, но в кэше остаётся старый.Очистка JSON (packages/bsky/src/data-plane/server/routes/records.ts)
\u0000) и управляющие символы. Они допустимы по RFC 8259, но отвергаются JSON.parse() в Node.js, что приводит к незаметным сбоям rowToRecord в dataplane, которые проявляются как отсутствующие посты.Инфраструктура для приватных постов сообщества, которые хранятся в AppView, а не на отдельных PDS. Специфично для того, как работает Blacksky, но может служить примером для других сообществ.
community.blacksky.feed.* с конечными точками для отправки, получения, удаления, ленты и просмотра тредовcommunity_post (миграция: 20260202T120000000Z-add-community-post.ts)getPostThreadV2 для смешанных тредов из стандартных и сообщественных постовBLACKSKY_MEMBERSHIP_DB_URL)Bluesky Relay (bsky.network)
|
v
rsky-wintermute -----> PostgreSQL 17 <----- Palomar
(индексатор на Rust) | (поиск на Go)
- потребитель firehose | |
- обратная загрузка | v
- индексатор меток | OpenSearch
- прямая индексация |
v
bsky-dataplane (gRPC :2585) <--- Redis (опционально)
|
v
bsky-appview (HTTP :2584)
|
v
Обратный прокси (Caddy/nginx)
| Компонент | Исходный код | Назначение |
|---|---|---|
| rsky-wintermute | blacksky-algorithms/rsky | Индексатор firehose на Rust: потребляет события, выполняет обратную загрузку репозиториев, индексирует записи в PostgreSQL |
| rsky-relay | blacksky-algorithms/rsky | Реле AT Protocol для получения меток модерации от сервисов-лейблеров |
| rsky-video | blacksky-algorithms/rsky | Сервис загрузки видео: транскодирование через Bunny Stream CDN, загрузка blob-ссылок в PDS пользователя |
| bsky-dataplane | Этот репозиторий (services/bsky) | Уровень данных gRPC поверх PostgreSQL |
| bsky-appview | Этот репозиторий (services/bsky) | HTTP-сервер API для конечных точек XRPC app.bsky.* |
| Palomar | blacksky-algorithms/indigo | Полнотекстовый поиск: индексирует профили и посты в OpenSearch с учётом количества подписчиков |
| palomar-sync | blacksky-algorithms/rsky | Синхронизирует количество подписчиков и оценки PageRank из PostgreSQL в OpenSearch |
Wintermute — монолитная служба на Rust с четырьмя параллельными путями обработки:
bsky.network через WebSocket, записывает события в очереди Fjall (встраиваемое key-value хранилище)ON CONFLICT для идемпотентности