← Усі статті

П'ять продуктів в одному 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.