24 мар. 2025 г.·7 мин

API gateway vs BFF для веб‑ и мобильных клиентов: компромиссы

API gateway vs BFF: узнайте, как каждый паттерн влияет на версионирование, производительность и разделение публичных и внутренних эндпоинтов для веб‑ и мобильных приложений.

API gateway vs BFF для веб‑ и мобильных клиентов: компромиссы

Проблема: один бэкенд, много клиентов, разные потребности

Часто всё начинается просто: один бэкенд предоставляет набор эндпоинтов, и и веб‑приложение, и мобильное приложение их вызывают. Кажется эффективным — одно место для фич, фиксирования багов и правил.

Потом приходит реальность. Веб‑интерфейс часто требует плотных экранов, фильтров, экспортов и админских действий. Мобильное приложение обычно нуждается в меньшем наборе полей, более быстрых экранах, потоках, дружелюбных к офлайну, и экономии батареи и трафика. Даже если фича «та же самая», оптимальная форма API для каждого клиента редко совпадает.

Со временем эндпоинты дрейфуют. Веб‑команда добавляет поля для нового табличного вида. Мобильные просят убрать тяжёлые payload‑ы и объединить несколько вызовов в один. Кто‑то добавляет параметр «только для iOS». Другой человек переиспользует внутренний админ‑эндпоинт в публичном приложении, потому что он «уже был». То, что начиналось как единый чистый API, превращается в коллекцию компромиссов.

Риски проявляются быстро:

  • Ломающиеся изменения, когда один клиент выпускается быстрее другого
  • Замедление приложений из‑за больших payload‑ов или слишком большого числа запросов
  • Усложнение кода бэкенда, когда каждый энтпоинт пытается обслуживать всех клиентов
  • Случайное раскрытие данных, когда внутренние поля или действия прорываются в публичные API
  • Боль при версионировании, потому что «маленькие изменения» для старых клиентов не такие уж и маленькие

Это основная напряжённость, лежащая в основе дебатов вокруг API gateway vs BFF. Нужно стабильное публичное API, на которое могут опираться мобильные и веб, но при этом давать каждому клиенту пространство для эволюции в своём темпе.

API gateway и BFF: что это такое (и чего это не заменяет)

API‑шлюз — это "парадная дверь" для ваших API. Клиенты вызывают шлюз, а он маршрутизирует запросы к нужным сервисам. Часто шлюз обрабатывает общие заботы, которые не хочется дублировать везде: проверки аутентификации, лимиты запросов, логирование и базовое формирование запросов/ответов.

Backend‑for‑frontend (BFF) — это небольшой бэкенд, написанный для одного конкретного клиента или группы клиентов, например «веб» и «мобильный». Клиент вызывает свой BFF, а он обращается к нижележащим сервисам. Ключевая идея — фокус: BFF может говорить на языке клиента (экраны, потоки, payload‑ы), даже если базовые сервисы остаются более универсальными.

Эти паттерны не заменяют хорошие доменные сервисы или чистую модель данных. Ваши основные сервисы, базы данных и бизнес‑правила должны оставаться источником правды. Шлюз или BFF не должны превращаться в гигантский комок бизнес‑логики, который со временем станет вашим реальным бэкендом.

Проще различать их так:

  • Шлюз: одна точка входа, общие заботы, маршрутизация и защита
  • BFF: клиент‑специфичные API, уменьшающие работу клиента и скрывающие внутреннюю сложность

Их можно комбинировать. Обычная схема — шлюз как публичный край, а за ним отдельные BFF для веба и мобайла. Шлюз решает внешнюю безопасность и правила трафика, а каждый BFF формирует ответ под клиента.

Как меняется путь запроса в каждом паттерне

Главное различие между API‑шлюзом и BFF — где вы размещаете логику «парадной двери»: маршрутизацию, проверки аутентификации и формирование ответов.

С API‑шлюзом клиент обычно общается с одной общей точкой входа. Шлюз форвардит запросы внутренним сервисам, выполняя базовые задачи: валидация токенов, лимиты, маршрутизация по пути.

С BFF каждый тип клиента (веб, iOS, Android) вызывает бэкенд, созданный специально для него. BFF вызывает внутренние сервисы и возвращает ответ, адаптированный под экран и ограничения клиента.

