<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Yuriy Gavrilov: posts tagged Dev</title>
<link>https://gavrilov.info/tags/dev/</link>
<description>Welcome to my personal place for love, peace and happiness 🤖 Yuiry Gavrilov</description>
<author></author>
<language>en</language>
<generator>Aegea 11.4 (v4171e)</generator>

<itunes:owner>
<itunes:name></itunes:name>
<itunes:email>yvgavrilov@gmail.com</itunes:email>
</itunes:owner>
<itunes:subtitle>Welcome to my personal place for love, peace and happiness 🤖 Yuiry Gavrilov</itunes:subtitle>
<itunes:image href="https://gavrilov.info/pictures/userpic/userpic-square@2x.jpg?1643451008" />
<itunes:explicit>no</itunes:explicit>

<item>
<title>Hugr: Data Mesh-платформа и GraphQL-бэкенд на базе DuckDB</title>
<guid isPermaLink="false">354</guid>
<link>https://gavrilov.info/all/hugr-data-mesh-platforma-i-graphql-bekend-na-baze-duckdb/</link>
<pubDate>Sun, 20 Sep 2026 09:00:00 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/hugr-data-mesh-platforma-i-graphql-bekend-na-baze-duckdb/</comments>
<description>
&lt;h3&gt;1. Что такое Hugr и зачем он нужен&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;Hugr&lt;/b&gt; — это open-source платформа класса Data Mesh и высокопроизводительный GraphQL-бэкенд, построенный поверх аналитического движка DuckDB. Проект развивается командой hugr-lab под руководством Владимира Грибанова и распространяется под лицензией MIT.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Назначение&lt;/b&gt; — решить конкретную инженерную боль: данные в организации разбросаны по десяткам систем (PostgreSQL, SQL Server, S3, REST API, Kafka, Redis), и каждая команда строит собственный слой доступа. Классические ETL-пайплайны и дублирование данных в единое хранилище дают задержку актуальности, удваивают инфраструктуру и создают узкое горлышко на дата-инженерах.&lt;/p&gt;
&lt;p&gt;Hugr предлагает иную модель: &lt;b&gt;данные остаются на месте, а поверх них выстраивается единый GraphQL-слой&lt;/b&gt;, который компилирует декларативные схемы в исполняемые запросы к каждому источнику. Для аналитика — один интерфейс вместо десятков коннекторов. Для разработчика — типизированный GraphQL API без ручного CRUD. Для дата-инженера — декларативное описание схемы через SDL-директивы вместо поддержки ETL.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Ключевые характеристики:&lt;/b&gt;&lt;/p&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Параметр&lt;/td&gt;
&lt;td style="text-align: center"&gt;Значение&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Лицензия&lt;/td&gt;
&lt;td style="text-align: center"&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Ядро&lt;/td&gt;
&lt;td style="text-align: center"&gt;DuckDB (in-process, колоночный, OLAP)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Интерфейс&lt;/td&gt;
&lt;td style="text-align: center"&gt;GraphQL (queries, mutations, subscriptions)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Язык реализации&lt;/td&gt;
&lt;td style="text-align: center"&gt;Go&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Репозитории&lt;/td&gt;
&lt;td style="text-align: center"&gt;`hugr-lab/hugr`, `hugr-lab/query-engine`&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Развёртывание&lt;/td&gt;
&lt;td style="text-align: center"&gt;Docker, Kubernetes, embedded в Go-сервисы&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;h3&gt;2. Архитектура: почему именно такая&lt;/h3&gt;
&lt;h4&gt;2.1. Мотивация&lt;/h4&gt;
&lt;p&gt;Традиционный подход «единое хранилище» (Data Warehouse / Lakehouse) предполагает перемещение данных в одну точку. Это создаёт три проблемы:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Задержка актуальности&lt;/b&gt; — данные в хранилище отстают от источника.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Дублирование и стоимость&lt;/b&gt; — копирование петабайтов дорого и медленно.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Схема-каплинг&lt;/b&gt; — потребители привязаны к физической структуре хранилища.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Data Mesh инвертирует модель: &lt;b&gt;каждый домен владеет своими данными и публикует их как продукт&lt;/b&gt;, а платформа обеспечивает федеративный доступ. Hugr — инфраструктура этого доступа.&lt;/p&gt;
&lt;h4&gt;2.2. Компоненты&lt;/h4&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;┌────────────────────────────────────────────────┐
│                  Клиенты                       │
│   Web · BI · Python · MCP/AI                   │
└───────────────────────┬────────────────────────┘
                        │ GraphQL / IPC / REST
┌───────────────────────▼────────────────────────┐
│              Hugr Server (Go)                  │
│  ┌──────────┐ ┌──────────┐ ┌────────────────┐  │
│  │ GraphQL  │ │ Schema   │ │ Access Control │  │
│  │ API+Subs │ │ Compiler │ │ OAuth2 / RBAC  │  │
│  └──────────┘ └──────────┘ └────────────────┘  │
│  ┌──────────────────────────────────────────┐  │
│  │     DuckDB Analytical Engine (Go)        │  │
│  │  In-process · Колоночный · Vectorized    │  │
│  └──────────────────────────────────────────┘  │
│  ┌──────────┐ ┌──────────┐ ┌────────────────┐  │
│  │  Cache   │ │  CoreDB  │ │ IPC Protocol   │  │
│  │Mem+Redis │ │ metadata │ │  (Arrow)       │  │
│  └──────────┘ └──────────┘ └────────────────┘  │
└──┬──────────┬──────────┬───────────┬───────────┘
   │          │          │           │
