Перейти к содержимому

Разрешить сайту считать ваши посещения с помощью Яндекс Метрики? Для этого она сохранит в браузере файлы cookie. Как сайт использует cookie

VC
Кейс 18 из 22 · Производство · сайт, карточка и телефония

Сайт, карточка и телефония для производства электрощитов: от пустой выдачи до первого звонка

Производитель электрощитов и низковольтных комплектных устройств (НКУ) из Калининграда работал по рекомендациям. Сайта и карточек на картах не было, а на офисный номер из сертификатов никто не отвечал. С середины августа по начало сентября 2026 года я собрал для него сайт на Astro и чат-консультанта на GigaChat, завёл карточку в Яндекс Бизнесе и настроил виртуальную АТС с голосовым меню. Заодно настроил разметку для поисковиков, защиту сервера, резервные копии с проверкой и вечернюю сводку.

Отрасль
Производство электрощитов и НКУ, Калининград
Технологии
Astro 5 · nginx · ВАТС Ростелекома · GigaChat
Сроки
Середина августа — начало сентября 2026
Итог
Входящий: сброс за 0 с → гудок через 19,6 с
01 · Проблема

Покупатель слышал о компании от проектировщика, а в интернете её не было

Компания из Калининграда собирает по однолинейной схеме заказчика ГРЩ, ВРУ, АВР, щиты учёта и освещения, шкафы автоматики. У неё два действующих сертификата соответствия ЕАЭС, собственные технические условия и паспорт на каждое изделие. Заказы приходили по рекомендациям и от проектировщиков.

Снабженец, услышав название, набирал его в поиске и не находил ничего: ни сайта, ни карточек на картах и в справочниках. На сайтах, которые собирают данные из реестров, лежали номера пятилетней давности. Первые места в выдаче по запросам о производстве щитов в городе занимала компания из другого региона.

Офисный номер указан в сертификатах и паспортах изделий. За него платили каждый месяц, но на звонки в офисе никто не отвечал. Когда подключили виртуальную АТС, входящий звонок на её номер сбрасывался мгновенно, без гудка: звонивший слышал тишину и обрыв. Причина нашлась в карточке пользователя, о ней ниже.

02 · Решение

Сайт, карточка и телефон собраны одним комплектом

Все части опираются на один файл подтверждённых фактов. Число попадает на сайт, в карточку и в базу знаний чат-консультанта только из документа или со слов владельца. Это правило я записал в план ещё до первой строки текста. Покупатель-юрлицо проверяет поставщика по реестрам за минуту, и одно расхождение подрывает доверие ко всей странице.

01
Факты

Единый файл подтверждённых фактов. 38 минут голосового разбора с владельцем расшифрованы на моём компьютере, без внешних сервисов

02
Сайт

Astro 5, восемь страниц, две сборки: для своего домена и для демонстрационной папки; форма с загрузкой однолинейной схемы

03
Приём заявок

Служба на сервере: заявка сначала сохраняется на диск, потом уходит в Telegram; согласие и тип вложения проверяются на сервере

04
Телефония

Виртуальная АТС Ростелекома: голосовое меню на три отдела, звонок на мобильные, перенос офисного номера

05
Поиск и контроль

Карточка в Яндекс Бизнесе, разметка LocalBusiness, IndexNow, заголовки безопасности, резервные копии с проверкой, вечерняя сводка

Числа только из документов

Владелец голосом прошёлся по черновику сайта. Запись на 38 минут я расшифровал у себя на компьютере: это внутренний разговор о бизнесе. Сверка сайта с разбором по 36 пунктам дала 33 совпадения. Одно расхождение было существенным. Страница продукции обещала подобрать комплектацию без однолинейной схемы, а по словам владельца без схемы щит не собирают. Абзац переписан. Заглушек «уточняется» в первой версии было 32, к концу правок не осталось ни одной.

Верхняя цифра на главной, 6300 А, взята из сертификата и собственных технических условий. На странице продукции рядом указан основной диапазон производства — до 630 А — и объяснено, где проходит граница конструкции. Раздел о поставке в остальную Россию написан после чтения первоисточников: область входит в особую экономическую зону, груз при вывозе проходит таможенный контроль, а для покупателя это обычная поставка внутри страны. Цифру отгрузок из разговора я снял с сайта до подтверждения. Отдельным проходом 31 противопоставление переписано в утвердительную форму, а повторов между страницами стало меньше: было 16, осталось 4.

Две сборки и три запрета на индексацию