Простая визуализация пути запроса:

  • API gateway path: Client -> Gateway -> Service(s) -> Response
  • BFF path: Client -> BFF (web or mobile) -> Service(s) -> Response

Владение тоже часто смещается. Шлюз обычно держит платформа или infra‑команда, потому что это влияет на все команды и сервисы. BFF чаще принадлежит feature‑команде, потому что он развивается вместе с UI и его релизным циклом.

Аутентификация обычно течёт так: клиент отправляет токен, крайний слой (шлюз или BFF) валидирует его или передаёт в auth‑сервис, а затем форвардит детали идентичности (user id, роли) вниз по цепочке. Различие — где применяются правила клиента. В шлюзе политики обычно общие и единообразные. В BFF можно добавить client‑специфичное формирование: вернуть меньший payload для мобильного или объединить несколько вызовов в один ответ для медленных сетей.

Именно на этапе формирования ответов BFF выглядят выгодно, но это добавляет больше движущихся частей для деплоя и согласования.

Безопасное разделение публичных и внутренних эндпоинтов

Публичный эндпоинт — любой маршрут API, до которого могут добраться веб‑приложение, мобильное приложение, партнёры или сторонние. Относитесь к нему как к потенциально враждебному: вы не контролируете сеть и код клиента.

Внутренний эндпоинт предназначен для сервис‑ту‑сервис трафика внутри вашей системы. Он может меняться быстрее, предполагать больше контекста и выдавать более подробные данные, но никогда не должен быть напрямую доступен из интернета.

С API‑шлюзом разделение часто физическое и простое: наружу выставлен только шлюз, который решает, какие внешние маршруты существуют. Всё остальное остаётся приватным. Это даёт вам возможность делать внутренние сервисы выразительнее, а публичную поверхность — меньше и безопаснее.

С BFF разделение больше про границы продукта. Каждый клиент (веб, iOS, Android) обращается только к своему BFF, а BFF вызывает внутренние сервисы. Это позволяет скрыть сложность: BFF может вызвать три сервиса, собрать результаты и вернуть один простой ответ, соответствующий реальным потребностям клиента.

Разделение будет безопасным только при наличии практических контролей:

  • Специфичная авторизация: роли и scope по маршруту, а не один переключатель «вошёл в систему»
  • Лимиты: по пользователю, токену и IP для публичных маршрутов
  • Фильтрация payload‑ов: возвращайте только то, что нужно клиенту — убирайте внутренние ID, отладочную информацию и поля только для админов
  • Чёткие allowlist’ы: какие эндпоинты публичны, какие — только для внутреннего использования

Пример: мобильному приложению нужен экран «Мои заказы». BFF может выставить /orders с только статусом и итогами заказа, а внутренний сервис хранит детальные раскладки стоимости и флаги по мошенничеству приватно.

Версионирование: что упрощается, а что усложняется

Держите правила шлюза простыми
Переносите бизнес‑правила в визуальные процессы, а не разбрасывайте их по конфигам шлюза.
Добавить логику

Боль от версионирования чаще всего проявляется, когда веб и мобильный идут с разной скоростью. Веб‑команда может выпустить и откатить изменения за часы. Мобильное приложение может ждать дней или недель из‑за ревью в сторах и пользователей, которые не обновляются. В этом разрыве решение между шлюзом и BFF становится практичным.

С API‑шлюзом вы можете сделать версионирование у единой «передней двери» (например, /v1/..., /v2/...). Это просто в объяснении и маршрутизации. Минус в том, что шлюз может превратиться в «музей версий», если многие клиенты и интеграции будут держаться за старые версии. Придётся дольше поддерживать старые формы данных.

С BFF версионирование чаще «по клиенту». Мобильный BFF может оставаться на старом контракте, пока веб‑BFF двигается быстрее, даже если оба общаются с одними и теми же внутренними сервисами. Это уменьшает давление по поддержке старых публичных версий. Компромисс — больше движущихся частей: нужно управлять и деплоить больше решений о версиях.

Версионирование внутри сервисов тоже возможно, но оно пробрасывает клиентские требования глубже в систему и усложняет чтение кода, потому что бизнес‑логика начинает ветвиться по версиям клиентов.

Небьющие изменения — ваши лучшие друзья: добавление опциональных полей, добавление новых эндпоинтов или принятие дополнительных входных полей. Бьющие изменения включают переименование поля, смену типа (строка → число) или удаление эндпоинта.

