Услуги
Сайты и магазиныЛендинги ★Создание сайтовИнтернет-магазины
ИИ и автоматизацияИИ-секретарь ★Автоворонка и прогрев ★Telegram-боты ★Автоматизация ★CRM-разработка
ПродвижениеSEO-продвижениеAI-продвижение ★Контекстная рекламаSMM и соцсети
Наружка, печать и производствоВывески и буквыНаружная рекламаБаннеры и штендерыТипографияВизиткиШирокоформатБрендированиеОклейка автоТорговое оборудованиеМатериалы для рекламы
Дизайн и поддержкаДизайнПоддержка
КомплексDigital под ключ ★
РешенияКейсыПортфолиоЦеныО студииБлогКонтакты Обсудить проект

Архитектура

Архитектура и стек без прикрас

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

Замер: 9 августа 2026разбор своей системы

Чем проверено: состав проверен по репозиторию и контракту API; каждый выбор привязан к ограничению, из-за которого сделан

Короткий вывод. Состав контура: статический сайт с генерацией из источников, ~490 Python-инструментов, PHP-API админки, три Node-сервиса бота и мини-приложения, Java-агент подписи на 1102 строки и два воркера вне контура сайта. Пять языков — не от широты души, а потому что каждый кусок упирался в своё ограничение. Ниже — состав целиком с причиной каждого выбора и отдельным списком мест, где эта сборка упирается в потолок. Второй список для нас важнее первого.

Схема контура

Что с чем разговаривает. Боевые адреса, порты и имена таблиц здесь обезличены — показана механика, а не карта.

Браузер клиента Мессенджеры Кабинет владельца Статический сайт тысячи страниц из источников Три Node-сервиса бот · мини-приложение · счета Java-агент подписи локально, ключ не уезжает PHP-API админки Файловое хранилище JSON без схемы, без версии формата, без блокировок ~490 Python-инструментов генераторы · чекеры · гейты Очередь заданий на стороне прода Воркер распознавания речи белого адреса нет Госсистема обмена воркер сам приходит за работой — наружу не открыто ничего

Выкладка на прод идёт только через сборочный конвейер репозитория, адресно по путям: прямая заливка отключена сознательно — два канала выкладки означают два разных прода. Оранжевая стрелка снизу вверх — то самое перевёрнутое направление связи.

Состав

СлойЧем сделанКаким ограничением продиктовано
Сайтстатический HTML, собирается из отдельных источников контента через слоты и рендертысячи страниц, из них большинство типовые; шаблонный движок на сервере дал бы то же самое, но с сервером, который может лечь. Статика не падает и не требует обслуживания
Выкладкатолько через сборочный конвейер репозитория, адресно по путямединственный канал выкладки — иначе прод и репозиторий расходятся. Прямая заливка по SFTP отключена сознательно: два канала выкладки означают два разных прода
Инструменты и проверки~490 Python-скриптов: генераторы, чекеры страниц, гейты цен и персональных данных, сборщики отчётовручная операция, повторённая трижды, становится скриптом. Реестр инструментов ведётся отдельно, чтобы не заводить второй такой же
Админка и её бэкендPHP-API на том же хостинге, что и сайтработает там, где уже есть хостинг, без второго сервера. Цена решения названа ниже
Бот, мини-приложение, счетатри Node-сервиса под менеджером процессов, три порта, три поддоменаразные контуры доступа: внутренний, пользовательский и публичный. Разделены сервисами, а не флагами в одном приложении
Подпись документов и обмен с госсистемойагент на Java 11, локальный HTTP-порт на машине владельца, 105 библиотеккриптография по национальному стандарту существует под эту платформу. Ключ, ПИН и пароль кабинета не должны покидать компьютер владельца — значит агент локальный, а не облачный
Распознавание речидообученная модель, воркер сам забирает задания с продау машины с моделью нет белого адреса. Не пробрасывать порт наружу, а перевернуть направление связи — воркер ходит за работой сам
Навигация по кодуграф кода с ручными наложениями поверх автоматического разборавопрос «что сломается, если тронуть это» дешевле задать графу, чем поиску по тексту

Три решения, которые стоит объяснить отдельно

  1. Направление связи перевёрнуто. Классический ответ на «нет белого адреса» — проброс порта или туннель. Мы вместо этого сделали очередь на стороне прода: воркер сам приходит за заданием, забирает, возвращает результат. Наружу не открыто ничего. Побочный выигрыш — машина может быть выключена, задания просто копятся.
  2. Секреты не централизованы намеренно. Ключ электронной подписи лежит на машине владельца и никуда не уезжает. Это неудобно (агент надо запустить) и это осознанный размен: централизованное хранилище ключей — новая точка отказа и новый предмет разговора с проверяющим.
  3. Разграничение видимости — в коде, а не в интерфейсе. Один и тот же заказ отдаётся разным ролям через фильтр полей: клиент не получает ни телефона водителя, ни ставок, ни служебных флагов. Прятать на фронте бесполезно — данные всё равно уходят в браузер.

