<?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 DevOps</title>
<link>https://gavrilov.info/tags/devops/</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>Свой 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>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>


</channel>
</rss>