Почему хороший деплой скучный. И как мы за день вывели клиентского бота на боевой сервер
06 мая мне на счёт упал аванс. Клиент-поставщик электроники из Удмуртии официально стартовал Этап 1. 07 мая бот уже стоял на VPS (это арендованный компьютер в дата-центре, всегда включён, на нём и крутятся боты) и обрабатывал реальные сообщения. Между этими двумя датами не случилось ни одного аврала и ни одной ночной правки в духе «о чёрт, не работает». Инфраструктуру мы собрали до аванса, и это вся причина.
Что произошло за 5 дней
04 мая мы прогнали smoke-тест на тестовом боте (быстрая проверка, что сборка вообще запускается и проходит насквозь). Whitelist пропустил нужные telegram-id, PII-маскер вычистил телефоны и адреса, LLM-классификация разложила входящие сообщения по категориям, запись в Google Sheets легла куда нужно. За два дня до денег весь pipeline (цепочка обработки сообщения от входа до записи в таблицу) уже отработал на реальных паттернах из переписок клиента.
06 мая на счёт пришёл аванс 75 000 ₽. Работа к этому дню была сделана. Аванс просто дал формальное разрешение поставить готовое решение на боевой сервер.
07 мая клиентский бот развёрнут на VPS Ubuntu 24.04 через Docker Compose. IP, ключи и переменные окружения зафиксированы в .secrets/vps.md. От клиента не потребовалось ничего: ни админ-доступов, ни вечернего созвона «давайте поправим».
Pipeline из 8 явных шагов с точками расширения
Чаще всего в малом бизнесе бот вырастает в монолитный message_handler, куда постепенно дописывают всё подряд, и через пару месяцев такой файл боятся открывать: одна правка тянет за собой три неожиданных поломки. У нас pipeline устроен иначе. Каждый шаг — отдельная функция с понятным входом и выходом, а между шагами оставлены явные «точки расширения», куда позже можно встроить новый модуль.
- Шаг 1.
whitelist: пропускаем только знакомые telegram-id - Шаг 2.
pii_masker: вырезаем телефоны, адреса, ФИО до отправки в LLM - Шаг 3.
extract: забираем сущности (даты, суммы, артикулы) - Шаг 4.
classify: раскладываем сообщение по бизнес-категориям - Шаг 4.5.
ocr: для скриншотов из WeChat (добавили на следующий день, об этом ниже) - Шаг 5.
route: отправляем в нужный лист Google Sheets - Шаг 6.
notify: уведомление команде если есть риск или срочная задача - Шаг 7.
log: запись для аудита и метрик качества
70 тестов покрывают каждый слой по отдельности. У каждого куска свой файл: tests/test_pii_masker.py, tests/test_classify.py, tests/test_route.py. Когда падает шаг, по красному тесту сразу видно какой, и в логи лезть не приходится.
Скучный деплой это когда «доделать чуть-чуть» уже произошло
Проекты малого бизнеса редко ломаются на старте. Они вязнут на фразе «надо доделать ещё чуть-чуть и можно показывать». Эта фаза «уже почти готово» умеет тянуться неделями, выматывает клиента и съедает репутацию подрядчика.
У нас smoke-тест прошёл за два дня до денег, каждый шаг pipeline проверен изолированно, а от git pull до рабочего бота на VPS — одна команда docker-compose up -d. Никакого ручного допиливания на сервере по ночам. Вот эта будничность и есть продакшен-качество: проект запущен в боевую работу и им реально пользуются.
Когда архитектура превращается в бизнес-возможности
Через два дня после деплоя клиент написал: «Давайте сразу делаем OCR плюс голосовые, их у нас много». OCR (распознавание текста на картинке) понадобился вот зачем: команда работает с китайскими поставщиками, скриншоты прайсов из WeChat и голосовые приходят ежедневно, и ждать 4-6 недель до Этапа 3 им не хотелось.
Технически справились в тот же день. src/ocr/vision.py через Google Cloud Vision встал в шаг 4.5. Распознавание голосовых через Whisper я завёл отдельным модулем, который слушает handle_voice. Ни одной старой функции трогать не пришлось. Команда docker-compose build --no-cache, и всё уже на проде.
Юридически оформили это как досрочный старт Этапа 3 через уведомление сторон по п.5.7 договора, выставили счёт № 003 на остаток Этапа 1 + аванс Этапа 3. Клиент получил фичу быстрее. Я получил подписанный документ и лишнее подтверждение: архитектура из изолированных модулей нужна ради денег, обеим сторонам, и красивая схема тут вторична.
Чек-лист «как сделать деплой скучным»
- 1. Pipeline разбит на шаги с явными именами (whitelist / mask / classify / route / log), вместо одного разросшегося
process_message() - 2. Каждый шаг покрыт тестами на реальных сценариях клиента (не на синтетике)
- 3. Smoke-тест прошёл на тестовом окружении ДО получения аванса
- 4. Деплой это одна команда, без ручных шагов «зайти на сервер, поправить .env»
- 5. Между шагами заложены точки расширения, чтобы новый модуль (OCR, Whisper, любой плагин) встал без переписывания
- 6. Секреты (ключи, IP, пароли) лежат в
.secrets/вне git, не в коде и не в memory
Если выполнено хотя бы 4 пункта из 6, деплой будет скучным. И клиент это оценит сильнее, чем любую красивую презентацию.
Хочется, чтобы ваш деплой тоже был скучным?
Разбираю задачу под ваш бизнес: какие модули нужны, как разрезать pipeline, где взять тестовые данные, на чём собирать продакшен. Бесплатный созвон 30 минут, диагностика и план.
Записаться на разбор →Или напишите напрямую: @kulievvb в Telegram
Что ещё почитать
- Все проекты MWB: чем занимаюсь сейчас
- Вайбкодинг 101: почему AI-разработка работает только при правильной архитектуре
- Кастомная разработка под задачу: как формируется этапность и оплата
- Связаться: обсудить ваш проект