Разграничение видимости — на сервере. Имена полей обезличены, механика настоящая

// Один заказ — три представления. Роль решает, что вообще уйдёт в ответ,
// а не то, что потом спрячет интерфейс.
function view_for(array $order, string $role): array {
    $common = ['id', 'status', 'from', 'to', 'when'];

    if ($role === 'client') {
        // ни телефона водителя, ни ставки, ни служебных флагов
        return pick($order, [...$common, 'price_client']);
    }
    if ($role === 'driver') {
        // своя ставка видна, клиентская цена — нет
        return pick($order, [...$common, 'rate_driver', 'client_name']);
    }
    return $order;  // диспетчер видит всё
}

Три строки, но именно они отвечают на вопрос «а данные точно не утекут в браузер». Фильтр стоит в одной функции, и все каналы — сайт, бот, мини-приложение — ходят через неё. Пока представление собирается в каждом обработчике отдельно, рано или поздно один из них отдаст лишнее поле, и заметит это клиент, а не мы.

Где эта сборка упирается — список без смягчений

ПределЧто это значит на практике
Хранилище — файлы JSON без схемы и блокировокгонки записи и стихийная эволюция полей. Разобрано отдельно: один запрос уже обнулял базу заявок
У PHP-API нет автотестова он ворочает заявками и деньгами. Провал ловится в проде человеком. Ближайшая работа — локальный прогон с конкурентными запросами и невалидным телом в том же гейте, что и проверка синтаксиса
Нет мониторинга доступностисервер умер — узнали при попытке им воспользоваться; автосбор данных стоял 10 дней незамеченным. Лечится дешёвой проверкой живости и внешним пингом, а не переписыванием архитектуры
Резервных копий репозиториев вне одного диска нетсамый неприятный пункт списка: единственная копия — вопрос «когда», а не «если»
Часть инструментов живёт вне основного контурапо нашему же правилу инструмент, оставленный на невлитой ветке, — это инструмент, которого нет. Правило есть, дисциплина неполная
Почему мы это публикуем. Первые четыре пункта — стандартная инженерная гигиена, и любой опытный человек найдёт их за час разговора. Разница лишь в том, узнает он о них от нас на входе или сам в середине проекта. Мы предпочитаем первое — включая случаи, когда это стоит сделки.

Чего в стеке нет и не будет в ближайшее время

  • Микросервисов. Три сервиса — это разделение контуров доступа, а не архитектурный стиль. Дробить дальше на нашем масштабе — добавить сетевых отказов там, где сейчас вызов функции.
  • Очередей и распределённых хранилищ. Масштаб не тот; порог, при котором они понадобятся, считается на салфетке и до него далеко.
  • 1С. Не наш стек. Мы делаем контур вокруг него — обмен, документы, отчётность, — но расширения внутри 1С не пишем и не беремся оценивать. Это отдельная профессия.
  • Собственной модели с нуля. Мы дообучаем готовые под свою задачу; обучение с нуля и классическое машинное обучение — не наш контур, и это записано в границах услуг.

Источники материала

  • Контракт бэкенда от 04.06.2026: состав сервисов, порты, поддомены, три механизма аутентификации, принцип разграничения видимости и правило «не ломать существующее».
  • Документация агента подписи: состав, требования к платформе, список боевых мин.
  • Протокол распознавания речи от 01.08.2026: устройство очереди и обоснование направления связи.
  • Реестр инструментов проекта — состав и статус каждого скрипта.
  • Разбор пяти инженерных книг от 31.07.2026 — источник списка пределов и предостережения против дробления на микросервисы.

Архитектурные решения тоже принимаются по замеру

На курсе — модуль про экономику: когда точное решение окупается, а когда дорогая точность не нужна. Порог считается, а не обсуждается.

Программа курса и цены
Соседние материалы
Предыдущий замер: «Единой модели данных нет» — верноСледующий замер: Что на самом деле отдаёт внешний APIВсе материалы журнала

Обсудим ваш проект

Оставьте заявку — свяжемся в течение 15 минут в рабочее время, зададим пару вопросов и пришлём ориентир по цене и срокам. Бесплатно, без обязательств.

  1. 1. Заявка или квиз
  2. 2. Короткий созвон / переписка
  3. 3. Бесплатная смета и план
  4. 4. Договор и старт

Бесплатно и ни к чему не обязывает. Ответим за 15 минут.