Claude Code живёт в терминале и делает почти всё сам: пишет код, ставит зависимости, запускает проект, читает ошибки и снова правит. Заканчивается это всегда одинаково — адресом вида localhost:3000, который открыт только на вашей машине. Дальше начинается отдельная жизнь: собрать архив, открыть панель хостинга, вспомнить, где лежали переменные окружения, выпустить сертификат. Рассказываем, как свести публикацию в тот же терминал, где пишется код: несколько правок в проекте, подключение репозитория к Dockbox и одна команда, которую агент выполняет сам.
Почему работа в терминале обрывается на localhost
Claude Code — это агент с доступом к оболочке: он не просто предлагает код, а выполняет команды, читает их вывод и по выводу правит файлы. Для работы с проектом это идеально. Ломается ровно последний шаг.
Терминал — дом агента. Пока дело идёт в командной строке, агент видит каждый шаг: установку зависимостей, запуск, падение, лог. Стоит унести финал в браузерную панель — и последний шаг вы делаете руками, вслепую для агента.
Локальный запуск не равен серверу. На вашей машине порт выбирает код, на сервере его назначает платформа. Локально ключи лежат в файле рядом, в продакшене приходят из окружения. Это две причины, по которым «у меня работает» превращается в пустую страницу.
Деплой в Dockbox — тоже команда оболочки. Проект подключается к Git-репозиторию, и каждый git push собирает Docker-контейнер и выкатывает его на тот же адрес. Терминал не нужно покидать: финальный шаг — та же строка, которую агент умеет выполнять.
Дальше — пять шагов от локального проекта до живой HTTPS-ссылки.
Шаг 1. Приведите проект к виду, готовому к серверу
Порт из окружения. Порт, вписанный в код, — причина номер один, по которой сборка проходит, а страница остаётся пустой. Агент правит это в одно предложение:
app.listen(3000, "localhost")
Правильный вариант — порт из переменной и адрес 0.0.0.0 вместо localhost:
const port = process.env.PORT || 3000
app.listen(port, "0.0.0.0")
Зависимости зафиксированы. package.json с файлом блокировки, requirements.txt, go.mod — без них контейнер соберётся на других версиях библиотек. Claude Code видит импорты и соберёт список сам, попросите отдельно.
Служебные папки не в репозитории. node_modules, venv, dist, build, __pycache__ добавьте в .gitignore: их всё равно пересоберут на сервере. Заодно туда же уходит .env.
Локальная проверка сборки. Если в проекте есть Dockerfile, агент может прогнать docker build . у вас на машине и увидеть ошибку до отправки кода.
Шаг 2. Вынесите секреты из кода
Код уезжает в репозиторий, а агент читает файлы целиком — поэтому ключи не должны лежать внутри. Всё, что читается из окружения, поместите в образец без значений:
API_KEY=
DATABASE_URL=
TELEGRAM_TOKEN=
Сам файл с настоящими значениями остаётся только на вашей машине, в репозиторий он не попадает. Значения вы задаёте при настройке проекта в панели: Dockbox хранит их зашифрованными и подставляет в контейнер как переменные окружения. Если ключ случайно попал в коммит — считайте его скомпрометированным и выпустите новый.
Шаг 3. Подключите репозиторий к Dockbox
Это единственный шаг, который делается в панели, и делается один раз. Создайте проект и подключите GitHub, GitLab или Bitbucket — приватный репозиторий тоже подойдёт. Укажите ветку, которая считается продовой.
Дальше Dockbox справляется сам: определяет стек по коду (Node.js, Python, Go, Rust, PHP, статика), находит Dockerfile или docker-compose, а если их нет — предлагает шаблон. Переменные из шага 2 задаются здесь же. В ответ платформа выдаёт адрес с уже работающим HTTPS — сертификат выпускать не нужно.
Шаг 4. Дальше публикация идёт одной командой из терминала
После подключения каждый push — это новый релиз на том же адресе. Скажите агенту: «закоммить и запушь». Он выполнит привычную последовательность:
git add .
git commit -m "publish site"
git push origin main
Перед этим попросите проверить индекс — «убедись, что .env и node_modules не в коммите»: агент посмотрит git status и уберёт лишнее. Обновление выкатывается автоматически, старый адрес сохраняется, так что новую ссылку никому сообщать не нужно.
Если сборка упала, её вывод виден в панели прямым текстом. Чаще всего причина воспроизводится локально тем же docker build . — и агент правит её в том же терминале.
Шаг 5. Проверьте ссылку, не выходя из терминала
Финальная проверка — одна команда, не нужен ни браузер, ни панель:
curl -I https://your-project.dockbox.host
Ответ 200 или 301 означает, что сайт живой и отвечает. 502 или Connection refused — приложение слушает не тот порт либо падает при старте: вернитесь к шагу 1, подсказка будет в первых строках лога. Повторный прогон после следующего push занимает секунду.
Сколько это стоит и как работают контейнеры
Starter — 990 ₽/мес, первый месяц бесплатно. 1 vCPU, 2 GB RAM, 20 GB SSD, один проект. Сайту или боту этого хватает с запасом.
Контейнеры работают постоянно. Нет засыпания при простое и нет лимита по часам: ссылка отвечает в момент открытия, без «прогрева», потому что контейнер не выключается.
Pro — 2 490 ₽/мес. 2 vCPU, 4 GB RAM, до пяти проектов — если частей несколько или сборка тяжёлая.
Team — 4 990 ₽/мес — для команд, которым нужен запас ресурсов.
Отдельного счёта за сборки и трафик нет, а упавший контейнер платформа перезапускает сама. Оплата и тарифы остаются в панели — агент денег не тратит. Тарифы — на dockbox.host.
Частые вопросы
Нужен ли Claude Code специальный плагин, чтобы публиковать?
Отдельный плагин не нужен: публикация для агента — обычная команда оболочки. Достаточно один раз подключить репозиторий к Dockbox, после чего git push из терминала собирает контейнер и выкатывает сайт. Агент выполняет эту команду наравне с любой другой.
Что попадёт в репозиторий, а что останется на машине?
Только исходный код и файлы конфигурации проекта. Служебные папки вроде node_modules, venv, dist и build уходят в .gitignore, их пересобирают на сервере. Файл с настоящими значениями секретов тоже остаётся локально: в панель вы вводите их отдельно.
Где хранить ключи, если код читает агент?
В переменных окружения. Локально — в файле вне репозитория, на сервере — в настройках проекта: Dockbox хранит значения зашифрованными и подставляет их в контейнер. В самом коде остаётся только чтение из окружения, поэтому ни архив, ни репозиторий секретов не содержат.
Может ли агент что-то сломать на проде или потратить деньги?
Оплату, смену тарифа и удаление проекта он не делает: это живёт в панели Dockbox, куда у агента доступа нет. Испортить релиз неудачным коммитом он может, но это обычный риск команды. Если сборка падает, предыдущая версия просто остаётся работать, пока новая не соберётся.
Почему после push ссылка открывается пустой или отдаёт 502?
Почти всегда приложение слушает порт, вписанный в код, вместо порта из переменной PORT, либо падает при старте из-за незаданной переменной окружения. Проверьте ответ командой curl -I и сравните с логом сборки в панели: причина написана прямым текстом в первых строках.