┌──▼───┐  ┌───▼────┐ ┌───▼────┐ ┌────▼──────┐
│ PG / │  │SQL Srv │ │DuckLake│ │ REST API  │
│MySQL │  │Azure   │ │Iceberg │ │Arrow Fl.  │
│Parq. │  │        │ │S3/CSV  │ │ Redis KV  │
└──────┘  └────────┘ └────────┘ └───────────┘&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;DuckDB как ядро&lt;/b&gt; — in-process колоночная СУБД для OLAP. Не требует отдельного процесса и сетевого порта, работает с десятками форматов (Parquet, CSV, JSON, GeoParquet, Delta Lake), обеспечивает векторизованное исполнение. Для Hugr это нулевая сетевая задержка между движком и логикой и возможность кросс-источниковых JOIN’ов в памяти.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;CoreDB&lt;/b&gt; хранит метаданные: источники, каталоги схем, роли, политики доступа. Может быть DuckDB-файлом или PostgreSQL (обязателен для кластера).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Компилятор схем&lt;/b&gt; преобразует GraphQL SDL с директивами (`@table`, `@view`, `@function`, `@field_references`, `@join`, `@module`) в логическую модель, из которой генерируются типы, фильтры, агрегации, мутации и sub-query поля для связей.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;3. Источники данных: единая точка входа&lt;/h3&gt;
&lt;h4&gt;3.1. Поддерживаемые типы&lt;/h4&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Категория&lt;/td&gt;
&lt;td style="text-align: center"&gt;Источники&lt;/td&gt;
&lt;td style="text-align: center"&gt;Особенности&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Реляционные&lt;/td&gt;
&lt;td style="text-align: center"&gt;PostgreSQL (PostGIS, TimescaleDB, pgvector), MySQL, SQL Server / Azure SQL&lt;/td&gt;
&lt;td style="text-align: center"&gt;Pushdown фильтров, сортировки, агрегаций и JOIN’ов&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Озёра данных&lt;/td&gt;
&lt;td style="text-align: center"&gt;DuckLake, Apache Iceberg (REST, Glue, S3 Tables)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Time-travel, snapshot-based DDL/DML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Файлы&lt;/td&gt;
&lt;td style="text-align: center"&gt;Parquet, Delta Lake, CSV, JSON, GeoParquet, Shapefiles&lt;/td&gt;
&lt;td style="text-align: center"&gt;Через DuckDB, поддержка S3 и Hive-партиционирования&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Сервисы&lt;/td&gt;
&lt;td style="text-align: center"&gt;REST API, Arrow Flight gRPC, GraphQL (в разработке)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Basic, ApiKey, OAuth2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;AI/ML&lt;/td&gt;
&lt;td style="text-align: center"&gt;Embeddings, LLM (OpenAI, Anthropic, Gemini)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Единый tool calling, streaming&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Key-Value&lt;/td&gt;
&lt;td style="text-align: center"&gt;Redis&lt;/td&gt;
&lt;td style="text-align: center"&gt;Pub/Sub, keyspace events, TTL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Расширения&lt;/td&gt;
&lt;td style="text-align: center"&gt;Extension-источник, Hugr Apps&lt;/td&gt;
&lt;td style="text-align: center"&gt;Кросс-источниковые представления, кастомные функции&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;h4&gt;3.2. Декларативная регистрация&lt;/h4&gt;
&lt;p&gt;Источник описывается мутацией `insert_data_sources`, после чего его схема компилируется и попадает в общее GraphQL-дерево. Адаптеры и коннекторы писать не нужно.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;mutation {
  core {
    insert_data_sources(data: {
      name: &amp;quot;my_llm&amp;quot;
      type: &amp;quot;llm-openai&amp;quot;
      prefix: &amp;quot;my_llm&amp;quot;
      path: &amp;quot;http://localhost:1234/v1/chat/completions?model=gemma-4&amp;amp;timeout=120s&amp;quot;
    }) { name }
  }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Новый источник появляется в API за одну мутацию, без пересборки и перезапуска.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;4. GraphQL как универсальный слой доступа&lt;/h3&gt;
&lt;h4&gt;4.1. Автогенерация из схемы&lt;/h4&gt;
&lt;p&gt;Для каждого табличного объекта компилятор создаёт:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;запросы с `filter`, `order_by`, `distinct_on`, `limit`, `offset`;&lt;/li&gt;
&lt;li&gt;запрос по первичному ключу (`object_name_by_pk`) и уникальным полям;&lt;/li&gt;
&lt;li&gt;агрегации (`object_name_aggregation`) и корзинные агрегации (`object_name_bucket_aggregation`);&lt;/li&gt;
&lt;li&gt;мутации `insert`, `update`, `delete` с типизированными входными структурами;&lt;/li&gt;
&lt;li&gt;фильтровые типы с операторами `eq`, `in`, `gt`, `lt` и вложенными фильтрами по связям;&lt;/li&gt;
&lt;li&gt;sub-query поля для связей (включая M2M), query-time JOIN’ы и пространственные JOIN’ы.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Дата-инженер описывает логическую модель — полный CRUD, агрегации и связи появляются автоматически.&lt;/p&gt;
&lt;h4&gt;4.2. Подписки&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Streaming LLM completions&lt;/b&gt; — токены с событиями `content_delta`, `reasoning`, `tool_use`, `finish`, `error`.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Pub/Sub&lt;/b&gt; — подписка на каналы Redis.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Keyspace events&lt;/b&gt; — мониторинг изменений ключей по паттерну.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4.3. JQ-трансформации&lt;/h4&gt;
&lt;p&gt;Серверные JQ-преобразования: встроенный `jq()` в GraphQL, REST-эндпоинт `/jq-query`, доступ к переменным через `$var_name`, вложенные GraphQL-запросы из JQ через `queryHugr()`. Это постобработка без выгрузки в Python — группировка, фильтрация, реструктуризация на сервере.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;5. AI-возможности: LLM и Embeddings&lt;/h3&gt;
&lt;h4&gt;5.1. Модуль `core.models`&lt;/h4&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Функция&lt;/td&gt;
&lt;td style="text-align: center"&gt;Назначение&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;`embedding` / `embeddings`&lt;/td&gt;
&lt;td style="text-align: center"&gt;Векторные эмбеддинги (одиночный и батч)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;`completion`&lt;/td&gt;
&lt;td style="text-align: center"&gt;Простая генерация текста&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;`chat_completion`&lt;/td&gt;
&lt;td style="text-align: center"&gt;Многооборотный диалог с tool calling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;`model_sources`&lt;/td&gt;
&lt;td style="text-align: center"&gt;Список зарегистрированных моделей&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Провайдеры: &lt;b&gt;OpenAI&lt;/b&gt; (и совместимые: Ollama, LM Studio, vLLM, Mistral, Qwen, Azure OpenAI), &lt;b&gt;Anthropic&lt;/b&gt; (Claude), &lt;b&gt;Google Gemini&lt;/b&gt;. Различия форматов абстрагированы.&lt;/p&gt;
&lt;h4&gt;5.2. Tool Calling и Round-trip&lt;/h4&gt;
&lt;p&gt;Вызовы инструментов нормализованы. Для Gemini 2.5+ поддерживается `thought_signature` — обязательное поле при отправке результатов инструментов обратно модели. Пайплайн: запрос → `tool_calls` + `thought_signature` → исполнение инструмента → сообщение с `role: “tool”` → полная история в `chat_completion`.&lt;/p&gt;
&lt;h4&gt;5.3. Thinking Budget&lt;/h4&gt;
&lt;p&gt;Параметр `thinking_budget` управляет chain-of-thought: задаётся на уровне источника (максимум) и запроса (кап). Модель сначала выдаёт `reasoning`-события, затем `content_delta`.&lt;/p&gt;
&lt;h4&gt;5.4. MCP-интеграция&lt;/h4&gt;
&lt;p&gt;Поддержка Model Context Protocol позволяет AI-ассистентам (Claude, Cursor) исследовать схему, выполнять семантический поиск и генерировать/валидировать GraphQL-запросы. Основа для «vibe-аналитики»: LLM строит запросы на естественном языке, Hugr их исполняет.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;6. Hugr Apps: расширяемость через Arrow Flight&lt;/h3&gt;
&lt;h4&gt;6.1. Концепция&lt;/h4&gt;
&lt;p&gt;Hugr Apps — внешние Go-приложения, подключаемые через DuckDB Airport extension (Apache Arrow Flight gRPC). Публикуют в общую GraphQL-схему скалярные функции, таблицы, табличные функции и собственные источники данных (например, PostgreSQL с миграциями).&lt;/p&gt;
&lt;h4&gt;6.2. Жизненный цикл&lt;/h4&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Сценарий&lt;/td&gt;
&lt;td style="text-align: center"&gt;Обнаружение&lt;/td&gt;
&lt;td style="text-align: center"&gt;Восстановление&lt;/td&gt;
&lt;td style="text-align: center"&gt;Потеря данных&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Graceful shutdown&lt;/td&gt;
&lt;td style="text-align: center"&gt;Немедленно&lt;/td&gt;
&lt;td style="text-align: center"&gt;N/A&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Краш приложения&lt;/td&gt;
&lt;td style="text-align: center"&gt;Heartbeat (~90 сек)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Мгновенно при рестарте&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Рестарт Hugr&lt;/td&gt;
&lt;td style="text-align: center"&gt;Startup load&lt;/td&gt;
&lt;td style="text-align: center"&gt;LoadDataSource&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Обновление версии&lt;/td&gt;
&lt;td style="text-align: center"&gt;Изменение пути&lt;/td&gt;
&lt;td style="text-align: center"&gt;Мгновенно (миграция)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нет&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Heartbeat: интервал 30 сек, таймаут 10 сек, 3 неудачи → приостановка каталога. При восстановлении каталог перекомпилируется.&lt;/p&gt;
&lt;h4&gt;6.3. Практический смысл&lt;/h4&gt;
&lt;p&gt;Бизнес-логику (геокодирование, скоринг, расчёты) можно вынести в отдельный сервис и опубликовать как SQL/GraphQL-функции без изменения основного конвейера.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;7. Production-readiness и работа под нагрузкой&lt;/h3&gt;
&lt;h4&gt;7.1. Кластерный режим&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;CLUSTER_ROLE&lt;/b&gt;: `management` или `worker`.&lt;/li&gt;
&lt;li&gt;Management-нода координирует синхронизацию схем, жизненный цикл источников и конфигурацию хранилищ.&lt;/li&gt;
&lt;li&gt;Worker-ноды получают обновления через push (broadcast) и pull (polling).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PostgreSQL CoreDB обязателен&lt;/b&gt; — все ноды разделяют единую метабазу.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.2. Кеширование&lt;/h4&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;In-memory&lt;/b&gt; — горячие данные на каждой ноде.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Внешний кеш&lt;/b&gt; (Redis / Memcached) — разделяемый, инвалидация при мутациях.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Директива `@cache` управляет кешированием на уровне схемы.&lt;/p&gt;
&lt;h4&gt;7.3. Производительность&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Нулевая сетевая задержка между логикой и движком.&lt;/li&gt;
&lt;li&gt;Векторизованное колоночное исполнение.&lt;/li&gt;
&lt;li&gt;Поддержка десятков форматов без конвертации.&lt;/li&gt;
&lt;li&gt;Кросс-источниковые JOIN’ы в памяти.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Filter pushdown&lt;/b&gt; — условия `WHERE` передаются на сторону источника (особенно PostgreSQL).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.4. Безопасность&lt;/h4&gt;
&lt;p&gt;OAuth2 / OpenID Connect, field-level и row-level security, ролевая модель с предопределёнными фильтрами, автозаполнение контекста пользователя/роли в мутациях.&lt;/p&gt;
&lt;h4&gt;7.5. Развёртывание&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Docker&lt;/b&gt;: `docker run -d --name hugr -p 15000:15000 -v ./schemas:/schemas ghcr.io/hugr-lab/automigrate:latest`&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Kubernetes&lt;/b&gt;: Helm-чарты в `hugr-lab/docker` (multi-node, load balancing, кеширование).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Embedded&lt;/b&gt;: Go-пакет `hugr-lab/query-engine`.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;7.6. Ограничения&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Планируются коннекторы к SQLite (через DuckDB) и ClickHouse.&lt;/li&gt;
&lt;li&gt;GraphQL как источник данных — в разработке.&lt;/li&gt;
&lt;li&gt;«Talk-to-data» (естественный язык) — анонсирован.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Для высоких нагрузок рекомендуется кластерный режим с PostgreSQL CoreDB и Redis-кешем.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;8. Области применения и примеры&lt;/h3&gt;
&lt;h4&gt;8.1. Бэкенд данных для приложений&lt;/h4&gt;
&lt;p&gt;Единый GraphQL-слой поверх существующих БД: быстрый запуск API, централизованная схема, контроль доступа.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;{
  marketing {
    campaigns_aggregation_bucket {
      key { channel { name } }
      aggregations { payments { amount { sum } } }
    }
  }
}&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;8.2. Data Mesh-платформа&lt;/h4&gt;
&lt;p&gt;Каждый домен публикует свою схему как модуль. Федеративный доступ через единый API, децентрализованное владение.&lt;/p&gt;
&lt;h4&gt;8.3. Аналитика и MLOps&lt;/h4&gt;
&lt;p&gt;OLAP-запросы и пространственные агрегации через GraphQL, экспорт в Arrow IPC → Python (pandas, GeoDataFrame, Jupyter), JQ-трансформации на сервере, цикл Ingestion → Processing → ML → API Access.&lt;/p&gt;
&lt;h4&gt;8.4. Агентная аналитика (Vibe Analytics)&lt;/h4&gt;
&lt;p&gt;Через MCP-эндпоинт LLM-агент исследует схему, генерирует запросы, выполняет цепочки и строит JQ-преобразования. Пользователь задаёт вопрос на естественном языке — агент возвращает результат.&lt;/p&gt;
&lt;h4&gt;8.5. Реал-тайм дашборды&lt;/h4&gt;
&lt;p&gt;Подключение Grafana/Metabase к Hugr → данные обновляются на каждый запрос, без ETL-задержек, с комбинацией нескольких источников.&lt;/p&gt;
&lt;h4&gt;8.6. Геопространственные задачи&lt;/h4&gt;
&lt;p&gt;Нативные пространственные типы, кросс-источниковые spatial JOIN’ы, поддержка GeoParquet, GeoJSON, Shapefiles, агрегации по пространственным отношениям.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;9. Итог&lt;/h3&gt;
&lt;p&gt;Hugr занимает нишу между «тяжёлыми» платформами данных (Databricks, Snowflake) и лёгкими GraphQL-обёртками над одной БД. Его ценность:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Декларативность&lt;/b&gt; — схема через SDL-директивы, полный CRUD генерируется автоматически.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Федеративность&lt;/b&gt; — данные не перемещаются, доступ на месте.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Производительность&lt;/b&gt; — DuckDB in-process даёт колоночную векторизацию без сетевых накладных расходов.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Расширяемость&lt;/b&gt; — Hugr Apps, Extension-источники, AI-модуль, Redis.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Открытость&lt;/b&gt; — MIT, Go-стек, Docker/K8s, embedded-режим.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Для команды, которая хочет дать аналитикам и приложениям единый доступ к разнородным данным без ETL-империи, Hugr — зрелый и прагматичный выбор с понятной траекторией масштабирования.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;10. Что ещё: другие инструменты и события из рассылки DuckDB (сентябрь 2026)&lt;/h3&gt;
&lt;p&gt;Ежемесячная рассылка DuckDB #45 (16 сентября 2026) принесла несколько значимых новостей.&lt;/p&gt;
&lt;h4&gt;Крупные события&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;AWS приобретает DuckLabs&lt;/b&gt; (компанию-создателя DuckDB). Проекты DuckDB, DuckLake, Quack остаются под MIT-лицензией и управлением DuckDB Foundation. Сообщество восприняло новость со сдержанным оптимизмом благодаря независимому фонду и открытой лицензии. Однако аналитики предупреждают: «разработчики не должны путать неизменность лицензии с неизменностью проекта — люди, пишущие код DuckDB, теперь получают зарплату от AWS, а зарплата влияет на дорожную карту».&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MotherDuck приобретает Tower.dev&lt;/b&gt; для интеграции рантайм-инфраструктуры в MotherDuck Flights — AI-агенты смогут выполнять задачи дата-инжиниринга и публиковать данные как API. Tower — это hosted-рантайм для Python-пайплайнов, обеспечивающий песочницу, планирование и наблюдаемость для кода, написанного LLM.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;DuckDB 2.0 preview (кодовое имя «Cyanoptera»)&lt;/h4&gt;
&lt;p&gt;Доступна preview-версия с клиент/серверным режимом через Quack и `CONNECT`, новым PEG-парсером SQL, переработанным C API для расширений, новым форматом хранения по умолчанию. Асинхронный I/O для S3, переписанный движок рекурсивных CTE и оптимизированный тип VARIANT. Релиз запланирован на октябрь 2026.&lt;/p&gt;
&lt;h4&gt;Экосистема&lt;/h4&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Инструмент / Статья&lt;/td&gt;
&lt;td style="text-align: center"&gt;Суть&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;sql.garden&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Open-source бесконечный холст для данных на Wails (Go + Vue 3) с MCP-сервером для AI-взаимодействия&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;DuckDB Table Functions in Java&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Регистрация табличных функций на чистом Java без C++ расширений; векторизованный батч 2048 строк, pushdown предикатов&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;JetBrains Parquet/Avro/ORC Viewer&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Плагин для IDE: 1 млрд строк / 29 ГБ Parquet открывается за ~1 сек&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Bulk Load в SQL Server&lt;/b&gt; (В. Грибанов)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Параллельные писатели и явные типы (`MSSQL_NVARCHAR(200)`) ускоряют загрузку 38 млн строк с 933 до 96 сек&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;DuckLake vs Iceberg (CDC)&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;DuckLake решает проблему мелких файлов в Postgres→DuckDB CDC: 6 576 мс против 269 344 мс у Iceberg COW&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;duckdb-zarr&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Rust-расширение для запросов к Zarr-хранилищам (N-мерные массивы) через SQL, поддержка S3/GCS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;DuckDB for Apache Iceberg&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Полноценный read/write lifecycle через REST-каталоги, MERGE INTO, ALTER TABLE, Iceberg V3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;SQLite vs DuckDB на $16-железе&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Для observability-данных DuckDB отодвигает «обрыв чтения» в 100 раз дальше и даёт 4× на метриках, 15× на логах&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Эти новости подтверждают вектор: экосистема DuckDB стремительно расширяется от аналитического движка в сторону полноценной платформы данных — с клиент/серверным режимом, AI-интеграцией и корпоративными сценариями. Hugr органично встраивается в эту экосистему, используя DuckDB как вычислительное ядро и добавляя слой декларативного доступа, который превращает сырой движок в управляемую платформу данных.&lt;/p&gt;
</description>
</item>

<item>
<title>Apache Airflow или Temporal: выбор между оркестрацией данных и бизнес-логикой</title>
<guid isPermaLink="false">348</guid>
<link>https://gavrilov.info/all/apache-airflow-ili-temporal-vybor-mezhdu-orkestraciey-dannyh-i-b/</link>
<pubDate>Mon, 07 Sep 2026 22:11:01 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/apache-airflow-ili-temporal-vybor-mezhdu-orkestraciey-dannyh-i-b/</comments>
<description>
&lt;p&gt;В мире разработки и инженерии данных инструменты &lt;b&gt;Apache Airflow&lt;/b&gt; и &lt;b&gt;Temporal&lt;/b&gt; часто могут восприниматься как конкуренты, поскольку оба решают задачу управления многошаговыми процессами. Однако на практике их философия, архитектура и сценарии использования настолько разные, что сравнивать их корректно можно лишь с четким пониманием контекста задачи.&lt;/p&gt;
&lt;p&gt;В этой статье мы разберем, для чего предназначен каждый инструмент, в чем их сильные и слабые стороны, и поможем вам определиться с выбором.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;1. В чем суть каждого инструмента?&lt;/h3&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-242.png" width="28" height="28" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Apache Airflow&lt;/b&gt; — это классический оркестратор batch-процессов. Он создавался как решение для управления ETL/ELT-пайплайнами, регулярной загрузки данных, построения отчетов и ML-циклов. Центральная концепция Airflow — &lt;b&gt;DAG&lt;/b&gt; (направленный ациклический граф), который описывает зависимости между задачами и обычно запускается по расписанию (например, ежедневно в 6 утра).&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/image-241.png" width="28" height="28" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Temporal&lt;/b&gt; — это платформа для надежного исполнения распределенных бизнес-процессов. Она не просто «запускает задачи», а управляет долгоживущими workflow с сохранением состояния, автоматическими повторами, обработкой сбоев и возможностью ждать внешние события (ответ пользователя, платеж, подтверждение от другой системы). Workflow в Temporal пишутся на обычном коде и выполняются детерминированно.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2. Главное различие&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;Airflow&lt;/b&gt; — это продвинутый планировщик для задач по расписанию в мире данных.&lt;br /&gt;
&lt;b&gt;Temporal&lt;/b&gt; — это движок надежного исполнения бизнес-логики в распределенных системах, который «помнит» состояние процесса даже через неделю.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;3. Сравнительная таблица&lt;/h3&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Критерий&lt;/td&gt;
&lt;td style="text-align: center"&gt;Apache Airflow&lt;/td&gt;
&lt;td style="text-align: center"&gt;Temporal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Основное назначение&lt;/td&gt;
&lt;td style="text-align: center"&gt;Оркестрация batch-задач и data pipeline’ов&lt;/td&gt;
&lt;td style="text-align: center"&gt;Надежное выполнение бизнес-процессов и workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Типичные сценарии&lt;/td&gt;
&lt;td style="text-align: center"&gt;ETL, загрузка данных, отчеты, ML-обучение, backfill&lt;/td&gt;
&lt;td style="text-align: center"&gt;Оформление заказов, платежи, onboarding, Saga-паттерны, фоновые операции&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Модель выполнения&lt;/td&gt;
&lt;td style="text-align: center"&gt;DAG из задач (Task)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Workflow + Activities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Основной фокус&lt;/td&gt;
&lt;td style="text-align: center"&gt;Планирование и запуск по расписанию&lt;/td&gt;
&lt;td style="text-align: center"&gt;Состояние, устойчивость, ретраи, долгие ожидания&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Работа с расписанием&lt;/td&gt;
&lt;td style="text-align: center"&gt;Отлично (родная функциональность)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Возможна, но не основная цель&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Долгоживущие процессы (дни/недели)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Не подходит (сложно и неэффективно)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Одно из ключевых преимуществ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Управление состоянием&lt;/td&gt;
&lt;td style="text-align: center"&gt;Ограниченное (обычно через внешние хранилища)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Встроенная, полная история выполнения&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Повторные попытки (retries)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Есть, на уровне задач&lt;/td&gt;
&lt;td style="text-align: center"&gt;Гибкие стратегии, таймауты, компенсации&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Устойчивость к сбоям&lt;/td&gt;
&lt;td style="text-align: center"&gt;Хорошая для batch-задач&lt;/td&gt;
&lt;td style="text-align: center"&gt;Исключительная (продолжает с места сбоя)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Язык разработки&lt;/td&gt;
&lt;td style="text-align: center"&gt;Python (DAG-файлы)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Go, Java, TypeScript, Python и другие&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Наблюдаемость&lt;/td&gt;
&lt;td style="text-align: center"&gt;UI для DAG, логи, статусы задач&lt;/td&gt;
&lt;td style="text-align: center"&gt;UI с историей событий, ретраями и состоянием workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Сложность внедрения&lt;/td&gt;
&lt;td style="text-align: center"&gt;Относительно низкая для data-команд&lt;/td&gt;
&lt;td style="text-align: center"&gt;Выше (требует проектирования workflow и инфраструктуры)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Идеально подходит для Data Engineering&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅ Да&lt;/td&gt;
&lt;td style="text-align: center"&gt;❌ Часто избыточно&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Идеально подходит для микросервисов&lt;/td&gt;
&lt;td style="text-align: center"&gt;❌ Ограниченно&lt;/td&gt;
&lt;td style="text-align: center"&gt;✅ Да&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Масштабирование&lt;/td&gt;
&lt;td style="text-align: center"&gt;Хорошее, но требует тонкой настройки&lt;/td&gt;
&lt;td style="text-align: center"&gt;Рассчитан на распределенные системы с рождения&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Основная аудитория&lt;/td&gt;
&lt;td style="text-align: center"&gt;Data Engineers, ML Engineers, аналитики&lt;/td&gt;
&lt;td style="text-align: center"&gt;Backend Engineers, Platform Engineers, команды микросервисов&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3&gt;4. Сложности и подводные камни&lt;/h3&gt;
&lt;h4&gt;4.1. Когда Airflow становится тяжелым&lt;/h4&gt;
&lt;p&gt;На старте Airflow кажется простым, но по мере роста числа DAG’ов и их сложности возникают типичные проблемы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Зоопарк DAG’ов&lt;/b&gt; — тысячи графов трудно поддерживать и отлаживать.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Жесткая привязка к расписанию&lt;/b&gt; — неудобно моделировать процессы, зависящие от событий, а не от времени.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Слабая работа с долгими процессами&lt;/b&gt; — если задача выполняется несколько часов, Airflow справится, но если процесс длится дни с ожиданием внешнего действия — начнутся трудности.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Промежуточное состояние&lt;/b&gt; — его нужно сохранять во внешних системах (S3, Redis, БД), что усложняет архитектуру.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Риск превращения в «универсальный Cron»&lt;/b&gt; — когда в Airflow пытаются запихнуть всё подряд, поддержка становится кошмаром.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;Вывод:&lt;/b&gt; Airflow хорош для периодических, четко структурированных задач с понятным началом и концом. Для сложной бизнес-логики он не предназначен.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;4.2. Когда Temporal требует дисциплины&lt;/h4&gt;
&lt;p&gt;Temporal дает суперспособности, но платой за них является более высокая инженерная культура:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Детерминированность&lt;/b&gt; — код Workflow обязан быть детерминированным (например, нельзя использовать `time.Now()` или случайные числа без специальной обертки).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Управление версиями&lt;/b&gt; — обновление логики workflow требует аккуратной миграции, иначе сломаются уже запущенные процессы.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Инфраструктура&lt;/b&gt; — Temporal требует собственного кластера (Cassandra/PostgreSQL + сервисы), это сложнее, чем поднять Airflow с локальной БД.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Порог входа&lt;/b&gt; — разработчикам нужно усвоить модель Workflow/Activity, понять, как работают таймауты и сигналы.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;Вывод:&lt;/b&gt; Temporal не нужен для простых ETL-задач, но незаменим там, где процесс должен «жить» и не умирать при сбоях.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;5. Temporal на платформах данных: когда он может быть полезен&lt;/h3&gt;
&lt;p&gt;Хотя в классическом data‑инжиниринге безраздельно правит Airflow, современные платформы данных становятся всё более распределёнными, событийно‑ориентированными и критичными к задержкам. В таких экосистемах появляются сценарии, где Temporal оказывается не избыточным, а очень даже востребованным.&lt;/p&gt;
&lt;p&gt;Вот несколько примеров, когда Temporal может усилить вашу data‑платформу:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Долгие и многоэтапные ML‑пайплайны&lt;/b&gt;  &lt;br /&gt;
Обучение модели может занимать часы и включать этапы подготовки данных, экспериментирования, валидации и деплоя. Если какой‑то этап упал, Temporal восстановит процесс с последней успешной точки, не перезапуская всё заново.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Координация распределённых трансформаций&lt;/b&gt;  &lt;br /&gt;
В архитектурах типа Data Mesh или при использовании множества независимых сервисов (например, микросервисы, каждый из которых обновляет свои витрины) Temporal выступает как надёжный координатор, гарантирующий согласованность обновлений даже при частичных отказах.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Event‑driven data pipelines&lt;/b&gt;  &lt;br /&gt;
Вместо жёсткого расписания вы можете запускать workflow по событиям — поступление нового файла в S3, сообщение в Kafka или завершение внешнего процесса. Temporal отлично поддерживает ожидание сигналов, что делает его естественным выбором для реактивных пайплайнов.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Компенсации и исправление данных&lt;/b&gt;  &lt;br /&gt;
Если в процессе загрузки обнаруживается ошибка в уже обработанных данных, Temporal позволяет реализовать компенсирующие действия (откат, дозагрузка, пересчёт) как часть workflow, с полным сохранением контекста.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Интеграция с внешними API с непредсказуемым временем ответа&lt;/b&gt;  &lt;br /&gt;
Например, вызов внешнего сервиса обогащения данных может зависнуть или отвечать минуты. Temporal управляет таймаутами, ретраями и не теряет состояние, даже если внешний сервис временно недоступен.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Обеспечение exactly‑once семантики в критичных data‑операциях&lt;/b&gt;  &lt;br /&gt;
Когда повторная обработка одних и тех же данных недопустима (финансовые отчёты, списания), Temporal с его идемпотентными Activity и уникальными идентификаторами workflow даёт высокие гарантии.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;При этом Temporal &lt;b&gt;не заменяет&lt;/b&gt; Airflow для стандартных ETL по расписанию. Однако если на вашей платформе данных есть процессы, которые:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;длятся дольше пары часов,&lt;/li&gt;
&lt;li&gt;требуют строгого состояния,&lt;/li&gt;
&lt;li&gt;зависят от внешних событий,&lt;/li&gt;
&lt;li&gt;должны безупречно восстанавливаться после сбоев,&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;— то Temporal может стать вторым (и очень мощным) инструментом в вашем арсенале, работающим плечом к плечу с Airflow.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;6. Рекомендации по выбору&lt;/h3&gt;
&lt;h4&gt;Выбирайте &lt;b&gt;Airflow&lt;/b&gt;, если:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Ваша задача — регулярный запуск batch-процессов (ежедневно, почасово).&lt;/li&gt;
&lt;li&gt;Вы строите ETL/ELT, витрины данных, ML-пайплайны.&lt;/li&gt;
&lt;li&gt;Процесс укладывается в DAG с четкими шагами.&lt;/li&gt;
&lt;li&gt;Команда хорошо знает Python и работает в среде data-инженерии.&lt;/li&gt;
&lt;li&gt;Вам нужен backfill (перезапуск за прошлые периоды).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Примеры:&lt;/b&gt; загрузка из CRM в DWH, пересчет отчетов, обучение модели по ночам.&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;Выбирайте &lt;b&gt;Temporal&lt;/b&gt;, если:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Процесс длится часы, дни или недели.&lt;/li&gt;
&lt;li&gt;Важен строгий контроль состояния — система должна запомнить, на каком шаге остановилась.&lt;/li&gt;
&lt;li&gt;Требуются сложные retries, таймауты и компенсационные транзакции (Saga).&lt;/li&gt;
&lt;li&gt;Есть ожидание событий от пользователя или внешнего сервиса.&lt;/li&gt;
&lt;li&gt;Вы строите микросервисную архитектуру или современную событийно‑управляемую платформу данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Примеры:&lt;/b&gt; оформление заказа, прохождение KYC, обработка платежей, доставка товара, долгий процесс верификации, а также упомянутые выше сложные data‑пайплайны с внешними зависимостями.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;7. Можно ли использовать их вместе?&lt;/h3&gt;
&lt;p&gt;Да, и это частая практика в крупных компаниях:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Airflow&lt;/b&gt; берет на себя все data-пайплайны и подготовку данных для аналитики.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Temporal&lt;/b&gt; отвечает за критичные бизнес-процессы, а также за те data‑процессы, которые требуют повышенной надёжности и управления долгим состоянием.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Например, Airflow утром подготавливает агрегированные данные, а Temporal запускает workflow их распределённой валидации и отправки во внешние системы с гарантией доставки. Инструменты не конфликтуют, а дополняют друг друга.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Итог&lt;/h3&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Airflow&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Temporal&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Слоган&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Планировщик для data-задач&lt;/td&gt;
&lt;td style="text-align: center"&gt;Движок надежных процессов (бизнес и data)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Сила&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Расписание, простота, Python-экосистема&lt;/td&gt;
&lt;td style="text-align: center"&gt;Состояние, устойчивость, долгие workflow, события&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Слабость&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Сложность с долгими процессами, состоянием&lt;/td&gt;
&lt;td style="text-align: center"&gt;Высокий порог входа, избыточен для простого расписания&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;&lt;b&gt;Коротко:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Нужны &lt;b&gt;данные, расписание, отчёты&lt;/b&gt; → &lt;b&gt;Airflow&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;Нужны &lt;b&gt;бизнес-логика, надёжность, долгие операции, событийная оркестрация&lt;/b&gt; (включая сложные сценарии на платформе данных) → &lt;b&gt;Temporal&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Выбор инструмента — это в первую очередь выбор архитектурного подхода. Не пытайтесь забить гвозди микроскопом, но и не используйте молоток для починки часов — выбирайте то, что соответствует реальной сложности ваших задач. А если сложность смешанная — смело комбинируйте оба решения.&lt;/p&gt;
</description>
</item>

<item>
<title>Зря я ему память ставил больше 🥲 ... проект – “Монолит”</title>
<guid isPermaLink="false">308</guid>
<link>https://gavrilov.info/all/zrya-ya-emu-pamyat-stavil-bolshe/</link>
<pubDate>Sat, 03 Jan 2026 19:30:34 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/zrya-ya-emu-pamyat-stavil-bolshe/</comments>
<description>
&lt;p&gt;вот же блин, не ждал я тут подвоха 😭&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/telegram-cloud-photo-size-2-5388624450019856252-y.jpg" width="1032" height="1152" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;сдулся мой старенький asustor, придется бутылки сдавать ... и еще накатить чего-то с горя, что бы было что сдавать.&lt;/p&gt;
&lt;p&gt;🥹&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2026-01-03-v-19.28.31.png" width="1198" height="866" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;а вот еще тряхнул стариной и решил понарошку собрать комп нестыдный на сегодня :)) ну даже очень.&lt;br /&gt;
вот что вышло:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/zrya-ya-emu-pamyat-stavil-bolshe1.png" width="1582" height="1346" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;ну прям мечта сисадмина и не только))) это по сути 4 в одном. через proxmox 4 виртуалки. Первая True Nas Scale для массива, вторая ubuntu server для докеров и Portainer тоже с gpu и третья виндовая для gpu в виндовой среде.  Встречайте...&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Проект “Монолит”: Как собрать домашний сервер мечты за миллион (и зачем это вообще нужно)&lt;/h2&gt;
&lt;p&gt;Говорят, что универсальных инструментов не бывает. Что “Швейцарский нож” режет хуже скальпеля, а универсальная шина хуже зимней. Мы решили бросить вызов этому утверждению. Ну я и мой электронный друг Gemini.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Задача звучала амбициозно:&lt;/b&gt; собрать в одном компактном корпусе устройство, которое заменит целый IT-отдел. Оно должно быть:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;AI-станцией&lt;/b&gt; для запуска “тяжелых” нейросетей (LLM) локально.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Графическим ПК&lt;/b&gt; топового уровня (4K/8K видео).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Корпоративным хранилищем (NAS)&lt;/b&gt; на 100+ ТБ с надежностью банка.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Лабораторией виртуализации&lt;/b&gt; для Docker, Kubernetes и DevOps-экспериментов.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;И всё это должно работать 24/7, стоять дома и не напоминать шумом взлетающий Боинг. Спойлер: у нас получилось.&lt;/p&gt;
&lt;h3&gt;Почему не Mac Pro и не облака?&lt;/h3&gt;
&lt;p&gt;Первый вопрос, который задают рациональные люди: *“Зачем тратить 1.2 млн рублей на самосбор, если есть MacBook Pro, AWS и простая дисковая шуршалка в углу?”*&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;MacBook M4 Max&lt;/b&gt; прекрасен, но это “золотая клетка”. На нем не развернешь серьезный кластер виртуализации, в нем нет 100 ТБ памяти, и он все еще слабее в AI-обучении, чем топовые GPU. Ну и закрыл крышку – прод упал.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Облака&lt;/b&gt; — это игла подписки. Аренда мощностей уровня нашей сборки (A100/H100) будет стоить те же деньги за год-полтора, но в итоге у вас не останется ничего.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Мы выбрали путь &lt;b&gt;“Digital Sovereignty”&lt;/b&gt; (Цифровой суверенитет). Своё железо, свои данные, свои правила.&lt;/p&gt;
&lt;h3&gt;Анатомия Монстра: Разбор “железа”&lt;/h3&gt;
&lt;p&gt;Каждый компонент здесь — результат компромиссов и долгих споров. Вот наша “Золотая конфигурация”:&lt;/p&gt;
&lt;h4&gt;1. Сердце: Архитектура “Всё в одном”&lt;/h4&gt;
&lt;p&gt;Мы отказались от серверных Threadripper в пользу &lt;b&gt;AMD Ryzen 9 9950X3D&lt;/b&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;*Зачем?* Нам важна однопоточная производительность для графики и отзывчивости системы. 16 ядер Zen 5 — это избыточно для дома, но идеально для виртуализации. А X3D-кэш делает этот “сервер” лучшим графическим ПК в мире.&lt;/li&gt;
&lt;li&gt;*Материнская плата:* &lt;b&gt;MSI MAG X870E Tomahawk&lt;/b&gt;. Надежная база с хорошим VRM, способная переварить этот процессор 24/7. Есть еще Eco режим, что позволит немного снизить мощность, но выиграть в теплоотдач и работе 24x7.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2. Мозг AI: Революция 5090 D&lt;/h4&gt;
&lt;p&gt;Сначала мы смотрели на RTX 4090. Но потом решили взглянуть на &lt;b&gt;NVIDIA RTX 5090 D (32GB)&lt;/b&gt;.&lt;br /&gt;
Это “Game Changer”.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Потребительские карты обычно имеют 24 ГБ памяти. Этого мало для серьезных языковых моделей (LLM). Llama-3-70B туда влезает только “порезанной”.&lt;/li&gt;
&lt;li&gt;32 ГБ GDDR7 памяти у 5090 D открывают портал в мир взрослого AI.&lt;/li&gt;
&lt;li&gt;Двухслотовая турбина выбрасывает горячий воздух из корпуса, спасая остальные компоненты от перегрева. Да, это стоит 340 000 рублей, но альтернатива (профессиональные карты RTX 6000) стоит в 3 раза дороже. Это отличный истребитель, но не космический крейсер enterprise уровня.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3. Хранилище: Надежность прежде всего&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Диски:&lt;b&gt; 8 штук **WD Ultrastar по 22 ТБ&lt;/b&gt;. Это 176 ТБ “сырого” объема.&lt;/li&gt;
&lt;li&gt;Контроллер:&lt;b&gt; Настоящий серверный HBA-адаптер **LSI 9300-8i&lt;/b&gt; в прошивке IT-Mode. Никаких программных RAID на материнской плате, только хардкор.&lt;/li&gt;
&lt;li&gt;Файловая система:&lt;b&gt; ZFS в режиме **RAIDZ2&lt;/b&gt; (аналог RAID 6). Могут умереть любые два диска одновременно — данные выживут.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;4. Память: Золотая (в прямом смысле) DDR5 ECC&lt;/h4&gt;
&lt;p&gt;Самая болезненная строка бюджета. &lt;b&gt;128 ГБ DDR5 ECC&lt;/b&gt;.&lt;br /&gt;
Из-за бума ИИ цены на память взлетели. Комплект из 4 планок по 32 ГБ сейчас стоит около &lt;b&gt;200 000+ рублей&lt;/b&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Можно ли сэкономить и взять обычную?* Нет. ZFS активно использует оперативную память. Ошибка в бите памяти может разрушить файловую систему. Для сервера 24/7 ECC (коррекция ошибок) — обязательное требование. Лучше этим не пренебрегать.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;5. Корпус: Jonsbo N5&lt;/h4&gt;
&lt;p&gt;Это магия инженерии. Красивый черный куб, куда помещается E-ATX плата, полноразмерная видеокарта и 8 жестких дисков. Мечта с красивыми деревяшками на лицевой панеле :)&lt;/p&gt;
&lt;h3&gt;Программная магия: Как этим управлять?&lt;/h3&gt;
&lt;p&gt;Железо — это только половина дела. Вся мощь раскрывается в софте.&lt;br /&gt;
Мы используем &lt;b&gt;Proxmox VE&lt;/b&gt; как гипервизор. Это “слоеный пирог”:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;VM TrueNAS:&lt;/b&gt; Прямой проброс контроллера LSI. Эта виртуалка управляет дисками и раздает файлы по сети.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;VM Windows 11:&lt;/b&gt; Прямой проброс RTX 5090. Подключаем монитор/клавиатуру — и это мощнейший графический ПК. Или подключаемся удаленно через Moonlight.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;VM Ubuntu Server + Docker (Portainer):&lt;/b&gt; Здесь живут “слуги”: Home Assistant (умный дом), Plex (кинотеатр), Nextcloud (ваше личное облако) и среды для разработки.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Экономика: Игрушка или Инвестиция?&lt;/h3&gt;
&lt;p&gt;Цена сборки чуть переваливает за &lt;b&gt;1 250 000 рублей&lt;/b&gt;. Безумие?&lt;br /&gt;
Смотря как посмотреть.&lt;/p&gt;
&lt;p&gt;Если рассматривать это как консоль для игр — безумие.&lt;br /&gt;
Но если вы IT-инженер, DevOps или AI-энтузиаст, это устройство становится активом:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Аренда мощностей:&lt;/b&gt; В простое карту 5090 можно сдавать в аренду на площадках типа Vast.ai для обучения чужих нейросетей, отбивая стоимость “железа”.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Обучение и Карьера:&lt;/b&gt; Навыки поднятия Kubernetes-кластера дома или тонкой настройки LLM стоят на рынке труда гораздо дороже миллиона.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Свой стартап:&lt;/b&gt; Это готовый MVP-стенд для запуска своего AI-сервиса без трат на облака.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Итог&lt;/h3&gt;
&lt;p&gt;Эта собрка не просто компьютер. Это &lt;b&gt;автономная цифровая крепость&lt;/b&gt;. В эпоху, когда сервисы закрываются, подписки дорожают, а данные утекают, иметь свой собственный суперкомпьютер под столом — это не паранойя. Это новый уровень свободы для миллионеров из трущоб :)&lt;/p&gt;
&lt;p&gt;Добро пожаловать в клуб владельцев виртуальных “Monolith”. 🤪&lt;/p&gt;
&lt;p&gt;UPD: 25.01.2026&lt;/p&gt;
&lt;p&gt;Первый шаг к монолиту сделан.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/IMG_1037.jpg" width="982" height="1555" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Кстати, конфигурация немного поменялась. Самсунг ssd заменил в плане на Микрон серверный по 960gb, но 4 штуки. У них оказался срок службы гораздо большое. в 5-7 раз где-то. Они будут работать в Raid10 или raidz1 с блоком 32к. Места будет чуть меньше в raidz1, где то 2.7tb.&lt;/p&gt;
&lt;h4&gt;Почему Micron 7450 MAX 1.6TB лучше Samsung 990 PRO UPD: не подходит, надо 2280, будет или 800gb или найду Trancend с PLP&lt;/h4&gt;
&lt;p&gt;Сравниваем, опираясь на мануал материнской платы и датащит диска:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Бессмертие (Endurance):&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;Samsung 990 PRO (2TB):** Ресурс ~1,200 TBW.&lt;/li&gt;
  &lt;li&gt;Micron 7450 MAX (1.6TB):&lt;b&gt; Ресурс **8,700 TBW&lt;/b&gt; (См. Table 3 в инструкции).&lt;/li&gt;
  &lt;li&gt;Итог:&lt;b&gt; Micron выносливее **в 7 раз&lt;/b&gt;. Вы можете писать на него базы данных и логи круглосуточно, и он переживет сам сервер.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="2"&gt;
