Cursor уверенно пишет Telegram-бота: выдаёт main.py на 200 строк, добавляет обработчики команд, клавиатуру и логирование. Проблема начинается на следующем шаге — бот живёт ровно столько, сколько открыт ваш ноутбук, а отвечать людям он должен круглосуточно. Рассказываем по шагам, как довести код из Cursor до работающего бота: где взять токен у BotFather, как вынести его из кода, что положить рядом с проектом и как задеплоить всё это на Dockbox.
Что Cursor пишет в проект — и чего в нём обычно нет
Cursor — это редактор с агентом: он видит файлы проекта и правит их по просьбе в чате. Код бота он выдаёт рабочий, но рассчитанный на запуск «у меня на машине». Обычно в таком проекте нет четырёх вещей:
- Файла зависимостей —
requirements.txtдля Python илиpackage.jsonдля Node.js; без него сборка не знает, что устанавливать; - Токена в переменных окружения — агент часто вставляет строку в код целиком, а так делать нельзя;
- Команды запуска для сервера — код написан под ручной
python main.py, а не под сервис; - Места для данных — если бот что-то запоминает, надо решить, куда это писать, чтобы не потерять при обновлении.
Это нормально: Cursor решает задачу «написать логику», а не «развернуть production». Дальше — четыре небольшие правки и деплой, и все правки тоже можно сделать прямо в чате Cursor.
Шаг 1. Получите токен у BotFather
Даже если в коде уже стоит строка с токеном — это заглушка. Откройте @BotFather, отправьте /newbot, придумайте имя и username (он должен заканчиваться на bot). В ответ придёт строка вида:
7123456789:***
Это и есть токен. Сохраните его отдельно от проекта — в код мы его вставлять не будем. Один токен — один бот. Если поднять второй процесс с той же строкой, один из них замолчит.
Шаг 2. Вынесите токен из кода
Плохой вариант, который агент делает по умолчанию:
TOKEN = "7123456789:***"
bot = Bot(token=TOKEN)
Правильный — читать из окружения:
import os
TOKEN = os.environ["BOT_TOKEN"]
bot = Bot(token=TOKEN)
Почему это важно. Код вы почти наверняка кому-то покажете или зальёте в Git. Токен в коде означает, что он утёк: чужой человек сможет писать вашим пользователям и читать переписку. Попросите Cursor прямо: «вынеси токен в переменную окружения BOT_TOKEN». Заодно пусть агент добавит проверку, что переменная задана, — тогда вместо трейсбека на старте будет понятное сообщение.
Шаг 3. Соберите список зависимостей и команду запуска
Python. Сложите в requirements.txt всё, что бот импортирует. Для типичного бота на aiogram:
aiogram==3.15.0
python-dotenv==1.0.1
Если бот работает с базой или картинками, добавьте sqlalchemy, Pillow, httpx — по факту импортов. Попросите: «собери requirements.txt по импортам в этом проекте» — и проверьте, что каждый import покрыт.
Node.js. Здесь всё в package.json: библиотеки в dependencies (Telegraf, node-telegram-bot-api и прочее) и обязательный скрипт запуска:
"scripts": {
"start": "node bot.js"
}
Папки с готовыми библиотеками не везите. venv для Python и node_modules для Node.js соберут заново из списка зависимостей при сборке — архив от этого меньше, а результат воспроизводимее.
Шаг 4. Одной фразой попросите Cursor подготовить проект
Это тот самый «один запрос»: напишите агенту в чат — «подготовь проект к деплою: добавь .gitignore, убери секреты из кода, проверь зависимости и команду запуска». Дальше он сам создаст .gitignore с .env, venv, __pycache__ и node_modules, поправит пути и перечислит зависимости. Файл .env с настоящим токеном в архив не попадает.
Проверьте, что бот запускается локально. Прогоните его у себя: python main.py или npm start. Если бот падает на вашей машине, на сервере он упадёт так же — платформа магии не добавит.
Шаг 5. Загрузите бота в Dockbox
Git-репозиторий или архив. Код можно подключить из репозитория — приватный тоже подойдёт, — либо загрузить ZIP. Оба способа удобно инициировать из Cursor: у редактора есть встроенный терминал и работа с Git, так что add, commit и push делаются, не выходя из проекта.
Язык и команду запуска платформа определит сама. Python виден по requirements.txt, Node.js — по package.json: подходящий образ, установка зависимостей, запуск нужной команды. Выбирать версию рантайма и менеджер процессов руками не нужно.
Токен — в переменные окружения проекта. Этот шаг забывают чаще всего. В панели проекта есть раздел секретов: укажите BOT_TOKEN и вставьте значение от BotFather. Значения хранятся в зашифрованном виде — видны имена переменных, но не сами токены. Так же задаются ключи платных API и адрес базы.
Шаг 6. Проверьте, что бот живой
Отправьте /start. Бот ответил — значит сборка и запуск прошли. Затем дайте пару команд, которые он реально умеет.
Посмотрите логи. Нормальный старт — строка вроде «Бот запущен» без трейсбеков. Всё, что бот печатает в stdout, видно в панели.
Остановите локальную копию. Пока бот крутится на вашем ноутбуке с тем же токеном, задеплоенный экземпляр будет получать 409 Conflict и терять сообщения.
Если бот молчит, причин обычно три: пустой или неверный токен, незаданная переменная окружения либо отсутствующая зависимость в списке. Точный ответ почти всегда написан в логах прямым текстом.
Сколько это стоит и что с автоперезапуском
Контейнеры работают постоянно. Нет ни лимита по часам, ни засыпания при простое — бот поднимается после деплоя и отвечает круглосуточно, независимо от того, включён ли ваш ноутбук. Упавший процесс платформа перезапускает сама: ровно та функция, ради которой на VPS ставят pm2 или systemd.
Starter — 990 ₽/мес, первый месяц бесплатно: 1 vCPU, 2 ГБ RAM, 20 ГБ SSD, один проект. Для одного бота на длинном опросе этого хватает. Pro — 2 490 ₽/мес: 2 vCPU, 4 ГБ RAM, до пяти проектов — если ботов несколько или бот тянет данные и картинки. Team — 4 990 ₽/мес — для команд с запасом ресурсов. Отдельного счёта за сборки и трафик нет.
Данные — в постоянное хранилище. Если бот хранит пользователей, заказы или настройки, следите, чтобы файлы и база лежали в постоянной папке (/data или том из compose-файла), а не во временной. Тогда обновление кода ничего не сотрёт.
Частые вопросы
Можно ли задеплоить бота прямо из Cursor?
Да, выходить из редактора не обязательно: Cursor видит проект, умеет править файлы и работать с Git, а встроенный терминал позволяет сделать commit и push в репозиторий, подключённый к Dockbox. Подготовку к деплою — зависимости, .gitignore, вынос секретов — агент делает по одной фразе в чате.
Что делать, если Cursor не выдал requirements.txt?
Попросите отдельно: «собери requirements.txt по импортам в этом коде». Затем проверьте, что каждый import из проекта попал в список, и зафиксируйте версии. Для Node.js аналог — dependencies и scripts.start в package.json.
Подойдёт ли платформа для aiogram, pyTelegramBotAPI и Telegraf?
Да, библиотека не важна: запускается любой Python- или Node.js-проект. Главное, чтобы рядом лежал список зависимостей, токен читался из переменной окружения, а бот работал в режиме длинного опроса — тогда ни домен, ни сертификат ему не нужны.
Где хранить токен, если не в коде?
В переменных окружения проекта. В панели Dockbox это отдельный раздел секретов: имя BOT_TOKEN, значение — строка от BotFather. В коде остаётся только чтение через os.environ или process.env, а .env держите в .gitignore.
Бот работал локально, а после деплоя молчит — почему?
Три типичные причины: не задана переменная окружения с токеном, не хватает зависимости из списка либо одновременно запущен второй экземпляр с тем же токеном — тогда Telegram отдаёт 409 Conflict. Проверьте логи запуска: ошибка почти всегда написана прямым текстом.