Skip to content
KitploitKITPLOIT
ИнструментыБлог
Log in
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
atproto — Форк эталонной реализации AT Protocol с оптимизированным по производительности AppView, индексером firehose на Rust, кэшированием Redis и функциями сообщества для самостоятельного хостинга социальных сетей в масштабе. | Kitploit
Инструменты/GitHubGitHub/blacksky-algorithms/atproto
Безопасность облачной инфраструктурыАудит конфигурацииОбнаружение СекретовУправление идентификацией и доступом (IAM)АутентификацияНеправильная КонфигурацияБезопасность APIБезопасность Баз Данных
Анализ Журналов
GitHubblacksky-algorithms/atproto

atproto

Форк эталонной реализации AT Protocol с оптимизированным по производительности AppView, индексером firehose на Rust, кэшированием Redis и функциями сообщества для самостоятельного хостинга социальных сетей в масштабе.

Репозиторий
9431614 дней назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Blacksky AppView

Это форк эталонной реализации AT Protocol от Blacksky, созданный компанией Bluesky Social PBC. Он обеспечивает работу AppView по адресу api.blacksky.community.

Мы публикуем этот код для прозрачности и чтобы другие сообщества могли воспользоваться нашей работой. Этот репозиторий не принимает вклады, issues или PR. Если вам нужна каноническая реализация atproto, используйте bluesky-social/atproto.

Что отличается

Все изменения находятся в packages/bsky (логика AppView), services/bsky (конфигурация времени выполнения) и одной пользовательской миграции. Всё остальное — из вышестоящего репозитория.

Почему не встроенный потребитель Firehose?

В вышестоящем dataplane входит потребитель firehose на TypeScript (subscription.ts), который индексирует события напрямую. Мы заменили его на rsky-wintermute — индексатор на Rust, по нескольким причинам:

  • Производительность при масштабировании: Потребитель на TypeScript обрабатывает события последовательно. При сетевом масштабе (~1 000 событий/сек, 18,5 миллиардов записей в сумме) полная обратная загрузка (~90 записей/сек) заняла бы 6,5 лет. Wintermute нацелен на 10 000+ записей/сек с параллельной обработкой очередей.
  • Архитектура обратной загрузки: Wintermute разделяет live-индексацию и обратную загрузку в независимые очереди (firehose_live, firehose_backfill, repo_backfill, labels). События live-режима никогда не блокируются работой по обратной загрузке.
  • Эксплуатационные инструменты: Wintermute включает утилиты для прямой индексации конкретных аккаунтов, массового импорта из PLC-каталога, повторного воспроизведения потока меток, восстановления blob-ссылок и управления очередями — всё это необходимо при начальной настройке AppView с нуля.

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/)

  • Профили акторов (TTL 60 с), записи (5 мин), счетчики взаимодействий (30 с), метаданные постов (5 мин)
  • Снижает нагрузку на базу данных при продакшн-трафике
  • Известная проблема: В кэше акторов есть ошибка сериализации protobuf-меток времени: после JSON-передачи через Redis объекты Timestamp теряют метод .toDate(), что приводит к неполной гидратации профилей при попадании в кэш. В настоящее время мы работаем с отключённым кэшированием Redis. Исправление: сериализовать метки времени как ISO-строки при записи в кэш и восстанавливать при чтении.

Серверное применение предпочтений уведомлений (packages/bsky/src/api/app/bsky/notification/listNotifications.ts)

  • Когда клиент не указывает reasons, сервер применяет сохранённые предпочтения уведомлений пользователя. Без этого предпочтения применяются только на стороне клиента и не имеют эффекта.

Исправление устаревшего ключа подписи в верификаторе аутентификации (packages/bsky/src/auth-verifier.ts)

  • При повторной попытке верификации JWT (forceRefresh) обходится кэш идентификаторов dataplane в памяти и DID-документ напрямую запрашивается из PLC-каталога. Исправляет ошибки аутентификации после миграции аккаунта, когда ключ подписи меняется, но в кэше остаётся старый.

Очистка JSON (packages/bsky/src/data-plane/server/routes/records.ts)

  • Из хранимых записей перед парсингом JSON удаляются нулевые байты (\u0000) и управляющие символы. Они допустимы по RFC 8259, но отвергаются JSON.parse() в Node.js, что приводит к незаметным сбоям rowToRecord в dataplane, которые проявляются как отсутствующие посты.

Сообщества (специфично для Blacksky)

Инфраструктура для приватных постов сообщества, которые хранятся в AppView, а не на отдельных PDS. Специфично для того, как работает Blacksky, но может служить примером для других сообществ.

  • Пользовательское пространство лексикона community.blacksky.feed.* с конечными точками для отправки, получения, удаления, ленты и просмотра тредов
  • Отдельная таблица community_post (миграция: 20260202T120000000Z-add-community-post.ts)
  • Проверка членства на уровне dataplane и API
  • Интеграция с 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-wintermuteblacksky-algorithms/rskyИндексатор firehose на Rust: потребляет события, выполняет обратную загрузку репозиториев, индексирует записи в PostgreSQL
rsky-relayblacksky-algorithms/rskyРеле AT Protocol для получения меток модерации от сервисов-лейблеров
rsky-videoblacksky-algorithms/rskyСервис загрузки видео: транскодирование через Bunny Stream CDN, загрузка blob-ссылок в PDS пользователя
bsky-dataplaneЭтот репозиторий (services/bsky)Уровень данных gRPC поверх PostgreSQL
bsky-appviewЭтот репозиторий (services/bsky)HTTP-сервер API для конечных точек XRPC app.bsky.*
Palomarblacksky-algorithms/indigoПолнотекстовый поиск: индексирует профили и посты в OpenSearch с учётом количества подписчиков
palomar-syncblacksky-algorithms/rskyСинхронизирует количество подписчиков и оценки PageRank из PostgreSQL в OpenSearch

rsky-wintermute подробно

Wintermute — монолитная служба на Rust с четырьмя параллельными путями обработки:

  • Ingester: Подключается к firehose bsky.network через WebSocket, записывает события в очереди Fjall (встраиваемое key-value хранилище)
  • Indexer: Читает из очередей, разбирает записи, записывает в PostgreSQL с ON CONFLICT для идемпотентности
  • Backfiller: Загружает полные CAR-файлы репозиториев из PDS, распаковывает записи в очередь обратной загрузки
  • Label indexer: Подписывается на потоки WebSocket лейблеров, обрабатывает события создания/отмены меток
Скачать инструмент