← Все статьи

Пять продуктов в одном FastAPI-монолите: HTMX, Telegram Mini App и Stars

getdoday.ru: ~76 000 строк без React, грабли themeParams и DNS бота, биллинг через Telegram Stars и entitlement.

Содержание

Коротко

Ярослав (SwairIt) за полтора месяца вырос из todo-листа на FastAPI в «студию» из пяти продуктов под одним доменом getdoday.ru — без единой строки React, ~76 000 строк кода и 1200+ тестов. На Habr — разбор архитектуры, выбора HTMX и граблей Telegram Mini App.

Что произошло

Под getdoday.ru живут: todo с вебом и Mini App, кабинет репетиторов Lessio, школьное Q&A Razbery, тренажёр ПДД и игра Tap Tower. Всё — один FastAPI-монолит с PostgreSQL, Jinja2, HTMX 2, Alpine.js и Tailwind через CDN.

Автор сознательно отказался от React: серверный рендер, подмена фрагментов HTML через hx-swap вместо JSON-API и виртуального DOM. Структура — по фичам (app/tasks/, app/pdd/), а не по слоям; общие модули auth, billing и бот переиспользуются.

Из граблей Mini App — четыре истории на часы отладки. themeParams из SDK ломает тёмную палитру на светлой теме Telegram — решение: своя тема и явный переключатель. DNS на проде резолвил api.telegram.org в недоступный адрес — понадобился monkey-patch на нескольких уровнях (socket, asyncio, httpcore). Из нескольких дата-центров Telegram отвечал только один IP. post_init в python-telegram-bot v21 через присваивание после build() молча игнорируется — нужен билдер.

Telegram Stars — модель single-merchant: деньги только на баланс вашего бота, маркетплейс «одни платят — другие получают» невозможен. Для нескольких платных вертикалей автор ввёл entitlement (pdd_pro отдельно от глобального Pro).

Почему это важно

Кейс показывает, что CRUD-интерфейсы и мультипродуктовый бэкенд можно собрать без SPA-стека. HTMX на мобильных оказался отзывчивее части React-приложений — меньше сериализации и парсинга JS. Для разработчиков Telegram-экосистемы статья — честный список продакшен-граблей, которых нет в официальной документации.

Процесс: mypy --strict, ruff, pre-commit, CI на GitHub Actions, деплой cron-poll ~60 секунд после push.

На практике

  1. Для CRUD и админок рассмотрите HTMX + серверный рендер вместо SPA по умолчанию.
  2. Организуйте монолит по фичам с общей инфраструктурой, не копируйте auth и billing.
  3. В Mini App не копируйте themeParams вслепую — зафиксируйте свою палитру.
  4. На VPS проверяйте доступность IP Telegram curl-ом; патч DNS может потребовать нескольких слоёв.
  5. Для Stars сразу закладывайте single-merchant и модель прав (entitlement на продукт).
  6. Коллбэки библиотек задавайте через билдер, не через присваивание после сборки.

Итог

Это не «HTMX против React», а история о том, как один разработчик с Python-фокусом довёз пять продуктов до продакшена с жёсткой типизацией и тестами. Грабли Telegram и Stars — особенно ценны. Полный разбор с цифрами — на Habr.