&lt;li&gt;&lt;b&gt;Over-provisioning (Резервная область):&lt;/b&gt;  &lt;br /&gt;
Почему объем такой странный — 1.6 ТБ, а не 2 ТБ?  &lt;br /&gt;
Micron намеренно “скрыл” около 400 ГБ флеш-памяти. Контроллер использует это скрытое место, чтобы перемещать данные, выравнивать износ и поддерживать высокую скорость, когда диск заполнен.  &lt;br /&gt;
У Samsung 990 PRO этой резервной области почти нет, поэтому при заполнении на 90% он начнет тормозить. Micron 7450 MAX будет работать на полной скорости даже если вы забьете его под завязку.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="3"&gt;
&lt;li&gt;&lt;b&gt;Скорость случайной записи (IOPS)&lt;/b&gt;:  &lt;br /&gt;
Для виртуалок важна запись мелких файлов (4K Random Write).&lt;/li&gt;

&lt;ul&gt;
  &lt;li&gt;Micron 7450 PRO:** 120,000 IOPS.&lt;/li&gt;
  &lt;li&gt;Micron 7450 MAX:&lt;b&gt; **250,000 IOPS&lt;/b&gt; (См. Table 2).&lt;/li&gt;
  &lt;li&gt;Модель MAX в два раза быстрее обычной серверной PRO-версии на запись. Это идеально для баз данных и ZFS SLOG.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Математика массива на Micron 1.6TB&lt;/h4&gt;
