К основному содержимому
#Architecture

Как я с агентами запил сегодня себе прямые эфиры на статический сайт без обычного бэкенда (Рубрика Architecture)

#Architecture #Engineering #Web #Cloudflare #DevOps #YouTube

На этой неделе у меня четыре разговора с экспертами в прямом эфире: два уже прошли, два ещё впереди. Формат общения в реальном времени перестал быть для меня разовым экспериментом, и в какой-то момент стало странно, что мой сайт polomodov.tech об этом ничего не знает. Я хотел простое поведение: если в ближайшие семь дней запланирован эфир, сайт сам показывает анонс. Когда трансляция начинается, блок переключается в состояние live. Если эфира нет, ничего не нужно править руками, пересобирать или выкладывать специально ради одной плашки.

Здесь было интересное ограничение. Сайт статический, собран на GitHub Pages и работает на собственном домене. Обычного бэкенда у него нет, и заводить отдельный сервис с сервером и базой данных ради статуса трансляции мне не хотелось. Но совсем без серверной части не обойтись: YouTube API требует OAuth, а значит, где-то должны безопасно жить client secret и refresh token.

В итоге, я сегодня утром пообщался с Codex и мы спроектировали такую схему

  • Добавили не полноценный бэкенд, а один узкий динамический слой - Cloudflare Worker.
  • Раз в две минуты Worker через OAuth запрашивает у YouTube списки active и upcoming трансляций;
  • Отбрасывает непубличные эфиры и эфиры другого канала, затем выбирает текущий либо ближайший запланированный;
  • Сохраняет в Workers KV нормализованный снимок из трёх состояний - offline, upcoming, live - и отдельно кэширует access token;
  • Наружу отдаёт только публичный read-only endpoint /status, без OAuth-данных и лишних деталей YouTube API;
  • Браузер опрашивает этот endpoint раз в минуту, но только пока вкладка видима.

Отдельно предусмотрено не только как показать эфир, но и как безопасно перестать его показывать. Клиент проверяет версию схемы и все поля ответа. Если снимок старше десяти минут, он считается устаревшим и интерфейс возвращается в offline. Так же скрывается анонс, если трансляция запланирована дальше чем на семь дней. Ошибка YouTube или Worker не превращается в вечную плашку «мы в эфире».

Сам плеер тоже не загружается заранее. Для активной трансляции iframe появляется только после клика. Если я впаду в маразм и запрещу встраивание Youtube-фрейма, то сайт покажет превью и ссылку на страницу YouTube. А в навигации индикатор появляется только для состояния live. Операционную часть я тоже не оставил «на потом»: изменения Worker выкладываются отдельным сценарием GitHub Actions, а ещё один сценарий раз в час проверяет схему /status и свежесть данных. При этом посещения сайта не увеличивают число запросов к YouTube - к API обращается только Worker по расписанию.

Круто, что все это от начала и до релиза заняло меньше дня:

  • Сегодня утром с агентом мы договорились об архитектуре
  • Основной PR открылся в 12:46
  • В 15:48 ветка синхронизировалась с main (я поревьювил и принял измения)
  • Дальше я настроил все токены и доступы по инструкции агента между Google Cloud Console, Cloudflare, Github
  • А в 17:09 изменения были смержены и дальше раскатаны
  • К 18:00 на сайте уже отображался завтрашний стрим с Женей Сергеевым про whitepaper Anthropic

В общем, сейчас разработка своих пет-проектов - это чистый фан, особенно если ты разбираешься в инженерии и настроил кучу детерминированных проверок, которые позволяют агенту безопасно достигать поставленных целей:)

#Architecture #Engineering #Web #Cloudflare #DevOps #YouTube