Депрекация работает лучше, когда она спланирована:

  • Назначьте четкую дату окончания поддержки и сообщайте заранее
  • Отслеживайте использование старой версии (логи, метрики) и ищите отстающих
  • Сначала обновите клиентов (особенно мобильные), потом удаляйте старый путь
  • Возвращайте понятную ошибку, когда старая версия окончательно заблокирована

Производительность: задержки, размер payload‑а и число вызовов

Производительность в схеме API gateway vs BFF — это в основном компромисс: один дополнительный хоп внутри системы против меньшего количества хопов по сети от клиента. Самый быстрый вариант часто тот, который уменьшает медленные и ненадёжные клиентские сетевые вызовы, даже если добавляет небольшой серверный шаг.

BFF часто выигрывает, когда клиент в противном случае сделал бы много вызовов. Вместо того чтобы веб и мобильный делали пять запросов и склеивали результаты на устройстве, BFF может получить всё сервер‑сторой и вернуть один ответ. Это обычно снижает общую задержку на мобильных, потому что сотовые сети добавляют задержку на каждый запрос.

Типичные выигрыши в производительности от шлюза или BFF:

  • Агрегация: объединение данных из нескольких сервисов в один ответ
  • Умное кэширование: кэширование на краю или в BFF для экранов с высокой частотой чтения
  • Меньшие payload‑ы: возвращайте только нужные поля
  • Меньше кругов: сокращение «чатти» со стороны клиента
  • Единые правила сжатия и таймаутов: применяйте дефолты в одном месте

Но паттерн может и навредить. Каждый дополнительный слой добавляет работу CPU и места, где можно ждать. Если вы дублируете одну и ту же логику агрегации для веба и мобильных, вы удваиваете работу и рискуете получить неконсистентное поведение. Перегрузка данными — ещё одна частая проблема: универсальный эндпоинт, пытающийся удовлетворить все экраны, может возвращать огромные payload‑ы, которые тратят время и трафик.

Мобильные особенности обостряют эти компромиссы. Нестабильные сети означают ретраи и таймауты; каждый лишний запрос съедает батарею. «Холодные старты» тоже важны: если приложению нужно несколько запросов, прежде чем первый экран станет полезным, пользователь это чувствует.

Практическое правило: сначала оптимизируйте число клиентских запросов, потом — добавленный хоп.

Быстрая оценка дизайна

Если экран требует более 2–3 последовательных вызовов, подумайте об агрегации. Если ответы большие и в основном неиспользуемые, подумайте о разделении эндпоинтов или использовании BFF, настроенного под конкретного клиента.

Операции: деплой, мониторинг и масштабирование

Создайте стабильный ядро‑бэкенд
Моделируйте данные в PostgreSQL и генерируйте Go-бэкенд, который можно безопасно развивать.
Начать создание

Главный операционный вопрос при выборе API gateway vs BFF — сколько движущихся частей вы готовы запускать и поддерживать. Шлюз часто становится общей инфраструктурой для многих команд и клиентов. BFF‑ы обычно меньше, но их может быть по одному на каждый клиент (веб, iOS, Android, партнёр), что увеличивает нагрузку на релизы и on‑call.

В тестировании и релизах шлюз безопаснее, когда вам в основном нужна маршрутизация, авторизация и лимиты. Изменения централизованы, поэтому одна ошибка может повлиять на всех. BFF‑ы уменьшают радиус поражения: изменение только для веба деплоится в веб‑BFF, а не в мобильный. Цена — больше конвейеров и версий в поле.

Для наблюдаемости нужно уметь проследить один пользовательский запрос через все слои, особенно когда один мобильный вызов запускает несколько бэкенд‑вызовов.

  • Используйте correlation ID и передавайте его через шлюз, BFF и логи бэкенда
  • Снимайте трейсы, чтобы видеть, где тратится время (шлюз, BFF, downstream‑сервис)
  • Держите структурированные логи (клиент, эндпоинт, код ответа, задержка, размер payload‑а)
  • Отслеживайте по эндпоинту ключевые метрики: уровень ошибок, p95‑латентность, пропускная способность

Масштабирование выглядит иначе. Шлюз — общий узел: он должен выдерживать пики и горячие эндпоинты, не становясь бутылочным горлышком. BFF‑ы позволяют масштабировать по клиентам, что помогает, когда веб‑трафик скачет в рабочие часы, а мобильный остаётся стабильным.

