ChatGPT уверенно пишет код Telegram-бота: присылает файл на двести строк, добавляет обработчики команд, рисует клавиатуру, иногда даже напоминает про переменные окружения. Диалог заканчивается одинаково: «сохрани это в файл и запусти». Именно здесь проекты и умирают — код работает в чате, потом лежит в папке «Загрузки» и до интернета не доходит, потому что следующий шаг звучит как «арендуй сервер». Между чатом и работающим ботом не хватает одного звена: папки на диске и терминала, из которого код уезжает в контейнер на Dockbox. Ниже — путь целиком, включая честную оговорку про сам чат ChatGPT.
Почему код из чата не доходит до интернета
Чат не выполняет программы. Веб-версия ChatGPT ничего не запускает на вашем компьютере: диалог закрывается, и всё заканчивается. Поэтому команда «опубликуй это» из чата не сработает — не потому, что модель не умеет, а потому что у неё нет доступа к вашей файловой системе и оболочке.
Код в чате — это текст, а не проект. Пока он не разложен по файлам вместе со списком зависимостей, собирать нечего.
Публикация живёт на стороне терминала. Codex — консольный агент: он видит файлы в папке, выполняет команды, читает их вывод и по выводу правит проект. Значит, и финальный шаг — отправка кода на сервер — его работа.
Серверную часть закрывает платформа. Вы подключаете Git-репозиторий, и каждый push собирает Docker-контейнер, который работает на выданном адресе. Ни Python, ни systemd, ни сертификаты администрировать не нужно.
Дальше — пять шагов от текста в чате до бота, который отвечает круглосуточно.
Шаг 1. Сохраните код из чата в обычную папку
Создайте папку проекта и разложите то, что написал ChatGPT, по файлам: сам код, список зависимостей и, если он есть, образец файла окружения. Для Python-бота структура выглядит так:
bot/
main.py
requirements.txt
.env.example
Для Python файл зависимостей — requirements.txt, для Node.js — package.json. Без него контейнер соберётся на других версиях библиотек, и ошибка всплывёт уже на сервере. ChatGPT соберёт список сам: попросите «собери requirements.txt по импортам в этом коде» и проверьте, что каждый import попал в файл.
Шаг 2. Вынесите токен из кода
По умолчанию модель вставляет токен прямо в код — так делать нельзя. Плохой вариант:
TOKEN = "7123456789:AAE..."
bot = Bot(token=TOKEN)
Правильный — значение приходит из окружения:
import os
TOKEN = os.environ["BOT_TOKEN"]
bot = Bot(token=TOKEN)
Причина простая: код вы будете показывать, кому-то отдавать или заливать в репозиторий. Токен в коде — это утёкший токен, а он позволяет чужому человеку читать переписку вашего бота и писать от его имени. Токен для нового бота выдаёт @BotFather по команде /newbot — там же его можно отозвать, если он попал не туда.
Рядом с кодом держите образец с одними именами переменных, без значений:
BOT_TOKEN=
DATABASE_URL=
Сам файл с настоящим токеном остаётся на вашей машине и в репозиторий не попадает.
Шаг 3. Подключите проект к Dockbox
Это единственный шаг, который делается руками в панели, и делается он один раз.
Репозиторий. Загрузите проект на GitHub, GitLab или Bitbucket — приватный тоже подойдёт — и подключите его к Dockbox, указав продовую ветку.
Стек платформа определяет по коду. Python, Node.js, Go, Rust, PHP, статика — что найдёт, то и соберёт. Dockerfile не обязателен: если он в проекте уже есть, он используется, но писать его специально не нужно.
Секреты — в настройках проекта. Токен и прочие ключи задаются здесь: Dockbox хранит значения зашифрованными и подставляет их в контейнер как переменные окружения.
В ответ платформа выдаёт адрес с работающим HTTPS. Сайту он нужен, боту — нет: бот работает в режиме опроса Telegram и отдельного домена не требует.
Шаг 4. Попросите агента опубликовать
Откройте терминал в папке проекта, запустите Codex и напишите обычными словами: «закоммить и запушь». Агент выполнит привычную последовательность:
git add .
git commit -m "publish bot"
git push origin main
Перед этим попросите проверить индекс — «убедись, что .env и __pycache__ не попали в коммит»: агент посмотрит git status и уберёт лишнее. Дальше Dockbox сам собирает контейнер и запускает его. Если код читает токен, а переменной в проекте нет, контейнер упадёт на старте — поэтому шаг 3 лучше не пропускать.
Шаг 5. Проверьте бота и разберите логи
Для сайта признак жизни — ответ на запрос:
curl -I https://your-project.dockbox.host
Для бота проверка другая: отправьте ему /start в Telegram, он должен ответить. Если молчит, смотрите лог сборки и лог контейнера в панели: причина написана прямым текстом в первых строках. 409 Conflict означает, что тем же токеном уже работает второй экземпляр — обычно старый процесс на ноутбуке. Жалоба на пустой токен — что переменная не задана в проекте.
Что агент делает сам, а что остаётся в панели
Делает: правит код, коммитит и пушит проект, обновляет файл зависимостей, читает вывод сборки и исправляет ошибку, выкатывает следующую версию на тот же адрес.
Не делает: не оплачивает, не меняет тариф, не удаляет проект и не придумывает значения токенов. Если значение нужно — агент спросит и остановится: это правило платформы, а не удача.
Сколько стоит и как работают контейнеры
Starter — 990 ₽/мес, первый месяц бесплатно. 1 vCPU, 2 GB RAM, 20 GB SSD, один проект. Боту с обработчиками команд и небольшим хранилищем этого хватает.
Контейнеры работают постоянно. Нет засыпания при простое и нет лимита по часам: бот отвечает в момент обращения, потому что контейнер не выключается.
Pro — 2 490 ₽/мес. 2 vCPU, 4 GB RAM, до пяти проектов — если бот тяжёлый, что-то считает в фоне или проектов несколько.
Team — 4 990 ₽/мес — когда нужен запас ресурсов на команду.
Отдельного счёта за сборки и трафик нет, а упавший контейнер платформа перезапускает сама. Тарифы и оплата — на dockbox.host.
Частые вопросы
Можно ли опубликовать бота прямо из чата ChatGPT?
Нет. Веб-версия не запускает программы на вашем компьютере, а публикация работает именно так. Сегодняшний путь — сохранить код в папку и отправить проект из терминала: Codex, Cursor или Claude Code справятся с этим одной просьбой. Сам код менять не нужно.
Нужен ли Docker или готовый Dockerfile?
Нет. Платформа определяет язык проекта и собирает его сама. Если Dockerfile или docker-compose в проекте уже есть, они используются — это ваш выбор, а не требование.
Что делать, если бот не стартует после деплоя?
Попросите показать логи: последние строки почти всегда называют причину — отсутствующая библиотека, незаданный токен, опечатка в имени файла запуска. Три самые частые причины — неверный токен, незаполненные переменные окружения или второй запущенный экземпляр с тем же токеном.
Где хранить токен, если в коде нельзя?
В переменных окружения. Локально — в файле вне репозитория, на сервере — в настройках проекта: Dockbox хранит значения зашифрованными и подставляет их в контейнер. В коде остаётся только чтение через os.environ.
Как обновить бота после правок в чате?
Скопируйте новый код в ту же папку и скажите агенту «обнови проект» — или просто «закоммить и запушь». Новый контейнер соберётся и встанет на то же место: адрес и токен остаются прежними.