Codex и ChatGPT: от кода в чате до работающего бота

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.

Как обновить бота после правок в чате?

Скопируйте новый код в ту же папку и скажите агенту «обнови проект» — или просто «закоммить и запушь». Новый контейнер соберётся и встанет на то же место: адрес и токен остаются прежними.