При инцидентах сбои будут выглядеть по‑разному. Со шлюзом проблемы часто проявляются массовыми 5xx или проблемами с авторизацией. С BFF‑ами проблемы чаще изолированы под одним клиентским фичей. Делайте понятные рукописи по инцидентам и простые fallback‑поведения (например, вернуть сокращённый ответ вместо таймаута).

Как выбрать: простой пошаговый процесс принятия решения

Избегайте долгосрочной привязки к бэкенду
Получайте реальный исходный код, который можно развернуть в облаке или экспортировать для самостоятельного хостинга.
Сгенерировать код

Выбор между API‑шлюзом и BFF — это меньше теория и больше то, что нужно вашим клиентам в повседневной работе.

Практичный поток принятия решения

  1. Начните с клиентов, а не с серверов. Перечислите все поддерживаемые клиенты (веб‑приложение, iOS, Android, партнёрский API, внутренний админ) и опишите, что нужно для каждого ключевого экрана. Если один и тот же экран «Данные клиента» требует разных полей и разных паттернов вызовов в разных клиентах, это сильный сигнал в пользу клиент‑специфической формовки.

  2. Замапьте текущее состояние. Возьмите существующие эндпоинты и отметьте, что общее (ядро домена: заказы, платежи, пользователи), а что сформировано под представление (сводка для дашборда, объединённый payload для "home screen"). Общие части — в доменных сервисах. Части, сформированные под представление, обычно лучше размещать в BFF.

  3. Решите, где должна жить логика формирования и правил. Если вам нужны в основном маршрутизация, авторизация, лимиты, кэш и безопасное выставление публичных и внутренних эндпоинтов — естественное место для этого шлюз. Если нужна реальная композиция (вызов нескольких сервисов, превращение шести вызовов в один, разные payload‑ы для приложений), поместите логику в BFF, чтобы она оставалась тестируемой и читаемой.

  4. Выберите подход к версионированию и депрекации, который вы действительно будете соблюдать. Например: "без бьющих изменений без новой версии, и каждое устаревшее поле поддерживается 90 дней." С подходом только через шлюз вы, возможно, будете версионировать публичную поверхность и переводить за ней. С BFF вы чаще оставляете ядро API стабильным и версионируете лишь BFF‑эндпоинты по клиентам.

  5. Планируйте rollout и измеряйте. Перед изменениями снимите базовые метрики: p95‑латентность, число вызовов на экран, размеры payload‑ов и уровень ошибок. Делайте релизы сначала для небольшой доли трафика, сравнивайте и расширяйте.

Простой пример: если мобильное приложение выпускается раз в месяц, а веб‑портал — ежедневно, небольшой мобильный BFF может защитить приложение от частых изменений бэкенда, пока веб продолжает быстро двигаться.

Пример: веб‑портал + мобильное приложение с разными скоростями релизов

Представьте компанию с клиентским порталом на вебе и полевым мобильным приложением. Оба нуждаются в одних и тех же данных: клиенты, задания, счета и сообщения. Портал меняется еженедельно. Мобильное приложение обновляется медленнее из‑за ревью в сторе и необходимости работать при слабом сигнале.

Боль проявляется быстро. Мобильные пользователи хотят компактные ответы, меньше вызовов и потоки, поддерживающие офлайн‑режим (например, скачать задания на день и синхронизировать изменения позже). Веб‑портал нормально делает больше вызовов и загружает более богатые экраны.

Вариант A: шлюз перед стабильными сервисами

Выбирая шлюз, вы оставляете бэкенд‑сервисы в основном без изменений. Шлюз обрабатывает аутентификацию, маршрутизацию и мелкие правки вроде заголовков, лимитов и простого маппинга полей.

Версионирование в основном остаётся на уровне сервисов — это упрощает картину. Но мобильные изменения часто движут вас к широким версиям вроде /v2, потому что подлежащие эндпоинты общие.

Экспозиция эндпоинтов проще, если вы рассматриваете шлюз как единственную публичную дверь. Внутренние сервисы остаются за ним, но нужно строго контролировать, что шлюз может достучаться и что он публикует.

Вариант B: мобильный BFF, говорящий на «мобильном» языке