Сайт на Astro 5 и Tailwind 4: восемь статичных страниц и своя графика. Это 16 значков на общей сетке и однолинейная схема типового щита с правдоподобными, но вымышленными данными: на скане настоящей схемы читается объект заказчика. Пока своего домена не было, сайт собирался в папке на уже работающем домене с сертификатом. Заказчик смотрел демонстрацию по https без настройки DNS. Проверка ссылок ловит и ссылку в никуда, и ссылку без нужного префикса. Логотип вёл на «/», то есть на главную того домена, где лежала демонстрация, и обычная проверка «цель существует» этого не замечала.

До согласования текстов сайт был закрыт от поисковиков тремя способами сразу: noindex в разметке, заголовок X-Robots-Tag и robots.txt. Снимать все три пришлось одновременно: любой оставшийся запрет сам по себе держал бы сайт вне индекса. Снятие запрета прописано в скрипт выкладки, иначе следующая выкладка закрыла бы сайт обратно. Время кэширования записи DNS уменьшено с суток до часа: если сайт придётся перенести на другой сервер, новый адрес дойдёт до посетителей примерно за час.

Форма, которая не теряет схему

Заявка на щит почти всегда приходит с однолинейной схемой. Сначала заявка пишется на диск и только потом уходит в Telegram. Вложения идут в группу менеджеров отдельными сообщениями, до 5 файлов. На странице указаны те же пределы, что стоят в службе: 20 МБ на файл и 60 МБ на заявку. Проверки, которые раньше были только в браузере, перенесены на сервер: согласие на обработку данных, тип файла, скрытое поле-ловушка для ботов и время заполнения. Форму, отправленную быстрее чем за две секунды, почти наверняка заполнила программа, и такая заявка молча отсекается.

Раньше отказ выглядел как успех: при любой ошибке человек попадал на страницу благодарности. Теперь страница показывает причину и телефоны. Файл, не прошедший проверку, доходит до менеджера отдельным блоком «не приняты вложения». Отправка в Telegram теряла обращения. Текст уходил в группу с HTML-разметкой без экранирования, и знак «меньше» в обычной для этой отрасли фразе «ввод < 630 А» ломал всё сообщение. Отправитель при этом получал автоответ «принято». Теперь спецсимволы экранируются, а в журнал пишется ответ Telegram целиком.

Почему входящие звонки сбрасывались мгновенно

Виртуальная АТС Ростелекома была подключена, правило маршрутизации исправно: работает круглосуточно и направляет звонки на группу. Входящий доходил до линии и мгновенно сбрасывался. В протоколе вызова был единственный шаг: «вызов на входящую линию». Причина нашлась в карточке единственного пользователя. Мобильный в сценарии вызова был выключен переключателем, а SIP-устройств (IP-телефонов или программ для звонков) не было прикреплено ни одного, так что АТС было некуда звонить. В схеме сценария выключенная ветка отличается только серым цветом рамки, поэтому проверять нужно карточку каждого номера. Заодно я поправил часовой пояс АТС, из-за которого журнал звонков ошибался на час, номер для исходящих по умолчанию и уведомления голосовой почты: они стояли на «не отправлять».

Потом настроил АТС под компанию: три пользователя в пределах тарифа — дирекция, бухгалтерия, технический отдел, у каждого свой мобильный. Входящих и исходящих линий стало по 6, было по 2. Голосовое меню озвучено синтезом речи и длится 13,6 с. Нажатая цифра отправляет вызов в отдел, а если время ожидания вышло — в дирекцию. Две стандартные записи, включённые в АТС по умолчанию, выключены: звонивший слышал стандартный текст оператора после меню компании и после 40 секунд гудков. Протоколы трёх настоящих звонков показали, что вызовы доходят куда нужно. Нажавший «1» на 11-й секунде соединился с дирекцией, ещё два звонка звонившие бросили сами на 16-й и 24-й секунде. Проблема была во времени: 13,6 с меню плюс 8 с ожидания давали 22 с до первого гудка, из них 8 — тишина. Ожидание уменьшено до 6 с, и до гудка стало 19,6 с. Дальше сократить время можно только укоротив текст самого меню.

Офисного номера из сертификатов в АТС не было: проверка звонками показала, что вызовы на него в журнал вообще не попадают. Обращение к оператору я переписал на основе этих фактов: три требования и перечень того, что уже настроено на стороне абонента. Перенос выполнен 1 сентября по заявке от 28 августа. Перенесённый номер пришёл со своим правилом: все вызовы шли в группу мимо голосового меню. Правило переключено вручную, и теперь оба номера ведут в одно меню. На время переноса основным на сайте стоял номер, выданный АТС. После переноса офисный номер вернулся в шапку, на кнопку звонка и в разметку, а служебный убран с семи страниц живого сайта.

