Содержание
Коротко
Ярослав (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.
На практике
- Для CRUD и админок рассмотрите HTMX + серверный рендер вместо SPA по умолчанию.
- Организуйте монолит по фичам с общей инфраструктурой, не копируйте auth и billing.
- В Mini App не копируйте themeParams вслепую — зафиксируйте свою палитру.
- На VPS проверяйте доступность IP Telegram curl-ом; патч DNS может потребовать нескольких слоёв.
- Для Stars сразу закладывайте single-merchant и модель прав (entitlement на продукт).
- Коллбэки библиотек задавайте через билдер, не через присваивание после сборки.
Итог
Это не «HTMX против React», а история о том, как один разработчик с Python-фокусом довёз пять продуктов до продакшена с жёсткой типизацией и тестами. Грабли Telegram и Stars — особенно ценны. Полный разбор с цифрами — на Habr.