С мобильным BFF мобильное приложение вызывает эндпоинты, спроектированные под мобильные экраны и синки. BFF может агрегировать данные (детали задания + клиент + последнее сообщение), обрезать поля и вернуть один payload, который соответствует потребностям приложения.

Чего это даёт:

  • Версионирование проще по клиенту: можно версионировать мобильный BFF, не заставляя веб двигаться вместе
  • Часто лучше производительность для мобильных: меньше вызовов и меньшие ответы
  • Чёткое разделение публичного и внутреннего: BFF публичен, он вызывает внутренние сервисы, которые не должны быть экспонированы

Частые ошибки и ловушки, которых стоит избегать

Роллаут безопасно на одной платформе
Развертывайте в AppMaster Cloud или в вашей среде на AWS, Azure или Google Cloud.
Развернуть сейчас

Главная ловушка — превращение шлюза в мини‑бэкенд. Шлюзы хороши для маршрутизации, auth, лимитов и простого формирования запросов/ответов. Если набить их бизнес‑правилами, вы получите скрытую логику, которую сложно тестировать, отлаживать и легко сломать при правке конфига.

BFF может пойти по противоположному пути: команды создают BFF под каждый экран или фичу, и поддержка взрывается. BFF обычно должен соответствовать типу клиента (веб, iOS, Android) или ясной продуктовой области, а не каждому UI‑виду. Иначе вы начнёте дублировать правила в десятках мест, и управление версиями превратится в постоянную работу.

Ошибки в версионировании часто происходят от крайностей. Если вы версионируете всё с самого начала, вы замораживаете API и будете вечно поддерживать старые варианты. Если никогда не версионируете, вы в итоге выпустите ломающее изменение без предупреждения. Простое правило работает: не версионировать для небольших добавлений, но вводить новую версию при удалении или смене смысла.

Публичные vs внутренние эндпоинты — место, где команды чаще всего страдают. Экспонирование внутренних сервисов в интернет (даже «временно») превращает любое внутреннее изменение в потенциальный инцидент или брешь безопасности. Держите границу: публично доступен только шлюз или BFF, внутренние сервисы остаются приватными.

Проблемы с производительностью обычно самосделанные: огромные payload‑ы, слишком много вызовов и отсутствие «бюджета» на задержки. Например, мобильному приложению может быть нужен только статус и итог заказа, а оно получает полный объект заказа с каждой строкой и служебными полями — это делает каждый запрос медленным в сотовой сети.

Сигналы тревоги:

  • В конфиге шлюза встречаются бизнес‑понятия вроде «правила возврата» или «VIP‑правила»
  • BFF размножаются быстрее, чем клиенты, которым они служат
  • Вы не можете объяснить стратегию версионирования одним предложением
  • Внутренние сервисы доступны из интернета
  • Ответы растут, потому что «вдруг понадобится позже»

Быстрый чеклист и следующие шаги

Если вы застряли в выборе API gateway vs BFF, сосредоточьтесь на том, что сломается первым в реальном мире: релизы, payload‑ы и границы безопасности.

Быстрый чеклист

Если вы отвечаете «нет» на несколько пунктов, текущее решение скорее всего начнёт мешать по мере роста клиентов:

  • Можете ли вы изменить один бэкенд‑сервис без того, чтобы все клиенты обновлялись в одну и ту же неделю?
  • Есть ли чёткая граница между публичными эндпоинтами (подходящими для интернета) и внутренними (только для доверенных систем)?
  • Получают ли веб и мобильный только то, что им нужно (а не тяжёлый «kitchen sink»)?
  • Можете ли вы выкатывать изменения постепенно (малый процент) и быстро видеть ошибки, задержки и аномальный трафик?
  • Известно ли, кто владеет контрактом для каждого эндпоинта и кто согласовывает ломаюшие изменения?

Следующие шаги

Превратите ответы в план. Цель не в идеальной архитектуре, а в том, чтобы было меньше сюрпризов при релизах.

Опишите контракт API простым языком (входы, выходы, коды ошибок, что разрешено менять). Выберите модель владения: кто отвечает за потребности клиента (веб/мобильный), а кто — за доменные сервисы. Решите, где жить версионированию (по клиенту или централизованно) и установите правило депрекации, которое будете соблюдать.