Чат-консультант на GigaChat честно говорит, чего не знает

Бот отвечает на вопросы о щитах и НКУ, а если ответа у него нет, собирает заявку с контактом. Движок на FastAPI отдаёт ответ потоком, окно чата написано без библиотек. База знаний занимает около 3200 токенов и целиком помещается в системный промпт — постоянную инструкцию модели. Поэтому векторного поиска здесь нет, и это сознательно: на таком объёме он добавил бы ещё одно место для сбоя и риск не найти нужный кусок. Половина правил — перечень того, чего бот не знает: цены, сроки, гарантия, предельный ток, марки аппаратов, объекты, номера сертификатов. По каждому пункту он говорит, что именно уточнит менеджер, и предлагает оставить телефон. Я проверил его вопросами по всему списку: бот ничего не выдумал. На вопрос о лицензии он объяснил, что сборка НКУ не лицензируется, и назвал регламенты ТР ТС 004/2011 и 020/2011.

Заявка сначала пишется на диск, потом уходит в мессенджер, и к ней прикладывается весь разговор. Без сертификата Минцифры защищённое соединение (TLS) со Сбером не устанавливается. Сертификат подключён только для этого соединения: государственный корневой сертификат в системном хранилище мог бы подписать для машины любой домен. Раньше счётчик частоты запросов брал адрес из заголовка, который подставлял сам клиент. 25 запросов с вымышленными адресами прошли без единого отказа, и каждый был платным вызовом модели за счёт владельца. Ограничение перенесено в nginx и считает по настоящему адресу соединения: 20 запросов в минуту. Те же 25 запросов теперь упираются в отказ. Службы больше не работают от root: раньше чат работал с полным набором из 41 привилегии ядра. Секреты передаются через EnvironmentFile, файлы заявок и переписки получили права 640 в каталогах 750.

Карточка, разметка и индексация

Карточка в Яндекс Бизнесе заведена с теми же данными, что на сайте. Часы работы по будням, 9:00–18:00, назвал владелец, и они одинаковы в карточке и в разметке. Карточка и сайт стоят в выдаче рядом, и разные ответы на один вопрос выглядят так, будто компанией никто не занимается. Разметка была типа Organization — юрлицо без места на карте. Добавлен тип LocalBusiness с часами, областью поставки «Россия», ссылкой на карточку и координатами. Ссылка связывает сайт и карточку в обе стороны и помогает поисковику понять, что это одна компания. Координаты со страницы карточки в Картах оказались центром видимой области и промахивались на два километра. Теперь они проверены прямым геокодированием по адресу дома и обратным — по точке.

Индексация открыта по решению владельца. Вместе с ней поставлен счётчик Яндекс Метрики с Вебвизором и подтверждены права в Вебмастере и Search Console. К 25 августа Google держал в индексе шесть страниц, робот Яндекса впервые пришёл 27 августа. Выкладка сама сообщает поисковикам об изменениях через IndexNow: адреса берутся из карты сайта, и первый вызов вернул код 202 на семи адресах. 6 сентября Вебмастер показал у карты «число ссылок в файле — 1» и ноль страниц в поиске. Адреса лежат во вложенном файле двухуровневой карты сайта. По журналу nginx робот девять раз забирал главный файл карты, но во вложенный не заходил. В robots.txt добавлена вторая строка Sitemap прямо на файл с адресами, и семь адресов отправлены на переобход.

  • Значок сайта в четырёх файлах: робот Вебмастера искал /favicon.ico и получал 404, хотя SVG-версия отдавалась
  • Картинка для превью ссылки в мессенджерах, 1200×630, из кадра цеха и своя страница 404 с разделами и телефонами; код ответа на ней остался 404
  • Описания страниц укорочены со 174 и 176 знаков до 132 и 131: поисковик показывает около 160, и концы фраз уходили в многоточие

Что поправлено на сервере

Директива add_header в nginx не наследуется во вложенный блок, если в нём есть хотя бы одна своя. Поэтому на CSS, шрифтах и картинках не было ни одного заголовка безопасности. Набор вынесен в отдельный файл и подключён в каждый блок. На статичных файлах теперь четыре заголовка, включая nosniff. Версия сервера скрыта, TLS 1.0 и 1.1 отключены. Политика безопасности содержимого (CSP) лежала в файле формата, который nginx не читает, и не отдавалась вовсе. Теперь она задана в конфигурации, а служебный файл, который отдавался наружу с кодом 200, закрыт. Ограничений по памяти у служб не было. На машине с 1,9 ГБ памяти несколько одновременных загрузок могли занять всю память и остановить nginx, а вместе с ним оба сайта. Теперь стоят пределы: 384 МБ на форму и чат и 192 МБ на приёмник. nginx перезапускается через 5 секунд после падения. Конфигурация целиком копируется в репозиторий: раньше копия отставала от рабочей на 25 строк.

