Где задеплоить проект, собранный в Cursor

Cursor пишет код по описанию: вы просите — и через полчаса в папке лежит рабочий проект, который открывается по адресу localhost:3000, пока открыт редактор. Закройте ноутбук — и проекта в интернете нет. Между «работает у меня» и «работает по ссылке» лежат несколько правок, которые Cursor сделает по первой просьбе. Рассказываем по шагам, что поправить и как получить HTTPS-адрес на Dockbox.

Что Cursor пишет и чего в этом коде нет

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

  • Файла зависимостей. requirements.txt для Python или package.json для Node.js — по нему сервер поймёт, что устанавливать.
  • Порта из переменной окружения. Модель ставит число, удобное здесь: 3000, 5000, 8000. На сервере порт назначает платформа.
  • Секретов вне кода. Токен бота или ключ платного API нередко остаётся прямо в файле рядом с логикой.
  • Места для данных. Если проект пишет базу файлом рядом с кодом, при первой же пересборке она обнулится.

Это не ошибка редактора: он решает задачу «написать код», а не «держать его в интернете». Дальше — пять шагов, каждый из которых Cursor закроет сам, если попросить.

Шаг 1. Определите, что именно вы собрали

Всё остальное зависит от типа проекта. Сайт открывается по ссылке, бот сам пишет в мессенджер и своего адреса не требует, а фоновый скрипт просто работает и делает своё дело. Посмотрите, что поднимается при запуске: веб-сервер (Flask, FastAPI, Express, Next.js) — значит, будет ссылка; библиотека мессенджера — значит, бот.

Заодно загляните в файл с командами:

"scripts": {
  "dev": "vite",
  "build": "vite build",
  "start": "node server.js"
}

Если есть start, проект запускается как приложение и должен слушать порт из окружения. Если только build — у вас статика, и адрес получится ещё проще.

Шаг 2. Уберите порт и localhost из кода

Самая частая причина «собралось, а ссылка пустая»: приложение слушает не там, куда приходит трафик. Cursor почти всегда пишет адрес так, как удобно на вашем компьютере.

Плохой вариант:

app.run(host="127.0.0.1", port=5000)

Правильный — порт из переменной PORT, адрес 0.0.0.0:

port = int(os.environ.get("PORT", 5000))
app.run(host="0.0.0.0", port=port)

Правка на две строки. Просто попросите Cursor: «бери порт из переменной окружения PORT и слушай 0.0.0.0». Для Node.js это process.env.PORT, для Go — os.Getenv("PORT").

Шаг 3. Вынесите ключи в переменные окружения

Второй след ИИ-кода — токен или ключ прямо в файле. Так делать нельзя хотя бы потому, что код вы будете показывать, кому-то отдавать или заливать в Git.

Плохой вариант:

BOT_TOKEN = "7123456789:AAG..."

Правильный:

BOT_TOKEN = os.environ["BOT_TOKEN"]

Для Python это os.environ, для Node.js — process.env. Значения задаются отдельно, в разделе секретов панели: при настройке проекта платформа спросит их и подставит в зашифрованном виде, так что они не попадут ни в архив, ни в репозиторий. Файл .env, если он есть в папке, в архив не кладите.

Шаг 4. Соберите чистый архив

Проект из Cursor — обычная папка. Забирайте её целиком, но без служебных каталогов: они в разы тяжелее самого кода и всё равно пересоздаются при сборке.

.venv/
node_modules/
__pycache__/
dist/
.cursor/

Список зависимостей, наоборот, оставьте: requirements.txt, package.json вместе с package-lock.json, go.mod. Второй путь — отправить код в GitHub прямо из Cursor, включая приватный репозиторий: тогда обновления выкатываются одним действием в панели.

Шаг 5. Загрузите проект и подключите домен

Загрузите архив или подключите репозиторий: Dockbox определит язык, поставит зависимости, соберёт проект и выдаст публичный HTTPS-адрес. Если что-то пошло не так, причина видна в логах панели — обычно это отсутствующая библиотека или список зависимостей, собранный через pip freeze вместе с локальными путями вашей машины.

Публичного адреса хватает для теста и для показа проекта. Для постоянного сайта подключите свой домен: укажите его в панели и пропишите DNS-запись на адрес проекта — сертификат HTTPS выпустится сам, а ссылка останется прежней при всех следующих обновлениях кода.

Сколько это стоит и как работают контейнеры

Starter — 990 ₽/мес, первый месяц бесплатно: 1 vCPU, 2 ГБ RAM, 20 ГБ SSD, один проект. Контейнеры работают постоянно — ни лимита по часам, ни засыпания при простое: ссылка отвечает в момент открытия, без «прогрева» после паузы.

Pro — 2 490 ₽/мес: 2 vCPU, 4 ГБ RAM, до пяти проектов — если фронтенд живёт вместе с сервером или проектов несколько. Team — 4 990 ₽/мес — для команд с запасом ресурсов. Отдельного счёта за сборки и трафик нет, упавший процесс платформа перезапускает сама, а тариф действует месяц и сам не списывается.

Частые вопросы

Надо ли выкладывать код через Git, если проект писал Cursor?

Нет. Достаточно архива: уберите из папки служебные каталоги и загрузите её. Git удобнее, если проект будет развиваться — Cursor умеет отправить код в репозиторий, включая приватный, а обновление потом выкатывается одним действием в панели.

Проект открывается в Cursor, но ссылка не работает. Почему?

Почти всегда из-за жёстко прописанного порта или адреса localhost: приложение слушает не там, куда приходит трафик. Уберите свои значения, читайте порт из переменной PORT и слушайте 0.0.0.0. Вторая причина — проект падает при старте, и это видно в логах панели.

Что делать с ключами API, которые Cursor вставил в код?

Вынести в переменные окружения и удалить из файлов. Значения задайте в секретах проекта: они хранятся в зашифрованном виде, а код читает их из окружения. Если ключ уже попал в Git, считайте его скомпрометированным и выпустите новый.

Нужно ли разбираться в коде, который написал Cursor?

Глубоко — нет. Достаточно трёх вещей: порт из переменной окружения, секреты вне кода и данные в постоянном хранилище. Сборку, запуск и перезапуск после сбоя платформа берёт на себя, а сами правки Cursor внесёт по вашему запросу.

Где хранить базу данных, если Cursor создал её файлом?

Сам файл остаётся рабочим, но жить он должен в постоянной папке /data: то, что лежит там, переживает обновление кода и перезапуск, а файлы рядом с кодом пересоздаются при каждом деплое. Путь к базе удобно задавать переменной окружения, чтобы он отличался локально и на сервере.