Добавьте базовый мониторинг перед крупными рефакторингами: скорость запросов, p95‑латентность, уровень ошибок и топ‑эндпоинтов по размеру payload‑а. Прототипируйте самые рискованные клиентские потоки в первую очередь.

Если вы строите с AppMaster (appmaster.io), практичный подход — держать основную бизнес‑логику и модели данных в генерируемом бэкенде, а тонкий шлюз или слой BFF добавлять только там, где клиент действительно требует другого формирования payload‑а или изоляции релизов.

Если чеклист даёт много «нет», примите это за сигнал: упростите контракт и ужесточите разделение публичного и внутреннего, прежде чем добавлять новые эндпоинты.

Вопросы и ответы

When should I use an API gateway instead of a BFF?

Начните с API‑шлюза, когда вам нужен один публичный вход с общими контролями — проверка аутентификации, лимиты запросов и маршрутизация. Добавляйте BFF, когда у веба и мобильных явно разные payload‑ы, нужно сократить число клиентских запросов или обеспечить независимые циклы релизов.

What logic should live in the gateway vs in a BFF?

Шлюз хорош для сквозных забот и контроля трафика на краю — маршрутизация, принудительная аутентификация, лимиты. BFF выполняет композицию, нужную клиенту: объединяет вызовы нескольких сервисов, убирает лишние поля и формирует ответ под экран. Избегайте переноса бизнес‑логики в шлюз.

How does versioning differ between a gateway-only approach and a BFF approach?

Шлюз даёт одну версионируемую «переднюю дверь», это просто и прозрачно, но вы можете долго поддерживать старые версии. BFF позволяет версионировать по клиентам: мобильный BFF остаётся стабильным, пока веб идёт вперёд. Цена — больше сервисов и контрактов для поддержки.

What’s the safest rule for avoiding breaking changes for mobile and web?

По умолчанию предпочитайте небьющие изменения: добавление опциональных полей или новых эндпоинтов. Вводите новую версию, когда удаляете поля, переименовываете их, меняете типы или смысл — потому что мобильные клиенты могут не обновиться неделями.

How do I safely separate public endpoints from internal endpoints?

Держите внутренние сервисы приватными и выставляйте наружу только шлюз или BFF. Фильтруйте ответы так, чтобы клиенты получали только необходимое, и применяйте авторизацию на уровне маршрута, чтобы внутренняя админская операция не стала доступна только потому, что пользователь залогинен.

Will adding a gateway or BFF make my app slower?

Когда клиент иначе сделал бы много последовательных вызовов, BFF часто быстрее: сервер собирает данные и возвращает один отклик, что сокращает задержки по мобильным сетям. Шлюз добавляет дополнительный хоп, поэтому держите его лёгким и замеряйте задержки и размеры payload‑ов, чтобы не получить незаметные тормоза.

Which pattern is easier to operate and troubleshoot?

Шлюз — общий узел, и неправильная конфигурация может повлиять на всех клиентов. BFF уменьшает радиус поражения, потому что изменения изолированы под конкретный клиент, но увеличивает число деплоев, наблюдения и on‑call нагрузки.

What monitoring should I add for a gateway/BFF setup?

Пропускайте корреляционный ID через шлюз/BFF и все downstream‑сервисы, чтобы один пользовательский запрос можно было проследить сквозь систему. Снизу вверх отслеживайте: ошибка/код ответа, p95‑латентность, throughput и размер payload‑а по эндпоинтам.

What are the most common mistakes with API gateways and BFFs?

Частая ошибка — накапливание бизнес‑правил в конфигурациях шлюза: это трудно тестировать и легко сломать при правке. Другая ошибка — создание слишком большого числа BFF (по экрану): логика дублируется, версиями управлять тяжело и поддержка растёт экспоненциально.

How can I apply this if I’m building with AppMaster?

Держите базовые модели данных и бизнес‑процессы в генерируемом бэкенде, а тонкий шлюз или клиент‑специфичный BFF добавляйте только там, где действительно нужно формировать другой payload или изолировать релизы. В AppMaster это часто означает стабильные доменные эндпоинты в сгенерированном Go‑бэкенде и небольшой слой для мобильной агрегации или обрезки полей.

Легко начать
Создай что-то невероятное

Экспериментируйте с AppMaster с бесплатной подпиской.
Как только вы будете готовы, вы сможете выбрать подходящий платный план.

Попробовать AppMaster