SessionProxy — от импорта сессии до дашборда

SessionProxy — от импорта сессии до дашборда An architecture diagram generated by Archify. Владелец · REST / gRPC / веб-UI · Architecture component Владелец REST / gRPC / веб-UI Control plane · chi REST + gRPC + htmx UI · app (Go) · app Control plane chi REST + gRPC + htmx UI app Гость · /r/{token}/... · Architecture component Гость /r/{token}/... Data plane · httputil.ReverseProxy · app (Go) · app Data plane httputil.ReverseProxy app Целевой сайт · Set-Cookie вырезается на обратном пути · Architecture component Целевой сайт Set-Cookie вырезается на обратном пути Redis · usage_counters, быстрый путь · app (Go) · app Redis usage_counters, быстрый путь app HAProxy · порт 5433, шлёт трафик только на primary · Postgres HA · postgres-ha HAProxy порт 5433, шлёт трафик только на primary postgres-ha Postgres patroni1 · primary или standby · Postgres HA · postgres-ha Postgres patroni1 primary или standby postgres-ha Postgres patroni2 · standby или primary · Postgres HA · postgres-ha Postgres patroni2 standby или primary postgres-ha etcd · хранит состояние кластера · Postgres HA · postgres-ha etcd хранит состояние кластера postgres-ha Debezium · logical replication slot · CDC-пайплайн · cdc Debezium logical replication slot cdc Kafka (KRaft) · proxy_access_logs topic · CDC-пайплайн · cdc Kafka (KRaft) proxy_access_logs topic cdc ClickHouse · Kafka Engine + MV → MergeTree · CDC-пайплайн · cdc ClickHouse Kafka Engine + MV → MergeTree cdc Metabase · дашборды · Architecture component Metabase дашборды импорт сессии (AES-256-GCM) shared_link + access_policy запрос по ссылке лимит: fast path resolve token, log proxy_access_logs запрос с расшифрованной кукой ответ, Set-Cookie ещё не вырезан health-check :8008/primary health-check :8008/primary потоковая репликация leader lease leader lease WAL, wal_level=logical CDC-события consume SQL-запросы app (Go) Postgres HA CDC-пайплайн Legend Backend Database Security Message bus External

Честная граница гарантии

  • • Set-Cookie вырезается из ответа — надёжно, это код, не организационное правило
  • • Утечка токена в теле ответа (HTML/JSON) НЕ перехватывается — осознанно не заявлено как защита

Почему Redis, а не только Postgres

  • • Лимиты проверяются в Redis на КАЖДЫЙ запрос гостя — быстрый путь
  • • Postgres — источник истины для отчётности и восстановления счётчиков после рестарта Redis
  • • Несколько access_policy на одной ссылке — схлопываются по правилу «самый строгий выигрывает»

HA на практике, не в теории

  • • Failover проверен вживую: stop primary → ~15 сек → standby стал primary, HAProxy сам переключил трафик
  • • etcd — не хранилище данных проекта, а только состояние кластера (кто сейчас лидер)
  • • Debezium подключается к текущему primary напрямую — не через HAProxy, у логической репликации свой slot

Почему именно proxy_access_logs — источник CDC

  • • Единственная таблица, растущая пропорционально трафику, а не числу объектов
  • • INSERT в Postgres долетает до ClickHouse за 1-3 секунды
  • • target_url/guest_session_id/shared_link_id в ClickHouse не передаются — не нужны для агрегатов

Что есть что

  • • Владелец — человек, чей аккаунт на целевом сайте временно расшаривается гостю
  • • Control plane — управляющая часть сервиса: импорт сессии, создание ссылок, политики, blacklist (REST/gRPC/веб-UI)
  • • Гость — человек, получивший расшаренную ссылку, работает с чужим аккаунтом через прокси
  • • Data plane — сам reverse proxy: подставляет куки владельца, вырезает их из ответа перед гостем
  • • Целевой сайт — реальный внешний сайт, доступ к которому расшарен (например, соцсеть или личный кабинет)
  • • Redis — быстрый кэш лимитов: сюда бьёт КАЖДЫЙ запрос гостя, чтобы не дёргать Postgres на каждый чих
  • • HAProxy — единственная точка входа в БД для приложения: не даёт трафику попасть на устаревший standby
  • • patroni1 / patroni2 — два равноправных узла Postgres, в любой момент один из них primary, другой standby
  • • etcd — маленькая база состояния кластера: кто сейчас лидер, через неё Patroni выбирает нового при падении
  • • Debezium — читает журнал изменений Postgres построчно и превращает их в поток событий
  • • Kafka — очередь-посредник, переносит эти события дальше, не теряя порядок
  • • ClickHouse — быстрая аналитическая БД, где эти события превращаются в агрегаты для отчётов
  • • Metabase — конечная панель, где кто-то смотрит готовые графики и цифры