&lt;p&gt;Если берем 4 таких диска и делаем &lt;b&gt;ZFS RAID10&lt;/b&gt;:&lt;/p&gt;
&lt;p&gt;$$1.6 \text{ ТБ} \times 4 = 6.4 \text{ ТБ (Сырой объем)}$$&lt;br /&gt;
$$\text{Полезный объем (RAID10)} = 3.2 \text{ ТБ}$$&lt;/p&gt;
&lt;p&gt;Еще большой плюс:  PLP (Power Loss Protection) — Защита от потери питания, которая есть в Micron. На плате распаяны танталовые конденсаторы. Если питание пропадает, у диска есть еще несколько миллисекунд, чтобы сбросить всё из оперативной памяти в ячейки NAND = защита от отключения электропитания и потери данных.&lt;/p&gt;
&lt;p&gt;Почему это важно для ZFS, он очень зависит от синхронной записи (Sync Writes) для баз данных и виртуальных машин. Зная, что у диска есть защита PLP, ZFS может безопасно отключать некоторые программные тормоза (O_DSYNC), работая значительно быстрее на мелких операциях записи.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Итого:&lt;/b&gt;&lt;br /&gt;
3.2 ТБ сверхбыстрого, защищенного от потери питания (PLP), “бессмертного” серверного пространства — это мечта для гипервизора Proxmox.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Короче берем Micron 7450 MAX 1.6TB.&lt;/b&gt; Это лучший компонент во всей сборке с точки зрения профессионального подхода. Главное найти его в форм-факторе 2280, а то на материнской плате есть только один длинный порт.&lt;/p&gt;
&lt;p&gt;UPD: 22.02.2026&lt;/p&gt;
&lt;p&gt;Проц едет.&lt;/p&gt;
&lt;p&gt;Диски ssd пришлось заменить на Synology m2 1.6 – других с поддержкой PLP нету в наличии вообще. PLP нужна для защиты от обрывов питания резких. 4 планки будут в 10 массиве, стрейп и зеркало.&lt;/p&gt;
&lt;p&gt;Память нашлась в наличии 90к – 48gb ecc ddr5 – но еще не брал(( надо сдать бутылки.&lt;/p&gt;
</description>
</item>

<item>
<title>Свой Heroku: запустил Dokku дома и накатил новогоднего :)</title>
<guid isPermaLink="false">307</guid>
<link>https://gavrilov.info/all/svoy-heroku-doma-zapustil-dokku-doma-i-nakatil-novogodnego/</link>
<pubDate>Thu, 01 Jan 2026 22:59:46 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/svoy-heroku-doma-zapustil-dokku-doma-i-nakatil-novogodnego/</comments>
<description>
&lt;p&gt;Мы привыкли, что для развертывания веб-приложений нужно платить за VPS или разбираться в дебрях Kubernetes. Но если у вас есть домашний сервер (в моем случае — Asustor), вы можете создать свою собственную PaaS-платформу (Platform as a Service), которая работает по принципу *“git push — и готово”*.&lt;/p&gt;
&lt;p&gt;Сегодня я расскажу, как настроить &lt;b&gt;Dokku&lt;/b&gt; через Portainer, запустить веселое Python-приложение к Новому 2026 году и поделюсь лайфхаками по оптимизации сборки и масштабированию.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2026-01-01-v-22.53.49.png" width="2546" height="936" alt="" /&gt;
&lt;/div&gt;
&lt;hr /&gt;
&lt;h3&gt;Часть 1. Фундамент: Запуск Dokku в Portainer&lt;/h3&gt;
&lt;p&gt;Dokku — это Docker-контейнер, который управляет другими Docker-контейнерами. Чтобы он заработал на NAS, его нужно правильно запустить. Я использовал Portainer Stack.&lt;/p&gt;
&lt;h4&gt;Docker Compose конфигурация&lt;/h4&gt;
&lt;p&gt;Вот рабочий `docker-compose.yml`, который решает главную проблему — доступность приложений из локальной сети.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;# version: '3.2'
services:
  agent:
    image: dokku/dokku:${VERSION}
    pid: host.  # ⚠️ важно для работы на NAS
    network_mode: bridge # ⚠️ важно для работы на NAS
    environment:
      DOKKU_HOSTNAME: ${DOKKU_HOSTNAME}
      DOKKU_HOST_ROOT: ${DOKKU_HOST_ROOT}
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ${VOLUME_PATH:-/var/lib/dokku}:/mnt/dokku
    ports:
      - &amp;quot;3022:22&amp;quot; # ⚠️ важно для работы через ssh и что бы не конфликтовал с 22 
      - &amp;quot;80:80&amp;quot;    # Внешний порт 80 -&amp;gt; порт 80 внутри контейнера Dokku
      - &amp;quot;443:443&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;Нюансы сети:&lt;/b&gt;&lt;br /&gt;
Чтобы обращаться к приложениям по красивым домегам типа `my-app.dokku.datahub.mother`, я настроил &lt;b&gt;AdGuard Home&lt;/b&gt; в качестве локального DNS-сервера (фильтры получил бонусом – где-то 20% это всякие счетчики, ужас:). Добавил правило Rewrite: `*.dokku.datahub.mother` → `192.168.0.20` (IP моего NAS). Теперь все поддомены (приложения) автоматически ведут на Dokku.&lt;/p&gt;
&lt;p&gt;Также для удобства я настроил `~/.ssh/config` на ноутбуке, чтобы не вводить порты вручную:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;Host dokku.datahub.mother
  HostName 192.168.0.20
  Port 3022
  User dokku&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ну и ключ сам так можно добавить&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;echo &amp;quot;ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ&amp;quot; | dokku ssh-keys:add dokku&lt;/code&gt;&lt;/pre&gt;&lt;hr /&gt;
&lt;h3&gt;Часть 2. Приложение “my-first-app”: Новогоднее гадание&lt;/h3&gt;
&lt;p&gt;Для теста я написал простое Flask-приложение, которое рассчитывает ваш возраст в наступающем 2026 году.&lt;/p&gt;
&lt;h4&gt;Код приложения (`app.py`)&lt;/h4&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def home():
    return &amp;quot;&amp;quot;&amp;quot;
    &amp;lt;h1&amp;gt;Приветствую в игре Нового 2026 года! 🎉&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;Это веселая интерактивная игра в честь Нового года. Угадай свой возраст на 1 января 2026!&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;Введи свой год рождения:&amp;lt;/p&amp;gt;
    &amp;lt;form action=&amp;quot;/result&amp;quot; method=&amp;quot;get&amp;quot;&amp;gt;
        &amp;lt;input type=&amp;quot;number&amp;quot; name=&amp;quot;birth_year&amp;quot; min=&amp;quot;1900&amp;quot; max=&amp;quot;2025&amp;quot; required&amp;gt;
        &amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;Угадать возраст на Новогодний 2026!&amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;
    &amp;quot;&amp;quot;&amp;quot;

@app.route('/result')
def result():
    birth_year = request.args.get('birth_year')
    if not birth_year or not birth_year.isdigit():
        return &amp;quot;Ошибка: введи корректный год рождения!&amp;quot;
    
    birth_year = int(birth_year)
    age_in_2026 = 2026 - birth_year
    return f&amp;quot;&amp;quot;&amp;quot;
    &amp;lt;h2&amp;gt;Результат: 🎇&amp;lt;/h2&amp;gt;
    &amp;lt;p&amp;gt;В 2026 году тебе будет {age_in_2026} лет!&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;Счастливого Нового 2026 года! Пусть все твои желания сбудутся!&amp;lt;/p&amp;gt;
    &amp;lt;a href=&amp;quot;/&amp;quot;&amp;gt;Играть снова&amp;lt;/a&amp;gt;
    &amp;quot;&amp;quot;&amp;quot;

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;Подготовка к деплою&lt;/h4&gt;
&lt;p&gt;Чтобы Dokku понял, как запускать это чудо, нужны два файла в корне проекта:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;`requirements.txt`&lt;/b&gt; (зависимости):&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;Flask==2.3.2
gunicorn==20.1.0
Werkzeug==2.3.3&lt;/code&gt;&lt;/pre&gt;&lt;ol start="2"&gt;
&lt;li&gt;&lt;b&gt;`Procfile`&lt;/b&gt; (команда запуска):&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;web: gunicorn app:app --bind 0.0.0.0:5000&lt;/code&gt;&lt;/pre&gt;&lt;ol start="3"&gt;
&lt;li&gt;&lt;b&gt;`.python-version`&lt;/b&gt; (опционально, явная версия Python):&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;3.11.14&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;Процесс деплоя&lt;/h4&gt;
&lt;p&gt;Все делается через Git, как на “взрослых” платформах:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Создаем приложение на сервере:&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;ssh dokku@dokku.datahub.mother apps:create my-first-app&lt;/code&gt;&lt;/pre&gt;&lt;ol start="2"&gt;
&lt;li&gt;&lt;b&gt;Отправляем код:&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;git init
    git add .
    git commit -m &amp;quot;Happy New Year 2026 version&amp;quot;
    git remote add dokku dokku@dokku.datahub.mother:my-first-app
    git push dokku master&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Если вы до этого еще что-то деплоили, то лучше проверить куда гит смотрит&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;git remote -v&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ну и поменяем еще не верное&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;git remote remove dokku&lt;/code&gt;&lt;/pre&gt;&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;git init
    git add .
    git commit -m &amp;quot;Happy New Year 2026 version&amp;quot;
    git remote add dokku dokku@dokku.datahub.mother:my-first-app
    git push dokku master&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;После пуша Dokku сам скачает Python, установит Flask и запустит Gunicorn. Через минуту-две приложение доступно по адресу `&lt;a href="http://my-first-app.dokku.datahub.mother"&gt;http://my-first-app.dokku.datahub.mother&lt;/a&gt;`.&lt;/p&gt;
&lt;p&gt;Еще нужно домен установить&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;ssh dokku@dokku.datahub.mother domains:set my-first-app my-first-app.dokku.datahub.mother&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;или можно сразу глобально его установить:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;ssh dokku@dokku.datahub.mother domains:set-global dokku.datahub.mother
# но тогда придется удалить ручную привязку 
ssh dokku@dokku.datahub.mother domains:clear my-first-app

# не забыть перебрать nginx ( на всякий случай ) 
ssh dokku@dokku.datahub.mother proxy:build-config my-first-app&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Сертификат сгенерировать&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;ssh dokku@dokku.datahub.mother certs:generate my-first-app my-first-app.dokku.datahub.mother&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;и проверить порты&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;ssh dokku@dokku.datahub.mother ports:report my-first-app&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;если порты не корректные, то можно их установить так:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;ssh dokku@dokku.datahub.mother ports:set my-first-app http:80:5000 https:443:5000&lt;/code&gt;&lt;/pre&gt;&lt;hr /&gt;
&lt;h3&gt;Часть 3. Уровень PRO: Скорость (uv) и Marimo&lt;/h3&gt;
&lt;p&gt;Аппетит приходит во время еды. После простого Flask-приложения я решил развернуть что-то посерьезнее — Data Science ноутбук на &lt;b&gt;Marimo&lt;/b&gt;, и столкнулся с реальными сложностями и особенностями. Для примера брал их дело ноутбук &lt;a href="https://marimo.app"&gt;https://marimo.app&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;1. Ускорение сборки с `uv`&lt;/h4&gt;
&lt;p&gt;Стандартный `pip` устанавливает пакеты медленно. Если проект большой, деплой может висеть минутами.&lt;br /&gt;
Я перешел на &lt;b&gt;uv&lt;/b&gt; — новый менеджер пакетов на Rust.&lt;/p&gt;
&lt;p&gt;Вместо `requirements.txt` я использовал `pyproject.toml` и `uv.lock`. Dokku (благодаря современным buildpacks) увидел `uv.lock` и переключился на быстрый режим. Время сборки сократилось &lt;b&gt;в разы&lt;/b&gt;.&lt;/p&gt;
&lt;h4&gt;2. Ловушка масштабирования (Scaling)&lt;/h4&gt;
&lt;p&gt;Marimo — это &lt;b&gt;stateful&lt;/b&gt; приложение (хранит состояние в памяти). Flask, который мы делали выше — &lt;b&gt;stateless&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;Когда я задеплоил Marimo, Dokku по умолчанию все было хорошо, но потом я решил масштабировать его и сделал так&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;ssh dokku@dokku.datahub.mother ps:scale my-marimo-app web=3&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;далее Dokku запустил &lt;b&gt;3 копии&lt;/b&gt; контейнера (`web=3`).&lt;br /&gt;
Начался хаос:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Интерфейс открывался.&lt;/li&gt;
&lt;li&gt;При нажатии кнопок вылетала ошибка `Invalid server token`.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Почему?&lt;/b&gt; Браузер загружал страницу с *Контейнера 1*, а WebSocket-запрос улетал в *Контейнер 2*, который ничего не знал про мою сессию.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Решение:&lt;/b&gt;&lt;br /&gt;
Для интерактивных приложений (Streamlit, Marimo, Jupyter) всегда принудительно ставьте одну реплику:&lt;br /&gt;
Ну ли придется делать липкие сессии на nginx или еще что-то.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;ssh dokku.datahub.mother ps:scale my-marimo-app web=1 # все вернуло в рабочее состояние.&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;А если не хватает мощности — лучше дайте этому единственному контейнеру больше ресурсов, чем пытаться плодить клонов или дайте каждому запускать свой:&lt;/p&gt;
&lt;p&gt;Вот так можно установить лимиты или повысить их:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;ssh dokku.datahub.mother resource:limit my-marimo-app --memory 2G --cpu 2&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;3. SSL в локальной сети&lt;/h4&gt;
&lt;p&gt;Браузеры блокируют микрофон и иногда WebSockets на HTTP-сайтах. Для локальной сети Let’s Encrypt не сработает (нет публичного IP), ну и его чуть сложнее запускать.&lt;br /&gt;
Я решил вопрос генерацией самоподписанного сертификата одной командой Dokku:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;ssh dokku.datahub.mother certs:generate my-first-app my-first-app.dokku.datahub.mother&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Браузер ругается, но приложение работает полноценно.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Еще я прогнал стресс тесты&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;ab -n 10000 -k -c 2000 ...&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Много они не показали, решением было подкрутить nginx, настроить кеш ssl, горизонтальное масштабирование не приносило больших результатов. я упирался в ограничения клиента при тестах нагрузки.&lt;/p&gt;
&lt;h3&gt;Итог&lt;/h3&gt;
&lt;p&gt;Dokku на домашнем сервере — это отличный инструмент.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Для простых API (Flask/FastAPI):&lt;/b&gt; Работает “из коробки” идеально.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Для сложных задач:&lt;/b&gt; Использование `uv` делает работу комфортной, а понимание разницы между *Stateless* и *Stateful* приложениями спасает от занудных ошибок и отладки.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Теперь my-first-app готово предсказывать возраст всем гостям на Новый год, а сервер готов к новым экспериментам! 🎄 Пожалуй оставлю его для будущих экспериментов. Прижился как-то быстро. Кстати у Dokku есть коммерческая PRO версия, а точнее не версия, а полноценный UI с кнопочками и стоит он 900$. &lt;a href="https://dokku.com/docs/enterprise/pro/"&gt;https://dokku.com/docs/enterprise/pro/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Пора чего-нибудь накатить новогоднего еще :)&lt;/p&gt;
</description>
</item>

<item>
<title>Эпоха «Толстого» браузера и революция локальных данных на WASM</title>
<guid isPermaLink="false">304</guid>
<link>https://gavrilov.info/all/epoha-tolstogo-brauzera-i-revolyuciya-lokalnyh-dannyh-na-wasm/</link>
<pubDate>Sat, 13 Dec 2025 01:20:55 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/epoha-tolstogo-brauzera-i-revolyuciya-lokalnyh-dannyh-na-wasm/</comments>
<description>
&lt;p&gt;В истории IT-архитектуры маятник всегда качался между двумя крайностями: централизацией и децентрализацией. Сначала были мейнфреймы (центр), затем «толстые» клиенты на ПК (локальные вычисления), а потом пришла эра веб-приложений, и индустрия массово мигрировала в Облака.&lt;/p&gt;
&lt;p&gt;Мы привыкли считать браузер лишь «тонким окном», интерфейсом, где вся магия, сложные вычисления и хранение происходят где-то далеко — на серверах AWS или Google. Но сегодня правила игры меняются. Благодаря технологиям WebAssembly (WASM), современному «железу» и новым подходам, браузер превращается в полноценную операционную систему для анализа данных или еще чего-то &lt;a href="https://blog.openreplay.com/ru/%D1%80%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE-%D0%BD%D0%BE%D0%B2%D0%B8%D1%87%D0%BA%D0%B0-%D0%BB%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0"&gt;blog.openreplay.com&lt;/a&gt;. Посмотрите статью о “Руководство по Разработке Local-First Приложений”.&lt;/p&gt;
&lt;h3&gt;Почему мы уходили в облака и почему возвращаемся?&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;Эра миграции в облака:&lt;/b&gt;&lt;br /&gt;
В 2010-х локальные машины были «бутылочным горлышком». Чтобы обработать гигабайты данных, требовались серверные стойки. Облака давали бесконечную масштабируемость. Архитектура сводилась к простой формуле: *данные пользователя → загрузка через сеть (latency) → обработка на сервере ($$$) → результат обратно клиенту*.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Проблемы сегодняшнего дня:&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Избыточность мощностей:&lt;/b&gt; Современный ноутбук аналитика (даже базовый MacBook Air на M-чипе) обладает вычислительной мощностью, сопоставимой с сервером десятилетней давности. Эти ресурсы простаивают, пока компании платят за облачные CPU.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Сетевые задержки и стоимость:&lt;/b&gt; Передать CSV-файл на 2 ГБ в облако для простой фильтрации или агрегации — это долго и дорого (ingress/egress трафик).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Приватность:&lt;/b&gt; Передача чувствительных отчетов или персональных данных на чужой сервер для разового анализа всегда несет риски утечки и нарушений регуляторики.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;b&gt;Решение: Приложения Local-First&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Технология WebAssembly (WASM) позволила запускать нативный код (C++, Rust, Go) прямо в песочнице браузера со скоростью, близкой к нативной &lt;a href="https://habr.com/ru/articles/892052"&gt;habr.com&lt;/a&gt;. Это породило новый класс ПО, которое выглядит как веб-сайт, но работает как десктопное приложение. Вы заходите на страницу, она загружает легковесный движок, и далее вы можете отключить интернет — приложение продолжит «перемалывать» ваши данные локально.&lt;/p&gt;
&lt;h3&gt;Новые герои: Сервер внутри вкладки&lt;/h3&gt;
&lt;p&gt;Уже сейчас существуют продукты, которые меняют представление о работе с данными. Они объединяют UX веб-приложений с мощностью десктопного софта, создавая ощущение, что сервер находится прямо у вас в RAM.&lt;/p&gt;
&lt;h4&gt;1. DataKit — Швейцарский нож аналитика&lt;/h4&gt;
&lt;p&gt;Проект &lt;b&gt;DataKit.page&lt;/b&gt; — яркий пример такой архитектуры. Это не просто “просмотрщик файлов”, это полноценная ETL/Analytics платформа, живущая в вашем браузере.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Как это работает:&lt;/b&gt; Вы перетаскиваете массивные файлы (CSV, JSON, Excel, Parquet) в окно. Они &lt;b&gt;не загружаются&lt;/b&gt; на внешний сервер. Браузер получает доступ к файлу через `File System Access API`, а движок (основанный на DuckDB WASM) монтирует их виртуально.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Функционал:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;SQL и Python в одном окне:&lt;/b&gt; Внутри работает не только SQL-движок, но и Python (через Pyodide). Вы можете использовать `pandas`, `polars`,  `numpy` и строить графики `matplotlib`, обращаясь к данным прямо с вашего диска.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;AI на борту:&lt;/b&gt; Интеграция с локальными LLM (через Ollama) или облачными провайдерами позволяет писать запросы на естественном языке, при этом сама схема и данные остаются у вас.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Умные форматы и коннекторы:&lt;/b&gt; Платформа «нативно» понимает Parquet и вложенные JSON, автоматически определяя типы данных и аномалии. Кроме того, она может подключаться к S3, Google Sheets и базам данных PostgreSQL, выполняя федеративные запросы.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2. DuckDB Local UI — SQL без инсталляции&lt;/h4&gt;
&lt;p&gt;Команда DuckDB в сотрудничестве с MotherDuck выпустила официальный локальный UI, работающий через расширение. Это прямой ответ на боль пользователей консольных утилит и отличный пример гибридного подхода &lt;a href="https://habr.com/ru/companies/cinimex/articles/913878"&gt;habr.com&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Сценарий:&lt;/b&gt; Раньше, чтобы поработать с локальной базой данных, нужно было либо мучиться в CLI, либо ставить тяжелый DBeaver. Теперь одной командой `duckdb -ui` или SQL-вызовом `CALL start_ui();` запускается локальный веб-сервер и открывается современный Notebook-интерфейс.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Гибридность:&lt;/b&gt; Вы работаете локально, но интерфейс имеет встроенную бесшовную интеграцию с облачным сервисом MotherDuck. Если для разового анализа локальных ресурсов достаточно, вы делаете это приватно. Как только требуется коллаборация или более мощные вычисления, вы можете переключить контекст выполнения в облако в том же окне.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3. Marimo – тетрадки, почти тот же подход имеет&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://gavrilov.info/all/tetradki-nashe-vsyo-marimo-io-i-utochkadb/"&gt;https://gavrilov.info/all/tetradki-nashe-vsyo-marimo-io-i-utochkadb/&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;3. PGlite и PondPilot — Postgres и SQL-песочницы&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;PGlite:&lt;/b&gt; Этот проект идет еще дальше и компилирует полноценный PostgreSQL в WASM, позволяя запускать его в браузере или Node.js без эмуляции ОС &lt;a href="https://habr.com/ru/articles/873112"&gt;habr.com&lt;/a&gt;. Это идеально для тестирования, прототипирования и создания приложений, которые требуют совместимости с Postgres.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PondPilot:&lt;/b&gt; Пример open-source SQL-редактора, построенного вокруг DuckDB-WASM &lt;a href="https://habr.com/ru/articles/913682"&gt;habr.com&lt;/a&gt;. Он позволяет быстро анализировать локальные файлы (CSV, Parquet, JSON), сохраняет историю, поддерживает вкладки и даже предлагает виджет для встраивания интерактивных SQL-примеров в блоги и документацию.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Сдвиг парадигмы: От DBeaver к Браузеру&lt;/h3&gt;
&lt;p&gt;Многие аналитики и инженеры привыкли к классическим клиентам баз данных (DBeaver, DataGrip). Это мощные, но «тяжелые» инструменты, требующие установки, настройки драйверов и обновлений. Новый WASM-тренд предлагает более гибкую альтернативу.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Сценарий «Мгновенной аналитики»:&lt;/b&gt;&lt;br /&gt;
Представьте, что вам прислали ссылку на лог-файл в S3 размером 5 ГБ или Parquet-дамп.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Старый путь:&lt;/b&gt; Скачать файл → Установить/открыть DBeaver → Настроить драйвер → Импортировать → Ждать загрузки → Писать SQL.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Новый путь (WASM):&lt;/b&gt; Открыть ссылку веб-приложения → Перетащить файл (или указать S3 URL) → Мгновенно писать SQL.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Еще вариант, лог 30ГБ и вы заказали функционал в другой команде, она с радостью сказала, что через два спринта сделает пайплайн за неделю, но ей надо требования. Вы их конечно написали на основе небольшого семпла строк из excel или на основе документации и отдали в разработку. А через месяц получили отличный пайплайн или, который не нужен или его нужно еще доработать.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Технологическая магия за кулисами:&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Apache Arrow:&lt;/b&gt; Это скрытый герой революции. Бинарный колоночный формат Arrow позволяет передавать данные из SQL-движка (DuckDB) в JavaScript-интерфейс или Python-ячейку &lt;b&gt;без копирования и сериализации памяти&lt;/b&gt; (Zero-copy). Это обеспечивает мгновенную реакцию интерфейса на миллионах строк — то, чего раньше было невозможно добиться при работе с DOM. (все помним D3JS)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Федеративные запросы:&lt;/b&gt; Локальное приложение умеет «ходить» в интернет. Вы можете написать `SELECT * FROM ‘s3://my-bucket/file.parquet’` прямо из браузера. Движок скачает только нужные байты (range requests), обработает их локально и покажет результат. Данные не оседают на промежуточных серверах разработчика софта.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Органическое масштабирование и новая экономика&lt;/h3&gt;
&lt;p&gt;Для архитекторов платформ данных этот тренд открывает удивительную экономическую модель &lt;b&gt;«Bring Your Own Compute» или «Client-side computing» (Принеси Свои Вычисления)&lt;/b&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Масштабирование без усилий:&lt;/b&gt; Вам не нужно создавать сложный кластер, чтобы тысячи пользователей могли фильтровать свои Excel-файлы. Вы просто хостите статические JS/WASM файлы на CDN.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Органическая нагрузка:&lt;/b&gt; Вычислительная мощность вашего “облака” растет линейно с количеством пользователей, потому что каждый новый пользователь приносит свой CPU и RAM. Пользователи выключают компьютеры — ваше “облако” естественным образом уменьшается.&lt;/li&gt;
&lt;li&gt;Коллаборация и Воспроизводимость:**
&lt;ul&gt;
  &lt;li&gt;*Разовая задача:* Сделал анализ локально, закрыл вкладку — данные исчезли из памяти (полная приватность).&lt;/li&gt;
  &lt;li&gt;*Командная работа:* Написал SQL/Python код локально, сохранил его (текст скрипта весит килобайты) и отправил коллеге. Коллега открыл ту же ссылку, подгрузился код, и магия вычислений произошла уже на его машине над теми же данными (если они в общем S3) или над его локальной копией.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Итого&lt;/h3&gt;
&lt;p&gt;Мы движемся к миру, где браузер — это не тонкий клиент, а &lt;b&gt;универсальная песочница для гибридных вычислений&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Разработчикам и Архитекторам:&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Присмотритесь к Serverless 2.0:&lt;/b&gt; Истинный `serverless` — это не AWS Lambda, за которую вы платите. Это когда сервера нет вообще, а код исполняется на клиенте (`client-side computing`). Это дешевле, быстрее для пользователя и безопаснее, удобно разрабатывать и обновлять код.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Privacy-first как преимущество:&lt;/b&gt; Позиционируйте такие решения как безопасные по умолчанию. Аргумент “Ваши данные никогда не покидают ваш компьютер” становится решающим для Enterprise-сектора.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Гибридная архитектура:&lt;/b&gt; Не отказывайтесь от сервера полностью. Пусть браузер берет на себя интерактивную работу, парсинг и предобработку, а сервер подключается для тяжелых “батчей” или работы с петабайтами данных в том же привычном окне.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;b&gt;Пользователям и Аналитикам:&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Осваивайте инструменты:&lt;/b&gt; Попробуйте &lt;a href="https://datakit.page,"&gt;https://datakit.page,&lt;/a&gt; &lt;a href="https://app.pondpilot.io"&gt;https://app.pondpilot.io&lt;/a&gt; или &lt;a href="https://shell.duckdb.org"&gt;DuckDB WASM Shell&lt;/a&gt; для разведочного анализа данных. Это часто быстрее, чем запускать локальный Jupyter.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Используйте облачные хранилища напрямую:&lt;/b&gt; Учитесь подключать S3, Google Sheets и другие облачные источники напрямую к таким инструментам. Это дает мощь облачного хранения в сочетании со скоростью и приватностью локального интерфейса.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ренессанс локальных вычислений начался. Ваш браузер способен на большее, чем просто отображать HTML. Он становится вашей персональной дата-лабораторией.&lt;/p&gt;
</description>
</item>

<item>
<title>Обзор pg_clickhouse: Как объединить мощь ClickHouse и удобство PostgreSQL</title>
<guid isPermaLink="false">302</guid>
<link>https://gavrilov.info/all/obzor-pg-clickhouse-kak-obedinit-mosch-clickhouse-i-udobstvo-pos/</link>
<pubDate>Fri, 12 Dec 2025 23:27:54 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/obzor-pg-clickhouse-kak-obedinit-mosch-clickhouse-i-udobstvo-pos/</comments>
<description>
&lt;p&gt;Недавно компания ClickHouse представила новый инструмент — расширение &lt;b&gt;pg_clickhouse&lt;/b&gt;. Это событие стало ответом на одну из самых частых болей разработчиков: сложность миграции аналитических запросов из классических реляционных баз данных в колоночные аналитические СУБД.&lt;/p&gt;
&lt;p&gt;Оригинал статьи: &lt;a href="https://clickhouse.com/blog/introducing-pg_clickhouse"&gt;A Postgres extension for querying ClickHouse&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;или берем сразу тут: &lt;a href="https://github.com/ClickHouse/pg_clickhouse/releases"&gt;https://github.com/ClickHouse/pg_clickhouse/releases&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;В этой статье мы разберем, что представляет собой этот инструмент, в чем его фундаментальный смысл для архитектуры приложений и куда проект хочет двигаться дальше.&lt;/p&gt;
&lt;h3&gt;Проблема: Данные переехали, а запросы остались&lt;/h3&gt;
&lt;p&gt;Типичный сценарий роста стартапа выглядит так: приложение строится на PostgreSQL. В какой-то момент данных (логов, метрик, транзакций) становится так много, что аналитические отчеты начинают тормозить. Обычные реплики для чтения (read replicas) перестают спасать.&lt;/p&gt;
&lt;p&gt;Команда принимает решение внедрить ClickHouse. Перенос данных сейчас решается просто (например, с помощью ClickPipes), но возникает другая проблема:&lt;br /&gt;
&lt;b&gt;Как быть с тысячами строк SQL-кода в ORM, дашбордах и скриптах, которые написаны под синтаксис Postgres?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Переписывание всей логики приложения под диалект ClickHouse — это месяцы работы и риск новых багов. Именно эту проблему решает `pg_clickhouse`.&lt;/p&gt;
&lt;h3&gt;Что такое pg_clickhouse?&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;pg_clickhouse&lt;/b&gt; — это расширение для PostgreSQL (Foreign Data Wrapper — FDW), которое позволяет создавать в Postgres «внешние таблицы», фактически ссылающиеся на таблицы в ClickHouse.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Суть технологии:&lt;/b&gt; Вы пишете запросы на привычном SQL диалекте PostgreSQL, обращаясь к этим таблицам. Расширение на лету транслирует запрос в диалект ClickHouse, отправляет его на исполнение в аналитическую базу и возвращает результат обратно в Postgres.&lt;/p&gt;
&lt;p&gt;Для приложения это выглядит прозрачно: таблицы ClickHouse могут находиться просто в отдельной схеме (schema). Достаточно изменить путь поиска (`search_path`), и старые запросы начнут работать с данными, лежащими в ClickHouse.&lt;/p&gt;
&lt;h3&gt;В чем «соль»: Технология Pushdown&lt;/h3&gt;
&lt;p&gt;Главная ценность и сложность такого расширения заключается не просто в соединении двух баз, а в эффективности этого соединения. Этот механизм называется &lt;b&gt;Pushdown&lt;/b&gt; (спуск или делегирование вычислений).&lt;/p&gt;
&lt;p&gt;Если вы делаете запрос `SELECT sum(price) FROM orders`, есть два пути его выполнения:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Плохой путь:&lt;/b&gt; Postgres выкачивает *все* миллионы строк из ClickHouse и сам считает сумму. Это уничтожает весь смысл аналитической базы.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Путь pg_clickhouse:&lt;/b&gt; Расширение понимает, что это агрегация, и отправляет в ClickHouse команду «посчитай сумму». Обратно по сети возвращается только одна цифра.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Умная трансляция функций&lt;/h4&gt;
&lt;p&gt;Авторы `pg_clickhouse` пошли дальше простой трансляции. Они научили расширение переводить специфические функции Postgres в аналоги ClickHouse, даже если синтаксис кардинально отличается.&lt;/p&gt;
&lt;p&gt;*Пример:*&lt;br /&gt;
В Postgres есть функция для расчета медианы: `percentile_cont(0.5) WITHIN GROUP (ORDER BY price)`.&lt;br /&gt;
В ClickHouse такой синтаксис не поддерживается.&lt;br /&gt;
`pg_clickhouse` автоматически переписывает это в нативную функцию ClickHouse: `quantile(0.5)(price)`.&lt;/p&gt;
&lt;p&gt;Также поддерживается трансляция конструкции `FILTER (WHERE ...)` в специфичные для ClickHouse комбинаторы `-If` (например, `sumIf`).&lt;/p&gt;
&lt;h4&gt;Ускорение подзапросов (Semi-Join)&lt;/h4&gt;
&lt;p&gt;В версии 0.1.0 была реализована поддержка &lt;b&gt;SEMI JOIN Pushdown&lt;/b&gt;. Это критически важно для запросов с конструкцией `WHERE ... IN (SELECT ...)` или `EXISTS`. Тесты на бенчмарке TPC-H показали, что благодаря этому время выполнения сложных запросов сократилось с нескольких секунд (или даже минут) до миллисекунд, так как фильтрация теперь происходит на стороне ClickHouse.&lt;/p&gt;
&lt;h3&gt;Планы развития (Roadmap)&lt;/h3&gt;
&lt;p&gt;Проект находится в стадии активной разработки (версия 0.1.0), и команда ClickHouse нацелена на полное покрытие аналитических сценариев.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Ключевые пункты плана:&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Полное покрытие TPC-H и ClickBench:&lt;/b&gt; Оптимизация планировщика, чтобы все стандартные аналитические бенчмарки выполнялись с максимальным pushdown-ом.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Расширенная поддержка функций:&lt;/b&gt; Трансляция *всех* агрегатных и обычных функций PostgreSQL в их эквиваленты в ClickHouse.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DML операции:&lt;/b&gt; Поддержка легковесных удалений (`DELETE`) и обновлений (`UPDATE`), а также пакетной вставки данных через `COPY`.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Управление настройками:&lt;/b&gt; Возможность передавать настройки ClickHouse (settings) через команды создания пользователей или серверов в Postgres.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Passthrough-режим:&lt;/b&gt; Возможность отправить произвольный SQL-запрос (на диалекте ClickHouse) и получить результат в виде таблицы, обходя парсер Postgres.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Заключение&lt;/h3&gt;
&lt;p&gt;`pg_clickhouse` — это попытка построить «лучшее из двух миров»: взять скорость колоночной СУБД и объединить её с богатой экосистемой и инструментарием PostgreSQL. Это позволяет разработчикам плавно мигрировать нагрузку, не переписывая приложение с нуля, и оставляет Postgres в качестве единой точки входа для данных.&lt;/p&gt;
</description>
</item>

<item>
<title>KubeVela: Современная доставка приложений</title>
<guid isPermaLink="false">300</guid>
<link>https://gavrilov.info/all/kubevela-sovremennaya-dostavka-prilozheniy/</link>
<pubDate>Mon, 08 Dec 2025 01:10:10 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/kubevela-sovremennaya-dostavka-prilozheniy/</comments>
<description>
&lt;p&gt;В мире Cloud-Native технологий Kubernetes стал операционной системой облака. Однако, как было отмечено в материалах про Rainbond, «ванильный» Kubernetes сложен для разработчиков. Если Rainbond решает эту проблему, предлагая готовый &lt;b&gt;PaaS «из коробки»&lt;/b&gt; с упором на UI, то &lt;b&gt;KubeVela&lt;/b&gt; подходит к задаче с другой стороны: это &lt;b&gt;двигатель для построения собственной платформы&lt;/b&gt; (Platform Engine), основанный на модели OAM (Open Application Model).&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-12-08-v-01.09.35.png" width="558" height="632" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;&lt;a href="https://kubevela.io"&gt;https://kubevela.io&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;KubeVela позволяет создавать простые и ориентированные на приложение (Application-centric) абстракции, сохраняя при этом полную гибкость и управляемость через код (Infrastructure as Code).&lt;/p&gt;
&lt;h3&gt;Основная философия: OAM и разделение ответственности&lt;/h3&gt;
&lt;p&gt;В основе KubeVela лежит стандарт &lt;b&gt;OAM (Open Application Model)&lt;/b&gt;. Эта модель разделяет ответственность между двумя ролями:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Разработчиĸи (Developers):&lt;/b&gt; Описывают &lt;b&gt;что&lt;/b&gt; нужно запустить (образ контейнера, порт, параметры запуска).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Платформенные инженеры (Platform Engineers):&lt;/b&gt; Описывают &lt;b&gt;ĸаĸ&lt;/b&gt; это должно работать (инфраструктура, политики масштабирования, Ingress, безопасность).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Математически модель приложения в KubeVela можно выразить формулой:&lt;/p&gt;
&lt;p&gt;$$ Application = Components + Traits + Workflow $$&lt;/p&gt;
&lt;p&gt;Где:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Components&lt;/b&gt;: Основная рабочая нагрузка (Workload). Например, Docker-образ, Helm-чарт или даже Terraform-модуль.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Traits&lt;/b&gt; (Свойства/Черты): Операционные характеристики, подключаемые к компоненту. Например: `ingress`, `scaler`, `sidecar`.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Workflow&lt;/b&gt;: Цепочка шагов доставки (Deploy -&gt; Test -&gt; Promote).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Пример манифеста KubeVela&lt;/h4&gt;
&lt;p&gt;Вместо десятков Kubernetes-ресурсов (Deployment, Service, Ingress, HPA), разработчик пишет один упрощенный файл:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
  name: website
spec:
  components:
    - name: frontend
      type: webservice
      properties:
        image: nginx
      traits:
        - type: scaler
          properties:
            replicas: 3
        - type: gateway
          properties:
            domain: test.example.com&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;Сравнение: KubeVela vs Rainbond&lt;/h3&gt;
&lt;p&gt;Основываясь на прошлой статье про &lt;a href="https://gavrilov.info/all/rainbond-oblachnaya-platforma-dlya-upravleniya-prilozheniyami/"&gt;Rainbond&lt;/a&gt;, сделаем детальное сравнение. Оба инструмента решают проблему сложности Kubernetes, но нацелены на разные аудитории.&lt;/p&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Хараĸтеристиĸа&lt;/td&gt;
&lt;td style="text-align: center"&gt;Rainbond&lt;/td&gt;
&lt;td style="text-align: center"&gt;KubeVela&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Философия&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;No-Code / Low-Code PaaS.&lt;/b&gt; Готовая платформа с полным UI. Ориентация на визуальное управление.&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Platform Engine / IaC.&lt;/b&gt; Инструментарий для создания платформы. Ориентация на GitOps и конфигурацию как код.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Входной порог&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Очень низкий.&lt;/b&gt; Не нужно знать Kubernetes. Можно собрать приложение из `.jar` или исходного кода одной кнопкой.&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Средний.&lt;/b&gt; Требует понимания концепций OAM. Инженерам платформы нужно знать CUE (язык конфигурации).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Гибĸость&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Ограничена возможностями UI платформы. Сложно кастомизировать внутреннюю логику деплоя нестандартных вещей.&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Высочайшая.&lt;/b&gt; Любая абстракция настраивается через X-Definitions (на языке CUE). Можно описать любой ресурс K8s или Terraform.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Интеграция IaC&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Базируется на внутренних механизмах.&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нативная интеграция с &lt;b&gt;Terraform&lt;/b&gt;. KubeVela может разворачивать облачные базы данных (AWS RDS, Cloud SQL) как часть приложения.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Multi-cluster&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Есть управление несколькими кластерами, но фокус на единой панели управления.&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Сильная сторона.&lt;/b&gt; Мощный движок развертывания приложений сразу в несколько кластеров с политиками (Placement Policies).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Для ĸого&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;SMB, стартапы, команды без сильной экспертизы в K8s, желающие получить опыт Heroku на своих серверах.&lt;/td&gt;
&lt;td style="text-align: center"&gt;Enterprise, Platform Engineering команды, желающие построить &lt;b&gt;свой&lt;/b&gt; внутренний PaaS (IDP) по стандартам Spotify/Netflix.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;h4&gt;Сравнение с другими аналогами&lt;/h4&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Crossplane&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Crossplane&lt;/b&gt; фокусируется на «Инфраструктуре» (создание баз данных, кластеров, сетей в облаках через K8s API).&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;KubeVela&lt;/b&gt; фокусируется на «Приложении».&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Итог:&lt;/b&gt; Они часто используются вместе. KubeVela использует Crossplane для заказа ресурсов.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="2"&gt;
&lt;li&gt;&lt;b&gt;ArgoCD / Flux (GitOps)&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;Это инструменты непрерывной доставки (CD), которые синхронизируют Git и K8s.&lt;/li&gt;
  &lt;li&gt;KubeVela &lt;b&gt;может&lt;/b&gt; использовать их под капотом или использовать свой собственный Workflow-контроллер для сложных сценариев (например, «засуспендить деплой, пока не пройдет тест, затем отправить уведомление в Slack»).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="3"&gt;
&lt;li&gt;&lt;b&gt;Backstage&lt;/b&gt;:
&lt;ul&gt;
  &lt;li&gt;Backstage — это «Портал» (Frontend). KubeVela — это «Движок» (Backend).&lt;/li&gt;
  &lt;li&gt;Существует плагин `vela-backstage`, который позволяет визуализировать приложения KubeVela внутри интерфейса Backstage. Это идеальная связка для построения IDP.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Ключевые возможности KubeVela&lt;/h3&gt;
&lt;h4&gt;1. Программируемая абстраĸция (CUE Language)&lt;/h4&gt;
&lt;p&gt;В отличие от Helm, где шаблонизация — это просто подстановка строк, KubeVela использует язык &lt;b&gt;CUE&lt;/b&gt; (Configure Unify Execute). Это позволяет платформенным инженерам создавать «умные» шаблоны.&lt;/p&gt;
&lt;p&gt;Пример логики на CUE внутри KubeVela: «Если пользователь не указал CPU, автоматически поставить `requests: 100m`, но если это ‘prod’ окружение, то поставить `500m`».&lt;/p&gt;
&lt;h4&gt;2. Единый Workflow для всего&lt;/h4&gt;
&lt;p&gt;KubeVela позволяет оркестрировать не только Kubernetes-ресурсы. В одном пайплайне вы можете:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Создать S3 бакет в AWS (через Terraform/Crossplane).&lt;/li&gt;
&lt;li&gt;Дождаться готовности.&lt;/li&gt;
&lt;li&gt;Задеплоить Deployment в Kubernetes.&lt;/li&gt;
&lt;li&gt;Отправить уведомление в Telegram.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;3. Отсуствие «Config Drift»&lt;/h4&gt;
&lt;p&gt;KubeVela активно борется с дрейфом конфигураций, постоянно сверяя желаемое состояние приложения с реальным (State Reconciliation).&lt;/p&gt;
&lt;h3&gt;Итог и реĸомендации&lt;/h3&gt;
&lt;p&gt;Выбор между Rainbond и KubeVela зависит от того, &lt;b&gt;ĸто&lt;/b&gt; будет обслуживать платформу и &lt;b&gt;ĸаĸие&lt;/b&gt; цели стоят перед бизнесом.&lt;/p&gt;
&lt;h4&gt;Выбирайте Rainbond, если:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;У вас небольшая или средняя команда разработчиков.&lt;/li&gt;
&lt;li&gt;Нет выделенного отдела Platform Engineering / DevOps.&lt;/li&gt;
&lt;li&gt;Нужно «вчера» перенести легаси (Java/PHP/Monolith) в контейнеры без переписывания кода.&lt;/li&gt;
&lt;li&gt;Вам нужен визуальный интерфейс для управления связями сервисов и мониторинга без написания YAML.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Цель:&lt;/b&gt; Быстрый Time-to-market с минимальными затратами на инженерию.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Выбирайте KubeVela, если:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Вы строите серьезный Internal Developer Platform (IDP) в крупной компании.&lt;/li&gt;
&lt;li&gt;У вас есть инженеры, знающие Kubernetes, но вы хотите скрыть его сложность от продуктовых разработчиков.&lt;/li&gt;
&lt;li&gt;Вам нужен строгий GitOps подход (все через репозиторий).&lt;/li&gt;
&lt;li&gt;Требуется гибридное развертывание: часть в K8s, часть в Serverless, часть в облачных RDS.&lt;/li&gt;
&lt;li&gt;Вы планируете использовать Backstage в качестве фронтенда.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Цель:&lt;/b&gt; Стандартизация, масштабируемость, полный контроль над абстракциями (Platform as Product).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Рекомендация по стеĸу для Enterprise:&lt;/b&gt;&lt;br /&gt;
Для максимальной эффективности современный стек платформенной инженерии часто выглядит так:&lt;br /&gt;
$$ \text{Backstage (UI)} + \text{KubeVela (Engine)} + \text{Crossplane (Infra)} $$&lt;br /&gt;
Эта связка дает удобство портала (как в Rainbond), мощь оркестрации (KubeVela) и управление облаком (Crossplane).&lt;/p&gt;
</description>
</item>

<item>
<title>Сравнительный анализ self-hosted S3-совместимых хранилищ</title>
<guid isPermaLink="false">299</guid>
<link>https://gavrilov.info/all/sravnitelny-analiz-self-hosted-s3-sovmestimyh-hranilisch/</link>
<pubDate>Mon, 08 Dec 2025 00:50:17 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/sravnitelny-analiz-self-hosted-s3-sovmestimyh-hranilisch/</comments>
<description>
&lt;p&gt;Четкое сравнение семи self-hosted S3-совместимых решений для хранения данных.&lt;/p&gt;
&lt;p&gt;Оригинал тут: &lt;a href="https://www.repoflow.io/blog/benchmarking-self-hosted-s3-compatible-storage-a-practical-performance-comparison"&gt;Команда RepoFlow. 9 августа 2025 г.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Локальное (self-hosted) объектное хранилище — это отличный выбор для разработчиков и команд, которые хотят иметь полный контроль над хранением и доступом к своим данным. Независимо от того, заменяете ли вы Amazon S3, размещаете внутренние файлы, создаете CI-конвейер или обслуживаете репозитории пакетов, уровень хранения может значительно повлиять на скорость и стабильность.&lt;/p&gt;
&lt;p&gt;Мы протестировали семь популярных решений для объектного хранения, поддерживающих протокол S3. Цель состояла в том, чтобы сравнить их производительность в идентичных условиях, используя реальные операции загрузки и скачивания.&lt;/p&gt;
&lt;h3&gt;Тестируемые решения&lt;/h3&gt;
&lt;p&gt;Каждое из следующих решений было развернуто с помощью Docker на одном и том же сервере без монтирования томов и без специальной настройки:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;`MinIO`&lt;/li&gt;
&lt;li&gt;`Ceph`&lt;/li&gt;
&lt;li&gt;`SeaweedFS`&lt;/li&gt;
&lt;li&gt;`Garage`&lt;/li&gt;
&lt;li&gt;`Zenko` (Scality Cloudserver)&lt;/li&gt;
&lt;li&gt;`LocalStack`&lt;/li&gt;
&lt;li&gt;`RustFS`&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Скорость последовательного скачивания&lt;/h3&gt;
&lt;p&gt;Средняя скорость скачивания одного файла разного размера.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-12-08-v-00.42.26.png" width="1270" height="656" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;[Изображение: График скорости последовательного скачивания для малых файлов размером 50 КБ и 200 КБ. По оси Y — скорость в МБ/с, по оси X — размер файла. Сравниваются Garage, Localstack, Minio, Zenko, Ceph, RustFS, SeaweedFS.]&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-12-08-v-00.42.57.png" width="1264" height="650" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;[Изображение: График скорости последовательного скачивания для больших файлов размером 10 МБ, 50 МБ, 100 МБ и 1 ГБ. По оси Y — скорость в МБ/с, по оси X — размер файла. Сравниваются те же решения.]&lt;/p&gt;
&lt;h3&gt;Скорость последовательной загрузки&lt;/h3&gt;
&lt;p&gt;Средняя скорость загрузки одного файла разного размера.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-12-08-v-00.43.18.png" width="1278" height="648" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;[Изображение: График скорости последовательной загрузки для малых файлов размером 50 КБ и 200 КБ. По оси Y — скорость в МБ/с, по оси X — размер файла. Сравниваются те же решения.]&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-12-08-v-00.43.34.png" width="1252" height="636" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;[Изображение: График скорости последовательной загрузки для больших файлов размером 10 МБ, 50 МБ, 100 МБ и 1 ГБ. По оси Y — скорость в МБ/с, по оси X — размер файла. Сравниваются те же решения.]&lt;/p&gt;
&lt;h3&gt;Производительность листинга&lt;/h3&gt;
&lt;p&gt;Измеряет время, необходимое для получения списка всех 2000 тестовых объектов в бакете с использованием разных размеров страницы (100, 500 и 1000 результатов на запрос).&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-12-08-v-00.44.02.png" width="1280" height="648" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;[Изображение: График производительности листинга. По оси Y — время в мс, по оси X — количество результатов на страницу (100, 500, 1000). Сравниваются те же решения.]&lt;/p&gt;
&lt;h3&gt;Скорость параллельной загрузки&lt;/h3&gt;
&lt;p&gt;Измеряет время, необходимое для параллельной загрузки нескольких файлов одинакового размера. Скорость загрузки рассчитывается по формуле:&lt;/p&gt;
&lt;p&gt;(number of files × file size) ÷ total time&lt;/p&gt;
&lt;h4&gt;Скорость параллельной загрузки – файлы 1 МБ&lt;/h4&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-12-08-v-00.44.22.png" width="1304" height="748" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;[Изображение: График скорости параллельной загрузки файлов размером 1 МБ. По оси Y — скорость в МБ/с, по оси X — количество параллельных потоков (5, 10, 20). Сравниваются те же решения.]&lt;/p&gt;
&lt;h4&gt;Скорость параллельной загрузки – файлы 10 МБ&lt;/h4&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-12-08-v-00.45.06.png" width="1254" height="650" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;[Изображение: График скорости параллельной загрузки файлов размером 10 МБ. По оси Y — скорость в МБ/с, по оси X — количество параллельных потоков (5, 10, 20). Сравниваются те же решения.]&lt;/p&gt;
&lt;h4&gt;Скорость параллельной загрузки – файлы 100 МБ&lt;/h4&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-12-08-v-00.45.23.png" width="1278" height="652" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;[Изображение: График скорости параллельной загрузки файлов размером 100 МБ. По оси Y — скорость в МБ/с, по оси X — количество параллельных потоков (5, 10, 20). Сравниваются те же решения.]&lt;/p&gt;
&lt;h3&gt;Скорость параллельного скачивания&lt;/h3&gt;
&lt;p&gt;Измеряет время, необходимое для параллельного скачивания нескольких файлов одинакового размера. Скорость скачивания рассчитывается по формуле:&lt;/p&gt;
&lt;p&gt;(number of files × file size) ÷ total time&lt;/p&gt;
&lt;h4&gt;Скорость параллельного скачивания – файлы 1 МБ&lt;/h4&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-12-08-v-00.45.45.png" width="1278" height="650" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;[Изображение: График скорости параллельного скачивания файлов размером 1 МБ. По оси Y — скорость в МБ/с, по оси X — количество параллельных потоков (5, 10, 20). Сравниваются те же решения.]&lt;/p&gt;
&lt;h4&gt;Скорость параллельного скачивания – файлы 10 МБ&lt;/h4&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-12-08-v-00.46.02.png" width="1280" height="644" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;[Изображение: График скорости параллельного скачивания файлов размером 10 МБ. По оси Y — скорость в МБ/с, по оси X — количество параллельных потоков (5, 10, 20). Сравниваются те же решения.]&lt;/p&gt;
&lt;h4&gt;Скорость параллельного скачивания – файлы 100 МБ&lt;/h4&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-12-08-v-00.46.17.png" width="1284" height="670" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;[Изображение: График скорости параллельного скачивания файлов размером 100 МБ. По оси Y — скорость в МБ/с, по оси X — количество параллельных потоков (5, 10, 20). Сравниваются те же решения.]&lt;/p&gt;
&lt;h3&gt;Как проводились тесты&lt;/h3&gt;
&lt;p&gt;Для каждого решения мы:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Загружали и скачивали файлы 7 различных размеров: 50 КБ, 200 КБ, 1 МБ, 10 МБ, 50 МБ, 100 МБ и 1 ГБ.&lt;/li&gt;
&lt;li&gt;Повторяли каждую загрузку и скачивание 20 раз для получения стабильных средних значений.&lt;/li&gt;
&lt;li&gt;Измеряли среднюю скорость загрузки и скачивания в мегабайтах в секунду (МБ/с).&lt;/li&gt;
&lt;li&gt;Выполняли все тесты на одной и той же машине, используя стандартный Docker-контейнер для каждой системы хранения, без внешних томов, монтирования или кешей.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Все решения тестировались в одноузловой конфигурации для обеспечения согласованности. Хотя некоторые системы (например, `Ceph`) спроектированы для лучшей производительности в кластерной среде, мы использовали одинаковые условия для всех решений, чтобы гарантировать справедливое сравнение.&lt;/p&gt;
&lt;h3&gt;Заключительные мысли&lt;/h3&gt;
&lt;p&gt;Эти результаты показывают, как каждое решение вело себя в нашей конкретной тестовой среде с одним узлом. Их следует рассматривать как относительное сравнение соотношений производительности, а не как абсолютные жесткие значения, которые будут применимы в любой конфигурации.&lt;/p&gt;
&lt;p&gt;При выборе подходящего решения для хранения данных учитывайте типичные размеры файлов, которые вы будете хранить, поскольку одни системы лучше справляются с маленькими файлами, а другие преуспевают с большими. Также подумайте об основных возможностях, которые вам требуются, таких как масштабируемость, репликация, долговечность или встроенный графический интерфейс. Наконец, помните, что производительность может сильно отличаться между одноузловыми и многоузловыми кластерами.&lt;/p&gt;
&lt;p&gt;Наши тесты предоставляют базовый уровень для понимания того, как эти системы соотносятся в идентичных условиях, но ваша реальная производительность будет зависеть от вашего конкретного оборудования, рабочей нагрузки и конфигурации.&lt;/p&gt;
</description>
</item>

<item>
<title>Open Source порталы разработки и что такое IDP</title>
<guid isPermaLink="false">282</guid>
<link>https://gavrilov.info/all/open-source-portaly-razrabotki-i-chto-takoe-idp/</link>
<pubDate>Wed, 24 Sep 2025 23:12:48 +0300</pubDate>
<author></author>
<comments>https://gavrilov.info/all/open-source-portaly-razrabotki-i-chto-takoe-idp/</comments>
<description>
&lt;p&gt;На рынке внутренних порталов разработчика существует один явный лидер в категории open source — &lt;b&gt;Backstage&lt;/b&gt;. Большинство других популярных решений, таких как Port, являются коммерческими (SaaS) продуктами, хотя они и могут предлагать open source компоненты для интеграции &lt;a href="https://internaldeveloperplatform.org/developer-portals/port/"&gt;https://internaldeveloperplatform.org/developer-portals/port/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Поэтому основной фокус в open source сегменте приходится именно на Backstage, который был создан в Spotify и позже передан в Cloud Native Computing Foundation (CNCF).&lt;/p&gt;
&lt;h5&gt;&lt;b&gt;Ключевое решение: Backstage&lt;/b&gt;&lt;/h5&gt;
&lt;p&gt;Backstage — это не готовый продукт, а &lt;b&gt;фреймворк&lt;/b&gt; для создания собственного портала разработчика &lt;a href="https://cloudomation.com/cloudomation-blog/5-internal-developer-portals-and-what-software-engineers-say-about-them/."&gt;https://cloudomation.com/cloudomation-blog/5-internal-developer-portals-and-what-software-engineers-say-about-them/.&lt;/a&gt; Это его главное преимущество и одновременно главный недостаток. Он предоставляет базовые строительные блоки и архитектуру, на основе которых компании могут построить портал, идеально соответствующий их процессам и инструментам.&lt;/p&gt;
&lt;p&gt;Кстати очень интересная статья про порталы, платформы и их различия.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-09-24-v-22.11.04.png" width="2084" height="1010" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Картинка от портала  Cortex – ну прям огонь сайт у них &lt;a href="https://www.cortex.io."&gt;https://www.cortex.io.&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://a.gavrilov.info/data/posts/Cloudomation%20Guide%20-%20Building%20Internal%20Developer%20Platforms.pdf"&gt;Cloudomation Guide – Building Internal Developer Platforms.pdf&lt;/a&gt; есть еще гайд обобщенный.  А основная концепция конечно тут &lt;a href="https://internaldeveloperplatform.org"&gt;https://internaldeveloperplatform.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Основные компоненты Backstage:&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Software Catalog:&lt;/b&gt; Единый реестр для всех программных активов компании (микросервисы, библиотеки, веб-сайты, ML-модели и т.д.). Позволяет централизовать метаданные, информацию о владельцах, зависимостях и состоянии.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Software Templates (Scaffolder):&lt;/b&gt; Инструмент для создания новых проектов по заранее подготовленным шаблонам. Это стандартизирует первоначальную настройку сервисов, CI/CD пайплайнов, репозиториев и т.д.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;TechDocs:&lt;/b&gt; Решение для создания, поддержки и отображения технической документации по принципу “docs-as-code”, когда документация хранится вместе с кодом.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Плагины:&lt;/b&gt; Экосистема Backstage строится вокруг плагинов. Существует огромное количество готовых плагинов для интеграции с AWS, Kubernetes, GitHub, CI/CD системами, системами мониторинга и многими другими. Если нужного плагина нет, его можно разработать самостоятельно.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Сравнение подходов: Build vs. Buy&lt;/h4&gt;
&lt;p&gt;Поскольку настоящий open source конкурент у Backstage практически отсутствует, наиболее корректно сравнить его не с другим open source решением, а с подходом использования коммерческих SaaS-платформ, ярким представителем которых является Port.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Port** — это коммерческий продукт, который предлагает готовый к использованию портал. Его философия заключается в гибкой модели данных на основе “blueprints” (шаблонов сущностей) и взаимосвязей между ними. Port позволяет быстро агрегировать данные из различных источников и построить каталог без необходимости развертывания и поддержки сложной инфраструктуры &lt;a href="https://www.qovery.com/blog/10-best-internal-developer-portals-to-consider/"&gt;10-best-internal-developer-portals-to-consider&lt;/a&gt;. Хотя ядро продукта закрыто, его интеграции и экспортеры данных являются открытыми [internaldeveloperplatform.org](&lt;a href="https://internaldeveloperplatform.org/developer-portals/port/)."&gt;https://internaldeveloperplatform.org/developer-portals/port/).&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Сравнительная таблица: Backstage vs. Коммерческие IDP (на примере Port)&lt;/h4&gt;
&lt;table cellpadding="0" cellspacing="0" border="0" class="e2-text-table"&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;Критерий&lt;/td&gt;
&lt;td style="text-align: center"&gt;Backstage (Open Source)&lt;/td&gt;
&lt;td style="text-align: center"&gt;Коммерческие решения типа Port (SaaS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Модель лицензирования&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Open Source (Apache 2.0). Бесплатно.&lt;/td&gt;
&lt;td style="text-align: center"&gt;Коммерческая (SaaS). Платная подписка.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Философия / Подход&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Фреймворк для &lt;b&gt;создания&lt;/b&gt; портала. “Построй свой дом”.&lt;/td&gt;
&lt;td style="text-align: center"&gt;Готовый продукт для &lt;b&gt;настройки&lt;/b&gt; портала. “Купи и настрой квартиру”.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Сложность внедрения&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Высокая.&lt;/b&gt; Требуется разработка, развертывание и поддержка. Есть кривая обучения [cloudomation.com](&lt;a href="https://cloudomation.com/cloudomation-blog/5-internal-developer-portals-and-what-software-engineers-say-about-them/)."&gt;https://cloudomation.com/cloudomation-blog/5-internal-developer-portals-and-what-software-engineers-say-about-them/).&lt;/a&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Низкая / Средняя.&lt;/b&gt; Быстрый старт, не требует своей инфраструктуры.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Требования к команде&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Нужна выделенная команда платформенных инженеров для разработки и поддержки портала.&lt;/td&gt;
&lt;td style="text-align: center"&gt;Может управляться одним или несколькими DevOps-инженерами. Не требует навыков фронтенд-разработки.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: right"&gt;&lt;b&gt;Гибкость и кастомизация&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Максимальная.&lt;/b&gt; Можно изменить и доработать абсолютно все, создать уникальные плагины и логику.&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Высокая, но ограничена&lt;/b&gt; возможностями платформы. Кастомизация интерфейса и логики возможна в рамках, заданных вендором.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Инфраструктура&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Требует собственной инфраструктуры для хостинга (обычно Kubernetes), базы данных, CI/CD для самого портала.&lt;/td&gt;
&lt;td style="text-align: center"&gt;Не требует. Хостится и управляется вендором.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Экосистема и интеграции&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Огромная, управляемая сообществом. Большое количество open source плагинов.&lt;/td&gt;
&lt;td style="text-align: center"&gt;Управляется вендором. Интеграции создаются вендором, но часто есть открытые API и экспортеры данных.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Общая стоимость владения (TCO)&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Скрытая и высокая.&lt;/b&gt; Лицензия бесплатна, но основные затраты — это зарплаты команды разработки и поддержки, а также стоимость инфраструктуры.&lt;/td&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Прозрачная и предсказуемая.&lt;/b&gt; Основные затраты — стоимость подписки.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: center"&gt;&lt;b&gt;Поддержка&lt;/b&gt;&lt;/td&gt;
&lt;td style="text-align: center"&gt;Сообщество (Slack, GitHub Issues).&lt;/td&gt;
&lt;td style="text-align: center"&gt;Коммерческая поддержка от вендора (SLA, выделенный менеджер).&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Выбор между open source фреймворком вроде `Backstage` и коммерческим продуктом — это классический выбор между &lt;b&gt;“Build” (создавать)&lt;/b&gt; и &lt;b&gt;“Buy” (покупать)&lt;/b&gt;.&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;`Backstage` — это стратегическая инвестиция.&lt;/b&gt; Это мощное решение для крупных или технологически зрелых компаний, у которых уже есть выделенная платформенная команда и которые готовы вкладывать ресурсы в создание идеально подогнанного под себя инструмента. `Backstage` дает полный контроль, избавляет от зависимости от вендора (vendor lock-in) и позволяет решать уникальные задачи, которые не могут покрыть коробочные продукты.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start="2"&gt;
&lt;li&gt;&lt;b&gt;Коммерческие IDP (такие как Port) — это тактическое решение для быстрого результата.&lt;/b&gt; Они идеально подходят для малых и средних компаний, или для крупных организаций, которые хотят быстро запустить портал и проверить гипотезы, не формируя для этого отдельную команду разработки. Этот подход обеспечивает быстрый старт, предсказуемые затраты и перекладывает всю головную боль по поддержке и развитию платформы на плечи вендора.&lt;/li&gt;
&lt;/ol&gt;
&lt;h5&gt;Рекомендации&lt;/h5&gt;
&lt;p&gt;&lt;b&gt;Выбирайте `Backstage`, если:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;У вас есть (или вы готовы создать) выделенная команда платформенных инженеров.&lt;/li&gt;
&lt;li&gt;У вас есть уникальные и сложные внутренние процессы, которые не укладываются в рамки готовых решений.&lt;/li&gt;
&lt;li&gt;Вы хотите максимальной гибкости для интеграции со своими самописными инструментами.&lt;/li&gt;
&lt;li&gt;Вы — крупная организация, для которой затраты на команду разработки портала оправданы в долгосрочной перспективе.&lt;/li&gt;
&lt;li&gt;Принципиально важно избежать зависимости от стороннего вендора.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Рассмотрите коммерческие решения (типа Port), если:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Вам нужен результат “здесь и сейчас” с минимальными первоначальными усилиями.&lt;/li&gt;
&lt;li&gt;У вас нет ресурсов на формирование команды для разработки собственного портала.&lt;/li&gt;
&lt;li&gt;Стандартного или предложенного вендором функционала достаточно для решения ваших задач.&lt;/li&gt;
&lt;li&gt;Вы предпочитаете прозрачную модель оплаты (SaaS-подписка) вместо скрытых затрат на разработку и поддержку.&lt;/li&gt;
&lt;li&gt;Вам важна гарантированная коммерческая поддержка с четким SLA.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Вне зависимости от выбора, начинать следует с определения ключевых проблем разработчиков, которые должен решить портал. Инструмент — это лишь средство для достижения цели, будь то упрощение создания новых сервисов, централизация знаний или автоматизация рутинных задач.&lt;/p&gt;
&lt;p&gt;Ниже небольшой гайд на основе дока выше Cloudomation Guide – Building Internal Developer Platforms.pdf&lt;/p&gt;
&lt;h4&gt;Руководство&lt;/h4&gt;
&lt;h2&gt;Создание внутренних платформ для разработчиков: лучшие практики, инструменты и стратегические выводы для технических лидов&lt;/h2&gt;
&lt;p&gt;***&lt;/p&gt;
&lt;h4&gt;Кратко о чем все это?&lt;/h4&gt;
&lt;p&gt;Ниже представлен обзор внутренних платформ для разработчиков (Internal Developer Platforms, или IDP). Поскольку инженерные команды сталкиваются с растущей сложностью, IDP становятся решением для снижения разногласий между разработкой и эксплуатацией.&lt;/p&gt;
&lt;p&gt;Независимо от того, оцениваете ли вы готовые платформы или создаете собственное решение, этот документ предлагает ценные сведения и тщательно подобранные ресурсы, которые помогут вам эффективно пройти путь внедрения IDP.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Основные тезисы:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;IDP&lt;/b&gt; — это платформы самообслуживания, созданные инженерами платформ для оптимизации разработки программного обеспечения за счет автоматизации развертываний, конфигураций и управления средами.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Преимущества:&lt;/b&gt; Сокращение времени, затрачиваемого на настройку и отладку, снижение когнитивной нагрузки на разработчиков, повышение надежности и соответствия требованиям, а также более высокая операционная эффективность.&lt;/li&gt;
&lt;li&gt;Каждая IDP уникальна, но обычно состоит из фронтенда, бэкенда и других интегрированных инструментов.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Ключевые возможности IDP&lt;/b&gt; должны включать: API, пользовательский интерфейс, автоматизацию, механизмы ограничений (например, политики), документацию и возможность обнаружения сервисов (discoverability).&lt;/li&gt;
&lt;li&gt;Для создания по-настоящему целостной IDP необходимо сосредоточиться на интеграции всех необходимых инструментов и сервисов.&lt;/li&gt;
&lt;li&gt;При внедрении IDP могут возникнуть следующие &lt;b&gt;проблемы:&lt;/b&gt; попытка сделать все сразу (и не достичь ничего), нехватка ресурсов и бюджета, невозможность поддерживать каталог программного обеспечения в актуальном состоянии и недостаток коммуникации между людьми.&lt;/li&gt;
&lt;li&gt;Обосновывая необходимость внедрения IDP, подкрепляйте свои аргументы данными и связывайте их с рисками и результатами, которые больше всего волнуют ваше руководство.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;***&lt;/p&gt;
&lt;h4&gt;Содержание&lt;/h4&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Что такое IDP?&lt;/li&gt;
&lt;li&gt;Зачем нужны IDP?&lt;/li&gt;
&lt;li&gt;Как работают IDP?&lt;/li&gt;
&lt;li&gt;Обоснование необходимости IDP для бизнеса&lt;/li&gt;
&lt;li&gt;Лучшие практики для создания IDP&lt;/li&gt;
&lt;li&gt;Инструменты платформенной инженерии для создания IDP&lt;/li&gt;
&lt;li&gt;3 проблемы при создании IDP&lt;/li&gt;
&lt;li&gt;Ресурсы&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h4&gt;1. Что такое IDP?&lt;/h4&gt;
&lt;p&gt;Внутренние платформы для разработчиков (IDP) лежат в основе дисциплины платформенной инженерии (Platform Engineering).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;Пояснение:&lt;/b&gt;&lt;br /&gt;
Внутренняя платформа для разработчиков — это, по сути, продукт, предназначенный для разработчиков внутри организации. Она предоставляет им доступ по принципу самообслуживания к технической инфраструктуре и рабочим процессам, таким как конвейеры развертывания или облачные ресурсы. &lt;a href="https://dev.to/e77/what-is-an-internal-developer-platforms-17o9"&gt;пост на dev.to&lt;/a&gt;. Ключевая идея — относиться к своей внутренней платформе как к продукту, а к разработчикам — как к клиентам. &lt;a href="https://dev.to/akshaymittal143/from-cloud-chaos-to-developer-delight-your-practical-guide-to-building-an-internal-developer-3o7n"&gt;еще пост с dev.to&lt;/a&gt;. Это позволяет им не ждать выполнения заявок в отдел эксплуатации и не нести полную ответственность за инфраструктуру, как в модели «you build it, you run it».&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;IDP призваны решить вечную проблему, которая преследует всех разработчиков ПО: программное обеспечение чрезвычайно сложно, и ни один человек не может знать всего, что требуется для создания целого программного продукта.&lt;/p&gt;
&lt;h5&gt;Понимание внутренних платформ для разработчиков&lt;/h5&gt;
&lt;p&gt;На схеме ниже показаны ключевые концепции, лежащие в основе IDP.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-09-24-v-22.46.02.png" width="996" height="796" alt="" /&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Подходы «Инфраструктура как код» (As-Code Approaches):&lt;/b&gt; Акцент на автоматизацию и документирование через код.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;«Золотые пути» (Golden Paths):&lt;/b&gt; Предоставление заранее определенных, проверенных и поддерживаемых путей для выполнения типовых задач (например, создание нового сервиса, развертывание в среде). Разработчики могут легко следовать этим путям, будучи уверенными в результате.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Самообслуживание (Self-Service):&lt;/b&gt; Позволяет разработчикам самостоятельно использовать платформу без необходимости обращаться в другие команды.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Управление как продуктом (Managed like a product):&lt;/b&gt; У платформы есть свой жизненный цикл выпуска, владелец продукта и дорожная карта развития.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Инженеры платформы (Platform Engineers):&lt;/b&gt; Создают и поддерживают IDP, фокусируясь на ценности для разработчиков.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Разработчики ПО (Software Developers):&lt;/b&gt; Основные пользователи, которые взаимодействуют с IDP.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Функции IDP&lt;/h5&gt;
&lt;p&gt;IDP предоставляют функции, которые являются центральными в повседневной работе разработчиков программного обеспечения.&lt;/p&gt;
&lt;p&gt;Это лишь примеры функций, которые может иметь IDP. Каждая IDP уникальна для организации, которая ее использует. Часто они создаются с нуля или сильно кастомизируются под нужды компании.&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;2. Зачем нужны IDP?&lt;/h4&gt;
&lt;p&gt;По мере усложнения процесса поставки ПО организации сталкиваются с фрагментированными практиками DevOps, несогласованными рабочими процессами и операционной неэффективностью. От разработчиков ожидают, что они будут управлять инфраструктурой, конвейерами CI/CD, политиками безопасности и мониторингом, что часто приводит к когнитивной перегрузке и снижению производительности. Именно здесь на помощь приходят платформенная инженерия и IDP.&lt;/p&gt;
&lt;h5&gt;Раскрывая мощь IDP&lt;/h5&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;Ускорение циклов разработки:&lt;/b&gt; Оптимизированное развертывание сокращает время, затрачиваемое на настройку и отладку.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Снижение когнитивной нагрузки на разработчиков:&lt;/b&gt; Упрощенное управление инфраструктурой позволяет сосредоточиться на написании кода.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Повышение надежности и соответствия требованиям (Compliance):&lt;/b&gt; Обеспечивает последовательное применение политик безопасности и соответствия во всех развертываниях.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Повышение инженерной эффективности:&lt;/b&gt; Автоматизирует управление ресурсами, повышая операционную эффективность.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h4&gt;3. Как работают IDP?&lt;/h4&gt;
&lt;p&gt;Каждая IDP уникальна, но есть некоторые общие характеристики, присущие большинству из них. В самом простом виде каждая IDP состоит примерно из трех «частей»:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Фронтенд IDP&lt;/li&gt;
&lt;li&gt;Бэкенд IDP&lt;/li&gt;
&lt;li&gt;Множество других инструментов, интегрированных с IDP&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-09-24-v-22.44.01.png" width="1062" height="432" alt="" /&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Фронтенд:&lt;/b&gt; Пользовательский интерфейс для доступа разработчиков к IDP. Часто это внутренний портал разработчика (Internal Developer Portal).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Бэкенд:&lt;/b&gt; Управляет интеграцией и автоматизацией с другими инструментами. Эту роль часто выполняет оркестратор платформы.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Интегрированные инструменты:&lt;/b&gt; Различные инструменты, которые работают с IDP для выполнения ключевых процессов (CI/CD, мониторинг, безопасность и т.д.).&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Архитектура&lt;/h5&gt;
&lt;p&gt;Следующая диаграмма архитектуры, основанная на модели CNOE (Cloud Native Operational Excellence), дает более детальное представление.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-09-24-v-22.39.52.png" width="972" height="368" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://gavrilov.info/all/rainbond-oblachnaya-platforma-dlya-upravleniya-prilozheniyami/"&gt;Ранее писал про Rainbond китайский, там немного другой акцент, но их архитектура тоже интересная, а так как это опенсорс, то можно свой такой запилить, но переводить придется :) &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;В этой диаграмме «Портал разработчика» (`Developer Portal`) является фронтендом IDP. Компонент «Оркестрация рабочих процессов» (`Workflow Orchestration`) будет бэкендом.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-09-24-v-22.40.18.png" width="946" height="674" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Ниже приведен более подробный пример архитектуры, показывающий, какие типы инструментов и сервисов могут быть частью IDP, сгруппированные по функциональным уровням (плоскостям).&lt;/p&gt;
&lt;h5&gt;Ключевая функциональность IDP&lt;/h5&gt;
&lt;p&gt;Основная идея IDP — объединить инструменты, сервисы, конфигурации и другую информацию в одном месте. Инженеры-программисты, а также другие заинтересованные стороны (например, команды эксплуатации) должны иметь возможность использовать IDP как единую точку входа для обнаружения и взаимодействия с приложениями и инфраструктурой компании.&lt;/p&gt;
&lt;p&gt;Таким образом, бэкенд IDP, как правило, должен быть сильным в двух типах функциональности: &lt;b&gt;№1 Интеграция&lt;/b&gt; и &lt;b&gt;№2 Автоматизация&lt;/b&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Интеграция:&lt;/b&gt; Объединение разнообразных инструментов и сервисов в единую систему.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Автоматизация:&lt;/b&gt; Связывание и оркестрация существующих конвейеров автоматизации.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h4&gt;4. Обоснование необходимости IDP для бизнеса&lt;/h4&gt;
&lt;p&gt;По мере того как организации масштабируют и модернизируют поставку своего программного обеспечения, сложность управления инфраструктурой, рабочими процессами разработчиков и управлением (governance) растет экспоненциально.&lt;/p&gt;
&lt;p&gt;Внутренняя платформа для разработчиков (IDP) предлагает стратегический ответ на этот вызов, обеспечивая более быструю доставку, более сильное управление и снижение операционных рисков. Однако, чтобы получить одобрение руководства, крайне важно сформулировать преимущества IDP в терминах бизнеса.&lt;/p&gt;
&lt;p&gt;Вот как можно обосновать необходимость IDP, обращаясь к четырем ключевым проблемам руководителей: &lt;b&gt;Масштаб, Затраты, Риски и Управление.&lt;/b&gt;&lt;/p&gt;
&lt;h5&gt;1. Масштаб: Предоставление организации возможности двигаться быстрее&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Проблема руководителя:&lt;/b&gt; Как мы можем масштабировать наши инженерные команды и поставку ПО без узких мест?&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Обоснование IDP:&lt;/b&gt; IDP повышает производительность, абстрагируя повторяющиеся, низкоценные задачи. Она дает командам приложений возможность самостоятельно обслуживать инфраструктуру, CI/CD, тестирование и развертывание стандартизированным и безопасным способом.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Бизнес-результаты:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;Повышение скорости работы команд приложений и организации в целом.&lt;/li&gt;
  &lt;li&gt;Быстрая доставка большей бизнес-ценности, поскольку команда разработки может сосредоточиться на коде.&lt;/li&gt;
  &lt;li&gt;Возможность масштабирования без линейного увеличения найма DevOps-инженеров.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Как это сделать:&lt;/b&gt; Оцените, сколько времени команды приложений тратят на борьбу с инфраструктурой и инструментами развертывания, и сколько — на работу над своим основным приложением. Используйте эти данные, чтобы обосновать необходимость IDP и показать, как она может высвободить время для основной задачи, что напрямую влияет на бизнес-ценность. Визуализируйте это, чтобы подчеркнуть, каким объемом инфраструктуры приходится управлять командам приложений, и сравните это с тем, как это могло бы выглядеть.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;*(В оригинальном документе здесь показаны два слайда из презентации PlatformCon23, представляющие “текущее состояние” и “будущее состояние”. Текущее состояние показывает, как команда из 50 разработчиков приложений вынуждена вручную взаимодействовать с разрозненным набором инструментов. Будущее состояние показывает, как команда платформы предоставляет единый, унифицированный слой, который абстрагирует эту сложность, позволяя командам приложений работать более эффективно.)*&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://gavrilov.info/pictures/Snimok-ekrana-2025-09-24-v-22.42.47.png" width="1008" height="1222" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Обратите внимание сколько кубиков вверху, а сколько внизу. В России кстати очень быстро вырывается вперед разработка на фреймворках streamlit, они почти ничего не делают повторно, если развернули хоть раз его с авторизацией и ипишками – в основном только ui колбасят. Но часто такие инициативы не вырастают сильно, их обычно давят в зародыше, так как они не соответствуют общему формату и не хотят делать все остальные кубики или не умеют – в общем похожи они на shadow it. Но если же им каким, то образом это удалось, то потом их не остановить и придя к ним через год, можно увидел второй прод, полностью зеркальный :) и сделал его кто-то один вечерами.&lt;/p&gt;
&lt;h5&gt;2. Затраты: Оптимизация за счет масштабирования и повторного использования&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Проблема руководителя:&lt;/b&gt; Как нам контролировать растущие расходы на облако и инженерию?&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Обоснование IDP:&lt;/b&gt; Платформенная инженерия сокращает дублирование усилий и консолидирует управление инфраструктурой. IDP способствует экономически эффективному масштабированию, обеспечивая прозрачность и контроль на протяжении всего жизненного цикла ПО. Централизация позволяет совместно использовать ресурсы, проактивно отслеживать затраты и автоматически высвобождать неиспользуемые активы (например, тестовые среды).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Бизнес-результаты:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;Улучшенная прозрачность и предсказуемость затрат.&lt;/li&gt;
  &lt;li&gt;Снижение общей стоимости владения (TCO) за счет оптимизации ресурсов.&lt;/li&gt;
  &lt;li&gt;Большая рентабельность инвестиций (ROI) в облачную инфраструктуру.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Важный момент:&lt;/b&gt; Команды платформы могут отслеживать метрики использования и отключать неиспользуемые среды.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;3. Риски: Сокращение точек отказа и операционных угроз&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Проблема руководителя:&lt;/b&gt; Какие риски угрожают нашей способности поставлять продукт надежно и безопасно?&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Обоснование IDP:&lt;/b&gt; IDP минимизирует операционные риски и риски безопасности путем стандартизации процессов по всем направлениям — конвейеры CI/CD, развертывание, наблюдаемость (observability), оповещения и аутентификация.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Бизнес-результаты:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;Снижение риска сбоев в продакшене.&lt;/li&gt;
  &lt;li&gt;Централизация ключевых сервисов, таких как развертывание, управление идентификацией и логирование.&lt;/li&gt;
  &lt;li&gt;Принудительное применение политик безопасности и соответствия на уровне платформы.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Примеры устраняемых рисков:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;Задержки в поставке из-за нестабильных конвейеров.&lt;/li&gt;
  &lt;li&gt;Утечки данных из-за неверно настроенных систем аутентификации.&lt;/li&gt;
  &lt;li&gt;Непрохождение аудита из-за несогласованного логирования или дрифта соответствия требованиям.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;4. Управление (Governance): Обеспечение согласованности и соответствия требованиям в масштабе&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Проблема руководителя:&lt;/b&gt; Как нам поддерживать контроль, не замедляя команды?&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Обоснование IDP:&lt;/b&gt; С IDP управление становится встроенным. От шаблонов до API, команды платформы могут кодировать стандарты и лучшие практики непосредственно в опыт разработчика.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Бизнес-результаты:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;Проактивное управление и применение политик.&lt;/li&gt;
  &lt;li&gt;Улучшенная аудитопригодность и соответствие нормативным требованиям.&lt;/li&gt;
  &lt;li&gt;Формирование культуры инженерного совершенства.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Подкрепление доводов данными&lt;/h5&gt;
&lt;p&gt;Ключевым фактором для вашего бизнес-обоснования являются данные. Проведите опрос в вашей инженерной организации, чтобы собрать информацию, например, о времени, затрачиваемом на инфраструктурные задачи по сравнению с разработкой новой функциональности.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Итоговые мысли: Что не дает спать руководителям?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;При формировании своего предложения обращайтесь непосредственно к рискам и результатам, которые больше всего волнуют ваших руководителей. Например:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Скорость выхода на рынок (Speed to market):&lt;/b&gt; Сможем ли мы поставлять продукт быстрее конкурентов?&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Надежность:&lt;/b&gt; Выдержат ли наши системы нагрузку?&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Безопасность и соответствие требованиям (Security &amp; Compliance):&lt;/b&gt; Уязвимы ли мы для взломов или аудитов?&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Масштабируемость:&lt;/b&gt; Сможем ли мы расти, не теряя контроля?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Внутренняя платформа для разработчиков — это не просто технический инструмент, это стратегический актив. С правильной постановкой вопроса, данными и видением вы можете продемонстрировать, как хорошо реализованная IDP поддерживает не только инженерию, но и весь бизнес.&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;5. Лучшие практики для создания IDP&lt;/h4&gt;
&lt;p&gt;Этот раздел основан на идеях, вдохновленных видео Виктора Фарчича «От нуля до полностью работающей платформы для разработчиков за 5 шагов!». Он описывает не столько шаги, сколько ключевые возможности, которые должна иметь IDP, чтобы быть полезной.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;5 ключевых возможностей IDP (по версии Виктора Фарчича):&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;API&lt;/li&gt;
&lt;li&gt;Управление состоянием (State management)&lt;/li&gt;
&lt;li&gt;Одноразовые действия / Рабочие процессы (One-shot actions / Workflows)&lt;/li&gt;
&lt;li&gt;RBAC и Политики (RBAC &amp; Policies)&lt;/li&gt;
&lt;li&gt;Пользовательские интерфейсы (опционально)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;b&gt;Наш взгляд на ключевые возможности (немного измененный и дополненный):&lt;/b&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;b&gt;API:&lt;/b&gt; Программный интерфейс для взаимодействия с платформой.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Пользовательские интерфейсы (не опционально):&lt;/b&gt; Удобный способ для разработчиков взаимодействовать с платформой.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Автоматизация:&lt;/b&gt; Включает как одноразовые действия (например, запуск сборки), так и управление состоянием (например, поддержание среды в нужном состоянии).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Ограничения (Constraints):&lt;/b&gt; Политики, управление доступом на основе ролей (RBAC) и т.д.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Документация и обнаруживаемость (Discoverability):&lt;/b&gt; Возможность легко находить сервисы, их владельцев и документацию.&lt;/li&gt;
&lt;/ol&gt;
&lt;h5&gt;Как это поможет мне построить платформу?&lt;/h5&gt;
&lt;p&gt;Если вы подумаете о проблемах, с которыми вы недавно сталкивались как инженер платформы или DevOps-инженер, вы, вероятно, сможете соотнести их с одной из описанных возможностей.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Некоторые примеры:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Если у вас проблемы с простоями инстансов или случайными высокими затратами из-за оставленных облачных ресурсов, у вас недостаточные возможности по &lt;b&gt;управлению состоянием&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;Если у вас проблемы с тем, что у инженеров-программистов нет доступа к нужной им инфраструктуре, или с тем, что младшие инженеры вмешиваются в развертывания, в которые им не следует вмешиваться, вы плохо управляете &lt;b&gt;ограничениями&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;Если ваши разработчики не могут самостоятельно запустить систему на основе feature-ветки или запустить сборку и тест для определенного коммита, вам нужно взглянуть на ваши возможности &lt;b&gt;автоматизации одноразовых действий&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;Если ваши инженеры-программисты просто не используют предоставляемые вами API и сервисы, вам, вероятно, следует взглянуть на предоставляемые вами &lt;b&gt;пользовательские интерфейсы&lt;/b&gt; или проверить, &lt;b&gt;обнаруживаемы / документированы&lt;/b&gt; ли ваши сервисы.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Цель и ценность этих ключевых возможностей — помочь вам понять, почему вы продолжаете терпеть неудачи в некоторых вопросах, и как вы можете начать исправлять ситуацию таким образом, чтобы это было долговечно и устойчиво управляемо.&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;6. Инструменты платформенной инженерии для создания IDP&lt;/h4&gt;
&lt;p&gt;В этой статье рассматривается, как структурировать IDP, с разбивкой по ключевым компонентам и с примерами инструментов, которые вы можете использовать.&lt;/p&gt;
&lt;h5&gt;Категоризация инструментов и компонентов&lt;/h5&gt;
&lt;p&gt;Мы классифицируем эти инструменты, используя «референсную архитектуру», популяризированную `platformengineering.org`. Эта структура разбивает экосистему на пять основных компонентов, известных как «плоскости» (`planes`):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Плоскость управления разработчика (`Developer Control Plane`):&lt;/b&gt; Все компоненты, через которые разработчики взаимодействуют с платформой. Обычно включает GUI/порталы, контроль версий, облачные среды разработки (CDE), а также стандарты конфигурации, которые разработчики поддерживают сами.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Плоскость интеграции и доставки (`Integration &amp; Delivery Plane`):&lt;/b&gt; Здесь происходит вся автоматизация. Инструменты CI/CD, автоматизация инфраструктуры и другие оркестраторы платформы обычно являются частью этой плоскости.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Плоскость мониторинга и логирования (`Monitoring &amp; Logging Plane`):&lt;/b&gt; Как следует из названия, здесь находятся все инструменты наблюдаемости (observability).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Плоскость безопасности (`Security Plane`):&lt;/b&gt; Управление секретами, инструменты политик и другие инструменты безопасности.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Плоскость ресурсов (`Resource Plane`):&lt;/b&gt; Вычислительные ресурсы и хранилища.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Пример: Создание внутренней платформы для разработчиков&lt;/h5&gt;
&lt;p&gt;Вот разбивка инструментов, которые вы могли бы использовать для создания IDP. Важное замечание: существует множество доступных инструментов. Упомянутые здесь — лишь примеры.&lt;/p&gt;
&lt;h5&gt;Плоскость управления разработчика&lt;/h5&gt;
&lt;p&gt;&lt;b&gt;№1 Портал разработчика (`Developer Portal`)&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Почему это важно:&lt;/b&gt; Внутренние порталы разработчиков служат единым интерфейсом и позволяют разработчикам, командам и инженерам-менеджерам обнаруживать сервисы, отслеживать владение, применять стандарты и улучшать программное обеспечение.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Инструменты для рассмотрения:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Backstage:&lt;/b&gt; Популярный open-source фреймворк для создания порталов разработчиков, созданный Spotify.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Port:&lt;/b&gt; Платформа для создания внутреннего портала разработчика с no-code подходом, что облегчает быстрый старт.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Cortex:&lt;/b&gt; Корпоративный внутренний портал разработчика, созданный для ускорения пути к инженерному совершенству. [cloudomation.com](&lt;a href="https://cloudomation.com/cloudomation-blog/5-internal-developer-portals-and-what-software-engineers-say-about-them/)"&gt;https://cloudomation.com/cloudomation-blog/5-internal-developer-portals-and-what-software-engineers-say-about-them/)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Atlassian Compass:&lt;/b&gt; Компонентный каталог для отслеживания компонентов и команд, которые за ними стоят.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;№2 Облачные среды разработки (`Cloud Development Environments, CDEs`)&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Почему это важно:&lt;/b&gt; CDE — это удаленные среды разработки, размещенные в облаке или локально. CDE позволяют разработчикам работать в согласованных, стандартизированных средах, что устраняет проблемы «у меня на машине все работает».&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Инструменты для рассмотрения:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Gitpod:&lt;/b&gt; Позволяет запускать безопасные, контекстно-насыщенные среды для разработчиков в корпоративном масштабе.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Coder:&lt;/b&gt; Предоставляет безопасные среды разработки для разработчиков и их агентов.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Плоскость интеграции и доставки&lt;/h5&gt;
&lt;p&gt;&lt;b&gt;№1 Конвейер CI (`CI Pipeline`)&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Почему это важно:&lt;/b&gt; Автоматизирует проверку кода, тестирование и обеспечивает более быстрые циклы обратной связи.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Инструменты для рассмотрения:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;GitHub Actions:&lt;/b&gt; Нативный CI для GitHub с настраиваемыми рабочими процессами.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;CircleCI:&lt;/b&gt; Высокомасштабируемый CI с поддержкой расширенного параллелизма.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Buildkite:&lt;/b&gt; CI, ориентированный на разработчиков, с масштабируемой инфраструктурой.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;№2 Конвейер CD (`CD Pipeline`)&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Почему это важно:&lt;/b&gt; Конвейеры CD автоматизируют безопасное, повторяемое развертывание программного обеспечения.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Инструменты для рассмотрения:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Argo CD:&lt;/b&gt; GitOps-ориентированная доставка для Kubernetes.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Flux:&lt;/b&gt; Контроллер GitOps для Kubernetes.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Octopus Deploy:&lt;/b&gt; Подходит для мультиоблачных и локальных (on-prem) сред.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;№3 Оркестратор платформы (`Platform Orchestrator`)&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Почему это важно:&lt;/b&gt; Инструменты оркестрации предоставляют логику для связывания рабочих процессов между различными инструментами и сервисами.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Инструменты для рассмотрения:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Humanitec:&lt;/b&gt; Оркестратор платформы, предоставляющий динамические среды. Является лидером рынка IDP. [internaldeveloperplatform.org](&lt;a href="https://internaldeveloperplatform.org/)"&gt;https://internaldeveloperplatform.org/)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Собственные решения/фреймворки:&lt;/b&gt; Многие команды используют общие инструменты, такие как &lt;b&gt;Argo Workflows&lt;/b&gt; или пишут собственные скрипты на Python/Go для объединения своих процессов.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Плоскость мониторинга и логирования&lt;/h5&gt;
&lt;p&gt;&lt;b&gt;№1 Наблюдаемость (`Observability`)&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Почему это важно:&lt;/b&gt; Инструменты наблюдаемости обеспечивают видимость состояния, производительности и надежности приложений и инфраструктуры.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Инструменты для рассмотрения:&lt;/b&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;Prometheus:&lt;/b&gt; Набор инструментов для мониторинга и оповещения, особенно для Kubernetes.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Grafana:&lt;/b&gt; Инструмент для создания дашбордов, часто используемый в паре с Prometheus.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Datadog:&lt;/b&gt; Облачный мониторинг и аналитика.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Плоскость безопасности&lt;/h5&gt;
&lt;p&gt;&lt;b&gt;№1 Менеджер секретов (`Secret Manager`)&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Почему это важно:&lt;/b&gt; Менеджеры секретов безопасно хранят и распространяют учетные данные, ключи API и другие конфиденциальные данные.&lt;/li&gt;
&lt;li&gt;Инструменты для рассмотрения:**
&lt;ul&gt;
  &lt;li&gt;&lt;b&gt;HashiCorp Vault:&lt;/b&gt; Ведущее в отрасли решение для управления секретами.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;AWS Secrets Manager / Azure Key Vault / GCP Secret Manager:&lt;/b&gt; Решения от крупных облачных провайдеров.&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Sealed Secrets (Bitnami):&lt;/b&gt; Шифрует секреты для Kubernetes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Вывод: Строительные блоки, а не список покупок&lt;/h5&gt;
&lt;p&gt;Если из этой главы и стоит что-то вынести, так это то, что платформенная инженерия — это не выбор самых модных инструментов с полки, а подбор правильных строительных блоков для создания бесшовного опыта для разработчиков. Думайте меньше о том, «какой инструмент мне выбрать?», и больше о том, «как я могу спроектировать платформу, которая будет незаметной и мощной для моих разработчиков и принесет пользу бизнесу?»&lt;/p&gt;
&lt;p&gt;Настоящая магия происходит тогда, когда эти инструменты перестают быть отдельными частями пазла и становятся частью целостной платформы для разработчиков, где разработчики едва замечают лежащую в основе сложность, потому что платформа работает с ними, а не против них.&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;7. 3 проблемы при создании IDP&lt;/h4&gt;
&lt;p&gt;Этот раздел основан на идеях Гая Менахема (Guy Menahem), архитектора решений в Amazon.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Проблема 1: Попытаться поймать всех зайцев одним выстрелом&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Многие команды платформенной инженерии пытаются сделать все сразу и в итоге не достигают ничего. Объединение всех инструментов в единое решение может привести к тому, что вы упустите основной рабочий процесс пользователя, что приведет к отказу от платформы. Вместо этого оттачивайте свои продуктовые навыки, чтобы понять, какую пользу пользователи извлекут из платформы, даже если на начальном этапе она будет включать всего несколько инструментов.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Проблема 2: Оценка затрат на создание и эксплуатацию&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Создание ценной платформы требует ресурсов, включая выделенную команду платформенной инженерии, бюджет на облачную инфраструктуру и сотрудничество. Также необходимо учитывать операционные расходы, такие как обновления и патчи безопасности. Оценивайте ресурсы, определяя размер и продолжительность работы команды, сосредотачиваясь на минимально жизнеспособном продукте (MVP) и рассчитывая облачные и операционные затраты.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Проблема 3: Создание и управление каталогом программного обеспечения&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Управление каталогом программного обеспечения, который представляет собой сложную базу данных ПО, систем и документации, может быть непростой задачей. Вовлечение всех команд в обновление и поддержание каталога имеет решающее значение для его качества и принятия. Упростите управление каталогом, автоматизировав сбор информации, принудительно обновляя его в процессах CI/CD и поощряя ежедневное использование платформы.&lt;/p&gt;
&lt;h5&gt;Наш взгляд&lt;/h5&gt;
&lt;p&gt;Проблемы, которые описывает Гай, реальны. Однако одна фундаментальная истина, которую он не упоминает, заключается в том, что &lt;b&gt;большинство проблем при создании IDP не являются техническими.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Вместо этого наиболее распространенные проблемы возникают из-за &lt;b&gt;недостатка коммуникации между людьми.&lt;/b&gt; Это типично для многих инженерных инициатив, поскольку инженеры, как правило, имеют очень специфический взгляд на инструменты, которые они создают, и этот взгляд часто сильно отличается от точки зрения их пользователей.&lt;/p&gt;
&lt;p&gt;То же самое часто происходит и в командах платформенной инженерии: они могут создавать ценную автоматизацию и сервисы, но если их нелегко использовать, в них отсутствуют ключевые функции, необходимые инженерам-программистам, или они просто не решают самые большие проблемы, с которыми сталкиваются разработчики, то они просто не будут использовать IDP.&lt;/p&gt;
&lt;p&gt;Самое важное, что вы должны делать как инженер платформы, — &lt;b&gt;регулярно спрашивать своих инженеров-программистов!&lt;/b&gt; Просите их протестировать то, что вы создаете, сказать, полезно ли это для них, и если ответ «нет», то изменяйте то, что вы создаете, чтобы ваши инженеры-программисты захотели это использовать.&lt;/p&gt;
&lt;p&gt;В конце концов, в этом и заключается вся суть IDP: она должна быть полезной для инженеров-программистов.&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;8. &lt;b&gt;Ресурсы и ссылки&lt;/b&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://platformengineering.org"&gt;https://platformengineering.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://internaldeveloperplatform.org"&gt;https://internaldeveloperplatform.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.infoq.com/platformengineering"&gt;https://www.infoq.com/platformengineering&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Сообщества&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reddit – &lt;a href="https://www.reddit.com/r/platform_engineering"&gt;https://www.reddit.com/r/platform_engineering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Platformers – &lt;a href="https://platformers.community"&gt;https://platformers.community&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Рассылки&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://platformweekly.com"&gt;https://platformweekly.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Ранее еще писал немного на другую тему, но про разработку и стандарты апишек,интересно, мало у кого они есть, выглядят вот так: &lt;a href="https://gavrilov.info/all/analiz-zalando-restful-api-and-event-guidelines/"&gt;https://gavrilov.info/all/analiz-zalando-restful-api-and-event-guidelines/&lt;/a&gt;&lt;/p&gt;
</description>
</item>


</channel>
</rss>