<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Блог ADG</title>
  <link>https://adg.ru/blog/</link>
  <atom:link href="https://adg.ru/rss.xml" rel="self" type="application/rss+xml"/>
  <description>Инженерные заметки команды ADG: инфраструктура, системное администрирование, DataOps, DevOps, автоматизация, АСУ ТП, информационная безопасность.</description>
  <language>ru</language>
  <lastBuildDate>Thu, 30 Jul 2026 09:00:00 +0300</lastBuildDate>
  <item>
    <title>План H2 2026: что модернизируем в инфраструктуре, куда двигаем AI-автоматизацию и какие регуляторные дедлайны не пропустить</title>
    <link>https://adg.ru/blog/2026-07-plan-h2-2026-infra-ai-regulyatorika/</link>
    <guid isPermaLink="true">https://adg.ru/blog/2026-07-plan-h2-2026-infra-ai-regulyatorika/</guid>
    <pubDate>Thu, 30 Jul 2026 09:00:00 +0300</pubDate>
    <category>Управление и процессы</category>
    <description>Наш публичный план на второе полугодие 2026: приоритеты по инфраструктуре, AI-агентам и регуляторике. Делимся для обратной связи.</description>
    <content:encoded><![CDATA[<p>Июль заканчивается, и мы традиционно делаем то, что, наверное, не очень принято публиковать открыто: кладём на стол план на полугодие. Не маркетинговый лендинг с «мы поможем вашему бизнесу», а рабочий приоритизированный список того, что собираемся делать у себя и в проектах. Если кто-то из читателей видит в этом своё и хочет обменяться опытом - отлично, для этого и пишем.</p>
<h2>Откуда берётся план</h2>
<p><a href="https://adg.ru/blog/2026-07-itogi-h1-2026-kii-pdn-ai-platform/">Итоги H1 2026</a> мы разобрали отдельно. Если коротко: регуляторная нагрузка выросла сильнее, чем рассчитывали; AI-автоматизация прошла через первые реальные провалы в проде и стала интереснее от этого, а не скучнее; инфраструктурный долг копился тихо, пока все смотрели на AI.</p>
<p>Теперь H2. Три направления.</p>
<h2>Инфраструктура: переход на рельсы</h2>
<p>Первое направление - это то, что откладывали с начала года.</p>
<p><strong>Kubernetes-дистрибутивы.</strong> После <a href="https://adg.ru/blog/2026-07-kubernetes-1-35-otechestvennye-distrib/">обзора отечественных дистрибутивов в июле</a> стало понятно, что несколько проектов у нас висят на самосборных кластерах без внятной истории обновлений. Во втором полугодии закрываем этот хвост: переводим на сертифицированные дистрибутивы там, где есть требования <a href="https://adg.ru/blog/terms/kii/">КИИ</a>, и договариваемся с командами о более ясной политике апгрейдов там, где требований нет, но риск накопленных уязвимостей тот же.</p>
<p><strong>Observability до конца.</strong> <a href="https://adg.ru/blog/2026-06-observability-zrelost-otechestvennye-2026/">Полгода назад</a> мы писали про зрелость observability-стека. Честный вывод: метрики и трейсы у нас в порядке, логи - сильно хуже. Часть сервисов пишет в stdout без структуры, часть - в файлы с нестандартным форматом. <a href="https://adg.ru/blog/terms/opentelemetry-collector/">OpenTelemetry Collector</a> уже развёрнут, но покрытие источников неполное. Цель H2: все production-сервисы в structured logging, все источники в Collector. Это не glamorous, но без этого observability - просто красивый дашборд.</p>
<p><strong>Бэкапы и air gap.</strong> Veeam v13 развернули в марте, но <a href="https://adg.ru/blog/2026-03-veeam-v13-release-air-gap-immutable/">политику air gap</a> полностью не отработали. Надо закрыть: настроить расписание изолированных резервных копий, проверить процедуру восстановления (не на словах, а живым тестом), задокументировать. Звучит как операционная рутина - и так и есть, но именно такая рутина потом спасает, когда звонят в три ночи.</p>
<h2>AI-агенты: масштабирование без потери контроля</h2>
<p>Второе направление - сложнее, потому что здесь нет устоявшихся ответов.</p>
<p>За первое полугодие мы дошли до нескольких работающих AI-сценариев в проде: классификация инцидентов, черновики ответов в helpdesk, автоматический анализ логов при алертах. <a href="https://adg.ru/blog/2026-07-aiops-incident-response-automation-2026/">AIOps для автоматизации реагирования</a> - это уже не эксперимент.</p>
<p>Проблема не в том, работает ли это технически. Проблема в том, что хорошо работающий агент начинает использоваться там, куда его изначально не планировали. Кто-то из команды подключает его к новому источнику данных, кто-то немного меняет промпт - и уже непонятно, что именно работает в проде и с какими правами.</p>
<p>На H2 приоритеты такие:</p>
<p><strong>Governance для агентов - это не бюрократия.</strong> Реестр развёрнутых агентов с описанием: что делает, какие данные обрабатывает, кто отвечает, как мониторить. Это несложно, но требует дисциплины. Без реестра масштабирование превращается в зоопарк.</p>
<p><strong>Оценка перед расширением.</strong> Прежде чем расширять агента на новый сценарий - письменная оценка рисков. Не большой документ, но фиксированный чеклист: что может пойти не так, есть ли ограничение на действия агента в этом сценарии, кто будет мониторить.</p>
<p><strong><a href="https://adg.ru/blog/terms/rag-pipeline/">RAG-пайплайны</a> под ревизию.</strong> <a href="https://adg.ru/blog/2026-07-llm-rag-prodakshn-itogi-2026/">Итоги RAG в проде</a> показали: качество retrieval деградирует, если не следить за актуальностью корпуса. Часть наших пайплайнов работает на документах, которые обновлялись в последний раз полгода назад. Это надо чинить системно, а не точечно.</p>
<h2>Регуляторика: дедлайны, которые уже видны</h2>
<p>Третье направление - самое предсказуемое, потому что регулятор расписание не меняет.</p>
<p><strong>КИИ: осенний цикл проверок.</strong> По наблюдениям коллег и публичным данным ФСТЭК, осень традиционно активна по плановым проверкам. <a href="https://adg.ru/blog/2026-07-fstec-ndc-novye-trebovaniya-2026/">Новые требования ФСТЭК по НДС</a> вступили в силу, и первые вопросы на проверках по ним уже фиксируются. Наша задача до конца августа: пройти по чеклисту со всеми заказчиками, у которых запланированы проверки в Q3-Q4.</p>
<p><strong>ПДн: изменения <a href="https://adg.ru/blog/terms/152-fz/">152-ФЗ</a>.</strong> <a href="https://adg.ru/blog/2026-07-pdn-152-fz-izmenenia-2026/">Июльский разбор изменений</a> - это хорошая база. Но между «прочитали» и «внедрили» - дистанция. У нескольких заказчиков обработка ПДн организована по старым схемам, и новые требования к трансграничной передаче и уведомлениям об утечках требуют изменений в процессах, а не только в документах.</p>
<p><strong><a href="https://adg.ru/blog/terms/sbom-fstec/">SBOM</a> и supply chain.</strong> <a href="https://adg.ru/blog/2026-02-sbom-fstec-ispolnenie-trebovaniy-2026/">Требования ФСТЭК по SBOM</a> были введены в начале года. Полгода прошло - у части заказчиков SBOM формально генерируется, но не используется и не проверяется. Если инспектор попросит показать, как SBOM применяется в процессе обновления ПО - ответить будет нечего. Это разрыв, который надо закрывать.</p>
<h2>Как мы приоритизируем</h2>
<p>Ничего экзотического. Дедлайны регуляторики не двигаются, поэтому они идут первыми. Инфраструктурный долг давит на надёжность прямо сейчас - он идёт вторым. AI-направление важное, но без жёстких внешних дедлайнов, поэтому работаем методично, без кавалерийских рывков.</p>
<p>Если у кого-то из читателей схожие приоритеты на H2 - интересно было бы сверить. Где расходится, где совпадает. Пишите в комментарии или напрямую.</p>]]></content:encoded>
  </item>
  <item>
    <title>Итоги H1 2026: отечественный стек повзрослел, AI добрался до NOC, регуляторика стала скучнее</title>
    <link>https://adg.ru/blog/2026-07-itogi-h1-2026-kii-pdn-ai-platform/</link>
    <guid isPermaLink="true">https://adg.ru/blog/2026-07-itogi-h1-2026-kii-pdn-ai-platform/</guid>
    <pubDate>Tue, 28 Jul 2026 09:00:00 +0300</pubDate>
    <category>Управление и процессы</category>
    <description>Три главных наблюдения команды по итогам первого полугодия 2026: зрелость отечественного стека, AI-агенты в первом уровне NOC и предсказуемость регуляторной нагрузки.</description>
    <content:encoded><![CDATA[<p>Первое полугодие закрыто. Мы традиционно делаем внутреннюю ретроспективу по проектам, и в этот раз решили часть наблюдений вынести публично - не в виде отчёта с цифрами, а в виде честного среза того, что поменялось в нашей повседневной работе за шесть месяцев.</p>
<p>Три наблюдения. Ни одно из них не было очевидным в январе.</p>
<h2>Первое: отечественный стек перестал быть «временным»</h2>
<p>Ещё в конце 2024-го значительная часть проектов строилась по такой логике: «сейчас ставим отечественный продукт, потому что регуляторика, но смотрим в сторону привычного». Это проявлялось в архитектуре - резервные интеграции, двойной мониторинг, избыточная документация на случай отката. Люди страховались.</p>
<p>В первом полугодии 2026 этот паттерн заметно изменился. Не везде и не у всех, но в достаточном числе проектов, чтобы это стало тенденцией.</p>
<p><strong>Что произошло на практике.</strong> <a href="https://adg.ru/blog/terms/astra-linux/">Astra Linux SE</a> 2.x и <a href="https://adg.ru/blog/terms/redos/">РЕД ОС</a> 9.x закрыли достаточно производственных кейсов, чтобы эксплуатирующие команды перестали относиться к ним как к «нестандартному» варианту. <a href="https://adg.ru/blog/terms/kubernetes/">Kubernetes</a> в дистрибуции <a href="https://adg.ru/blog/terms/deckhouse/">Deckhouse</a> или аналогах - работает. <a href="https://adg.ru/blog/2026-04-postgresql-18-prodakshn-sertifikaciya-kii/">PostgreSQL 18 с сертификацией для КИИ</a> - используется в проде без постоянного оглядывания на совместимость. Это не означает, что всё идеально и проблем нет. Проблемы есть - особенно в нишевом прикладном ПО и в сетевом оборудовании. Но базовый инфраструктурный слой перестал быть источником экзистенциального беспокойства.</p>
<p>Мы это чувствуем по характеру вопросов на пресейлах. Раньше первый час уходил на «а точно ли оно работает». Сейчас - на «как правильно строить» и «как мигрировать».</p>
<h2>Второе: AI-агенты дошли до первого уровня NOC</h2>
<p>В январе мы запустили первый агент с правом на действие - не только читает алерты и пишет дежурному, но и выполняет ограниченный набор операций автономно. К июлю у нас накопился достаточный операционный опыт, чтобы говорить о результате.</p>
<p>Детали мы <a href="https://adg.ru/blog/2026-07-aiops-incident-response-automation-2026/">разбирали отдельно</a>: примерно треть Tier-1 инцидентов закрывается без участия человека. Здесь хочется сказать о другом - об изменении отношения к теме внутри клиентских команд.</p>
<p><strong>Было.</strong> В начале года типичная реакция на предложение «агент будет что-то делать сам» - осторожная, граничащая с отказом. Не потому что технически непонятно, а потому что «ответственность непонятна». Кто виноват, если агент перезапустил не тот под? Это реальный вопрос, не демагогия.</p>
<p><strong>Стало.</strong> Те же команды через полгода задают другой вопрос: «почему агент не делает X автономно, нам кажется, это тоже можно доверить». Это разворот. Доверие к агентам строилось медленно - через прозрачные логи, через то, что агент всегда объясняет что сделал и почему, через то, что ни одного серьёзного инцидента по вине агента не было.</p>
<p>Одновременно сформировалось понимание, что первый уровень - это не вся NOC-автоматизация. Tier-2 и выше требует другого уровня рассуждений и другого контроля. Пока агенты работают там, где паттерн повторяемый, а действие обратимо. Это правильная граница.</p>
<h2>Третье: регуляторная нагрузка выросла, но стала предсказуемой</h2>
<p>Если кто-то ожидал, что после волны 2024-2025 регуляторика слегка расслабится - нет. По объёму требований первое полугодие 2026 не легче. Новые методрекомендации ФСТЭК по <a href="https://adg.ru/blog/terms/kii/">КИИ</a>, изменения в <a href="https://adg.ru/blog/terms/152-fz/">152-ФЗ</a>, активизация проверок по <a href="https://adg.ru/blog/terms/sbom/">СБОМ</a> - это реальная нагрузка на команды.</p>
<p>Но произошло кое-что важное: нагрузка стала предсказуемой.</p>
<p><strong>Чем отличается предсказуемая нагрузка от непредсказуемой.</strong> Год назад интерпретация требований была лотереей. Разные регуляторы, разные проверяющие, разные акценты - компании тратили огромный ресурс не на выполнение, а на угадывание. Сейчас паттерны выровнялись. ФСТЭК опубликовал обезличенную статистику нарушений за H1 - мы её <a href="https://adg.ru/blog/2026-06-kii-itogi-h1-2026-regulyatorika/">разбирали в июне</a>. <a href="https://adg.ru/blog/terms/gosopka-2/">ГосСОПКА 2.0</a> имеет задокументированный API. Реестровые требования по ПДн устоялись настолько, что превратились в чеклист, а не в загадку.</p>
<p>Практически это выглядит так: у нас появились внутренние шаблоны для типовых сценариев - объект КИИ третьей категории, оператор ПДн с выгрузкой в реестр, аудит по 239-му приказу. Шаблон - это не замена анализа, это отправная точка, которая сокращает время работы вдвое и снижает риск что-то пропустить. В прошлом году таких шаблонов у нас не было, потому что не было достаточной повторяемости.</p>
<p>Это не означает, что регуляторика стала простой. Некоторые требования по-прежнему трактуются широко, и инспектора пользуются этим. Но базовый уровень понятности существенно вырос, и это снимает фоновую тревогу с проектов.</p>
<h2>Что дальше</h2>
<p>Три наблюдения выше - это срез, а не прогноз. Второе полугодие принесёт свои сюрпризы: у нас уже в работе несколько проектов, где видно нетипичные конфигурации и нестандартные вопросы.</p>
<p>Одна вещь остаётся без ответа, и мы за ней следим: как масштабируется доверие к AI-агентам в командах, где меньше технической культуры. Опыт, о котором мы пишем, накоплен в достаточно зрелых командах. Там, где инженерная база слабее - другая картина. Границы автономии агентов определяет в том числе зрелость команды, которая их эксплуатирует. Это интересный и до конца не решённый вопрос.</p>]]></content:encoded>
  </item>
  <item>
    <title>Managed-сервисы IL-2 облаков в середине 2026: Selectel, SberCloud, VK Cloud</title>
    <link>https://adg.ru/blog/2026-07-otechestvennye-oblaka-il2-2026-sravnenie/</link>
    <guid isPermaLink="true">https://adg.ru/blog/2026-07-otechestvennye-oblaka-il2-2026-sravnenie/</guid>
    <pubDate>Thu, 23 Jul 2026 09:00:00 +0300</pubDate>
    <category>Инфраструктура</category>
    <description>Сравниваем managed Kubernetes и managed PostgreSQL у Selectel, SberCloud и VK Cloud с IL-2 сертификацией. Что уже тянет enterprise, а что требует допиливания.</description>
    <content:encoded><![CDATA[<p>Несколько клиентов в последние месяцы задают один и тот же вопрос: мы работаем с <a href="https://adg.ru/blog/terms/kii/">КИИ</a> или просто осторожные - можно ли взять managed Kubernetes в IL-2 облаке и не городить при этом огород из самодельных операционных процедур? Ответ за последний год стал заметно менее однозначным, что само по себе прогресс. Но нюансов хватает.</p>
<p>Мы посмотрели три провайдера, которые сейчас публично заявляют <a href="https://adg.ru/blog/terms/il2-sertifikat-oblako/">IL-2 аттестат</a> и продают managed-сервисы поверх него: Selectel, SberCloud (платформа SberCloud Advanced) и VK Cloud. Яндекс Cloud здесь не рассматриваем - у него другая история с сертификацией, отдельный разговор.</p>
<h2>Managed Kubernetes: у кого что</h2>
<p><strong>Selectel.</strong> <a href="https://adg.ru/blog/terms/kubernetes/">Managed Kubernetes</a> у Selectel работает поверх их собственной платформы виртуализации, сертификат IL-2 распространяется на инфраструктурный слой. Control plane управляется провайдером, worker-ноды живут в проекте клиента. Версии Kubernetes поддерживаются с задержкой примерно в один минорный релиз от upstream - на момент написания доступна 1.34, 1.35 в testing. Это приемлемо для большинства production-нагрузок.</p>
<p>Что работает хорошо: node pools с автоскейлингом, интеграция с их же load balancer и object storage, сносная документация по network policy. Что вызывает вопросы: отсутствие встроенного managed etcd-бэкапа на стороне провайдера (клиент должен настраивать сам или использовать Velero), и довольно скромный набор admission webhook'ов из коробки. Для команд, привыкших к <a href="https://adg.ru/blog/terms/deckhouse/">Deckhouse</a> или OpenShift, это ощущается как «почти голый k8s».</p>
<p><strong>SberCloud Advanced.</strong> Здесь ситуация интереснее. SberCloud развивает Kubernetes-сервис на базе собственного дистрибутива, достаточно близкого к vanilla, но с добавленными модулями под их экосистему. IL-2 аттестат здесь охватывает всё - и control plane, и данные клиентов на инфраструктуре провайдера, что важно при обработке данных КИИ.</p>
<p>Опыт работы с control plane у SberCloud заметно богаче: встроенный etcd-бэкап с политиками ретенции, policy enforcement через <a href="https://adg.ru/blog/terms/opa-gatekeeper/">OPA Gatekeeper</a> из коробки, интеграция с их IAM для RBAC. Но есть и обратная сторона: цикл поддержки версий длиннее, обновление кластера - процедура с участием саппорта, не всегда автоматизированная. Мы столкнулись с ситуацией, когда минорное обновление заняло несколько дней согласований вместо ожидаемого rolling update.</p>
<p><strong>VK Cloud.</strong> Managed Kubernetes в VK Cloud - продукт с наиболее долгой историей среди трёх, и это чувствуется. API стабильный, документация по edge cases довольно подробная, есть нормальный <a href="https://adg.ru/blog/terms/terraform/">terraform-провайдер</a> с покрытием большей части ресурсов. Поддержка IL-2 появилась через выделенный сегмент инфраструктуры - не все регионы, уточнять при заказе.</p>
<p>Из минусов: автоскейлинг node pool работает, но порой с задержкой, которую мы бы назвали «задумчивой» - от срабатывания метрики до появления новой ноды проходит больше времени, чем хотелось бы для нагрузки с резкими пиками. И интеграция с их managed PostgreSQL через network policy требует ручной настройки там, где ожидаешь автоматики.</p>
<h2>Managed PostgreSQL: зрелость разная</h2>
<p>Это, пожалуй, самая показательная часть, потому что managed PostgreSQL - более простой продукт, чем Kubernetes, и по его состоянию хорошо видна зрелость operational-процессов провайдера в целом.</p>
<p><strong>Selectel</strong> предлагает PostgreSQL до версии 16 (17 в бете). Failover автоматический через <a href="https://adg.ru/blog/terms/patroni/">Patroni</a>, время переключения в наших тестах - около 20-30 секунд, что для большинства приложений терпимо при наличии retry-логики. Есть point-in-time recovery с хранением WAL до 7 дней. Мониторинг - стандартный набор метрик через их же панель, интеграция с внешним <a href="https://adg.ru/blog/terms/prometheus/">Prometheus</a> требует настройки экспортёра вручную.</p>
<p><strong>SberCloud.</strong> PostgreSQL 15 и 16 в production, 17 заявлен. Managed-сервис построен на Patroni с их собственной обёрткой. Примечательно, что SberCloud - один из немногих, кто явно описывает, как проходит failover в сценарии потери connection с мастером, включая поведение при split-brain. Это признак того, что операционная команда провайдера реально с этим разбиралась, а не просто задеплоила Patroni по туториалу. PITR есть, период хранения WAL конфигурируется. Из неудобного: параметры кластера меняются через тикет в саппорт для части настроек, нет полноценного API для изменения postgresql.conf на лету.</p>
<p><strong>VK Cloud.</strong> PostgreSQL здесь живёт в рамках их DBaaS-платформы, которая поддерживает несколько СУБД. Версии 15, 16 и 17. PITR работает. Есть API для управления кластером, terraform-ресурсы покрывают основное. Читаемые реплики создаются через API без привлечения саппорта - казалось бы, базово, но у конкурентов это не всегда так. Из нареканий: мониторинг bloat и autovacuum-метрики не попадают в стандартный набор дашбордов, приходится добирать через pg<em>stat</em>* вручную.</p>
<h2>Что это значит на практике</h2>
<p>Если собрать в одну таблицу без украшений:</p>
<ul>
<li><strong>Selectel</strong> - хорошая база, понятная модель, IL-2 на инфраструктуре. Для команд, которые готовы сами операционировать нюансы Kubernetes и не боятся настроить мониторинг PostgreSQL - рабочий вариант. Не для тех, кто хочет максимум managed из коробки.</li>
<li><strong>SberCloud Advanced</strong> - наиболее enterprise-ориентированный из трёх. IL-2 охватывает больше слоёв, operational-практики PostgreSQL выглядят серьёзнее. Плата за это - меньше автоматизации самообслуживания, больше взаимодействия с саппортом.</li>
<li><strong>VK Cloud</strong> - самый зрелый продуктово, наиболее удобный API и terraform-покрытие. IL-2 через выделенный сегмент, что нужно учитывать при планировании. Для команд с развитой IaC-культурой подходит лучше всего.</li>
</ul>
<p>Мы занимаемся настройкой и сопровождением <a href="https://adg.ru/services/managed/">managed-инфраструктуры</a> на всех трёх платформах - выбор провайдера обычно не абстрактный, а продиктован тем, какие сервисы клиент уже использует и насколько критично самообслуживание через API. Если коротко: в 2026 году IL-2 облака перестали быть синонимом «возьмём VM и всё поднимем сами», но до «закрыли глаза и задеплоили» ещё есть дистанция.</p>]]></content:encoded>
  </item>
  <item>
    <title>Поправки к 152-ФЗ по биометрии в 2026: что HR и финтех должны перенастроить в ИС</title>
    <link>https://adg.ru/blog/2026-07-pdn-152-fz-izmenenia-2026/</link>
    <guid isPermaLink="true">https://adg.ru/blog/2026-07-pdn-152-fz-izmenenia-2026/</guid>
    <pubDate>Tue, 21 Jul 2026 09:00:00 +0300</pubDate>
    <category>Регуляторика</category>
    <description>Новый порядок обработки биометрических ПДн по 152-ФЗ затронет HR и финтех уже сейчас. Разбираем, что нужно пересмотреть в информационных системах до вступления в силу.</description>
    <content:encoded><![CDATA[<p>В этом месяце вступают в силу поправки к <a href="https://adg.ru/blog/terms/152-fz/">152-ФЗ</a>, которые касаются биометрических персональных данных и требований к их обработке. Документ циркулировал в разных редакциях с прошлого года, и у операторов было время подготовиться - но по нашим наблюдениям, большинство не успело. Особенно это касается двух категорий заказчиков: HR-компаний с пропускными системами и лицевой идентификацией и финтеха с удалённой верификацией клиентов.</p>
<p>Мы занимаемся <a href="https://adg.ru/services/audit/">аудитом</a> операторов ПДн и сейчас разбираем, что конкретно изменилось и что нужно сделать в <a href="https://adg.ru/blog/terms/ispdn/">информационных системах</a>.</p>
<h2>Что изменилось по существу</h2>
<p>Поправки не переписывают 152-ФЗ целиком - они уточняют несколько блоков, которые давно вызывали вопросы.</p>
<p><strong>Биометрия обособлена жёстче.</strong> Ранее биометрические ПДн были специальной категорией с повышенными требованиями, но граница между «обычным» фото в личном деле и биометрией, обрабатываемой для идентификации, была размытой. Теперь закон прямо разграничивает: биометрические данные, используемые для установления личности субъекта, - отдельный режим с отдельными требованиями к ИС, согласию и хранению. Фото в паспортных данных сотрудника и шаблон лица в системе контроля доступа - разные категории с разным правовым основанием.</p>
<p><strong>Согласие на биометрию - только письменное и отзываемое с техническим механизмом.</strong> Устная форма и галочка в интерфейсе больше не работают. Оператор обязан обеспечить субъекту возможность отозвать согласие, причём это должно быть реализовано технически: отзыв - не просто запись в журнале, а реальное прекращение обработки и удаление биометрического шаблона в разумный срок. Что такое «разумный срок» - поправки определяют как не более 30 дней.</p>
<p><strong><a href="https://adg.ru/blog/terms/fz-242/">Локализация</a> биометрических данных.</strong> Биометрические шаблоны (не исходные изображения, а именно шаблоны для идентификации) должны храниться исключительно на территории РФ. Для большинства российских операторов это и так было очевидно, но поправки закрывают сценарий, когда шаблоны вычислялись в облачном API иностранного вендора и кэшировались за рубежом.</p>
<p><strong>Ограничение на передачу третьим лицам.</strong> Биометрические данные для идентификации нельзя передавать третьим лицам без отдельного явного согласия - даже в рамках группы компаний. Договор поручения на обработку ПДн недостаточен.</p>
<h2>Где это бьёт больнее всего</h2>
<p>В HR это пропускные системы с распознаванием лиц - их внедряли активно в 2023-2024 годах. Типичная архитектура: камера на входе, локальный сервер или облачный API для вычисления шаблона, СКУД, которая получает результат идентификации. Проблемы обычно в нескольких местах.</p>
<ul>
<li><strong>Форма согласия.</strong> В большинстве случаев согласие на биометрию было вшито в трудовой договор или общее согласие на обработку ПДн - без явного указания на биометрию как отдельную категорию. Это нужно переделывать.</li>
<li><strong>Механизм отзыва.</strong> СКУД не умеет «удалить шаблон по запросу сотрудника» - это не функционал, который закладывается по умолчанию. Нужна доработка или замена.</li>
<li><strong>Обработчик шаблонов.</strong> Если API для идентификации - сторонний сервис (а таких много), нужно проверить, где он хранит шаблоны и есть ли договор поручения с явным указанием на биометрию.</li>
</ul>
<p>В финтехе похожая история с удалённой верификацией клиентов при открытии счёта или оформлении кредита. Там биометрические данные часто передаются в Единую биометрическую систему (ЕБС/ГБД) или в сервисы банков-партнёров. Новый порядок требует пересмотра оснований для каждого из этих потоков.</p>
<h2>Что нужно пересмотреть в ИС</h2>
<p>Мы сейчас идём по этому чеклисту с несколькими заказчиками - для понимания масштаба задачи.</p>
<p><strong>Инвентаризация систем с биометрией.</strong> Не документация - реальный опрос ИТ: где вычисляются шаблоны, где хранятся, куда передаются результаты. Часто оказывается, что шаблоны оседают в нескольких местах сразу: на локальном сервере СКУД, в логах API и в базе самого сервиса идентификации.</p>
<p><strong>Ревизия согласий.</strong> Для каждой системы нужно понять, на каком основании обрабатываются биометрические данные. Если основание - согласие, смотрим форму: письменное ли оно, явно ли указана биометрия, есть ли механизм отзыва. Если нет - готовим новые формы и техническое решение для отзыва.</p>
<p><strong>Технический механизм удаления шаблонов.</strong> Это самая трудоёмкая часть. Нужно не просто помечать запись как «отозванную» - нужно реальное удаление биометрического шаблона из всех мест хранения. Если СКУД или система верификации не умеют этого делать по API - либо доработка, либо замена вендора.</p>
<p><strong>Договоры с обработчиками.</strong> Проверить все договоры поручения на обработку ПДн, где есть биометрия. Поручение должно явно называть биометрические данные и содержать ограничения на их передачу.</p>
<p><strong>Реестр и уведомление.</strong> Если биометрические данные не выделены в уведомлении оператора как отдельный вид - обновить. Мы в марте писали о том, как РКН находит расхождения между реестровой записью и реальными системами - с биометрией цена такого расхождения выросла.</p>
<h2>Что пока остаётся неясным</h2>
<p>Поправки не дают чёткого ответа на несколько вопросов. Что считать биометрическим шаблоном - только математический вектор признаков или любой файл, из которого можно его вычислить? Как трактовать ситуацию, когда биометрию обрабатывает государственный орган в рамках межведомственного взаимодействия? Надеемся, что РКН даст разъяснения - но исходим из того, что их придётся ждать.</p>
<p>Для наших заказчиков ближайший практический шаг - инвентаризация систем с биометрией и ревизия форм согласия. Без этой картины разговор о соответствии абстрактный, а дедлайн уже наступил.</p>]]></content:encoded>
  </item>
  <item>
    <title>ClickHouse 26.5 + Apache Iceberg: federated query без ETL и сколько это реально стоит</title>
    <link>https://adg.ru/blog/2026-07-clickhouse-26-5-new-features/</link>
    <guid isPermaLink="true">https://adg.ru/blog/2026-07-clickhouse-26-5-new-features/</guid>
    <pubDate>Thu, 16 Jul 2026 09:00:00 +0300</pubDate>
    <category>Данные и аналитика</category>
    <description>ClickHouse 26.5 улучшил query cache и добавил полноценную поддержку Iceberg для внешних таблиц. Тестируем federated query на нашем кластере и замеряем overhead.</description>
    <content:encoded><![CDATA[<p><a href="https://adg.ru/blog/terms/clickhouse/">ClickHouse</a> 26.5 вышел на прошлой неделе. Два изменения сразу попали в поле нашего внимания: переработанный query cache и расширенная поддержка <a href="https://adg.ru/blog/terms/apache-iceberg/">Apache Iceberg</a> для внешних таблиц. Второе - в первую очередь, потому что именно с Iceberg у нас давний незакрытый счёт.</p>
<p>В апреле <a href="https://adg.ru/blog/2026-04-data-lakehouse-otechestvennye-2026/">мы описывали</a> как строили <a href="https://adg.ru/blog/terms/data-lakehouse/">lakehouse</a> на ClickHouse + MinIO + Iceberg и сколько вспомогательного кода пришлось написать, чтобы всё работало. Одна из главных болей - ClickHouse умел читать Iceberg-таблицы, но не умел делать это в режиме полноценного federated query: нельзя было объединить данные из нативной ClickHouse-таблицы и Iceberg-таблицы в одном запросе без предварительного <a href="https://adg.ru/blog/terms/etl/">ETL</a> или materialised view. Точнее, технически JOIN работал, но partition pruning на стороне Iceberg отваливался, и запрос читал всё подряд.</p>
<h2>Что изменилось в 26.5</h2>
<p><strong>Поддержка Iceberg стала полноценной внешней таблицей.</strong> В 26.5 движок <code>IcebergS3</code> получил нормальный pushdown предикатов, включая сложные фильтры по партиционированным полям. Теперь ClickHouse смотрит на Iceberg-манифесты и partition summary прежде чем идти за файлами, и транслирует WHERE-условия в pruning на уровне Iceberg partition spec. Включая <code>bucket()</code> и <code>truncate()</code> трансформации - как раз то, на чём мы спотыкались раньше.</p>
<p><strong>Query cache стал умнее в сценариях с внешними таблицами.</strong> До 26.5 query cache работал только для запросов полностью к нативным MergeTree-таблицам - логично, потому что для внешних источников кеш рисковал отдавать устаревшие данные без предупреждения. В 26.5 добавили TTL-based invalidation привязанный к snapshot ID Iceberg-таблицы: кеш хранит вместе с результатом snapshot, при котором он был получен, и инвалидирует запись при появлении нового snapshot. Не универсальное решение - оно работает только там, где ClickHouse видит Iceberg-метаданные, но для нашего сценария это именно то, что нужно.</p>
<h2>Что тестировали</h2>
<p>На нашем аналитическом кластере живут две категории данных: горячие - нативные ClickHouse MergeTree-таблицы с данными за последние 90 дней, и холодные - исторический архив в Iceberg/<a href="https://adg.ru/blog/terms/minio-s3/">MinIO</a> с полной историей за несколько лет. До 26.5 запросы «дай мне тренд за 2 года» шли в два шага: сначала выгрузка из Iceberg через отдельный pipeline, потом JOIN уже внутри ClickHouse с нативными данными. Это или ручной ETL, или сложный orchestration.</p>
<p>После обновления на 26.5 написали тестовый запрос который напрямую объединяет нативную таблицу с Iceberg-внешней:</p>
<pre><code class="language-sql">SELECT
    toStartOfMonth(event_time) AS month,
    sum(amount) AS total
FROM native_events
UNION ALL
SELECT
    toStartOfMonth(event_time) AS month,
    sum(amount) AS total
FROM iceberg_s3('...', 'events')
WHERE event_time &lt; toDate('2026-01-01')
GROUP BY month
ORDER BY month</code></pre>
<p><strong>Partition pruning.</strong> На запросе с конкретным диапазоном дат ClickHouse теперь реально читает только нужные Iceberg-партиции. На нашей тестовой таблице с партицией по месяцам и запросом за год - сканирует 12 файловых групп вместо всего архива. Раньше читал всё. Разница в прочитанных байтах из MinIO - кратная.</p>
<p><strong>Overhead на первый запрос.</strong> Новый pushdown требует парсинга Iceberg-манифестов до начала чтения данных. На больших таблицах с тысячами snapshot-файлов это добавляет заметную задержку перед началом streaming результата. На нашей таблице с ~800 manifest entries это около 1-2 секунд дополнительно к первому запросу. Для интерактивного BI это граница приемлемого; для пакетных запросов - не проблема совсем.</p>
<p><strong>Query cache на Iceberg.</strong> Включили с TTL в 5 минут. При повторных запросах к одному snapshot - кеш работает и отдаёт результат мгновенно. При появлении нового snapshot в Iceberg-таблице (у нас compaction запускается раз в 30 минут) - кеш инвалидируется автоматически. Раньше мы городили свой инвалидатор поверх application-layer кеша. Теперь это из коробки.</p>
<h2>Что стало ненужным</h2>
<p>Помним, что в апреле написали schema-sync daemon для автоматической синхронизации схемы между Iceberg и ClickHouse? В 26.5 добавили <code>REFRESH PERIODICALLY</code> опцию для внешних Iceberg-таблиц - движок сам опрашивает catalog по расписанию и подхватывает новые колонки. Daemon мы ещё не выключили (хочется понаблюдать поведение в разных ситуациях), но по всей видимости это убираемый компонент.</p>
<h2>Осторожность, которую не стоит отбрасывать</h2>
<p>Federated query между нативным ClickHouse и Iceberg теперь работает удобно, но несколько вещей надо держать в голове.</p>
<p><strong>Первое - network cost.</strong> Каждый query к Iceberg-данным в MinIO - это трафик между ClickHouse-нодами и object storage. Даже с pruning это реальная нагрузка на сеть. При высокой конкурентности запросов у нас начинает проявляться contention на сетевом интерфейсе storage-ноды.</p>
<p><strong>Второе - catalog latency.</strong> Если Iceberg catalog (у нас REST catalog на <a href="https://adg.ru/blog/terms/postgresql/">PostgreSQL</a>) недоступен или медленный - весь запрос ждёт. Это новая точка зависимости, которой не было при работе только с нативными таблицами.</p>
<p><strong>Третье - snapshot consistency.</strong> JOIN между нативной таблицей (данные на момент запроса) и Iceberg-таблицей (данные на момент последнего snapshot) - это разные временные срезы. Для большинства аналитических сценариев это нормально, но надо понимать, что пишешь запрос, который по природе eventually consistent.</p>
<h2>Где мы сейчас</h2>
<p>Обновление выглядит убедительно для наших сценариев. ETL-pipeline который гонял данные из Iceberg в staging-таблицу перед JOIN - планируем убрать. Это уменьшит и сложность, и latency для запросов типа «вся история».</p>
<p>Query cache на Iceberg включаем в продуктиве - это прямой выигрыш для BI-дашбордов которые читают исторические данные за фиксированный период.</p>
<p>Schema-sync daemon оставляем под наблюдением ещё несколько недель.</p>
<p>Про остальное в 26.5 (новые функции для работы с временными рядами, изменения в replicated DDL) - пишите если интересно, можем разобрать отдельно.</p>
<p>Если строите аналитическую платформу с lakehouse-архитектурой - <a href="https://adg.ru/services/dwh-bi/">DWH/BI-проекты</a> это как раз та область, где мы работаем с такими стеками в продуктиве.</p>]]></content:encoded>
  </item>
  <item>
    <title>Автоматизировали 35% Tier-1 инцидентов через AIOps-агент: где прошли границы автономии</title>
    <link>https://adg.ru/blog/2026-07-aiops-incident-response-automation-2026/</link>
    <guid isPermaLink="true">https://adg.ru/blog/2026-07-aiops-incident-response-automation-2026/</guid>
    <pubDate>Tue, 14 Jul 2026 09:00:00 +0300</pubDate>
    <category>Автоматизация</category>
    <description>Перезапуск подов, очистка очередей, перераспределение дисков - агент делает это сам. Рассказываем, как мы определяли, что ему можно доверить, а что требует человека.</description>
    <content:encoded><![CDATA[<p>Примерно полгода назад мы <a href="https://adg.ru/blog/2026-02-aiops-root-cause-analysis-prodakshn/">собрали RCA-агент поверх Zabbix + Loki</a>, который анализировал инциденты и писал дежурному в Mattermost: «вот что случилось, вот почему, вот где смотреть». Агент был read-only - никаких действий, только диагностика. Это был осознанный выбор: сначала понять, насколько он вообще прав.</p>
<p>Оказался прав достаточно часто, чтобы следующий вопрос стал неизбежным: а что если дать ему кнопки?</p>
<p>С марта этого года у нас в проде работает агент, который не только диагностирует, но и реагирует. Сейчас примерно треть Tier-1 инцидентов закрывается без участия дежурного - агент обнаружил, отработал, записал в тикет. Рассказываем, как мы дошли до такой конфигурации и где пришлось провести жёсткие границы.</p>
<h2>Что такое Tier-1 в нашем контексте</h2>
<p>Для начала - что мы называем Tier-1, чтобы не было иллюзий. Это не «простые» инциденты в смысле «не страшные». Это инциденты с понятным и повторяемым паттерном: симптом хорошо распознаётся, причина известна, действие стандартное. Накопленная база показала, что таких у нас около 40% от общего потока - и это неплохой материал для автоматизации.</p>
<p>Конкретные примеры из того, что сейчас делает агент:</p>
<ul>
<li><strong>Перезапуск подов с OOMKill.</strong> Pod упал по OOM, это видно из событий <a href="https://adg.ru/blog/terms/kubernetes/">Kubernetes</a>. Агент проверяет, что это не системный под, не база данных, не stateful-компонент без graceful shutdown, и перезапускает. Если в течение 10 минут под падает снова - эскалирует.</li>
<li><strong>Очистка накопившихся очередей.</strong> Несколько сервисов у клиента генерируют «мусорные» сообщения при определённых условиях - это известная история, задокументированная в runbook. Агент сам чистит очереди по заданному паттерну.</li>
<li><strong>Перераспределение дискового пространства.</strong> Если заполнение раздела пересекает порог, агент проверяет стандартные места скопления мусора (logs, tmp, старые снапшоты) и чистит то, что помечено как безопасное для удаления. С явным лимитом: трогает только файлы старше 7 дней из заранее согласованного списка директорий.</li>
</ul>
<p>Выглядит просто. На практике - без проработки граничных условий запускать не стоит.</p>
<h2>Как мы определяли границы автономии</h2>
<p>Самый сложный вопрос проекта - не технический. Технически несложно дать агенту kubectl exec или доступ к <a href="https://adg.ru/blog/terms/kafka/">Kafka</a> API. Сложно решить, для каких классов действий этот доступ допустим.</p>
<p>Мы пришли к трём критериям, которые определяют, идёт ли действие в автономный список или требует подтверждения:</p>
<p><strong>Первый - обратимость.</strong> Действие должно быть обратимым без потери данных. Перезапуск пода - обратимо. Удаление файла логов - обратимо (файл воссоздаётся). Масштабирование деплоя вниз в прайм-тайм - нет, потому что пользователи уже получают деградацию и откат не мгновенный.</p>
<p><strong>Второй - изолированность.</strong> Действие не должно затрагивать компоненты за пределами затронутого сервиса. Если проблема на одном поде - агент работает с этим подом. Если проблема выглядит как сетевая - агент ничего не трогает, потому что сетевые изменения каскадируют.</p>
<p><strong>Третий - предсказуемость результата.</strong> Агент должен уметь сформулировать ожидаемый результат своего действия и проверить его через заданное время. Перезапустил под - через 3 минуты проверяет статус. Если не Ready - эскалирует. Это важно: без проверки результата автоматизация превращается в «выстрелил и забыл», что хуже ручной работы.</p>
<p>Всё, что не проходит хотя бы один критерий, идёт на подтверждение к дежурному. Агент присылает сообщение: «Вот что вижу, вот что предлагаю сделать, подтвердите.» Дежурный отвечает одной кнопкой. Или не отвечает - тогда через 5 минут агент отправляет повторный запрос и звонит.</p>
<h2>Где потребовали человеческого подтверждения</h2>
<p>Несколько случаев, которые казались автоматизируемыми, но оказались нет.</p>
<p><strong>Деградация базы данных.</strong> Любое изменение, которое касается <a href="https://adg.ru/blog/terms/postgresql/">PostgreSQL</a> или Redis в продуктиве, идёт только через подтверждение. Не потому что агент не может выполнить команду - потому что у баз данных слишком много состояния, которое агент не видит. Незафиксированные транзакции, репликационный лаг, блокировки - всё это влияет на то, что «безобидный» рестарт может сделать на практике.</p>
<p><strong>Инциденты с внешними зависимостями.</strong> Если агент видит, что проблема с высокой вероятностью не на нашей стороне - сетевой провайдер, сторонний API, - он не делает ничего автоматически. Ни «лечебного» перезапуска сервиса, ни других действий, которые создают шум без пользы.</p>
<p><strong>Паттерны с низким confidence.</strong> Есть пороговое значение уверенности диагноза. Если агент не может сопоставить симптом с известным паттерном выше порога - он сразу идёт к дежурному, не пытаясь применить «похожий» runbook.</p>
<h2>Инженерная честность про 35%</h2>
<p>Цифра 35% закрытых Tier-1 без участия человека звучит хорошо. Но важен контекст.</p>
<p>Первый месяц после запуска - примерно 20%, потому что список автономных действий был маленьким и агент часто перестраховывался. Мы итеративно разбирали каждый случай, где агент попросил подтверждение, и часть из них переносили в автономный режим - но только после явного обсуждения с клиентом. Сейчас 35%, и мы не торопимся поднимать эту цифру. Цель не максимизировать автономию, а держать её в зоне, где дежурный уверен, что агент не делает глупостей за его спиной.</p>
<p>Был один случай, который укрепил нас в консервативном подходе. Агент автономно почистил tmp-директорию на сервере приложений, потому что она соответствовала всем критериям безопасного удаления. Оказалось, что один из разработчиков положил туда временный файл с ручными миграционными данными, которые ждали применения. Файл был правильно назван, лежал в правильном месте, был достаточно старым. Данные потеряли. Восстановили из памяти разработчика за пару часов, но это была неприятная история.</p>
<p>После этого мы добавили четвёртый критерий к автономным действиям: файловые операции требуют явного согласованного списка - не директорий, а конкретных паттернов файлов. Это замедляет onboarding нового клиента, но убирает класс сюрпризов.</p>
<h2>Где мы сейчас</h2>
<p><a href="https://adg.ru/blog/2026-01-llm-agent-monitoring-observability/">Мониторинг трассировок</a> дал нам метрику, которую сейчас смотрим отдельно: процент инцидентов, где агент эскалировал, но дежурный после разбора не применял никаких действий. Это «ложные эскалации» - агент перестраховался там, где мог справиться сам. Сейчас эта цифра около 15% от всех эскалаций. Работаем над тем, чтобы снизить её, но медленно и осторожно.</p>
<p>Следующий вопрос, который у нас открыт: как автоматизировать не отдельные действия, а цепочки. Сейчас агент делает одно атомарное действие и проверяет результат. Иногда нужно сделать несколько вещей подряд - например, почистить очередь, перезапустить воркер и проверить метрики. Это сложнее по логике подтверждений: если шаг 2 из 3 требует подтверждения, а шаг 1 уже выполнен - что делать? Такие сценарии в автономный режим не переводим. Накапливаем прецеденты.</p>
<p>Автономия агента - это не ползунок, который сдвигаешь вправо. Это набор решений о доверии, каждое из которых принимается медленно и на основе реального опыта.</p>]]></content:encoded>
  </item>
  <item>
    <title>PKI для КИИ: ФСТЭК требует отечественных ЦС для машинного TLS - разбираемся с внутренним CA в Kubernetes</title>
    <link>https://adg.ru/blog/2026-07-fstec-ndc-novye-trebovaniya-2026/</link>
    <guid isPermaLink="true">https://adg.ru/blog/2026-07-fstec-ndc-novye-trebovaniya-2026/</guid>
    <pubDate>Thu, 09 Jul 2026 09:00:00 +0300</pubDate>
    <category>Регуляторика</category>
    <description>ФСТЭК опубликовал требования к национальным доверенным центрам сертификации для критических систем. Разбираем, как внедрить внутренний CA на базе ГОСТ в Kubernetes.</description>
    <content:encoded><![CDATA[<p>На прошлой неделе ФСТЭК опубликовал требования к национальным доверенным центрам сертификации (НДЦ) для объектов <a href="https://adg.ru/blog/terms/kii/">КИИ</a>. Документ ждали - регулятор анонсировал его ещё в начале года как часть уточнения требований к криптографической защите. Теперь, когда текст опубликован, стало понятно, что ряд наших заказчиков с контейнерными рабочими нагрузками получает конкретную задачу: мигрировать внутреннее PKI под отечественные алгоритмы.</p>
<p>Мы занимаемся <a href="https://adg.ru/services/audit/">аудитом</a> КИИ, поэтому сразу пошли разбираться, что это значит на практике в <a href="https://adg.ru/blog/terms/kubernetes/">Kubernetes</a>.</p>
<h2>Что требует документ</h2>
<p>Ключевое требование звучит так: машинное TLS-взаимодействие компонентов внутри объекта КИИ должно обеспечиваться сертификатами, выданными ЦС, входящим в реестр НДЦ ФСТЭК, либо созданным на основе сертифицированного СКЗИ с отечественными алгоритмами.</p>
<p>Под «машинным взаимодействием» документ понимает в том числе: взаимодействие между микросервисами, компонентами оркестратора, агентами мониторинга, базами данных - то есть весь service-to-service трафик, который в Kubernetes закрывают через mTLS.</p>
<p>Let's Encrypt и коммерческие зарубежные ЦС для этого класса применений выбывают явно. Собственный внутренний CA на OpenSSL с RSA - тоже вопрос, потому что ФСТЭК ориентирует на ГОСТ Р 34.10-2012 и ГОСТ Р 34.11-2012.</p>
<h2>Откуда растёт задача</h2>
<p>У нескольких наших заказчиков внутренние сервисы в Kubernetes исторически работали с self-signed сертификатами RSA-2048, выданными локальным CA на основе OpenSSL. Это работало - никто особо не думал о PKI внутри кластера, cert-manager раскатывал ротацию, операторы не беспокоились.</p>
<p>После <a href="https://adg.ru/blog/2026-01-kii-2026-novye-trebovaniya-fstec/">январских методрекомендаций</a> криптографическая часть формально оставалась в серой зоне: требования к алгоритмам были, но чёткой нормы про ЦС для машинного TLS не было. Теперь она есть.</p>
<p>Параллельно мы видим, что в <a href="https://adg.ru/blog/terms/devsecops/">DevSecOps</a>-практике для КИИ подписание образов и артефактов уже пошло в сторону отечественных инструментов - мы писали об этом в <a href="https://adg.ru/blog/2026-06-devsecops-reestry-artefaktov-2026/">июне</a>. PKI для сервисного трафика - следующий логичный уровень.</p>
<h2>Как это выглядит в Kubernetes</h2>
<p>Разберём архитектуру внутреннего CA на отечественных алгоритмах для кластера.</p>
<p><strong>Корневой CA на ГОСТ.</strong> Для создания корневого CA нужна реализация ГОСТ Р 34.10-2012 на эллиптических кривых. Из доступных инструментов - КриптоПро CSP с набором утилит командной строки: <code>csptest</code>, <code>certutil</code>. Альтернатива - OpenSSL с движком gost (пакет <code>openssl-gost-engine</code>), сборки которого есть в <a href="https://adg.ru/blog/terms/redos/">РедОС</a> 9.x и <a href="https://adg.ru/blog/terms/astra-linux/">Astra Linux</a> SE 2.x. КриптоПро даёт сертифицированное СКЗИ, что закрывает требование о сертификации. <code>openssl-gost-engine</code> - нет, поэтому для строгого исполнения требований НДЦ он не подходит.</p>
<p><strong>Промежуточный CA для кластера.</strong> Практика здесь стандартная: root CA держать офлайн или в аппаратном HSM, для кластера выпускать отдельный intermediate CA с ограниченным сроком действия. Это снижает радиус поражения при компрометации кластерного компонента.</p>
<p><strong>cert-manager и ГОСТ.</strong> Это место наибольшего трения. cert-manager умеет работать с внешними issuer через CustomResourceDefinition и <code>spec.issuerRef.kind: Issuer</code>. Есть два подхода:</p>
<ul>
<li><strong>Vault PKI Secrets Engine</strong> - HashiCorp Vault поддерживает внешние PKCS#11-провайдеры; при подключении КриптоПро через PKCS#11-интерфейс Vault может подписывать сертификаты ГОСТ-ключом. cert-manager взаимодействует с Vault через стандартный Vault Issuer. Это рабочая схема, но требует Vault в кластере или рядом с ним.</li>
<li><strong>Самописный external issuer</strong> - cert-manager имеет спецификацию External Issuer, позволяющую написать отдельный контроллер, который обрабатывает <code>CertificateRequest</code> и подписывает их любым бэкендом. Несколько команд уже публиковали такие реализации для КриптоПро CSP.</li>
</ul>
<p>На практике мы сейчас смотрим в сторону Vault PKI - он даёт аудит-лог выдачи сертификатов, что само по себе полезно для КИИ. Для кластеров поменьше external issuer с прямым вызовом CSP - проще в операционном плане.</p>
<p><strong>Что делать с сервисными mesh.</strong> Если в кластере работает <a href="https://adg.ru/blog/terms/service-mesh/">Istio</a> или аналог с mTLS, там своя CA (istiod). Istio поддерживает подключение внешнего CA через <code>pluggedInCerts</code> - нужно переключить на тот же intermediate CA. Это требует перезапуска sidecar-ов, планируем это как отдельное окно.</p>
<h2>Что не решается быстро</h2>
<p>Есть несколько вещей, которые мы видим как реальные сложности на ближайшие месяцы.</p>
<p><strong>Ротация существующих сертификатов.</strong> В продуктивных кластерах за годы накапливается много сертификатов: ingress-контроллеры, webhooks, etcd, kubelet. Полная миграция на ГОСТ - это ротация всего этого стека, причём координированно. Один неучтённый webhook с истёкшим старым сертификатом может положить API-сервер в самый неудобный момент.</p>
<p><strong>Доверие клиентов.</strong> Корневой ГОСТ-сертификат нужно добавить в trust store на всех узлах кластера, во все контейнеры, которые делают TLS-соединения, и в те внешние системы, которые обращаются к сервисам кластера. Это не автоматизируется за один день.</p>
<p><strong>Инструментарий разработчиков.</strong> Если команда использует <code>curl</code>, <code>wget</code>, клиентские SDK - они должны поддерживать ГОСТ. Большинство стандартных linux-утилит на дистрибутивах с поддержкой ГОСТ работают корректно, но это нужно проверять для каждого компонента.</p>
<h2>Сроки по документу</h2>
<p>Требования вступают в силу для объектов первой категории через шесть месяцев с даты публикации, для второй и третьей - через двенадцать. Это даёт время на подготовку, но с учётом того, что нужно пройти выбор инструментария, пилот, документирование и согласование изменений в ОРД - откладывать на последний месяц не стоит.</p>
<p>Для наших заказчиков ближайший шаг - инвентаризация текущего PKI в кластерах: что выдаёт сертификаты, какие алгоритмы используются, где root CA, какой срок действия у intermediate. Без этой картины разговор о миграции абстрактный.</p>]]></content:encoded>
  </item>
  <item>
    <title>Год корпоративного RAG в проде: что работает и что нет</title>
    <link>https://adg.ru/blog/2026-07-llm-rag-prodakshn-itogi-2026/</link>
    <guid isPermaLink="true">https://adg.ru/blog/2026-07-llm-rag-prodakshn-itogi-2026/</guid>
    <pubDate>Tue, 07 Jul 2026 09:00:00 +0300</pubDate>
    <category>Автоматизация</category>
    <description>Год эксплуатации RAG-систем в корпоративном проде РФ: переход с pgvector на гибридный поиск и главный вывод - качество retrieval решает больше, чем размер модели.</description>
    <content:encoded><![CDATA[<p>Около года назад мы <a href="https://adg.ru/blog/2025-04-llm-rag-korporativnaya-wiki-2025/">перевели первый RAG-пайплайн в продуктивный контур</a>. С тех пор накопилось несколько инсталляций у разных клиентов, разный масштаб базы знаний, разный уровень требований к качеству ответов. Сейчас есть смысл остановиться и посмотреть, что за это время поменялось в нашем понимании задачи.</p>
<p>Главный вывод коротко: мы слишком долго смотрели не туда. Полгода мы занимались моделями - выбирали, сравнивали, тестировали. А узким местом всё это время был retrieval.</p>
<h2>Как мы это поняли</h2>
<p>Один из клиентов - производственная компания с базой знаний в несколько тысяч документов - жаловался на качество ответов. Мы методично улучшали промпт, попробовали переход с одной модели на другую, подбирали температуру. Качество менялось в пределах погрешности. Потом кто-то из команды сел и руками прошёлся по 50 случаям, где пользователи явно переспрашивали: задали вопрос, получили ответ, тут же переформулировали.</p>
<p>Картина оказалась однозначной: в 38 случаях из 50 правильный документ в базе был. Ретривер его не достал. Не потому что модель слабая - потому что в топ-5 retrieved чанков нужного куска не было.</p>
<p>Это не открытие само по себе - о важности retrieval говорят давно. Но когда видишь это на конкретных числах своего проекта, а не в чужой статье, как-то иначе воспринимается.</p>
<h2>Переход на гибридный поиск</h2>
<p>До этого момента мы использовали <a href="https://adg.ru/blog/terms/pgvector/">pgvector</a> с косинусным поиском по плотным эмбеддингам. Работало, но с характерной проблемой: точные термины, артикулы, названия процессов - всё это семантический поиск теряет, если нет похожих по смыслу соседей в пространстве векторов. «ИТС-442» и «инструкция по техническому обслуживанию узла 442» в векторном пространстве далеко друг от друга, хотя это один и тот же документ.</p>
<p>Решение, к которому мы пришли - <a href="https://adg.ru/blog/terms/hybrid-search-rag/">гибридный поиск</a>: плотный эмбеддинг-поиск через pgvector плюс разреженный BM25 через отдельный индекс, финальный rerank по score от обоих методов. Схема не новая, но вопрос был в том, насколько это оправдано для наших объёмов.</p>
<p>Оправдалось. На тестовом наборе из 200 вопросов recall@5 (доля случаев, когда нужный документ попал в топ-5) вырос с примерно 60% до примерно 80%. Точные цифры зависят от конкретной базы, но направление было одинаковым на двух клиентах, где мы это тестировали.</p>
<p>Что сложно в этом переходе:</p>
<ul>
<li><strong>Поддерживать два индекса.</strong> BM25 и векторный индекс нужно держать консистентными при обновлении документов. Это не катастрофа, но лишняя точка, за которой нужно следить.</li>
<li><strong>Scoring не складывается напрямую.</strong> Нормализация score-ов от BM25 и косинусного поиска - отдельная задача. Мы используем reciprocal rank fusion, это работает предсказуемо.</li>
<li><strong>BM25 требует качественного текста.</strong> Если документы плохо написаны или содержат много OCR-мусора - разреженный индекс только мешает. Пришлось улучшить пайплайн предобработки документов.</li>
</ul>
<h2>Что с моделями</h2>
<p>После того как retrieval наладили - да, качество генерации тоже имеет значение. Но разница между моделями на хорошо отретриверованном контексте значительно меньше, чем мы ожидали. У нас работают инсталляции на <a href="https://adg.ru/blog/terms/gigachat-api/">GigaChat API</a> и на локальных моделях (Qwen2.5 в нескольких вариантах размера), и при хорошем retrieval разница в итоговом качестве ответа - рабочая, но не кардинальная.</p>
<p>Там, где модель реально решает - это «нечёткие» вопросы, где пользователь формулирует неточно или смешивает несколько тем. Но это скорее задача query expansion на входе в ретривер, чем задача мощности генеративной модели.</p>
<p>Для <a href="https://adg.ru/blog/terms/kii/">КИИ</a>-клиентов вариант с облачными API не работает по контрактным причинам - это не изменилось. <a href="https://adg.ru/blog/terms/llm-inference/">Локальный инференс</a> остаётся единственным путём.</p>
<h2>Что сейчас в работе</h2>
<p><a href="https://adg.ru/blog/2026-01-llm-agent-monitoring-observability/">Мониторинг на уровне span-ов</a> дал нам метрику, которую теперь смотрим отдельно: доля запросов, где score лучшего retrieved документа ниже порога. Это ранний сигнал, что какая-то категория вопросов плохо покрыта базой знаний - не потому что модель плохая, а потому что документа нет или он написан так, что ни один из индексов его не находит.</p>
<p>Параллельно тестируем reranker-модель поверх гибридного поиска - дополнительный проход, который переранжирует топ-15 кандидатов перед подачей в генерацию. На синтетических тестах это даёт ещё один заметный прирост recall, но у нас нет достаточной production-статистики, чтобы говорить уверенно.</p>
<h2>Где мы стоим</h2>
<p><a href="https://adg.ru/blog/terms/rag/">RAG</a> в корпоративном проде работает. Не без усилий, не «запустил и забыл», но работает. Основная часть усилий уходит не на модели и не на инфраструктуру - она уходит на качество данных и качество retrieval. Это скучнее, чем обсуждать GPT-5 против локальных моделей, но это честная картина.</p>
<p>Переход с чистого векторного поиска на гибридный был правильным решением, и мы жалеем, что не сделали его раньше. Не потому что pgvector плох - он справляется с объёмами нормально - а потому что один тип индекса физически не покрывает все сценарии поиска в корпоративных документах.</p>]]></content:encoded>
  </item>
  <item>
    <title>Deckhouse 1.72 и ROSA с Kubernetes 1.35: обновляем production-кластер и сравниваем manual steps</title>
    <link>https://adg.ru/blog/2026-07-kubernetes-1-35-otechestvennye-distrib/</link>
    <guid isPermaLink="true">https://adg.ru/blog/2026-07-kubernetes-1-35-otechestvennye-distrib/</guid>
    <pubDate>Thu, 02 Jul 2026 09:00:00 +0300</pubDate>
    <category>DevOps</category>
    <description>Deckhouse 1.72 принёс Kubernetes 1.35 с graduated in-place resize и переработанным scheduler. Сравниваем процесс обновления и ручные шаги с ROSA на том же релизе.</description>
    <content:encoded><![CDATA[<p>В апреле мы разбирали <a href="https://adg.ru/blog/2026-04-kubernetes-1-35-release-obzor/">Kubernetes 1.35 на тестовом стенде</a> - тогда <a href="https://adg.ru/blog/terms/deckhouse/">Deckhouse</a> только выкатил кандидат, и в stable-канале 1.35 ещё не было. Теперь вышел Deckhouse 1.72 с поддержкой 1.35 в stable, ROSA тоже объявила поддержку через свой update-канал. Мы прошли обновление на двух production-кластерах клиентов - один на Deckhouse, второй на ROSA - и посмотрели, насколько отличается опыт.</p>
<h2>Что несёт Kubernetes 1.35 коротко</h2>
<p>Если вы читали апрельский разбор, напомним ключевые моменты. <a href="https://adg.ru/blog/terms/inplace-pod-resizing/">In-place pod resizing</a> перешёл в graduated: API финальный, feature gate включён по умолчанию, изменение CPU requests применяется без рестарта контейнера. Scheduler получил стабилизированный QueueingHint API и исправленный PreScore - плагины теперь работают на полном списке feasible-нод, а не на выборке. Для большинства кластеров второе проходит незаметно, но для нагрузок с кастомными scheduler-плагинами или активным VPA - заметно.</p>
<p>Важный момент из апрельского тестирования, который подтвердился в production: in-place resize для уменьшения memory requests по-прежнему уходит в <code>Deferred</code> у части нод. Не баг, поведение задокументировано, но нужно закладывать в операционные процедуры.</p>
<h2>Deckhouse 1.72: что добавилось поверх 1.35</h2>
<p>Deckhouse 1.72 - это не просто «bumped version Kubernetes». Вместе с 1.35 в релиз вошло несколько изменений платформы.</p>
<p><strong>node-manager получил поддержку in-place resize в NodeGroup-политиках.</strong> Теперь можно задать стратегию resize на уровне NodeGroup: <code>updateMode: InPlaceOrRecreate</code> для подов, которые допускают in-place, и <code>updateMode: Recreate</code> для тех, которые нет. Раньше это нужно было настраивать в VPA-объектах индивидуально. Выглядит незначительно, но для большого кластера с несколькими типами нагрузок - ощутимое упрощение.</p>
<p><strong>Модуль vertical-pod-autoscaler обновлён</strong> и теперь по умолчанию выставляет <code>updateMode: InPlaceOrRecreate</code> для новых VPA-объектов. Если у вас уже есть VPA-объекты без явного <code>updateMode</code> - при обновлении до 1.72 они получат этот режим. На кластере клиента это привело к одному небольшому сюрпризу: несколько подов с VPA начали получать in-place resize вместо eviction, и операционная команда клиента удивилась, увидев новый статус в <code>kubectl get pods</code>. Не проблема, но стоит предупреждать заранее.</p>
<p><strong>Сетевой модуль cni-<a href="https://adg.ru/blog/terms/cilium/">Cilium</a> обновлён до версии с поддержкой scheduler-events от QueueingHint.</strong> Это связано с изменениями в scheduler из 1.35: Cilium теперь корректно сигнализирует scheduler, когда сетевой ресурс освободился, вместо того чтобы ждать следующего цикла. На практике это уменьшает задержку между освобождением пода и началом нового scheduling.</p>
<h2>Сам процесс обновления на Deckhouse</h2>
<p>Обновление кластера с Deckhouse 1.71 до 1.72 заняло около двух часов на кластере из 14 нод. Плановое обслуживание мы закладывали на четыре часа - осталось время.</p>
<p>Deckhouse обновляется через <code>DeckhouseRelease</code> объект в канале <code>stable</code>. Появился новый release - мы прочитали release notes, убедились, что нет несовместимостей с нашими кастомными ресурсами, подтвердили обновление. Дальше Deckhouse сам катит ноды в порядке, который мы задали в <code>NodeGroup</code>: сначала одна control-plane нода, потом остальные по одной с проверкой ready-состояния.</p>
<p>Manual steps для этого обновления:</p>
<ul>
<li><strong>Проверить VPA-объекты</strong> перед обновлением: если <code>updateMode</code> явно не задан, он будет изменён на <code>InPlaceOrRecreate</code>. Мы прошлись по всем VPA и явно выставили режим там, где хотели сохранить прежнее поведение (eviction).</li>
<li><strong>Проверить кастомные scheduler-плагины</strong>, если есть. У нас их нет, но у одного из клиентов был DeploymentTopologyPolicy от стороннего оператора - проверили совместимость с изменённым PreScore.</li>
<li><strong>Предупредить операционную команду</strong> об изменении видимого поведения VPA-подов.</li>
</ul>
<p>По сути три пункта. Для <a href="https://adg.ru/services/managed/">managed-кластеров</a> с Deckhouse это стандартный ритуал перед каждым крупным обновлением.</p>
<h2>ROSA: то же самое, но иначе</h2>
<p>На втором кластере с <a href="https://adg.ru/blog/terms/rosa-server/">ROSA</a> процесс обновления до 1.35 выглядит по-другому структурно, хотя итог тот же.</p>
<p>ROSA использует канальную модель: <code>stable</code>, <code>testing</code>, <code>candidate</code>. Kubernetes 1.35 появился в <code>testing</code> раньше, в <code>stable</code> вышел несколько дней назад. Обновление применяется через <code>rosectl cluster update --version 1.35</code> или через веб-консоль. Платформа сама управляет rolling update нод, но детальность контроля меньше: нельзя задать порядок обновления нод так же гибко, как в Deckhouse через NodeGroup-стратегии.</p>
<p>Manual steps для ROSA оказалось больше:</p>
<ul>
<li><strong>VPA в ROSA не обновляется автоматически</strong> вместе с кластером. Нужно отдельно обновить VPA Operator через OperatorHub или helm-чарт. В Deckhouse это часть платформы и версионируется вместе.</li>
<li><strong>Feature gate <code>InPlacePodVerticalScaling</code></strong> в ROSA включён, но настройка <code>updateMode</code> для VPA по умолчанию не меняется - нужно делать вручную, если хочешь перейти на in-place.</li>
<li><strong>Scheduler-плагины</strong> в ROSA работают через стандартный механизм Kubernetes, без дополнительной абстракции. После обновления до 1.35 убедились, что QueueingHint в кастомных плагинах реализован корректно - у одного плагина обнаружился пропущенный метод, который раньше не мешал, а теперь вызывает предупреждения.</li>
<li><strong>Проверить OperatorHub-операторы</strong> на совместимость с 1.35 API - это обязательный шаг, который в Deckhouse частично закрывается модулем compatibility-check.</li>
</ul>
<p>Время обновления ROSA-кластера вышло примерно таким же - около двух часов на 12 нодах. Но подготовка заняла больше: чеклист был длиннее, часть шагов требовала явных команд вместо декларативной конфигурации.</p>
<h2>Итог сравнения</h2>
<p>Оба дистрибутива дали <a href="https://adg.ru/blog/terms/managed-k8s-otechestvennye/">отечественный managed Kubernetes</a> в production. Graduated in-place resize работает на обоих. По опыту этого обновления разница в ощущениях такая: Deckhouse автоматизирует больше нюансов платформы - VPA, CNI, совместимость - и требует меньше явных ручных шагов. ROSA даёт чуть больше прозрачности через стандартные Kubernetes-примитивы, но и чуть больше ответственности за согласованность компонентов.</p>
<p>Для команд, у которых операционные процедуры уже выстроены под один из дистрибутивов, это не повод переходить. Но для новых проектов разница в объёме manual steps - аргумент, который стоит учитывать.</p>
<p>In-place resize в production пока работает только для CPU: memory случай с <code>Deferred</code> встретился и здесь, на <a href="https://adg.ru/blog/terms/containerd/">containerd</a> 1.7 с cgroup v2. Будем держать это в виду при следующих VPA-политиках.</p>]]></content:encoded>
  </item>
  <item>
    <title>Полгода внутренней платформы: 40 команд онбордировано, время до прода сократилось с 4 дней до 6 часов</title>
    <link>https://adg.ru/blog/2026-06-platform-engineering-idp-itogi-h1/</link>
    <guid isPermaLink="true">https://adg.ru/blog/2026-06-platform-engineering-idp-itogi-h1/</guid>
    <pubDate>Tue, 30 Jun 2026 09:00:00 +0300</pubDate>
    <category>DevOps</category>
    <description>Итоги первого полугодия работы IDP: 40 команд в платформе, цикл commit-to-prod 6 часов вместо 4 дней. Разбираем, что пошло не так на старте и как пришлось переделать governance.</description>
    <content:encoded><![CDATA[<p>Шесть месяцев назад мы запустили внутренний <a href="https://adg.ru/blog/terms/internal-developer-platform/">developer portal</a> в полноценном операционном режиме - не пилот, не «для избранных команд», а для всех. К концу июня в платформе работают 40 продуктовых команд, цикл от коммита до прода сократился примерно с четырёх дней до шести часов. Это хорошая новость.</p>
<p>Плохая новость: первые три месяца мы потратили на то, чтобы признать, что governance-модель, которую спроектировали на старте, не работает. И переделали её почти с нуля.</p>
<h2>Что было на старте</h2>
<p>В апреле мы <a href="https://adg.ru/blog/2026-04-platform-engineering-idp-otechestvennye/">описывали первые результаты</a> - Backstage с плагинами под <a href="https://adg.ru/blog/terms/gitflic/">Gitflic</a> и <a href="https://adg.ru/blog/terms/harbor-registry/">Harbor</a>, Software Templates, сокращение онбординга нового сервиса с трёх дней до двух часов. Всё это правда. Только речь тогда шла о 8-10 командах, которые онбордились в контролируемом режиме.</p>
<p>Когда число команд перевалило за 15 и мы открыли регистрацию для всех - посыпалось.</p>
<p>Первая проблема была ожидаемой: Templates не покрывали реальное разнообразие. У нас было три шаблона (Spring, FastAPI, фронтенд), а команды приходили с Go-сервисами, с легаси на PHP, с кастомными воркерами. Кто-то начинал адаптировать ближайший Template под свои нужды - и создавал сервис, который формально существовал в portal, но реально выходил за рамки любых автоматических политик.</p>
<p>Вторая проблема была менее очевидной и болезненнее: <strong>мы не разграничили, кто владеет платформой как продуктом</strong>.</p>
<h2>Провал governance-модели версии 1.0</h2>
<p>Начальная модель выглядела разумно: есть платформенная команда (мы), есть команды-потребители. Платформенная команда пишет Templates и поддерживает portal, команды-потребители используют. Классика.</p>
<p>Проблема в том, что мы не договорились о нескольких вещах.</p>
<p><strong>Первое - кто принимает запросы на новые Templates.</strong> Когда пришли первые пять команд с запросами «нам нужен шаблон для X» - мы взяли их в бэклог. Когда пришли ещё двадцать - бэклог превратился в очередь на полтора месяца вперёд. Команды начали делать Templates сами, без ревью, без стандартов. В portal появились шаблоны, которые создавали <a href="https://adg.ru/blog/terms/kubernetes/">Kubernetes</a>-namespace без <a href="https://adg.ru/blog/terms/network-policy-kubernetes/">NetworkPolicy</a>. Один шаблон генерировал Harbor robot account с правами на весь реестр, а не на один проект.</p>
<p><strong>Второе - кто отвечает за деградацию.</strong> Когда у команды не получалось что-то сделать через portal - она шла к нам. Мы разбирались, находили баг или неочевидное поведение, чинили. Но при 40 командах этот поток стал съедать треть времени платформенной команды. Без <a href="https://adg.ru/blog/terms/sla/">SLA</a>, без тикетной системы, просто «в личку написали».</p>
<p><strong>Третье - как обновлять платформу без поломки того, что уже работает.</strong> Мы обновили Backstage с 1.26 до 1.28 в феврале. Три плагина перестали работать, потому что сменился API. Семь команд обнаружили это в момент, когда им нужно было создать новый сервис.</p>
<h2>Governance-модель версии 2.0</h2>
<p>Переделка заняла март и апрель. Вот что изменилось.</p>
<p><strong>Platform-as-a-product со своим бэклогом и SLA.</strong> Теперь это официально продукт внутри компании, у него есть product owner из платформенной команды, публичный бэклог и два типа запросов: «баг» (SLA 2 рабочих дня) и «новый Template» (SLA 2 спринта). Это не ускорило обработку запросов - зато убрало ожидание неизвестности и обиды «вы нас игнорируете».</p>
<p><strong>Контрибьюторская модель для Templates.</strong> Команды могут писать свои Templates, но через PR в платформенный репозиторий с обязательным ревью от платформенной команды. Чеклист ревью формализован: NetworkPolicy, ресурсные лимиты, robot account с минимальными правами, catalog-info.yaml. Templates без прохождения чеклиста в portal не попадают. Да, это медленнее, чем «залить самому». Зато мы знаем, что в portal нет шаблонов, которые создают дыры в безопасности.</p>
<p><strong>Changelog с уведомлениями об обновлениях.</strong> Перед любым обновлением Backstage или плагинов - тестирование на staging-инстансе portal, список потенциально затронутых команд, уведомление в Mattermost за неделю. Это очевидно, но нам понадобилось один раз поломать прод, чтобы сделать это правилом.</p>
<h2>Откуда взялись 6 часов</h2>
<p>Цикл commit-to-prod стал 6 часов не потому, что portal волшебным образом ускорил деплой. Он ускорился по другой причине: платформа убрала ручные ожидания из пути.</p>
<p>Раньше выглядело так: разработчик создаёт PR - ждёт, пока кто-то вручную настроит pipeline в CI-системе - pipeline отрабатывает - ждёт, пока DevOps-инженер проверит манифесты - деплой идёт в прод. Ожидания на ручных шагах суммировались в 2-3 дня при любой загрузке команды.</p>
<p>Сейчас: PR создан - platform-pipeline запускается автоматически через Templates-сгенерированную конфигурацию - GitOps-контроллер видит изменение и деплоит - прод. <a href="https://adg.ru/blog/2026-03-gitops-fleet-management-masshtab/">GitOps-подход</a>, который мы описывали раньше, здесь является несущей конструкцией: без автоматической синхронизации состояния fleet-репозитория скорость бы не появилась.</p>
<p>Шесть часов - это в среднем, включая время прохождения CI (тесты, сборка образа, сканирование). Для критических фиксов с fast-track путём - 1.5-2 часа.</p>
<h2>Где до сих пор больно</h2>
<p>Нет смысла делать вид, что всё хорошо.</p>
<ul>
<li><strong>Observability платформы</strong> - мы знаем, что portal живой, но не знаем детально, какие Templates используются чаще, где пользователи застревают, сколько попыток создания заканчивается ошибкой. Backstage не даёт это из коробки, плагин аналитики мы ещё не написали.</li>
<li><strong>Стоимость владения</strong> - поддержка portal сейчас занимает примерно 40% времени одного инженера. Это приемлемо при 40 командах, но нелинейно вырастет при 80.</li>
<li><strong>Синхронизация с реальностью</strong> - если команда сделала что-то вне portal (а такое бывает), reconciliation между реальным состоянием и тем, что видит Catalog, до сих пор частично ручной процесс.</li>
</ul>
<p><a href="https://adg.ru/blog/terms/platform-engineering/">Platform Engineering</a> как функция не заканчивается запуском portal. Она, скорее, только начинается, когда portal запущен и к нему пришли реальные пользователи. Первые полгода - это в основном обнаружение того, что не учли при проектировании.</p>]]></content:encoded>
  </item>
  <item>
    <title>Zabbix 8.0 на нашем мониторинг-кластере: встроенная anomaly detection вместо ручных порогов</title>
    <link>https://adg.ru/blog/2026-06-zabbix-8-0-release-ai-anomaly/</link>
    <guid isPermaLink="true">https://adg.ru/blog/2026-06-zabbix-8-0-release-ai-anomaly/</guid>
    <pubDate>Thu, 25 Jun 2026 09:00:00 +0300</pubDate>
    <category>Системное администрирование</category>
    <description>Zabbix 8.0 вышел с встроенным AI anomaly detection и переработанным TimescaleDB backend. Разбираем, как обучить модель на своей истории метрик без отправки данных наружу.</description>
    <content:encoded><![CDATA[<p>Zabbix 8.0 вышел на прошлой неделе, и у нас уже поднят тестовый кластер. Основные анонсированные фичи - встроенная <a href="https://adg.ru/blog/terms/anomaly-detection-monitoring/">anomaly detection</a> на базе локальной ML-модели и переработанный TimescaleDB backend с нативной партиционностью. Без внешних API, без отправки метрик в облако. Для наших клиентов с чувствительной инфраструктурой это принципиально.</p>
<h2>Что изменилось в хранилище</h2>
<p>TimescaleDB backend в Zabbix был и раньше, но работал как надстройка: Zabbix писал в <a href="https://adg.ru/blog/terms/postgresql/">PostgreSQL</a>, TimescaleDB превращал таблицы в гипертаблицы через расширение. В 8.0 интеграция глубже - Zabbix теперь умеет управлять партициями напрямую, не полагаясь на автоматику TimescaleDB. Это даёт контроль над политиками хранения на уровне конкретных item-групп: метрики ядра хоста держим 90 дней с полным разрешением, агрегаты по приложениям - год, детальные системные метрики - 30 дней. Раньше такую гранулярность приходилось делать через костыли в retention-политиках или заводить отдельные хосты.</p>
<p>Производительность записи тоже ощутимо выросла. На нашем тестовом кластере (около 40 000 item-ов, среднее значение раз в минуту) TimescaleDB backend в 8.0 показывает примерно на треть меньше latency при вставке по сравнению с нашей текущей версией 7.2. Это не маркетинговый замер - просто pgbench поверх Zabbix history table до и после.</p>
<h2>Anomaly detection: как оно устроено</h2>
<p>Zabbix 8.0 добавляет новый тип item - anomaly detection item. Он не собирает метрику сам по себе, а получает базовую метрику как источник и обучает локальную модель на её истории. Никаких внешних вызовов нет - модель живёт на том же Zabbix-сервере, обучение происходит через встроенный Python-worker.</p>
<p>Схема обучения прямолинейная. Zabbix берёт исторические данные за указанный период (по умолчанию 8 недель), разбивает их по дням недели и часам суток, строит базовый профиль нормального поведения с доверительными интервалами. Алгоритм - вариация seasonal decomposition с добавкой, которую авторы называют adaptive smoothing: модель адаптируется к медленному дрейфу базовой линии, не реагируя на долгосрочные тренды как на аномалии.</p>
<p>Триггер на аномалию задаётся как отклонение от предсказанного диапазона более чем на N сигма в течение M минут. Это точно те же параметры, что вы бы выставляли вручную, - разница в том, что «нормальный диапазон» теперь рассчитывается из реальной истории, а не из головы.</p>
<h2>Что это меняет на практике</h2>
<p>Мы посмотрели на наш пул алертов за последние три месяца и прикинули, сколько триггеров можно было бы заменить anomaly detection item-ами.</p>
<p>Грубая оценка: около 60% триггеров по CPU, памяти, latency и disk I/O у нас заданы статическими порогами типа «CPU &gt; 85% 5 минут» или «response time &gt; 2 секунды». Это работает, но требует ручной настройки под каждый хост - то, что нормально для веб-сервера под нагрузкой, будет ложным алертом на аналитическом сервере, который честно ест CPU по расписанию. Anomaly detection закрывает ровно эту проблему: порог для каждого хоста выводится из его собственной истории.</p>
<p>Остальные 40% - это специфические триггеры: конкретные процессы упали, размер очереди превысил N сообщений, репликация отстала больше чем на M секунд. Там аномалии не помогут - нужны точные пороги или структурные проверки.</p>
<h2>Как обучить модель на реальных данных</h2>
<p>Несколько замечаний из тестовой эксплуатации:</p>
<ul>
<li>
<p><strong>Период обучения важен.</strong> 8 недель - разумный минимум для сервисов с недельной цикличностью. Если у вас есть месячный цикл (финансовые системы, отчётность), ставьте 12-16 недель, иначе модель не увидит паттерн и будет биться об него каждый месяц.</p>
</li>
<li>
<p><strong>История до обучения должна быть чистой.</strong> Если в период обучения были инциденты с высокой нагрузкой - модель включит их в «нормальный» диапазон. Zabbix позволяет исключить период из обучения через API, и это надо использовать осознанно, а не забыть про эту возможность.</p>
</li>
<li>
<p><strong>Adaptive smoothing и плановые изменения.</strong> Если вы добавили новый сервис или выкатили релиз с изменённой нагрузкой - модель адаптируется, но это займёт несколько дней. В этот период чувствительность лучше снизить вручную через параметр sensitivity в item-настройках.</p>
</li>
<li>
<p><strong>Zabbix Python worker - отдельный процесс.</strong> Он запускается рядом с Zabbix server и потребляет ресурсы пропорционально количеству anomaly detection item-ов. На нашем кластере с 200 такими item-ами это около 300 МБ RAM и пара процентов CPU в фоне. Не страшно, но посчитайте до масштабирования.</p>
</li>
</ul>
<h2>Что не нравится уже сейчас</h2>
<p>Интерфейс настройки модели в веб-GUI сырой. Можно задать период обучения и sensitivity - и почти всё. Посмотреть, на каких данных модель обучена, что она считает аномальным диапазоном для конкретного часа в конкретный день недели - нельзя. Это жирная дыра в <a href="https://adg.ru/blog/terms/monitoring/">observability</a> самого мониторинга. Объяснять клиенту «почему сработал алерт» при наличии anomaly detection item становится сложнее: был порог 85% - понятно. Теперь «модель решила, что это аномалия» - объяснение, с которым не все готовы работать.</p>
<p>Zabbix API в 8.0 добавил endpoint для выгрузки предсказанных baseline-значений - но это JSON с цифрами, без какой-либо визуализации в стандартном GUI. Мы уже сделали дашборд в Grafana через этот API, который показывает предсказанный диапазон поверх реальной метрики. Работает, но это дополнительная работа, которую хотелось бы видеть из коробки.</p>
<p>Подключение для <a href="https://adg.ru/services/managed/">managed-клиентов</a> планируем на следующий месяц - сначала на нескольких пилотных хостах. Посмотрим, как anomaly detection ведёт себя на инфраструктуре, которая не была в тестовой выборке.</p>]]></content:encoded>
  </item>
  <item>
    <title>Data mesh на отечественном стеке: domain ownership, ClickHouse и где федерация данных ломается</title>
    <link>https://adg.ru/blog/2026-06-data-mesh-otechestvennye-instrumenty-2026/</link>
    <guid isPermaLink="true">https://adg.ru/blog/2026-06-data-mesh-otechestvennye-instrumenty-2026/</guid>
    <pubDate>Tue, 23 Jun 2026 09:00:00 +0300</pubDate>
    <category>Данные и аналитика</category>
    <description>Помогаем заказчику внедрить data mesh: каждый домен владеет ClickHouse-кластером, публикует data contract через единый каталог. Разбираем сложности governance и федерации.</description>
    <content:encoded><![CDATA[<p><a href="https://adg.ru/blog/terms/data-mesh/">Data mesh</a> - это когда команда, ответственная за домен, сама владеет своими данными: их качеством, схемой, доступностью и SLA. Центральная BI-команда перестаёт быть единственным горлышком, через которое протаскиваются все пайплайны. Звучит как здравая идея, особенно когда у заказчика восемь продуктовых доменов и один измотанный дата-инженер на всех.</p>
<p>На практике мы сейчас ведём именно такой проект - крупный промышленный холдинг, несколько бизнес-единиц, исторически разрозненные данные. Задача: выстроить data mesh поверх отечественного стека без иностранных SaaS-каталогов и без единого централизованного хранилища, которое всех и замедляло.</p>
<h2>Как устроена архитектура</h2>
<p>Каждый домен получает собственный <a href="https://adg.ru/blog/terms/clickhouse/">ClickHouse</a>-кластер. Не схему в общем кластере, а отдельный инстанс - со своей командой, своим расписанием обновлений, своими решениями по партиционированию. Домен CRM смотрит на одно, домен производства - на другое, домен логистики - на третье.</p>
<p>Поверх этого - единый каталог данных. Мы взяли OpenMetadata (self-hosted, лицензия Apache 2.0), интегрировали с каждым ClickHouse-кластером через коннекторы и сделали из него точку входа: где что лежит, кто владелец, какие данные готовы к межменному потреблению.</p>
<p><a href="https://adg.ru/blog/terms/data-contract/">Data contract</a> - ключевое понятие в этой схеме. Каждый домен публикует не просто таблицы, а явные контракты: какие поля, какие типы, какой SLA обновления, какая гарантия качества. Контракт описывается в YAML, версионируется в git, регистрируется в каталоге. Потребитель подписывается на конкретную версию контракта и получает уведомление при breaking change.</p>
<pre><code>Domain A (CRM)         Domain B (Production)      Domain C (Logistics)
  ClickHouse-A           ClickHouse-B               ClickHouse-C
  + data contracts       + data contracts            + data contracts
        |                       |                          |
        +-------------- OpenMetadata Catalog -------------+
                                |
                      Cross-domain consumers
                      (BI, ML, reporting)</code></pre>
<h2>Где ломается федерация</h2>
<p>Вот где начинается настоящий разговор.</p>
<p><strong>Первое - cross-domain запросы.</strong> ClickHouse умеет делать распределённые запросы через движок <code>Distributed</code> и remote-функции. Но это работает нормально, когда кластеры находятся в одной сети с предсказуемой задержкой. У нашего заказчика домены физически в разных ЦОД-ах (историческое наследие). Remote-запрос из кластера логистики в кластер CRM для join-а даёт latency, с которой BI-инструменты просто не справляются интерактивно. Решение, к которому мы пришли: для межденного потребления домен публикует не живую таблицу, а реплицированный «data product» - периодически обновляемую агрегированную копию для внешних потребителей. Живой федерации нет, зато есть предсказуемость.</p>
<p><strong>Второе - governance без диктатора.</strong> В классическом монолитном DWH есть центральная команда, которая говорит «эта колонка называется так, этот тип вот такой, дедупликация по этому ключу». В data mesh этого человека нет по дизайну. У нас довольно быстро выяснилось, что два домена независимо завели сущность «клиент» с несовместимыми идентификаторами. Домен CRM использует внутренний UUID, домен биллинга - ИНН. Джойнить их сложно, и это не проблема инструментов - это организационная проблема, которую инструменты не решают.</p>
<p>Мы ввели уровень «federated governance»: небольшой совет из владельцев доменов, который собирается раз в две недели и согласует общие справочники и master-сущности. Без принуждения, но с явным реестром «что должно быть одинаковым». Работает с переменным успехом - зависит от того, насколько заняты участники.</p>
<p><strong>Третье - observability данных.</strong> Когда у тебя один DWH, ты видишь всё в одном месте. Когда восемь кластеров - мониторинг качества данных надо строить отдельно. OpenMetadata умеет запускать data quality checks через своё UI, но интеграция с ClickHouse по части column-level lineage работает не идеально: lineage строится по SQL-запросам, которые OpenMetadata перехватывает через query log, и на сложных CTE иногда теряет часть рёбер графа. Мы дополнили это ручной разметкой критичных пайплайнов.</p>
<p><strong>Четвёртое - версионирование контрактов на практике.</strong> В теории: вышла новая версия контракта, потребители получили уведомление, мигрировали. На практике: потребитель - это тоже команда со своим спринтом и бэклогом. Breaking change в контракте домена производства завис на две недели, потому что команда BI-отчётности была занята другим. Контракт v2 вышел, но отчёты работали на v1-таблицах, пока кто-то не заметил расхождение. Помогло бы автоматическое тестирование на стороне потребителя - сейчас это добавляем.</p>
<h2>Что работает без оговорок</h2>
<p>ClickHouse как база для domain-owned хранилища - хорошее решение. Команды разворачивают кластер через <a href="https://adg.ru/blog/terms/helm/">Helm</a>-чарты, управляют самостоятельно, релизный цикл у каждого домена свой. После того как мы написали базовые runbook-и и настроили мониторинг через <a href="https://adg.ru/blog/terms/victoriaMetrics/">VictoriaMetrics</a>, нагрузка на центральную инфра-команду по этим кластерам невысокая.</p>
<p>OpenMetadata как каталог - функционально достаточен, хотя UX в некоторых местах требует привыкания. Главное, что он self-hosted, поддерживает LDAP-аутентификацию и не тянет данные наружу - для заказчиков с требованиями по суверенитету данных это не опция, а требование.</p>
<h2>Где мы сейчас</h2>
<p>Два домена из восьми полностью перешли на data mesh модель с опубликованными контрактами. Остальные в процессе - у кого-то технический долг в пайплайнах, у кого-то просто нет ресурса сесть и описать контракт на существующие данные. Второе, по нашим наблюдениям, встречается чаще первого.</p>
<p>Data mesh - это больше про организацию, чем про инструменты. Инструменты мы подобрали достаточно быстро. Убедить команды взять на себя ответственность за качество данных - это отдельная работа, которая в проектный план не всегда помещается честно.</p>
<p>Если работаете с похожей задачей - распределёнными данными по нескольким доменам и нужен порядок без монолитного DWH - в рамках <a href="https://adg.ru/services/dwh-bi/">DWH/BI-проектов</a> мы помогаем выстроить как архитектуру, так и governance-процессы вокруг неё.</p>]]></content:encoded>
  </item>
  <item>
    <title>DevSecOps для КИИ: Trivy + Cosign в Gitflic CI и что делать с legacy-образами без тегов</title>
    <link>https://adg.ru/blog/2026-06-devsecops-reestry-artefaktov-2026/</link>
    <guid isPermaLink="true">https://adg.ru/blog/2026-06-devsecops-reestry-artefaktov-2026/</guid>
    <pubDate>Thu, 18 Jun 2026 09:00:00 +0300</pubDate>
    <category>Информационная безопасность</category>
    <description>Для КИИ-клиентов настраиваем обязательный scan каждого образа в Harbor через Trivy и Cosign в Gitflic CI. Рассказываем про интеграцию и про проблему legacy без тегов.</description>
    <content:encoded><![CDATA[<p>Год назад разговор с КИИ-клиентами про сканирование образов звучал примерно так: «мы понимаем, что надо, но не горит». Сейчас не так. После обновления методрекомендаций ФСТЭК и нескольких проверок, о которых разошлись слухи в профессиональном сообществе, вопрос «когда настроим» превратился в «почему ещё не настроили». Мы сейчас идём по нескольким КИИ-объектам из клиентского портфеля и везде поднимаем одну и ту же схему: <a href="https://adg.ru/blog/terms/harbor-registry/">Harbor</a> как реестр, Trivy как сканер, <a href="https://adg.ru/blog/terms/cosign-sigstore/">Cosign</a> для подписи, и всё это завязано в <a href="https://adg.ru/blog/terms/gitflic/">Gitflic CI</a>.</p>
<h2>Почему Harbor без политик - не защита</h2>
<p>Harbor стоит у большинства наших клиентов уже несколько лет - его выбирали ещё когда GitLab Container Registry казался избыточным. Но стоит - не значит работает как защита. Типичная картина при <a href="https://adg.ru/services/audit/">аудите</a>: образы пушатся, лежат, никто их не сканирует, политик блокировки нет. Это просто файловый сервер с красивым интерфейсом.</p>
<p>Harbor 2.x умеет встраивать Trivy как внутренний сканер - включается в настройках за несколько кликов. После включения каждый новый образ при пуше автоматически уходит на сканирование. Дальше настраивается политика: образы с критическими уязвимостями без доступного фикса блокируются при pull. Важный нюанс, который сначала вызывает вопросы у команд: образ попадает в реестр, но не становится доступным для pull, пока сканирование не завершилось. Первый раз это выглядит как баг. Надо объяснять заранее.</p>
<p>Для КИИ-контекста отдельно интересен режим сканирования на наличие вредоносных компонентов - Trivy проверяет базы Trivy Advisory DB и GHSA. Это не закрывает zero-day, но known-malicious компоненты из последних <a href="https://adg.ru/blog/terms/supply-chain-attack/">supply chain</a> инцидентов ловит нормально. Мы проверяли на реальных кейсах из нашего <a href="https://adg.ru/blog/2026-03-supply-chain-bezopasnost-2026-tendencii/">мартовского разбора</a>.</p>
<h2>Gitflic CI: как интегрировали Cosign</h2>
<p>С подписью образов через Cosign в Gitflic CI есть одна особенность, которую нужно учитывать: Gitflic не поддерживает OIDC keyless signing так же нативно, как GitLab через <code>id_tokens</code> (OIDC). Пришлось идти через классический вариант - пара ключей, ключ в CI-переменной.</p>
<p>Схема stage в пайплайне:</p>
<pre><code class="language-yaml">scan-image:
  stage: security
  image: registry.internal/devtools/trivy:0.52
  needs: [build]
  script:
    - trivy image
        --severity CRITICAL,HIGH
        --exit-code 1
        --ignore-unfixed
        ${HARBOR_HOST}/${CI_PROJECT_PATH}:${CI_COMMIT_SHA}
  only:
    - main
    - /^release\/.*/

sign-image:
  stage: security
  image: registry.internal/devtools/cosign:2.4
  needs: [scan-image]
  script:
    - echo "${COSIGN_PRIVATE_KEY}" | cosign sign --key /dev/stdin
        ${HARBOR_HOST}/${CI_PROJECT_PATH}:${CI_COMMIT_SHA}
  only:
    - main
    - /^release\/.*/</code></pre>
<p><code>needs: [scan-image]</code> здесь принципиален: подпись ставится только после успешного прохождения scan. Если Trivy вернул exit code 1 - sign-image не запустится, образ не будет подписан, и дальнейшие попытки задеплоить его в <a href="https://adg.ru/blog/terms/kubernetes/">Kubernetes</a> упрутся в Kyverno-политику.</p>
<p>Cosign хранит подписи в Harbor как OCI-артефакты рядом с образом - никакого отдельного хранилища не нужно. Harbor 2.x поддерживает это нативно.</p>
<p>Kyverno-политика закрывает последний рубеж: в namespace <code>production</code> и <code>staging</code> запрещены Pod-ы с образами без валидной Cosign-подписи от нашего internal CA. Dev-namespace намеренно оставляем без принудительной верификации - разработчики собирают образы локально, блокировать dev болезненно и контрпродуктивно.</p>
<h2>Проблема legacy-образов без тегов</h2>
<p>Это то, что неожиданно съело больше всего времени. У каждого клиента в Harbor накопился слой образов, которые пушились годами без нормальной политики тегирования: <code>latest</code>, безымянные слои от промежуточных сборок, артефакты полузабытых проектов. Trivy их не сканировал никогда.</p>
<p>Проблема в том, что часть этих образов всё ещё используется. Не активно, но используется - в batch-задачах, в legacy-скриптах деплоя, в cron-контейнерах, которые «всегда так работали». Тупо заблокировать их нельзя: завалишь какой-нибудь ночной процесс и узнаешь об этом утром от заказчика.</p>
<p>Мы выработали такой подход:</p>
<ul>
<li><strong>Инвентаризация через Harbor API</strong> - скрипт обходит все репозитории, собирает образы старше 180 дней без тегов кроме <code>latest</code>, смотрит дату последнего pull. Образы, которые не тянули больше года, выносим в отдельный список «кандидаты на архив».</li>
<li><strong>Форсированное сканирование</strong> - для образов с активными pulls (даже раз в квартал) запускаем Trivy принудительно через Harbor API: <code>POST /api/v2.0/repositories/{repo}/artifacts/{digest}/scan</code>. Это не блокирует образ, но даёт нам отчёт по уязвимостям.</li>
<li><strong>Постепенная блокировка</strong> - образы с критическими CVE, которые реально тянутся в продакшн, выносим на отдельные переговоры с командой клиента: либо обновляете базовый образ, либо мы фиксируем это как accepted risk с обоснованием для аудитора ФСТЭК.</li>
</ul>
<p>Принципиально важный момент: принятый риск для КИИ-объектов должен быть задокументирован. «Мы знали, но не обновили» без бумаги - это замечание на проверке. «Мы знали, оценили, приняли, вот обоснование и дата пересмотра» - это управляемая история.</p>
<h2>Что получается в итоге</h2>
<p>Полный пайплайн для нового образа выглядит так: сборка - Trivy-скан (блокирующий для main/release) - Cosign-подпись - пуш в Harbor - Kyverno в Kubernetes. Образ, который не прошёл хотя бы одну ступень, до production не доберётся.</p>
<p>Для legacy-образов пока компромисс: сканируем принудительно, документируем риски, постепенно вытесняем самые проблемные. Полный закрытый контур - это процесс на несколько месяцев, а не спринт.</p>
<p>Если ваш объект КИИ готовится к аудиту или хочет заранее разобраться с состоянием реестра образов - это хорошо ложится в рамки <a href="https://adg.ru/services/audit/">аудита безопасности</a>, где мы разбираем текущее состояние и выстраиваем конкретный план.</p>]]></content:encoded>
  </item>
  <item>
    <title>Полгода PostgreSQL 18 в продакшне: что сработало, что регрессировало и как мы обошли</title>
    <link>https://adg.ru/blog/2026-06-postgresql-18-features-prodakshn-gid/</link>
    <guid isPermaLink="true">https://adg.ru/blog/2026-06-postgresql-18-features-prodakshn-gid/</guid>
    <pubDate>Tue, 16 Jun 2026 09:00:00 +0300</pubDate>
    <category>Данные и аналитика</category>
    <description>Инкрементальные чекпоинты убрали пики IO, async I/O дал прирост на batch SELECT. Одна нагрузка регрессировала - разбираем почему и как исправили через ALTER SYSTEM.</description>
    <content:encoded><![CDATA[<p>Полгода - это тот рубеж, когда первоначальный энтузиазм от апгрейда уже выветрился, а реальные паттерны нагрузки успели проявить себя во всей красе. В <a href="https://adg.ru/blog/2026-01-postgresql-18-prodakshn-pervye-itogi/">январе</a> мы описывали первые три месяца: инкрементальные чекпоинты убрали пики I/O, <a href="https://adg.ru/blog/terms/async-io-postgres/">async I/O</a> ускорил seq scan, autovacuum с <code>io_uring</code> потребовал настройки. Сейчас июнь, и картина дополнилась.</p>
<p>Несколько компаний из нашего круга - финтех, ретейл, один государственный заказчик - перешли на PG18 примерно в одно время, и у нас сложилась неплохая выборка наблюдений с разных профилей нагрузки. Вот что интересного.</p>
<h2>Инкрементальные чекпоинты: полгода спустя</h2>
<p>В январе мы писали, что «зубья» на latency исчезли. Это подтверждается. Более того - на одном из контуров с очень интенсивной записью (несколько тысяч транзакций в секунду, смесь INSERT и UPDATE) эффект оказался ещё заметнее, чем казалось на трёхмесячном горизонте.</p>
<p>Интересное наблюдение: равномерность I/O дала вторичный эффект - стала лучше работать утилизация дискового кеша ОС. Раньше пики checkpoint-а буквально вымывали page cache, особенно на серверах с умеренным объёмом RAM. После перехода паттерн чтения стал предсказуемее, кеш-хиты подросли, и это заметно по <code>pg_stat_bgwriter.buffers_clean</code> - их стало меньше, что хороший знак.</p>
<p>Конфигурационная деталь, которую стоит проверить при апгрейде: если у вас был кастомный <code>checkpoint_completion_target = 0.95</code> как обходной манёвр для сглаживания пиков - с инкрементальными чекпоинтами его можно снизить обратно к дефолтным 0.9 или даже к 0.8, поскольку само по себе сглаживание теперь встроено в механизм. Не обязательно, но даёт чуть больше агрессии при сбросе.</p>
<h2>Async I/O и batch SELECT: цифры устаканились</h2>
<p>На аналитическом профиле (batch SELECT по большим таблицам, отчётные джобы, <a href="https://adg.ru/blog/terms/etl/">ETL</a>) прирост от <code>io_method=io_uring</code> стабилизировался в диапазоне 18-22%. Это соответствует тому, что мы ожидали по бенчмаркам, и за шесть месяцев не деградировал - что важно, поскольку первые пару месяцев всегда есть соблазн списать хороший результат на «эффект свежего кеша».</p>
<p>Ключевое условие, которое мы теперь документируем явно для каждого нового контура:</p>
<ul>
<li><strong><code>io_method = io_uring</code></strong> работает только если ядро 6.1+ и io_uring не заблокирован через seccomp или cgroup. В контейнерах на некоторых платформах по умолчанию заблокирован - проверяйте.</li>
<li><strong><code>max_io_concurrency</code></strong> - на NVMe мы выставляем 48-64, на SAS-стойке оставляем дефолт. Выше не всегда лучше: при чрезмерном значении начинается конкуренция внутри io_uring-очереди, и прирост срезается.</li>
<li><strong><code>effective_io_concurrency</code></strong> - для аналитических запросов поднимаем до 256, для OLTP-контуров оставляем скромнее: там latency важнее throughput.</li>
</ul>
<h2>Регресс, который мы не ожидали: нагрузка с большим числом коротких курсоров</h2>
<p>Вот это стало сюрпризом. На одном из контуров - внутренняя система документооборота, специфическая нагрузка - после перехода на PG18 начали замечать рост latency на отдельных запросах. Не на всех, и не сразу: через несколько недель после перехода.</p>
<p>Покопавшись, нашли причину. Нагрузка использует большое количество коротких курсоров: приложение открывает курсор, выбирает несколько строк, закрывает, открывает следующий - и так тысячи раз в секунду. В PG17 это работало нормально. В PG18 в этом паттерне проявилось нежелательное взаимодействие между логикой управления буферами async I/O и тем, как GID (global identifier) назначается в контексте незавершённых курсорных операций.</p>
<p>Точнее: при высокой частоте открытия/закрытия курсоров в условиях активного async I/O возникал contention на внутреннем локе при регистрации GID. Это не deadlock, но throughput на этом паттерне падал - на нашей нагрузке примерно на 15-20% относительно PG17.</p>
<p>Решение нашлось через <code>ALTER SYSTEM</code>. Конкретно помогло:</p>
<pre><code class="language-sql">ALTER SYSTEM SET io_method = 'worker';
ALTER SYSTEM SET max_io_concurrency = 16;
SELECT pg_reload_conf();</code></pre>
<p>То есть откат к модели <code>worker</code> для этого конкретного инстанса, без перезапуска. GID-contention исчез, latency вернулась к норме. Потеря в throughput на batch SELECT - да, есть, около 8-10%. Но на этом контуре batch SELECT нет, и компромисс оказался приемлемым.</p>
<p>Важный вывод: <code>ALTER SYSTEM</code> без перезапуска - это не только удобство, это операционная страховка. На PG17 для изменения <code>io_method</code> требовался рестарт; на PG18 ряд параметров, включая этот, перегружается через <code>pg_reload_conf()</code>. Это реальная разница при инциденте в боевом контуре.</p>
<h2>Общее ощущение через полгода</h2>
<p>PG18 в продакшне - это не «обновился и забыл». Это версия, которая даёт ощутимые выигрыши на нагрузках с I/O-давлением, но требует понимания, что именно она делает иначе. Инкрементальные чекпоинты и async I/O - это не просто «быстрее», это другая модель взаимодействия с железом и ОС.</p>
<p>Регресс на курсорной нагрузке неприятный, но обходимый. И хорошо, что инструментарий для обхода - <code>ALTER SYSTEM</code> плюс <code>pg_reload_conf()</code> - есть без перезапуска. На системах, где рестарт СУБД это событие с согласованием, это принципиально.</p>
<p>Параллельно идёт процесс сертификации <a href="https://adg.ru/blog/terms/postgres-pro/">Postgres Pro</a> 18 Enterprise через ФСТЭК - об этом писали в <a href="https://adg.ru/blog/2026-04-postgresql-18-prodakshn-sertifikaciya-kii/">апреле</a>. Для <a href="https://adg.ru/blog/terms/kii/">КИИ</a>-контуров это всё ещё ограничение: функциональность есть, регуляторного зазора нет. Там остаёмся на сертифицированных версиях и ждём.</p>]]></content:encoded>
  </item>
  <item>
    <title>Итоги H1 2026 по КИИ: 73% нарушений - про мониторинг, не про железо</title>
    <link>https://adg.ru/blog/2026-06-kii-itogi-h1-2026-regulyatorika/</link>
    <guid isPermaLink="true">https://adg.ru/blog/2026-06-kii-itogi-h1-2026-regulyatorika/</guid>
    <pubDate>Thu, 11 Jun 2026 09:00:00 +0300</pubDate>
    <category>Регуляторика</category>
    <description>ФСТЭК публикует обезличенную статистику проверок КИИ за первое полугодие 2026. Разбираем цифры и делаем выводы для практики.</description>
    <content:encoded><![CDATA[<p>На прошлой неделе ФСТЭК опубликовал обезличенную сводку по итогам проверок объектов <a href="https://adg.ru/blog/terms/kii/">КИИ</a> за первое полугодие 2026. Это не пресс-релиз и не отчёт с громким заголовком - технический документ на сайте регулятора, который несложно пропустить. Мы его не пропустили, потому что занимаемся <a href="https://adg.ru/services/audit/">аудитом</a> КИИ и эти цифры напрямую влияют на то, как мы строим работу с заказчиками.</p>
<p>Самое интересное - не в абсолютных числах проверок, а в распределении нарушений по категориям.</p>
<h2>Что показывает статистика</h2>
<p>Согласно публикации, 73% всех выявленных нарушений относятся к двум кластерам: организация мониторинга и реагирование на инциденты. Технические средства защиты - сертифицированные МЭ, антивирусы, системы обнаружения вторжений - дают оставшиеся 27%.</p>
<p>Иначе говоря: три четверти претензий регулятора - это не «у вас нет нужного железа» и не «версия прошивки устарела». Это «вы не видите, что происходит в вашей инфраструктуре» и «вы не умеете на это реагировать».</p>
<p>Для нас это не сюрприз - мы видели тот же паттерн на <a href="https://adg.ru/blog/2026-03-fstec-audit-kii-q1-2026/">мартовских проверках Q1</a>: инспекторы последовательно запрашивают выборки событий из <a href="https://adg.ru/blog/terms/siem/">SIEM</a>, смотрят хронологию и задают вопрос про разрывы. Но то, что регулятор собрал это в статистику и опубликовал, - это сигнал уже системного уровня.</p>
<h2>Что конкретно нарушают</h2>
<p>Из описания в документе можно восстановить типовые картины. ФСТЭК не называет объекты, но группирует нарушения по признакам.</p>
<p><strong>Неполное покрытие источников событий.</strong> Промышленные контроллеры, <a href="https://adg.ru/blog/terms/asu-tp/">SCADA-системы</a>, специализированное оборудование АСУТП - туда SIEM зачастую не дотягивается. Причины стандартные: нет стандартного интерфейса экспорта, производитель не поддерживает <a href="https://adg.ru/blog/terms/syslog/">syslog</a>, интеграция требует доработки под конкретную модель. В <a href="https://adg.ru/blog/2026-01-kii-2026-novye-trebovaniya-fstec/">январских методрекомендациях</a> регулятор сделал оговорку про компенсирующие меры для такого оборудования - но компенсация должна быть задокументирована, иначе это нарушение.</p>
<p><strong>Разрывы в непрерывности.</strong> Источник формально подключён, но в истории событий есть дыры - несколько часов или суток тишины. Сбой агента, ротация сертификатов, плановые окна обслуживания без уведомления системы мониторинга. Инспектор смотрит на хронологию: если разрыв не объяснён служебной записью, это замечание.</p>
<p><strong>Реагирование без процедуры.</strong> Инцидент зафиксирован в SIEM - что дальше? Если ответ «ну, кто-то посмотрит», это не процедура реагирования. Регулятор спрашивает: есть ли документ, кто дежурный, каков порядок эскалации, есть ли журнал разбора инцидентов. Отсутствие этих артефактов - отдельная строчка в предписании.</p>
<p><strong>Передача в <a href="https://adg.ru/blog/terms/gossopka/">ГосСОПКА</a> не в реальном времени.</strong> Пакетный режим вместо потокового - нарушение для первой категории. Многие объекты настроили интеграцию давно, в пакетном режиме, и не переводили. Теперь это видно в проверках.</p>
<h2>Почему технические средства дают только 27%</h2>
<p>Отчасти это хорошая новость: отрасль в целом освоила базовый набор сертифицированных решений. Сертифицированный МЭ, антивирус, СЗИ НСД - это уже не редкость. Плохая новость в том, что технические средства сами по себе не работают без процессов вокруг них.</p>
<p>Это то, с чем мы сталкиваемся на практике регулярно. Заказчик потратил серьёзные деньги на SIEM, выстроил архитектуру сбора событий - а потом оказывается, что три сегмента ОТ не подключены, потому что «там сложный вендор, разберёмся потом». Или правила корреляции не обновлялись два года. Или дежурный аналитик SOC физически не успевает разбирать алерты, и они просто накапливаются.</p>
<p>Регулятор, похоже, это понял раньше многих объектов.</p>
<h2>Что это значит для наших проектов</h2>
<p>Статистика H1 подтверждает вектор, который мы и так видели в отдельных проверках. Но теперь у нас есть общий ориентир для разговора с заказчиками.</p>
<p>Первое: инвентаризация покрытия источников - это не разовая задача. После любого изменения инфраструктуры нужно проверять, все ли новые узлы передают события.</p>
<p>Второе: непрерывность мониторинга - это метрика, которую надо мерить. Если SIEM не получал событий от источника дольше N часов, это должен быть алерт, а не открытие при следующей проверке.</p>
<p>Третье: документ по реагированию на инциденты - это не формальность для папки. Инспектор будет спрашивать, как вы применяли его в последние полгода. Журнал разборов, служебные записки по аномалиям - вот что делает документ живым.</p>
<p>Четвёртое: передача в ГосСОПКА в реальном времени - для первой категории это теперь стандартный пункт в предписании, если не сделано. Лучше разобраться с сетевыми ограничениями до проверки, чем объяснять инспектору, почему пакетный режим.</p>
<p>Публикация ФСТЭК хороша тем, что даёт системный срез, а не просто впечатления от конкретных объектов. Цифра 73% - достаточно весомый аргумент для внутреннего разговора о приоритетах, когда бюджет ограничен, а купить ещё один сертифицированный продукт проще, чем выстроить процесс.</p>]]></content:encoded>
  </item>
  <item>
    <title>Суверенный рунет 2026: новые требования к ТСПУ для корпоративных сетей</title>
    <link>https://adg.ru/blog/2026-06-suverennyj-runet-2026-tspu-praktika/</link>
    <guid isPermaLink="true">https://adg.ru/blog/2026-06-suverennyj-runet-2026-tspu-praktika/</guid>
    <pubDate>Tue, 09 Jun 2026 09:00:00 +0300</pubDate>
    <category>Регуляторика</category>
    <description>Регулятор распространяет требования ТСПУ на корпоративные сети с выходом в интернет. Разбираем, что меняется в конфигурации пограничных маршрутизаторов и что происходит с VPN до облаков.</description>
    <content:encoded><![CDATA[<p>В начале года мы уже писали про <a href="https://adg.ru/blog/2026-01-kii-2026-novye-trebovaniya-fstec/">новые требования ФСТЭК по КИИ</a> - там фокус был на мониторинге и сегрегации. Сейчас параллельный трек: Роскомнадзор методично расширяет периметр закона о <a href="https://adg.ru/blog/terms/suverennyj-runet/">суверенном рунете</a>. С весны в нескольких волнах разъяснений и приказов появилось требование об установке <a href="https://adg.ru/blog/terms/tspu/">ТСПУ</a> не только у классических операторов связи, но и у организаций, самостоятельно подключённых к интернету через собственные AS или через прямые договоры с магистральными провайдерами. Для части наших клиентов это оказалось неожиданностью - они всегда считали, что ТСПУ это «проблема Ростелекома», а не их.</p>
<h2>Кого это касается</h2>
<p>Граница проходит не по размеру организации, а по архитектуре подключения. Если организация:</p>
<ul>
<li><strong>имеет собственный автономный номер (ASN)</strong> и анонсирует свои префиксы в <a href="https://adg.ru/blog/terms/bgp-multihoming/">BGP</a>;</li>
<li><strong>подключена к нескольким транзитным провайдерам</strong> напрямую, минуя единую точку обмена трафиком под ТСПУ;</li>
<li><strong>эксплуатирует точку обмена трафиком</strong> или IX-подключение на своей стороне.</li>
</ul>
<p>...то формально попадает в категорию, для которой требования об установке средств фильтрации и мониторинга теперь распространяются напрямую.</p>
<p>Большинство средних компаний, которые подключены через одного-двух интернет-провайдеров в пассивном режиме, под требования не попадают - трафик проходит через ТСПУ провайдера. Но среди наших <a href="https://adg.ru/services/managed/">managed-клиентов</a> несколько организаций имеют именно такую «продвинутую» топологию - их кто-то когда-то убедил взять собственный ASN ради независимости от провайдера.</p>
<h2>Что конкретно меняется</h2>
<p>Практика пока складывается неравномерно. По нашим наблюдениям - и по тому, что слышим от коллег - технические требования к оборудованию на стыке с интернетом такие:</p>
<ul>
<li><strong>Место установки.</strong> ТСПУ должно стоять на всех точках подключения к сетям связи общего пользования. Если у организации два аплинка от разных провайдеров - на каждом.</li>
<li><strong>Управление.</strong> Оборудование должно принимать сигналы управления от Роскомнадзора в автоматическом режиме. Это означает наличие отдельного управляющего интерфейса и стабильного канала до систем РКН.</li>
<li><strong>Логирование.</strong> Журналы трафика через ТСПУ - отдельный болезненный вопрос по срокам хранения и доступу.</li>
</ul>
<h2>Что происходит с VPN-туннелями до облаков</h2>
<p>Здесь самое интересное с операционной точки зрения. У нескольких клиентов инфраструктура частично размещена в отечественных IaaS-облаках, и связность между корпоративной сетью и облаком организована через <a href="https://adg.ru/blog/terms/ipsec/">IPsec</a> или WireGuard поверх интернета.</p>
<p>ТСПУ - это DPI-оборудование. Оно инспектирует трафик. IPsec в туннельном режиме непрозрачен для DPI - с точки зрения фильтра это зашифрованный поток между двумя точками. На практике это порождает несколько сценариев:</p>
<p><strong>Туннель работает, но регулятор видит его как непрозрачный трафик.</strong> Пока это не является поводом для блокировки - легитимные IPsec-сессии между организацией и её облачными ресурсами не входят в перечень запрещённого трафика. При этом процедура согласования сложнее: регулятор может запросить подтверждение, что туннель идёт именно в отечественный ЦОД.</p>
<p><strong>Использование VPN-продуктов из стоп-листа.</strong> Ряд VPN-решений, особенно западных вендоров, уже попал или может попасть под ограничения. Если организация использует такой продукт для связи с облаком - придётся мигрировать на альтернативу. На практике для корпоративных IPsec-туннелей это решается заменой клиентского ПО на сертифицированные отечественные аналоги или на нативные средства операционной системы.</p>
<p><strong>Производительность.</strong> ТСПУ добавляет задержку. Незначительную - обычно единицы миллисекунд, но для приложений, чувствительных к latency, это стоит замерить до и после.</p>
<p>Для туннелей до облаков мы рекомендуем переходить на прямое L3-подключение к облачному провайдеру там, где это доступно, - минуя публичный интернет. Это снимает вопрос и с ТСПУ, и с DPI, и заодно даёт более предсказуемую производительность.</p>
<h2>Конфигурация пограничных маршрутизаторов</h2>
<p>На нескольких проектах нам пришлось пересматривать конфигурацию BGP-сессий на пограничных маршрутизаторах. Несколько практических наблюдений:</p>
<ul>
<li><strong>Анонсы и фильтрация.</strong> ТСПУ стоит между маршрутизатором и провайдером - это влияет на видимость управляющего канала. Нужно явно проверить, что out-of-band управление маршрутизатором не зависит от туннелей, которые могут быть прерваны при применении правил фильтрации.</li>
<li><strong>Failover-логика.</strong> Если ТСПУ выходит из строя или применяет некорректное правило, трафик может упасть. Схему failover стоит протестировать отдельно - убедиться, что secondary-аплинк действительно подхватывает нагрузку.</li>
<li><strong>Документация топологии.</strong> На аудитах <a href="https://adg.ru/blog/terms/prikaz-fstec-239/">ФСТЭК</a>, которые мы сопровождали в марте, инспекторы фиксировали замечания за несоответствие схемы реальной топологии. С ТСПУ ситуация аналогичная: оборудование появляется в схеме, его нужно отразить в документации и включить в процесс управления изменениями.</li>
</ul>
<h2>Где сейчас неопределённость</h2>
<p>Честно: нормативная база ещё не устоялась. Разъяснения РКН выходят неравномерно, правоприменительная практика по корпоративным сетям только формируется. Мы видим расхождения между тем, что написано в письмах регулятора, и тем, что реально требуют при проверках.</p>
<p>Наша текущая рекомендация клиентам с собственными ASN: инициировать консультацию с РКН для уточнения применимости требований именно к вашей топологии, не ждать проверки. Это не гарантирует отсутствия замечаний, но фиксирует добросовестную позицию организации. И параллельно - провести аудит всех VPN-продуктов на пограничных устройствах: что из этого из ограниченного списка, что нет.</p>
<p>История с ТСПУ для корпоративных сетей ещё не дописана - это точно не финальная версия требований.</p>]]></content:encoded>
  </item>
  <item>
    <title>Паттерны оркестрации LLM-агентов: что победило в корпоративном проде</title>
    <link>https://adg.ru/blog/2026-06-llm-agent-orchestration-patterns-2026/</link>
    <guid isPermaLink="true">https://adg.ru/blog/2026-06-llm-agent-orchestration-patterns-2026/</guid>
    <pubDate>Thu, 04 Jun 2026 09:00:00 +0300</pubDate>
    <category>Автоматизация</category>
    <description>Год в продакшне с агентами: разобрали три паттерна оркестрации на реальных задачах - incident triage, knowledge retrieval и конфигурационный аудит. Какой паттерн для чего работает.</description>
    <content:encoded><![CDATA[<p>Разговоры про «правильную архитектуру агентов» шли с тех пор, как у агентов вообще появились инструменты. Multi-agent, ReAct, Plan-and-Execute - терминов много, внятных сравнений на реальных задачах было мало. За последний год у нас накопилось достаточно практики, чтобы сказать что-то конкретное. Не «паттерн X лучше», а «для задачи Y паттерн X работает, для задачи Z - нет, и вот почему».</p>
<p>Три задачи, три разных паттерна, три разных итога.</p>
<h2>Задача первая: incident triage</h2>
<p>Это наш <a href="https://adg.ru/blog/2026-02-aiops-root-cause-analysis-prodakshn/">RCA-агент поверх Zabbix + Loki</a>. Алерт прилетел - агент собирает контекст, строит гипотезу, пишет дежурному.</p>
<p>Мы начинали с ReAct (Reasoning + Acting): агент шаг за шагом рассуждает, решает, какой инструмент вызвать, смотрит на результат, продолжает. Выглядело логично - инцидент непредсказуем, жёсткий план не поможет.</p>
<p>На практике ReAct дал проблему, которую мы не ожидали: агент застревал в петлях. Видит ошибку в логах, идёт в <a href="https://adg.ru/blog/terms/zabbix/">Zabbix</a> за метриками, видит там аномалию, возвращается в <a href="https://adg.ru/blog/terms/loki-log-aggregation/">Loki</a> за контекстом этой аномалии - и так несколько кругов. Каждый круг - вызов LLM, задержка, стоимость токенов. При этом конечный ответ не становился лучше после второго круга.</p>
<p>Мы зафиксировали максимум 3 итерации и добавили явный «план» на старте: сначала Loki за последние 15 минут, потом Zabbix за метриками, потом синтез. Это уже ближе к Plan-and-Execute, чем к чистому ReAct. Агент стал предсказуемым и дешевле. Качество диагностики при этом не упало - скорее чуть выросло, потому что порядок сбора контекста стал осмысленным.</p>
<p><strong>Вывод по incident triage:</strong> ReAct хорош теоретически, но в инциденте, где есть шум и ложные корреляции, нужны ограничения. Облегчённый Plan-and-Execute с фиксированным порядком инструментов и потолком итераций работает лучше.</p>
<h2>Задача вторая: knowledge retrieval</h2>
<p>У другого клиента - корпоративный ассистент по базе знаний: несколько тысяч страниц в Confluence, разработчики задают вопросы на русском, агент отвечает с цитатами.</p>
<p>Здесь мы с самого начала попробовали простую цепочку без агентной оркестрации: пользователь -&gt; <a href="https://adg.ru/blog/terms/rag-pipeline/">embeddings-поиск</a> -&gt; reranker -&gt; LLM. Сработало на базовых запросах. Но посыпалось на составных: «покажи, как настроить nginx для нашего кластера и какие ограничения в политике ИБ для внешних портов». Это два поиска, результаты которых нужно свести вместе.</p>
<p>Multi-agent здесь дал правильное разделение: оркестратор принимает запрос, декомпозирует на подзадачи, каждую отдаёт агенту-специалисту (search-agent для KB, policy-agent для ИБ-документов), потом синтезирует ответы. Каждый агент маленький и предсказуемый, оркестратор не лезет в детали поиска.</p>
<p>Грабля, на которую мы наступили: оркестратор иногда дробит запрос на слишком мелкие подзадачи. Вопрос «как перезапустить сервис» превращается в три параллельных поиска, каждый из которых находит одно и то же. Пришлось добавить классификатор на входе: простой запрос идёт прямо в search-agent, минуя декомпозицию. Это не самое элегантное решение, но работает.</p>
<p><strong>Вывод по knowledge retrieval:</strong> multi-agent даёт ценность именно на составных запросах с разными источниками данных. На простых запросах оркестрация - лишний оверхед и лишние токены. Классификатор сложности запроса на входе обязателен.</p>
<h2>Задача третья: конфигурационный аудит</h2>
<p>Периодическая задача: обойти инфраструктуру клиента, собрать конфиги, проверить на соответствие baseline-у, сформировать отчёт. Это не интерактив - это батч с детерминированным результатом.</p>
<p>ReAct здесь даже не рассматривали: задача хорошо декомпозируется заранее. Plan-and-Execute в чистом виде - составить план обхода, потом выполнить каждый шаг - подходит идеально.</p>
<p>Агент-планировщик принимает список хостов и категорий проверок, строит граф задач. Агент-исполнитель проходит по задачам, вызывает инструменты (<a href="https://adg.ru/blog/terms/ssh/">SSH</a>, API <a href="https://adg.ru/blog/terms/ansible/">Ansible</a>, запросы к инвентарю), собирает результаты. Агент-синтезатор сводит результаты в читаемый отчёт.</p>
<p>Плюс здесь неожиданный: разделение планировщика и исполнителя дало возможность перезапускать провалившиеся шаги без повторного планирования. Хост недоступен - шаг помечается как failed, остальные продолжаются, в отчёте хост отдельным разделом с пометкой. При ReAct такое пришлось бы обрабатывать в промпте, что быстро превращается в лапшу.</p>
<p><strong>Вывод по конфигурационному аудиту:</strong> Plan-and-Execute для батчевых задач с детерминированной структурой - просто правильный выбор. Персистентный граф задач с восстановлением после сбоев делает задачу надёжной без сложной логики в промпте.</p>
<h2>Что общего между тремя случаями</h2>
<p>Если смотреть поперёк задач, видны два фактора выбора паттерна.</p>
<p><strong>Первый - предсказуемость структуры задачи.</strong> Если структура известна заранее (аудит, батч, отчёт) - Plan-and-Execute. Если структура зависит от того, что агент найдёт по пути (инцидент, исследование) - ReAct, но с ограничениями. Если задача композитная и хорошо делится на независимые части - multi-agent.</p>
<p><strong>Второй - стоимость ошибки.</strong> ReAct в инциденте ошибается дорого: петля из пяти итераций в два часа ночи задерживает ответ. Plan-and-Execute ошибается дешевле: провалил шаг - перезапустил шаг. Multi-agent ошибается предсказуемо: если упал один агент-специалист, оркестратор это видит.</p>
<p>Отдельное наблюдение по <a href="https://adg.ru/blog/2026-01-llm-agent-monitoring-observability/">мониторингу агентов</a>: без <a href="https://adg.ru/blog/terms/opentelemetry/">трейсов</a> на уровне span-ов мы бы не увидели, что ReAct на incident triage делает лишние круги. Число итераций на запрос - метрика, которую теперь смотрим отдельно для каждого агента.</p>
<h2>Где мы сейчас</h2>
<p>Ни один из трёх паттернов не стал «дефолтным» для всех задач. Это раздражает, потому что хочется единого шаблона, но практика показывает: паттерн - следствие структуры задачи, а не предпочтение архитектора.</p>
<p>Одна вещь, которую мы планируем проверить в ближайших спринтах: гибридный оркестратор, который начинает как Plan-and-Execute, но позволяет агенту-исполнителю отклоняться от плана при неожиданных находках. По ощущениям, это могло бы закрыть пробел между incident triage и аудитом. По факту - пока не знаем.</p>]]></content:encoded>
  </item>
  <item>
    <title>Два года на VictoriaMetrics + Grafana + Loki: что прижилось, где болит</title>
    <link>https://adg.ru/blog/2026-06-observability-zrelost-otechestvennye-2026/</link>
    <guid isPermaLink="true">https://adg.ru/blog/2026-06-observability-zrelost-otechestvennye-2026/</guid>
    <pubDate>Tue, 02 Jun 2026 09:00:00 +0300</pubDate>
    <category>DevOps</category>
    <description>Итоги двух лет эксплуатации observability-стека на базе VictoriaMetrics, Grafana и Loki в отечественных инсталляциях: что работает надёжно, где всё ещё больно.</description>
    <content:encoded><![CDATA[<p>Примерно два года назад мы начали переводить наших <a href="https://adg.ru/services/managed/">managed-клиентов</a> с классической связки <a href="https://adg.ru/blog/terms/zabbix/">Zabbix</a> + <a href="https://adg.ru/blog/terms/prometheus/">Prometheus</a> на стек <a href="https://adg.ru/blog/terms/victoriaMetrics/">VictoriaMetrics</a> + Grafana + <a href="https://adg.ru/blog/terms/loki/">Loki</a>. Не потому что Zabbix плохой - Zabbix 7 был вполне годным, и сейчас восьмая версия с anomaly detection выглядит интересно. Просто на горизонте в несколько кластеров и сотен сервисов Prometheus начинал задыхаться, а VictoriaMetrics давала заметно лучшую компактность хранения при том же объёме метрик. Пора подвести промежуточные итоги.</p>
<h2>Что прижилось</h2>
<p><strong>VictoriaMetrics как хранилище метрик.</strong> Здесь без оговорок - работает. Сжатие лучше Prometheus-а, single-node держит нагрузку, которую раньше тянул только Prometheus в федерации. Cluster-режим подняли на двух проектах с особенно активными сервисами - там это оправдано. На остальных single-node и не думает потеть. Удобная вещь - vmbackup/vmrestore: бэкапы и восстановление без танцев с iptables и снапшотами.</p>
<p><strong>Grafana как единый фронт.</strong> Три источника данных в одном дашборде - VictoriaMetrics, Loki, Tempo - это то, ради чего весь стек вообще имеет смысл. Когда дежурный видит spike latency на графике и кликом открывает связанные логи за тот же интервал - это реальное ускорение диагностики, а не демо с конференции. Grafana On-Premise держится стабильно, обновления выходят регулярно, ничего принципиально сломанного в последних версиях не попадалось.</p>
<p><strong>Loki для логов.</strong> С оговорками, но в целом - да, прижился. Модель «только индекс по лейблам, остальное в объекте» работает при правильных лейблах. Если лейблы сделаны плохо - и запросы медленные, и объём индекса раздутый. Мы набили шишки на первых инсталляциях: лейбл <code>pod_name</code> с уникальными значениями на каждый под - почти то же самое, что вообще без индекса. Переделали на <code>namespace</code>, <code>app</code>, <code>component</code> - стало нормально.</p>
<h2>Где всё ещё больно</h2>
<p><strong>Alertmanager-маршрутизация - самое больное место.</strong> Логика маршрутизации в yaml-конфиге Alertmanager устроена так, что при попытке описать нетривиальные правила («этот алерт - в дежурный канал, но только ночью и только если severity=critical, а если днём - просто в общий чат») быстро получается нечитаемая матрёшка из <code>routes</code>, <code>matchers</code> и <code>continue: true</code>. Мы сделали несколько итераций, написали внутреннюю документацию с примерами - помогло, но каждый новый человек в команде всё равно спотыкается об это место.</p>
<p><strong>Cardinality под нагрузкой.</strong> VictoriaMetrics справляется лучше Prometheus-а, но высокая cardinality метрик всё равно бьёт по памяти. На одном проекте разработчики добавили в метрики лейбл <code>user_id</code> - и мы получили несколько миллионов уникальных time series за сутки. VictoriaMetrics не упала, но потребление памяти выросло неприятно. Пришлось добавить в процесс code review отдельный чеклист на лейблы метрик. Это организационная проблема, не техническая, но она реальна.</p>
<p><strong>Loki и долгосрочное хранение.</strong> Loki хранит данные хорошо, пока объём умеренный. Когда логов много и retention длинный - появляются вопросы к стоимости хранения и скорости compaction. На двух проектах с compliance-требованиями, где логи надо хранить год, мы пришли к тому, что Loki держит горячий период (30-60 дней), а холодный архив идёт в object storage через конфигурацию storage и compactor. Работает, но настройка не тривиальная.</p>
<p><strong>Отсутствие нормальной RBAC в Grafana на уровне дашбордов.</strong> Enterprise-функции Grafana с fine-grained permissions нам недоступны - клиенты не хотят платить за подписку поверх On-Premise. Дефолтная ролевая модель Grafana грубая: либо viewer для всего, либо editor почти для всего. Для клиентов, где разные команды должны видеть только свои namespace-ы, мы используем Organizations - несколько изолированных «организаций» внутри одного Grafana. Работает, но это костыль, и поддерживать одинаковые дашборды в нескольких Organizations - боль.</p>
<h2>Почему не SaaS</h2>
<p>Нас иногда спрашивают - почему мы не перевели хотя бы некритичные сервисы на какой-нибудь облачный мониторинг? Дешевле же, меньше операционной нагрузки.</p>
<p>Ответ несложный. Во-первых, у большинства наших клиентов данные в метриках и логах - чувствительная информация: имена хостов, внутренние адреса, параметры запросов, иногда персональные данные в трейсах. Отправлять это в иностранный SaaS - не вариант, это не про паранойю, а про compliance. Отечественных SaaS-мониторингов с нормальным Prometheus-совместимым API и Loki-совместимым приёмником пока нет в том виде, который нас устроил бы.</p>
<p>Во-вторых, операционная нагрузка на поддержку стека оказалась меньше, чем мы ожидали. VictoriaMetrics не требует постоянного ухода. Grafana обновляется раз в несколько месяцев. Основная работа - это именно настройка дашбордов, алертов и разбор проблем с cardinality. Это осмысленная работа, а не просто «держи инфраструктуру живой».</p>
<h2>Что с Zabbix</h2>
<p>Zabbix мы не выкинули. На нескольких проектах он остался как основной источник алертов по инфраструктурным метрикам - хост недоступен, диск заканчивается, процесс упал. Zabbix 8 с встроенным <a href="https://adg.ru/blog/terms/anomaly-detection-monitoring/">anomaly detection</a> выглядит как шаг вперёд, но мы пока смотрим на это осторожно: anomaly detection хорошо работает на предсказуемых паттернах, а на нагрузке с большой дисперсией даёт ложные срабатывания. Будем тестировать.</p>
<p>Для нас Zabbix и VictoriaMetrics/Grafana - не конкуренты. Zabbix хорош для агентного мониторинга хостов, network devices, windows-серверов с нестандартными метриками. VictoriaMetrics + Grafana - для cloud-native сервисов, где метрики отдаются через /metrics endpoint. На большинстве проектов оба стека работают параллельно, и дежурный смотрит в Grafana, потому что там всё в одном месте.</p>
<p>Промежуточный итог такой: стек рабочий, производительный и поддерживаемый. Боль не в инструментах, а в организации данных и правилах работы с ними. Это, наверное, честный результат для двух лет эксплуатации.</p>]]></content:encoded>
  </item>
  <item>
    <title>РЕД ОС 9.2 против Astra Linux SE 2.15: сравниваем на контейнерах, Ansible и свежем железе</title>
    <link>https://adg.ru/blog/2026-05-redos-9-2-astra-2-15-sravnenie/</link>
    <guid isPermaLink="true">https://adg.ru/blog/2026-05-redos-9-2-astra-2-15-sravnenie/</guid>
    <pubDate>Thu, 28 May 2026 09:00:00 +0300</pubDate>
    <category>Инфраструктура</category>
    <description>РЕД ОС 9.2 и Astra Linux SE 2.15 вышли в мае 2026. Прогоняем одну тестовую нагрузку на обоих и смотрим, что выбрать для серверов в 2026.</description>
    <content:encoded><![CDATA[<p>В мае оба ведущих отечественных серверных дистрибутива обновились почти одновременно: <a href="https://adg.ru/blog/terms/redos/">РЕД ОС 9.2</a> вышла в начале месяца, <a href="https://adg.ru/blog/terms/astra-linux/">Astra Linux SE 2.15</a> - в середине. Оба релиза позиционируются как обновления системных компонентов без структурных ломающих изменений. У нас накопилась тестовая нагрузка, которую мы давно хотели прогнать одинаково на обоих - и майская пауза в плановых апгрейдах дала для этого время.</p>
<p>Контекст: мы используем оба дистрибутива у разных заказчиков. РЕД ОС чаще идёт на серверные роли в смешанных инфраструктурах, Astra Linux SE - там где нужна сертификация по классу защищённости или есть требование к мандатному управлению. Иногда выбор ОС диктуется не нами, а закупкой или политикой. Так что сравнение честное - не «какую купить», а «что учесть при работе с каждой».</p>
<h2>Стенд и нагрузка</h2>
<p>Две идентичные ВМ на одном гипервизоре: 8 vCPU, 32 ГБ RAM, NVMe-том. Одна - РЕД ОС 9.2 с минимальной установкой плюс docker и <a href="https://adg.ru/blog/terms/podman/">podman</a> из штатного репозитория. Вторая - Astra Linux SE 2.15, тот же набор пакетов, Parsec в режиме enforcing.</p>
<p>Нагрузка состоит из трёх частей: запуск набора контейнерных сервисов через Compose, применение набора Ansible-плейбуков из нашей общей коллекции, и синтетический тест IO на NVMe с параллельными потоками. Ничего экзотического - это то, с чем мы работаем каждый день.</p>
<h2>Контейнеры: разный стартовый уровень</h2>
<p>РЕД ОС 9.2 обновила podman до актуального патча-релиза пятой ветки - то, что мы разбирали после 9.1 в <a href="https://adg.ru/blog/2026-02-redos-9-1-release-container-runtime/">февральском посте</a>. <a href="https://adg.ru/blog/terms/docker-compose/">Compose-манифесты</a> запустились без изменений, crun работает штатно, rootless-режим ведёт себя предсказуемо. В 9.2 появилась более свежая версия buildah, что важно для тех, кто собирает образы прямо на серверах без отдельного CI.</p>
<p>У Astra Linux SE 2.15 ситуация другая. Docker здесь присутствует, но его взаимодействие с Parsec по-прежнему требует внимания. При запуске контейнера с bind-mount на каталог с ненулевым мандатным уровнем получаем AVC-отказ - поведение знакомое по 2.14, мы его касались в <a href="https://adg.ru/blog/2026-01-astra-linux-se-2-14-release/">январском обзоре</a>. В 2.15 добавили документированный механизм маппинга мандатных меток для контейнеров, что технически правильно, но настройка занимает время. Из восьми сервисов в нашем Compose-наборе шесть запустились без правок. Два потребовали явного задания контекста через переменные окружения и метки в юнит-файлах.</p>
<p>Для задач, где контейнеры работают без пересечения с мандатной иерархией - например, полностью изолированные сервисы без монтирований в защищённые каталоги - Astra Linux SE 2.15 работает нормально. Но как только появляется интеграция с файловой системой хоста и Parsec включён, нужно планировать время на настройку.</p>
<h2>Ansible: где коллекции работают, а где нет</h2>
<p>Мы гоняли один набор плейбуков из нашей коллекции для управления серверами: конфигурация sshd, управление пользователями, деплой <a href="https://adg.ru/blog/terms/systemd/">systemd</a>-юнитов, настройка logrotate и базовый hardening. Все плейбуки работают через community.general и <a href="https://adg.ru/blog/terms/ansible/">ansible.posix</a> без вендорских модулей.</p>
<p>На РЕД ОС 9.2 всё прошло без единой ошибки. Это RHEL-производная с предсказуемым расположением конфигурационных файлов и стандартным поведением systemd - Ansible с такими системами дружит давно.</p>
<p>На Astra Linux SE 2.15 плейбуки выполнились, но с нюансами. Задачи, работающие с файлами через <code>copy</code> и <code>template</code>, в нескольких случаях получили неожиданное поведение из-за Parsec: файл записывался, но с не той меткой, и последующий сервис его не видел. Проявляется это не ярко - задача завершается как <code>changed</code>, ошибок нет, а сервис потом не может прочитать конфиг. Диагностируется через <code>pdp-ls</code> на целевых файлах.</p>
<p>Решение - либо явно задавать метки через <code>pdp-chml</code> в отдельной задаче после <code>copy</code>/<code>template</code>, либо убедиться, что плейбук запускается в контексте с нужным уровнем. Второй вариант чище, но требует доработки плейбуков под конкретную Astra-среду. Для нашей общей коллекции мы добавили Astra-специфичные задачи в отдельный опциональный тег <code>parsec_labels</code> - применяем только там, где он нужен.</p>
<p>Несколько модулей из ansible.posix работали не совсем корректно с <a href="https://adg.ru/blog/terms/selinux/">SELinux</a>-контекстами на Astra - там собственная подсистема, и часть модулей, ориентированных на стандартный SELinux, читает типы контекстов иначе. Не блокирует, но надо держать в голове.</p>
<h2>Поддержка железа: обновление ядра</h2>
<p>РЕД ОС 9.2 поставляется с обновлённым ядром из 6.6 LTS, в котором закрыт ряд проблем с драйверами RAID-контроллеров и NVMe на новых чипсетах. На нашем тестовом стенде разница не была видна - железо стандартное. Но у одного из заказчиков с недавно поставленными серверами на Elbrus-compatible шине эта деталь принципиальна: на 9.1 у них были прерывистые таймауты IO, на 9.2 - нет.</p>
<p>Astra Linux SE 2.15 тоже обновила ядро - до 6.6 LTS, что выравнивает ситуацию с железом. Это закономерно: обе ОС сейчас идут на одном ядерном треке, и hardware-совместимость у них примерно одинакова. Исключение - драйверы, специфичные для конкретных российских производителей: здесь у каждого вендора своя история, и лучше проверять по конкретной модели, а не полагаться на общую логику.</p>
<h2>Где что уместно</h2>
<p>После этого сравнения наш практический вывод простой.</p>
<p><strong>РЕД ОС 9.2</strong> - дистрибутив, с которым стандартный серверный инструментарий работает без сюрпризов. Если вы управляете серверами через Ansible с обычными коллекциями, используете контейнеры в rootless-режиме, и вам не нужен мандатный контроль доступа - это предсказуемая, хорошо управляемая RHEL-подобная система.</p>
<p><strong>Astra Linux SE 2.15</strong> - правильный выбор там, где сертификация и мандатный контроль доступа не опция, а требование. Parsec работает, его можно настроить под контейнеры и Ansible - но это отдельная работа, которую нужно закладывать в оценку проекта. На объектах <a href="https://adg.ru/blog/terms/kii/">КИИ</a> с требованиями ФСТЭК к классу защищённости выбор в пользу Astra часто не технический, а регуляторный.</p>
<p>Обе ОС получили в мае обновления, которые актуальны - свежее ядро, закрытые CVE, исправленные пакеты. Это хорошо. Но при выборе между ними стоит честно ответить на вопрос: есть ли у вас требование к мандатному контролю, или вы берёте Astra «на всякий случай»? Во втором случае дополнительная сложность не добавляет безопасности - только работы.</p>]]></content:encoded>
  </item>
  <item>
    <title>БДУ ФСТЭК май 2026: agent hijacking и dependency confusion попали в реестр угроз</title>
    <link>https://adg.ru/blog/2026-05-fstec-ugrozy-bdu-2026-update/</link>
    <guid isPermaLink="true">https://adg.ru/blog/2026-05-fstec-ugrozy-bdu-2026-update/</guid>
    <pubDate>Tue, 26 May 2026 09:00:00 +0300</pubDate>
    <category>Информационная безопасность</category>
    <description>ФСТЭК обновил БДУ угроз в мае 2026, добавив векторы для LLM-агентов и supply chain. Проводим gap-анализ текущих мер и формируем план закрытия пробелов.</description>
    <content:encoded><![CDATA[<p>ФСТЭК в мае обновил Банк данных угроз безопасности информации. Обновления БДУ выходят регулярно, но это - не очередной патч с парой дополнительных CVE. В реестр попали два класса угроз, которые раньше существовали в практике, но не были формально закреплены как типовые векторы для российских информационных систем: атаки на LLM-агентов (<a href="https://adg.ru/blog/terms/agent-privilege-escalation/">agent hijacking</a>) и <a href="https://adg.ru/blog/terms/dependency-confusion/">dependency confusion</a> применительно к отечественным репозиториям пакетов.</p>
<p>Для нас это прямой повод провести gap-анализ: что из новых угроз БДУ уже закрыто у наших клиентов, что закрыто частично, а где дыра. Записываем, что нашли.</p>
<h2>Что именно добавили</h2>
<p>БДУ теперь содержит два новых идентификатора угроз, которые относятся к нашей практике.</p>
<p><strong>Первый - угроза перехвата управления LLM-агентом</strong> (формулировка в реестре звучит примерно как «угроза навязывания недоверенных инструкций автономному агенту через обрабатываемые данные»). Это та же механика, которую мы разбирали в марте при <a href="https://adg.ru/blog/2026-03-llm-agent-security-prompt-injection-prod/">threat model хелпдеск-агента</a>: вредоносные инструкции в пользовательском вводе или во внешних данных, которые агент обрабатывает как часть контекста. Теперь этому вектору есть идентификатор в БДУ, что значит: при аудите <a href="https://adg.ru/blog/terms/kii/">КИИ</a>-объекта с LLM-агентами аудитор формально обязан его проверить.</p>
<p><strong>Второй - угроза подмены зависимостей через неоднозначность имён пакетов в корпоративных репозиториях</strong> (dependency confusion). Здесь акцент именно на отечественных репозиториях: Nexus с зеркалами Гит-репозиториев отечественного ПО, GitFlic Packages, внутренние PyPI-зеркала. Вектор известен с 2021 года на международной сцене, но в БДУ он долго не попадал - видимо, регулятор считал его «западной» проблемой. Теперь нет: несколько публичных инцидентов с российскими внутренними реестрами в 2025-2026 годах изменили позицию.</p>
<h2>Gap-анализ: что есть, чего нет</h2>
<p>Мы прошлись по нескольким клиентам, у которых либо уже эксплуатируются LLM-агенты, либо есть внутренние репозитории зависимостей с отечественным ПО. Общая картина оказалась предсказуемой - и при этом не радостной.</p>
<p>По agent hijacking:</p>
<ul>
<li><strong><a href="https://adg.ru/blog/terms/opa/">OPA</a>-guardrails или аналогичный policy layer</strong> - есть у двух клиентов из пяти. Это те, где мы сами выстраивали защиту агентов после прошлогодних инцидентов.</li>
<li><strong>Изоляция пользовательского ввода от системного промпта</strong> - сделана везде, но с разным качеством. У одного клиента «изоляция» - это просто префикс «User said:» перед вводом. Это не изоляция, это декорация.</li>
<li><strong>Логирование попыток tool-call с отклонением</strong> - есть у одного клиента из пяти. Остальные логируют только успешные вызовы.</li>
<li><strong>Документированный threat model агента</strong> - нет ни у кого, кроме проекта, который мы разбирали в марте.</li>
</ul>
<p>По dependency confusion:</p>
<ul>
<li><strong>Явный приоритет внутреннего репозитория над публичным</strong> в настройках pip/npm/maven - есть у трёх клиентов из четырёх, у которых мы смотрели конфиги. Но у одного из трёх настройка есть только в CI-пайплайне; на developer-машинах - нет, и разработчики ставят пакеты с дефолтными настройками.</li>
<li><strong>Проверка на подозрительные совпадения имён</strong> при добавлении новой зависимости - нет нигде. Это ручной процесс, который никто не делает систематически.</li>
<li><strong><a href="https://adg.ru/blog/terms/sbom-fstec/">SBOM</a> с фиксацией источника</strong> каждого пакета (не просто имя и версия, но и откуда скачан) - есть у двух клиентов, которые уже перестроились под <a href="https://adg.ru/blog/2026-02-sbom-fstec-ispolnenie-trebovaniy-2026/">требования ФСТЭК к SBOM</a>.</li>
</ul>
<h2>Что делаем</h2>
<p>На основе gap-анализа формируем план по двум трекам.</p>
<p><strong>Трек агентской безопасности.</strong> Для каждого клиента с LLM-агентом в продакшне - провести threat model по обновлённому чеклисту, который теперь явно включает новый идентификатор БДУ. Формат: рабочая сессия с командой, два-три часа, результат - список tool-call политик и приоритетный backlog по их реализации. Там, где агент использует сторонние инструменты (почта, JIRA, AD), первым делом идёт жёсткая фиксация допустимых параметров на уровне policy, а не надежда на то, что модель «сама не согласится» на вредоносный вызов.</p>
<p><strong>Трек supply chain.</strong> Здесь работа разбивается на три шага: проверка конфигов менеджеров пакетов на всех окружениях (включая developer-машины, не только CI), проверка что внутренний репозиторий явно объявлен как единственный источник для внутренних имён пакетов, и добавление проверки источника в SBOM-пайплайн. По последнему пункту - у Syft есть поддержка метаданных об источнике в формате CycloneDX, это не требует смены инструмента, только конфигурирования.</p>
<p>Полного закрытия этих векторов за один спринт не выйдет - особенно там, где нет ни OPA, ни нормального threat model. Но приоритизировать работу теперь проще: БДУ ФСТЭК - это прямой аргумент в разговоре с CISO о том, почему это нужно делать не «когда-нибудь», а в ближайший квартал.</p>
<p>Если у вас в инфраструктуре есть LLM-агенты или внутренние репозитории с отечественным ПО - разобраться с gap-анализом под новые угрозы БДУ можно в рамках <a href="https://adg.ru/services/audit/">аудита</a>.</p>]]></content:encoded>
  </item>
</channel>
</rss>
