Эта статья — 2я часть серии о создании реальных веб-сервисов с помощью ИИ-инструментов, таких как Cursor.

Первая часть будет полезна, если вы не разбираетесь в том, что такое frontend и backend, базы данных, HTML/CSS/JavaScript и React, но очень хотите сделать проект.

Теперь идём дальше.


Перед тем, как писать техническое задание для вашего продукта, есть один важный вопрос, на который нужно ответить:

Какой стек вы будете использовать?

На первый взгляд, это может казаться чисто техническим решением. Но когда вы создаёте ПО с помощью Cursor, стек фактически становится частью инструкции, которую вы даёте ИИ.

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

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


Выбор фреймворка

Если у вашего продукта есть веб-интерфейс (то есть, пользователи работают с ним через браузер), вам нужен фреймворк, который обрабатывает и frontend, и backend.

Для обоих сервисов, которые построил, я выбрал Next.js. И ни разу не пожалел об этом. Вариантов существует много, но Next.js оказался очень удобным при разработке с участием AI.

Он предоставляет:

  • понятную структуру проекта

  • систему маршрутизации

  • API-эндпоинты

  • серверный рендеринг

  • современную экосистему React

С точки зрения проекта на Cursor, структура проекта имеет огромное значение. ИИ-инструменты работают значительно лучше, когда окружение предсказуемо. Без такой структуры генерация кода довольно быстро начинает превращаться в хаос.


Где будет работать ваш сервер?

Когда фреймворк выбран, следующий вопрос — где приложение будет запускаться. Другими словами, где будет хостинг. Тут сразу отмечу, что оба проекта я делал под глобальный рынок. Для России рекомендуют Timeweb, но я не пробовал.

Vercel

Д��я моего первого проекта я использовал Vercel.

Это довольно естественный выбор при работе с Next.js. Деплой (выгрузка на сервер) происходит при пуше (команда git push) автоматически "из коробки".

Однако со временем я столкнулся с неожиданной проблемой. В некоторых регионах (например, Россия) приложение недоступно без VPN. Поэтому первый проект остался на Vercel, но для второго я решил попробовать что-то другое.

Fly.io

Во втором проекте я перешёл на Fly.io.

Деплой там немного сложнее, чем в Vercel, но его можно автоматизировать. В итоге, мне даже больше понравился Fly.io. Он даёт чуть больше контроля над деплоем и версиями, а также кажется более удобным для масштабирования, если проект начнёт расти.

Интересно, что у Fly.io формально нет бесплатного тарифа, но если ежемесячные расходы ниже $5, они вообще ничего не списывают.


Выбор базы данных

Есть два основных подхода:

Первый — запускать собственную базу данных на своём сервере. Это даёт полный контроль и может быть полностью бесплатным.

Второй — использовать Database as a Service.

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

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

Почему Supabase оказался удобным

Во-первых, Supabase поддерживает векторное хранение данных.

Это оказалось важно для одного из моих проектов, где данные хранились в виде эмбеддингов, созданных с помощью модели OpenAI embedding-3-small. По мере того как ИИ всё глубже интегрируется в программные продукты, нативная поддержка векторных данных становится неожиданно полезной.

Во-вторых, Supabase включает встроенную систему аутентификации. Пользователи могут входить через:

  • Google

  • GitHub

  • email

  • и проч.

Supabase также предоставляет хранилище файлов, позволяющее пользователям загружать изображения и другие файлы без необходимости строить отдельную инфраструктуру.

Ещё одна полезная функция — поддержка RPC-функций. Во втором проекте я полностью отказался от того, чтобы мой бэкенд делал запросы напрямую в таблицы БД, и сделал все через RPC. На практике, ошибок при генерации кода сейчас практически нет.

Также Supabase поддерживает инструменты безопасности, например Row Level Security (RLS).

Недостатки Supabase

Первая проблема, с которой я столкнулся, связана со встроенной системой аутентификации: вход через Google работает нестабильно у пользователей, которые заходят через Safari на iPhone.

