Добавить в корзинуПозвонить
Найти в Дзене
Будни аналитика

Выкатить ReadBot в интернет, туда, где он будет жить своей жизнью

После того как локально всё заработало, наступил момент истины — выкатить ReadBot в настоящий интернет, туда, где он будет жить своей жизнью, пока мой ноутбук выключен. Утро началось с подготовки. Александр в режиме FSD выдал 702 страницы анализа: нужен Universal Source рефакторинг, чтобы один источник мог работать и в режиме чтения, и в режиме анализа. Антон расписал план из девяти блоков. Макс начал катить — модели, миграции, роутеры, API-клиент для бота. Гриша проверял каждый блок и говорил APPROVED. К обеду счётчик тестов показал 864 зелёных, ноль красных, ноль ошибок. Было 797 и пятьдесят падающих — теперь чисто. Я смотрел на эту цифру и понимал: вот оно, готово к проду. Команда агентов за утро сделала то, на что у меня в одиночку ушла бы неделя. Но самое интересное было впереди. Открыл Railway. Настроил переменные окружения. Залил код. Нажал Deploy. Первая попытка — Build failed, не находит entrypoint-api.sh. Вторая — игнорирует ENTRYPOINT из Dockerfile. Третья — сломалось экрани

После того как локально всё заработало, наступил момент истины — выкатить ReadBot в настоящий интернет, туда, где он будет жить своей жизнью, пока мой ноутбук выключен.

Утро началось с подготовки. Александр в режиме FSD выдал 702 страницы анализа: нужен Universal Source рефакторинг, чтобы один источник мог работать и в режиме чтения, и в режиме анализа. Антон расписал план из девяти блоков. Макс начал катить — модели, миграции, роутеры, API-клиент для бота. Гриша проверял каждый блок и говорил APPROVED. К обеду счётчик тестов показал 864 зелёных, ноль красных, ноль ошибок. Было 797 и пятьдесят падающих — теперь чисто.

Я смотрел на эту цифру и понимал: вот оно, готово к проду. Команда агентов за утро сделала то, на что у меня в одиночку ушла бы неделя. Но самое интересное было впереди.

Открыл Railway. Настроил переменные окружения. Залил код. Нажал Deploy. Первая попытка — Build failed, не находит entrypoint-api.sh. Вторая — игнорирует ENTRYPOINT из Dockerfile. Третья — сломалось экранирование кавычек в команде запуска. Я методично правил, заливал, ждал. Четвёртая, пятая, шестая попытка. Каждый раз что-то новое: то миграции не применяются, то healthcheck падает, то порт не тот.

На седьмой попытке я просто написал: /app/entrypoint.sh uvicorn api.main:app --host 0.0.0.0 --port 8000. Без изысков. Нажал Deploy и пошёл за кофе, потому что уже не верил.

Вернулся — зелёная галочка. Healthcheck succeeded. Сердце ёкнуло.

Открыл Telegram, нашёл своего бота. Отправил голосовое сообщение. Whisper на сервере где-то в облаке Railway распознал речь. FastAPI отправил запрос через Claude CLI — через мою личную Max-подписку, без единого API-ключа. Бот ответил. Я выключил ноутбук. Отправил ещё одно голосовое. Бот снова ответил.

Вот оно. Продукт в проде — это не когда код лежит на сервере. Это когда ты выключаешь свой компьютер, идёшь спать, а наутро видишь, что бот всю ночь обрабатывал сообщения без тебя. Он живёт своей жизнью. Где-то в датацентре Railway крутится контейнер с FastAPI и Whisper. Где-то Claude через CLI-сессию, привязанную к моей подписке, отвечает пользователям. Никаких API-ключей, никаких лимитов на токены, никаких подписок на сторонние сервисы.

Я открыл логи Railway. Там мелькали строчки: POST /chat/topics/1/messages, Claude CLI response received, voice transcribed. Мой ReadBot v2.0 работал в настоящем интернете. Восемьсот шестьдесят четыре зелёных теста, семь попыток деплоя, один прорыв.

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

#AIразработка #Python #Claude #ReadBot #ИИагенты #программирование