Проект BFF: инфраструктура в Selectel
BFF — компоненты одного процесса Bun

Браузер

Caddy

  1. HTML-хендлер
  1. Сессия и Go-клиент
Go

Go API

Гость { user: null }

  1. serialize-javascript
  1. Bun HTMLRewriter

index.html локальный шаблон

  1. HTML 200

HTML 503

7. Старт клиента — только HTML 200

textContent → JSON.parse()

→ инициализировать стор

→ первый рендер

стартового RPC users.me нет

Общий с tRPC слой: сессия, refresh, Orval-клиент Go. Один refresh и повтор после 401 для HTML и RPC; без вызова своего tRPC.

Нет сессии: Go не вызывается.

Подтверждённо недействительная сессия: удаление cookie. В том числе отклонённый refresh или повторный 401.

serialize-javascript isJSON: true только { user }

Без токенов и служебных ответов Go.

index.html из образа BFF: прочитан и проверен при старте, хранится в памяти. Без S3/CDN на запрос.

script#bootstrap type=application/json setInnerContent: html: true после безопасной сериализации.

503: сессия сохраняется, приложение не запускается. После успешного refresh новая cookie передаётся даже с HTML 503.

Общая политика HTML 200 и 503, включая гостевые

Cache-Control: private, no-store Новая cookie или удаление cookie — в заголовках до тела.

1. Открытие страницы

Включая GET по внешней ссылке. Cookie сессии: SameSite=Lax.

  • Наша инфраструктура
  • Пользовательский трафик
  • Прочие связи
1. GET HTML · SameSite=Lax
2. HTML-запрос
3. Общая сессия
4. GET /users/me
4. Ответ Go: DTO или ошибка → BFF
5. Успешный DTO → { user }
Гость: нет сессии / сессия недействительна
5. { user: null }
6. Безопасный JSON
6. Шаблон из памяти
7. Готовый HTML
7. HTML 200
сеть / таймаут / 5xx / S2S
HTML 503
7. HTML 200 или 503