Как я с агентами запил сегодня себе прямые эфиры на статический сайт без обычного бэкенда (Рубрика Architecture)
На этой неделе у меня четыре разговора с экспертами в прямом эфире: два уже прошли, два ещё впереди. Формат общения в реальном времени перестал быть для меня разовым экспериментом, и в какой-то момент стало странно, что мой сайт 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