Дровяная
«Дровяная» — мой демо-проект: сайт пиццерии, где заказ можно написать словами, как другу. Фраза «две пепперони большие без лука и колу к семи на Ленина 5» превращается в чек, уходит на кухню и возвращается статусом клиенту — на страницу заказа и в Telegram. Внутри разбор текста, бот, панель кухни и админка с CRM.

Задача
Показать, что заказ в общепите не обязан быть двадцатью тапами по карточкам: человек уже знает, чего хочет, и быстрее всего написать это одной фразой.
Собрать не витрину, а рабочий контур: заказ с сайта и из Telegram, кухня, статусы клиенту, управление меню и база клиентов — всё то, чем заведение пользуется каждый день.
Что сделано
- Заказ обычной фразой: количество, размер, «без лука», добавки, время («к семи», «полдевятого», «через час»), адрес и самовывоз
- Разбор понимает опечатки и текст, набранный в латинской раскладке
- Черновик заказа собирается сразу под строкой: состав, цены, доставка, итог и вопросы, если чего-то не хватает
- Меню из 24 позиций: пиццы, закуски, десерты и напитки, три размера, добавки — цена пересчитывается на лету
- Колесо вкусов и карточки, где при выборе размера меняется сама пицца, а не масштаб фотографии
- Корзина и оформление: доставка или самовывоз, время, комментарий курьеру
- Страница заказа с живым статусом: «принят — готовим — готово — курьер выехал», без перезагрузки
- Кнопка «получать статусы в Telegram» — дальше клиент не держит вкладку открытой
- Повтор прошлого заказа одной кнопкой, с пересчётом по актуальным ценам
- Telegram-бот: тот же разбор в чате, карточка заказа, подтверждение и уведомления о статусах
- Мини-приложение в Telegram открывает сайт с той же корзиной
- Панель кухни: колонки по статусам, новые заказы прилетают сами, звук на новый заказ, вход по паролю
- Админка: редактор меню (цены по размерам, состав, синонимы для разбора, наличие, порядок, архив)
- Админка: заказы с поиском и фильтрами, ручная смена статуса, настройки заведения — часы, зоны и цена доставки, минимальный заказ
- CRM: карточки клиентов, сегменты «новые / постоянные / спящие», сумма и средний чек, заметки, выгрузка в csv
- Сводка: выручка и средний чек за день и неделю, что заказывают, в какие часы приходят заказы
- Карта доставки на Яндексе с зонами и ценой по каждой
- Ограничения на разбор: лимиты по ip и на пользователя Telegram, отсев мусорных фраз до обращения к модели
Детали
Разбор устроен в два слоя. Сначала работают правила: они читают числа, размеры, время, адрес и сверяют слова с меню — включая опечатки и раскладку. Сверху подключается GigaChat через function calling. Если модель молчит, тормозит или выдумывает позицию, которой в тексте не было, заказ всё равно соберётся по правилам, а выдуманное отсеется.
На разбор навешаны лимиты: мусорные фразы до модели вообще не доходят, у каждого ip и каждого пользователя Telegram свой счётчик в час и в сутки. Демо открыто всему интернету, и оплачивать чужие развлечения я не собирался.
Кухня и страница заказа обновляются по SSE: сервер сам присылает изменение статуса, клиент ничего не опрашивает. Заказ, оформленный на сайте, появляется на кухне за долю секунды.
Меню лежит в базе, а не в коде: правки в админке сразу меняют витрину, корзину, разбор текста и ответы бота. Синонимы к позициям тоже правятся в админке — «ббк» или «острая с колбасой» начинают пониматься без релиза.
База — sqlite в режиме WAL: для заведения с сотней заказов в день этого хватает с большим запасом, а обслуживать нечего.
Деплой одной командой: сборка, выкладка по ssh в отдельный релиз, переключение симлинка, рестарт, health-check и автоматический откат, если новая версия не поднялась. 250 тестов на разбор текста гоняются до сборки.
Как это выглядит внутри






