Перейти к основному содержимому

Бэкенд

Зона ответственности бэкенд-разработчика. Раздел — стартовая точка: напарник по бэкенду дополняет и правит по ходу проектирования.

:::note Статус Это предложение архитектуры на основе аналитики (стек NuxtNuxtМета-фреймворк поверх Vue.js. Поддерживает серверный рендеринг (SSR) и режим SPA. Используется для витрины клиента и админок. + DirectusDirectusOpen-source headless-платформа поверх PostgreSQL: даёт модель данных, REST/GraphQL API, аутентификацию, RBAC и готовую админку без написания кода. + PostgresТенантЛогически изолированный клиент в multi-tenant системе. В Ghost Kitchen тенант — это бренд: его данные отделены от других по `brand_id` и правам доступа. + MollieMollieЕвропейский платёжный провайдер. Принимает оплату (карты, iDEAL, Apple/Google Pay и др.) и присылает статус платежа через вебхуки.). Решения помечены как рекомендации — обсуждаемо. :::

Принцип разделения

Бэкенд = Directus (декларативное ядро) + Node-адаптер (императивная логика) поверх одной базы.

Directus — что закрывает без кода

  • Модель данных (коллекции = таблицы Postgres) и связи.
  • REST и GraphQL API над данными — потребляет фронтенд.
  • Аутентификация, токены, refresh, сброс пароля.
  • RBACRBACRole-Based Access Control — управление доступом на основе ролей. Права выдаются роли (Company Admin, Brand Admin, Restaurant Manager), а не каждому пользователю отдельно. и политики доступа на уровне коллекций и строк (изоляция тенантовТенантЛогически изолированный клиент в multi-tenant системе. В Ghost Kitchen тенант — это бренд: его данные отделены от других по `brand_id` и правам доступа. по brand_id).
  • Готовая админка для контент-операций (меню, бренды, пользователи).
  • Загрузка файлов/изображений (S3-совместимое хранилище).

Node-адаптер — что пишем сами

Тонкий сервис (рекомендуется тот же стек, что у фронта — Node/TypeScript; при желании NestJS или лёгкий Nitro/Fastify). Отвечает за то, что выходит за рамки CRUD:

  • Оркестрация оформления заказаCheckoutОформление заказа: ввод контактов и адреса, выбор времени/доставки, оплата и подтверждение. В кастомном стеке полностью под нашим контролем. (расчёт суммы, валидация, резерв).
  • Создание платежа в MollieMollieЕвропейский платёжный провайдер. Принимает оплату (карты, iDEAL, Apple/Google Pay и др.) и присылает статус платежа через вебхуки. и приём вебхуковWebhookHTTP-уведомление, которое внешний сервис (например, Mollie) шлёт платформе при событии — например, «платёж оплачен». Альтернатива постоянному опросу API..
  • Передача заказа в LiefersoftLiefersoftPOS/кассовая система ресторана (Германия) с TSE-фискализацией. Платформа передаёт ей заказы для приготовления и фискального учёта. и приём статусов приготовления.
  • ИдемпотентностьИдемпотентностьСвойство операции давать один и тот же результат при повторе. Защищает от дублей заказа/платежа при повторной доставке вебхука или ретрае., ретраи, dead-letter queueDead-letter queueОчередь для сообщений/задач, которые не удалось обработать после всех повторов. Их разбирают вручную, чтобы не потерять заказ при сбое интеграции., алерты, аудит-лог.

:::tip Граница ответственности Простое правило: читать/редактировать данные → через Directus API; деньги, внешние системы, переходы статусов заказа → через адаптер. Цена и финальные суммы считаются на сервере (адаптере), не доверяем клиенту. :::

Безопасность

  • RBACRBACRole-Based Access Control — управление доступом на основе ролей. Права выдаются роли (Company Admin, Brand Admin, Restaurant Manager), а не каждому пользователю отдельно. + изоляция тенантов по brand_id (политики Directus / проверки в адаптере). Ни один запрос Brand Admin не должен возвращать данные чужого бренда.
  • JWT + refresh-токены (Directus из коробки).
  • TLS везде; секреты в переменных окружения.
  • Вебхуки Mollie — проверка подписи; идемпотентные обработчики.
  • Аудит-лог действий админов (кто создал бренд, изменил цену, отменил заказ).

Хостинг (рекомендация)

КомпонентГдеЗаметка
Витрина/админки (Nuxt)VercelSSR + edge
PostgreSQLNeonmanaged, ветки для preview
Directus + адаптерHetzner VPS (Docker)дёшево, под контролем
ФайлыS3-совместимое (или MinIO)изображения меню

Что дальше