Я обнаружил это только спустя примерно 2 месяца разработки, и, фактически, это оказалось невозможно исправить.

Во втором проекте я в итоге использовал только часть системы аутентификации Supabase.

Второй недостаток — цена. Формально у Supabase есть бесплатный тариф, но на практике вы можете всё равно платить около $25–40 в месяц, даже если приложение ещё находится в разработке и у него нет пользователей. Не огромная сумма, но об этом стоит помнить.


Cursor �� ChatGPT: разные роли

Cursor для меня, это основная среда разработки. Существуют и другие IDE, но Cursor показал себя хорошо. Переходить на VS Code, например, и общаться с ботом через командную строку, мне совершенно не хочется пробовать.

Серьёзные минусы — стоимость и постоянные обновления.

Иногда мои расходы на Cursor доходили до $100 в день. Со временем, я научился снижать их. Сейчас, реалистичная оценка — $300 в месяц, если использовать мощные модели.

Понятно, что у Cursor есть базовая подписка за $20, но пользоваться их бесплатной моделью просто невозможно, а лимиты на платные очень маленькие.

ChatGPT всё равно нужен

Даже если вы используете Cursor, всё равно рекомендую иметь подписку ChatGPT Plus.

Cursor → написание и изменение кода
ChatGPT → обсуждение идей и архитектуры

Внутри Cursor модель оптимизирована для генерации кода и стабильности.
Вне Cursor ChatGPT работает более творчески.

Есть простое правило: не просите ChatGPT писать production-код, это бессмысленно, тот же ChatGPT внутри Курсора, а тем более Opus, напишет код точно лучше.

ChatGPT для визуала

Ещё одно неожиданное применение ChatGPT, генерация изображений.

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

Вместо покупки ассетов или найма дизайнеров на каждую итерацию я генерировал большую часть визуалов напрямую через ChatGPT.

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


Инструменты дизайна

Многие используют Figma, чтобы спроектировать интерфейс перед написанием кода.

Лично я почти не пользовался этим. Cursor генерирует разумные UI-макеты самостоятельно, после чего корректирую их вручную.

Тем не менее, если вы предпочитаете сначала проектировать интерфейсы, Figma может быть очень полезна. У Google также есть полезный проект Google Stitch, который превращает дизайн в рабочий код.

Теоретически вы можете:

  1. сделать дизайн в Figma

  2. сгенерировать шаблоны через Stitch

  3. затем превратить эти шаблоны в React-компоненты


Email и ещё кое что

Большинству приложений рано или поздно нужно отправлять email.

Для этого я использовал простой сервис Resend.

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

Если архитектура изначально спроектирована правильно, кеширование всегда можно добавить позже.


Нужен ли Docker?

В обоих проектах мне удалось полностью обойтись без Docker.


Железо важнее, чем кажется

Один неожиданный урок вообще не был связан с программированием.

Ваше железо имеет значение. Cursor удобнее, когда у вас достаточно пространства на экране, чтобы видеть несколько панелей одновременно. Я начал разработку на маленьком 13-дюймовом планшете. Технически это работало, но было крайне неудобно. Переход на 27-дюймовый монитор радикально улучшил рабочий процесс.

Cursor также может быть довольно требовательным к ресурсам, поэтому мощный компьютер действительно помогает.


Операционная система

Для контекста — весь этот эксперимент я проводил на Windows.

Однако, ничего в этом стеке не зависит конкретно от Windows, кроме постоянных попыток ИИ писать команды через символ && (но это лечится правилами, о которых напишу позже). Та же конфигурация отлично работает и на macOS или Linux.


Минимальный стек

Если сильно сжать, мой стек выглядит так:

Framework: Next.js
Database: Supabase
Hosting: Fly.io
IDE: Cursor
Chat: ChatGPT
Email: Resend

Этого оказалось более чем достаточно, чтобы построить реально работающие продукты.


Что дальше

Теперь можно перейти к следующему шагу.

Перед тем, как писать код, нужно чётко описать продукт.

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

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