Раньше резервные копии вообще не включали этот проект. Теперь в копию входят заявки, вложения, журнал чата и снимок базы знаний. Секреты не копируются: их можно перевыпустить за минуту. Сначала копия проверялась только по размеру. Но при обрыве на середине получается файл правильного вида и солидного размера, который не распаковывается. Добавлены распаковка и проверка, что заявки внутри. Учебное восстановление: 22 файла, все три файла заявок на месте. Через несколько дней проверка стала поднимать ложную тревогу на исправных копиях. Причина была в цепочке команд. grep -q закрывал канал после первого совпадения, tar получал SIGPIPE, и pipefail считал провалом всю цепочку команд: чем раньше находились заявки, тем вернее срабатывала тревога. Копии снимает вторая машина по ключу, которому разрешена одна команда. Она же каждые пять минут проверяет доступность обоих сайтов. Каждый её вход отмечается в журнале авторизации. Если входа нет дольше 26 часов, ежедневная сводка сообщит об этом в Telegram. Эта строка появляется, только когда что-то не так: две машины присматривают друг за другом без внешних служб.

Вечерняя сводка каждый раз считает всё заново

Каждый вечер в Telegram уходит сводка: заявки за сутки, сколько человек заходило и сколько пришло из поиска. В отчёт была вписана строка «сайт закрыт от поисковиков». Она была верна до 19 августа, но печаталась и после, каждый вечер. Теперь посетители считаются по журналу nginx при каждом запуске, и такая строка устареть не может. Первый подсчёт отсеивал роботов по подписи браузера и выдал 30 человек за сутки при двух настоящих: сканеры давно представляются обычным браузером. Сработал подсчёт по поведению: шрифт запрашивает только тот, кто действительно отрисовывает страницу. Новый подсчёт даёт 29 человек за неделю, Яндекс Метрика — 26. Расхождение в три человека и есть точность метода; до правки оно было 178. В тексте сводки стоит «примерно» и указано, что точное число — в Метрике.

Вёрстка на телефоне и вес страниц

На экране шириной 375 px первый экран трёх страниц уезжал за правый край. Элемент сетки по умолчанию не становится уже своего содержимого, и колонка с однолинейной схемой раздувалась до 586 px. После правки колонка занимает 335 px, а схема прокручивается внутри своего блока. Фотографии производства переведены в формат WebP с запасным JPEG, в размерах 1600 и 800 px. Семь кадров страницы производства: 3200 КБ → 1168 КБ на компьютере и 415 КБ на телефоне, разрешение не уменьшено; главный кадр продукции на телефоне 627 → 147 КБ. С кадра ниже первого экрана снят приоритет загрузки, и десять прогонов Lighthouse показали: LCP (время появления главного элемента) 2,40 → 2,10 с, вес 367 → 324 КБ, сдвиг вёрстки нулевой. Типографика встроена в сборку: 830 неразрывных пробелов расставляет скрипт. Контраст по формуле WCAG: текст 17,8:1, акцент 8,0:1. Основной телефон выводился по 5–8 раз на страницу. На главной он теперь стоит 6 раз, было 8, а полный список номеров выводится один раз.

03 · Технологии

Статичный сайт на своём сервере, телефония Ростелекома и сервисы Яндекса

Astro 5 · Tailwind 4

Статичный сайт, две сборки: для своего домена и для демонстрационной папки; проверка ссылок и типографика внутри сборки

nginx · Let's Encrypt · systemd

Заголовки безопасности на всех файлах, политика содержимого, ограничение частоты запросов, службы без root, перезапуск после падения

Python · FastAPI

Приём заявок с вложениями и движок чата: сначала на диск, потом в Telegram; согласие и тип файла проверяются на сервере

GigaChat

Чат-консультант: база знаний около 3200 токенов в системном промпте и перечень того, чего он не знает

Виртуальная АТС Ростелекома

Голосовое меню на три отдела, звонок на мобильные, перенос офисного номера в АТС

Яндекс Бизнес · Метрика · Вебмастер · IndexNow

Карточка с теми же часами и телефоном, счётчик с Вебвизором, разметка LocalBusiness, сообщение поисковикам при каждой выкладке

Astro 5Tailwind 4nginxLet's EncryptsystemdPythonFastAPIGigaChatВАТС РостелекомаЯндекс БизнесЯндекс МетрикаIndexNowSchema.orgTelegram Bot APILighthouse
04 · Результат

Замеры до и после

Входящий звонок
сброс за 0 с 19,6 с

до первого гудка: 13,6 с голосового меню и 6 с ожидания, нажавший цифру соединяется раньше. Сброс за 0 с был на номере АТС до исправления

Фото производства на телефоне
3200 КБ 415 КБ

семь кадров страницы производства; на компьютере 1168 КБ, разрешение 1600 px сохранено

Главная страница, LCP
2,40 с 2,10 с

десять прогонов Lighthouse; вес страницы 367 → 324 КБ, сдвиг вёрстки нулевой

Счёт посетителей в вечерней сводке
3 человека — расхождение недельного счёта с Яндекс Метрикой; до правки расхождение было 178

Отбор роботов по подписи браузера пропускал сканеры, которые представляются обычным браузером: 30 человек за сутки при двух настоящих. Отбор по поведению, по запросу шрифта, дал 29 человек за неделю, Метрика — 26. В сводке стоит «примерно»: число из журнала показывает порядок величины, точное число — в Метрике.

Сайт из восьми страниц работает на своём домене, форма принимает заявки со схемами, карточка в Яндекс Бизнесе заведена. Офисный номер из сертификатов отвечает голосовым меню и переводит вызов на мобильные сотрудников. К 25 августа Google держал в индексе шесть страниц, робот Яндекса пришёл 27 августа; после исправления карты сайта 6 сентября семь адресов отправлены на переобход. Теперь у компании есть сайт, карточка на картах и телефон, который отвечает.

Чат-консультант работает на сайте. Его проверили вопросами, ответов на которые у него нет: он ничего не выдумал и предлагал оставить телефон, чтобы уточнил менеджер.

Есть ограничение: сайт работает на одном сервере, запасного пока нет. 18 августа из-за аварии у оператора связи в дата-центре сайт был недоступен. Причина была на стороне площадки: одновременно отключился и соседний сервер, которого мои правки не касались. Поэтому время кэширования DNS уменьшено до часа, а копии уходят на вторую машину и проверяются распаковкой. Если сайт придётся перенести на другой сервер, после переезда посетители увидят новый адрес примерно через час.

С 18 августа по 6 сентября в журнале работ 92 записи, и каждая заканчивается проверкой на живом сайте: коды ответа страниц, заголовки, вёрстка на 375 px, сквозная заявка с вложением, настоящие звонки по протоколам АТС.

05 · Где пригодится

Где ещё пригодится тот же комплект

За кейсом стоит частая задача: действующий бизнес впервые появляется в интернете. Сайт, карточку и телефон удобно собирать за один заход, опираясь на один файл фактов.

  • → Производство или мастерская без сайта — заказчик проверяет поставщика по реестрам за минуту; сайт, карточка и реквизиты помогают эту проверку пройти
  • → Городской номер, на который никто не отвечает — виртуальная АТС с меню по отделам и звонком на мобильные, с проверкой по протоколам настоящих звонков
  • → Сайт есть, а заявки теряются — заявка сохраняется на диск до отправки в мессенджер, вложения идут отдельными сообщениями, причину отказа видят и человек, и менеджер
  • → Карточка и сайт расходятся — часы, телефон и адрес берутся из одного источника, разметка LocalBusiness ссылается на карточку
  • → Чат-консультант для узкой ниши — база фактов помещается в системный промпт, половина правил перечисляет то, чего бот не знает
Что я переношу в следующие проекты
  • Единый файл фактов: число попадает на сайт, в карточку и в базу знаний чата только из документа или со слов владельца
  • Приём заявок «сначала на диск, потом в мессенджер» с вложениями отдельными сообщениями и проверками на сервере
  • Проверку копий распаковкой и по наличию заявок; две машины присматривают друг за другом по журналу авторизации
  • Порядок проверки виртуальной АТС: карточка каждого номера, часовой пояс, стандартные записи, замер времени до первого гудка по протоколам
  • Вечернюю сводку, которая заново считает состояние при каждом запуске и пишет о копиях, только если с ними что-то не так

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

Похожая задача?

Если у производства нет сайта и на офисный номер никто не отвечает, всё это можно наладить разом

Я начинаю с файла фактов: что подтверждено документами и словами владельца. На нём строятся сайт, карточка и телефония, а каждая правка проверяется на живом сайте и настоящими звонками.

Готовы начать?

Начните с аудита за 5 000 ₽: письменный отчёт и расчёт окупаемости

Расскажу, что автоматизировать в первую очередь, когда это окупится и нужен ли вашей задаче ИИ вообще. Иногда он не нужен.

Или просто задайте вопрос. В рабочее время отвечаю в течение 2 часов