{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Yuriy Gavrilov: posts tagged DevOps",
    "_rss_description": "Welcome to my personal place for love, peace and happiness 🤖 Yuiry Gavrilov",
    "_rss_language": "en",
    "_itunes_email": "yvgavrilov@gmail.com",
    "_itunes_categories_xml": "",
    "_itunes_image": "https:\/\/gavrilov.info\/pictures\/userpic\/userpic-square@2x.jpg?1643451008",
    "_itunes_explicit": "no",
    "home_page_url": "https:\/\/gavrilov.info\/tags\/devops\/",
    "feed_url": "https:\/\/gavrilov.info\/tags\/devops\/json\/",
    "icon": "https:\/\/gavrilov.info\/pictures\/userpic\/userpic@2x.jpg?1643451008",
    "authors": [
        {
            "name": "Yuriy Gavrilov - B[u]g - for charity.gavrilov.eth",
            "url": "https:\/\/gavrilov.info\/",
            "avatar": "https:\/\/gavrilov.info\/pictures\/userpic\/userpic@2x.jpg?1643451008"
        }
    ],
    "items": [
        {
            "id": "307",
            "url": "https:\/\/gavrilov.info\/all\/svoy-heroku-doma-zapustil-dokku-doma-i-nakatil-novogodnego\/",
            "title": "Свой Heroku: запустил Dokku дома и накатил новогоднего :)",
            "content_html": "<p>Мы привыкли, что для развертывания веб-приложений нужно платить за VPS или разбираться в дебрях Kubernetes. Но если у вас есть домашний сервер (в моем случае — Asustor), вы можете создать свою собственную PaaS-платформу (Platform as a Service), которая работает по принципу *“git push — и готово”*.<\/p>\n<p>Сегодня я расскажу, как настроить <b>Dokku<\/b> через Portainer, запустить веселое Python-приложение к Новому 2026 году и поделюсь лайфхаками по оптимизации сборки и масштабированию.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/gavrilov.info\/pictures\/Snimok-ekrana-2026-01-01-v-22.53.49.png\" width=\"2546\" height=\"936\" alt=\"\" \/>\n<\/div>\n<hr \/>\n<h3>Часть 1. Фундамент: Запуск Dokku в Portainer<\/h3>\n<p>Dokku — это Docker-контейнер, который управляет другими Docker-контейнерами. Чтобы он заработал на NAS, его нужно правильно запустить. Я использовал Portainer Stack.<\/p>\n<h4>Docker Compose конфигурация<\/h4>\n<p>Вот рабочий `docker-compose.yml`, который решает главную проблему — доступность приложений из локальной сети.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\"># version: '3.2'\nservices:\n  agent:\n    image: dokku\/dokku:${VERSION}\n    pid: host.  # ⚠️ важно для работы на NAS\n    network_mode: bridge # ⚠️ важно для работы на NAS\n    environment:\n      DOKKU_HOSTNAME: ${DOKKU_HOSTNAME}\n      DOKKU_HOST_ROOT: ${DOKKU_HOST_ROOT}\n    volumes:\n      - \/var\/run\/docker.sock:\/var\/run\/docker.sock\n      - ${VOLUME_PATH:-\/var\/lib\/dokku}:\/mnt\/dokku\n    ports:\n      - &quot;3022:22&quot; # ⚠️ важно для работы через ssh и что бы не конфликтовал с 22 \n      - &quot;80:80&quot;    # Внешний порт 80 -&gt; порт 80 внутри контейнера Dokku\n      - &quot;443:443&quot;<\/code><\/pre><p><b>Нюансы сети:<\/b><br \/>\nЧтобы обращаться к приложениям по красивым домегам типа `my-app.dokku.datahub.mother`, я настроил <b>AdGuard Home<\/b> в качестве локального DNS-сервера (фильтры получил бонусом – где-то 20% это всякие счетчики, ужас:). Добавил правило Rewrite: `*.dokku.datahub.mother` → `192.168.0.20` (IP моего NAS). Теперь все поддомены (приложения) автоматически ведут на Dokku.<\/p>\n<p>Также для удобства я настроил `~\/.ssh\/config` на ноутбуке, чтобы не вводить порты вручную:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">Host dokku.datahub.mother\n  HostName 192.168.0.20\n  Port 3022\n  User dokku<\/code><\/pre><p>ну и ключ сам так можно добавить<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">echo &quot;ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ&quot; | dokku ssh-keys:add dokku<\/code><\/pre><hr \/>\n<h3>Часть 2. Приложение “my-first-app”: Новогоднее гадание<\/h3>\n<p>Для теста я написал простое Flask-приложение, которое рассчитывает ваш возраст в наступающем 2026 году.<\/p>\n<h4>Код приложения (`app.py`)<\/h4>\n<pre class=\"e2-text-code\"><code class=\"\">from flask import Flask, request\n\napp = Flask(__name__)\n\n@app.route('\/')\ndef home():\n    return &quot;&quot;&quot;\n    &lt;h1&gt;Приветствую в игре Нового 2026 года! 🎉&lt;\/h1&gt;\n    &lt;p&gt;Это веселая интерактивная игра в честь Нового года. Угадай свой возраст на 1 января 2026!&lt;\/p&gt;\n    &lt;p&gt;Введи свой год рождения:&lt;\/p&gt;\n    &lt;form action=&quot;\/result&quot; method=&quot;get&quot;&gt;\n        &lt;input type=&quot;number&quot; name=&quot;birth_year&quot; min=&quot;1900&quot; max=&quot;2025&quot; required&gt;\n        &lt;button type=&quot;submit&quot;&gt;Угадать возраст на Новогодний 2026!&lt;\/button&gt;\n    &lt;\/form&gt;\n    &quot;&quot;&quot;\n\n@app.route('\/result')\ndef result():\n    birth_year = request.args.get('birth_year')\n    if not birth_year or not birth_year.isdigit():\n        return &quot;Ошибка: введи корректный год рождения!&quot;\n    \n    birth_year = int(birth_year)\n    age_in_2026 = 2026 - birth_year\n    return f&quot;&quot;&quot;\n    &lt;h2&gt;Результат: 🎇&lt;\/h2&gt;\n    &lt;p&gt;В 2026 году тебе будет {age_in_2026} лет!&lt;\/p&gt;\n    &lt;p&gt;Счастливого Нового 2026 года! Пусть все твои желания сбудутся!&lt;\/p&gt;\n    &lt;a href=&quot;\/&quot;&gt;Играть снова&lt;\/a&gt;\n    &quot;&quot;&quot;\n\nif __name__ == '__main__':\n    app.run(host='0.0.0.0', port=5000)<\/code><\/pre><h4>Подготовка к деплою<\/h4>\n<p>Чтобы Dokku понял, как запускать это чудо, нужны два файла в корне проекта:<\/p>\n<ol start=\"1\">\n<li><b>`requirements.txt`<\/b> (зависимости):<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">Flask==2.3.2\ngunicorn==20.1.0\nWerkzeug==2.3.3<\/code><\/pre><ol start=\"2\">\n<li><b>`Procfile`<\/b> (команда запуска):<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">web: gunicorn app:app --bind 0.0.0.0:5000<\/code><\/pre><ol start=\"3\">\n<li><b>`.python-version`<\/b> (опционально, явная версия Python):<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">3.11.14<\/code><\/pre><h4>Процесс деплоя<\/h4>\n<p>Все делается через Git, как на “взрослых” платформах:<\/p>\n<ol start=\"1\">\n<li><b>Создаем приложение на сервере:<\/b><\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">ssh dokku@dokku.datahub.mother apps:create my-first-app<\/code><\/pre><ol start=\"2\">\n<li><b>Отправляем код:<\/b><\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">git init\n    git add .\n    git commit -m &quot;Happy New Year 2026 version&quot;\n    git remote add dokku dokku@dokku.datahub.mother:my-first-app\n    git push dokku master<\/code><\/pre><p>Если вы до этого еще что-то деплоили, то лучше проверить куда гит смотрит<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">git remote -v<\/code><\/pre><p>ну и поменяем еще не верное<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">git remote remove dokku<\/code><\/pre><pre class=\"e2-text-code\"><code class=\"\">git init\n    git add .\n    git commit -m &quot;Happy New Year 2026 version&quot;\n    git remote add dokku dokku@dokku.datahub.mother:my-first-app\n    git push dokku master<\/code><\/pre><p>После пуша Dokku сам скачает Python, установит Flask и запустит Gunicorn. Через минуту-две приложение доступно по адресу `<a href=\"http:\/\/my-first-app.dokku.datahub.mother\">http:\/\/my-first-app.dokku.datahub.mother<\/a>`.<\/p>\n<p>Еще нужно домен установить<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">ssh dokku@dokku.datahub.mother domains:set my-first-app my-first-app.dokku.datahub.mother<\/code><\/pre><p>или можно сразу глобально его установить:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">ssh dokku@dokku.datahub.mother domains:set-global dokku.datahub.mother\n# но тогда придется удалить ручную привязку \nssh dokku@dokku.datahub.mother domains:clear my-first-app\n\n# не забыть перебрать nginx ( на всякий случай ) \nssh dokku@dokku.datahub.mother proxy:build-config my-first-app<\/code><\/pre><p>Сертификат сгенерировать<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">ssh dokku@dokku.datahub.mother certs:generate my-first-app my-first-app.dokku.datahub.mother<\/code><\/pre><p>и проверить порты<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">ssh dokku@dokku.datahub.mother ports:report my-first-app<\/code><\/pre><p>если порты не корректные, то можно их установить так:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">ssh dokku@dokku.datahub.mother ports:set my-first-app http:80:5000 https:443:5000<\/code><\/pre><hr \/>\n<h3>Часть 3. Уровень PRO: Скорость (uv) и Marimo<\/h3>\n<p>Аппетит приходит во время еды. После простого Flask-приложения я решил развернуть что-то посерьезнее — Data Science ноутбук на <b>Marimo<\/b>, и столкнулся с реальными сложностями и особенностями. Для примера брал их дело ноутбук <a href=\"https:\/\/marimo.app\">https:\/\/marimo.app<\/a><\/p>\n<h4>1. Ускорение сборки с `uv`<\/h4>\n<p>Стандартный `pip` устанавливает пакеты медленно. Если проект большой, деплой может висеть минутами.<br \/>\nЯ перешел на <b>uv<\/b> — новый менеджер пакетов на Rust.<\/p>\n<p>Вместо `requirements.txt` я использовал `pyproject.toml` и `uv.lock`. Dokku (благодаря современным buildpacks) увидел `uv.lock` и переключился на быстрый режим. Время сборки сократилось <b>в разы<\/b>.<\/p>\n<h4>2. Ловушка масштабирования (Scaling)<\/h4>\n<p>Marimo — это <b>stateful<\/b> приложение (хранит состояние в памяти). Flask, который мы делали выше — <b>stateless<\/b>.<\/p>\n<p>Когда я задеплоил Marimo, Dokku по умолчанию все было хорошо, но потом я решил масштабировать его и сделал так<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">ssh dokku@dokku.datahub.mother ps:scale my-marimo-app web=3<\/code><\/pre><p>далее Dokku запустил <b>3 копии<\/b> контейнера (`web=3`).<br \/>\nНачался хаос:<\/p>\n<ul>\n<li>Интерфейс открывался.<\/li>\n<li>При нажатии кнопок вылетала ошибка `Invalid server token`.<\/li>\n<\/ul>\n<p><b>Почему?<\/b> Браузер загружал страницу с *Контейнера 1*, а WebSocket-запрос улетал в *Контейнер 2*, который ничего не знал про мою сессию.<\/p>\n<p><b>Решение:<\/b><br \/>\nДля интерактивных приложений (Streamlit, Marimo, Jupyter) всегда принудительно ставьте одну реплику:<br \/>\nНу ли придется делать липкие сессии на nginx или еще что-то.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">ssh dokku.datahub.mother ps:scale my-marimo-app web=1 # все вернуло в рабочее состояние.<\/code><\/pre><p>А если не хватает мощности — лучше дайте этому единственному контейнеру больше ресурсов, чем пытаться плодить клонов или дайте каждому запускать свой:<\/p>\n<p>Вот так можно установить лимиты или повысить их:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">ssh dokku.datahub.mother resource:limit my-marimo-app --memory 2G --cpu 2<\/code><\/pre><h4>3. SSL в локальной сети<\/h4>\n<p>Браузеры блокируют микрофон и иногда WebSockets на HTTP-сайтах. Для локальной сети Let’s Encrypt не сработает (нет публичного IP), ну и его чуть сложнее запускать.<br \/>\nЯ решил вопрос генерацией самоподписанного сертификата одной командой Dokku:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">ssh dokku.datahub.mother certs:generate my-first-app my-first-app.dokku.datahub.mother<\/code><\/pre><p>Браузер ругается, но приложение работает полноценно.<\/p>\n<hr \/>\n<p>Еще я прогнал стресс тесты<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">ab -n 10000 -k -c 2000 ...<\/code><\/pre><p>Много они не показали, решением было подкрутить nginx, настроить кеш ssl, горизонтальное масштабирование не приносило больших результатов. я упирался в ограничения клиента при тестах нагрузки.<\/p>\n<h3>Итог<\/h3>\n<p>Dokku на домашнем сервере — это отличный инструмент.<\/p>\n<ul>\n<li><b>Для простых API (Flask\/FastAPI):<\/b> Работает “из коробки” идеально.<\/li>\n<li><b>Для сложных задач:<\/b> Использование `uv` делает работу комфортной, а понимание разницы между *Stateless* и *Stateful* приложениями спасает от занудных ошибок и отладки.<\/li>\n<\/ul>\n<p>Теперь my-first-app готово предсказывать возраст всем гостям на Новый год, а сервер готов к новым экспериментам! 🎄 Пожалуй оставлю его для будущих экспериментов. Прижился как-то быстро. Кстати у Dokku есть коммерческая PRO версия, а точнее не версия, а полноценный UI с кнопочками и стоит он 900$. <a href=\"https:\/\/dokku.com\/docs\/enterprise\/pro\/\">https:\/\/dokku.com\/docs\/enterprise\/pro\/<\/a><\/p>\n<p>Пора чего-нибудь накатить новогоднего еще :)<\/p>\n",
            "date_published": "2026-01-01T22:59:46+03:00",
            "date_modified": "2026-01-05T13:51:37+03:00",
            "tags": [
                "Dev",
                "DevOps",
                "IT",
                "Management"
            ],
            "image": "https:\/\/gavrilov.info\/pictures\/Snimok-ekrana-2026-01-01-v-22.56.17.png",
            "_date_published_rfc2822": "Thu, 01 Jan 2026 22:59:46 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "307",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/gavrilov.info\/pictures\/Snimok-ekrana-2026-01-01-v-22.56.17.png",
                    "https:\/\/gavrilov.info\/pictures\/Snimok-ekrana-2026-01-01-v-22.53.49.png"
                ]
            }
        },
        {
            "id": "300",
            "url": "https:\/\/gavrilov.info\/all\/kubevela-sovremennaya-dostavka-prilozheniy\/",
            "title": "KubeVela: Современная доставка приложений",
            "content_html": "<p>В мире Cloud-Native технологий Kubernetes стал операционной системой облака. Однако, как было отмечено в материалах про Rainbond, «ванильный» Kubernetes сложен для разработчиков. Если Rainbond решает эту проблему, предлагая готовый <b>PaaS «из коробки»<\/b> с упором на UI, то <b>KubeVela<\/b> подходит к задаче с другой стороны: это <b>двигатель для построения собственной платформы<\/b> (Platform Engine), основанный на модели OAM (Open Application Model).<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/gavrilov.info\/pictures\/Snimok-ekrana-2025-12-08-v-01.09.35.png\" width=\"558\" height=\"632\" alt=\"\" \/>\n<div class=\"e2-text-caption\"><a href=\"https:\/\/kubevela.io\">https:\/\/kubevela.io<\/a><\/div>\n<\/div>\n<p>KubeVela позволяет создавать простые и ориентированные на приложение (Application-centric) абстракции, сохраняя при этом полную гибкость и управляемость через код (Infrastructure as Code).<\/p>\n<h3>Основная философия: OAM и разделение ответственности<\/h3>\n<p>В основе KubeVela лежит стандарт <b>OAM (Open Application Model)<\/b>. Эта модель разделяет ответственность между двумя ролями:<\/p>\n<ol start=\"1\">\n<li><b>Разработчиĸи (Developers):<\/b> Описывают <b>что<\/b> нужно запустить (образ контейнера, порт, параметры запуска).<\/li>\n<li><b>Платформенные инженеры (Platform Engineers):<\/b> Описывают <b>ĸаĸ<\/b> это должно работать (инфраструктура, политики масштабирования, Ingress, безопасность).<\/li>\n<\/ol>\n<p>Математически модель приложения в KubeVela можно выразить формулой:<\/p>\n<p>$$ Application = Components + Traits + Workflow $$<\/p>\n<p>Где:<\/p>\n<ul>\n<li><b>Components<\/b>: Основная рабочая нагрузка (Workload). Например, Docker-образ, Helm-чарт или даже Terraform-модуль.<\/li>\n<li><b>Traits<\/b> (Свойства\/Черты): Операционные характеристики, подключаемые к компоненту. Например: `ingress`, `scaler`, `sidecar`.<\/li>\n<li><b>Workflow<\/b>: Цепочка шагов доставки (Deploy -> Test -> Promote).<\/li>\n<\/ul>\n<h4>Пример манифеста KubeVela<\/h4>\n<p>Вместо десятков Kubernetes-ресурсов (Deployment, Service, Ingress, HPA), разработчик пишет один упрощенный файл:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">apiVersion: core.oam.dev\/v1beta1\nkind: Application\nmetadata:\n  name: website\nspec:\n  components:\n    - name: frontend\n      type: webservice\n      properties:\n        image: nginx\n      traits:\n        - type: scaler\n          properties:\n            replicas: 3\n        - type: gateway\n          properties:\n            domain: test.example.com<\/code><\/pre><h3>Сравнение: KubeVela vs Rainbond<\/h3>\n<p>Основываясь на прошлой статье про <a href=\"https:\/\/gavrilov.info\/all\/rainbond-oblachnaya-platforma-dlya-upravleniya-prilozheniyami\/\">Rainbond<\/a>, сделаем детальное сравнение. Оба инструмента решают проблему сложности Kubernetes, но нацелены на разные аудитории.<\/p>\n<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"e2-text-table\">\n<tr>\n<td style=\"text-align: center\">Хараĸтеристиĸа<\/td>\n<td style=\"text-align: center\">Rainbond<\/td>\n<td style=\"text-align: center\">KubeVela<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center\"><b>Философия<\/b><\/td>\n<td style=\"text-align: center\"><b>No-Code \/ Low-Code PaaS.<\/b> Готовая платформа с полным UI. Ориентация на визуальное управление.<\/td>\n<td style=\"text-align: center\"><b>Platform Engine \/ IaC.<\/b> Инструментарий для создания платформы. Ориентация на GitOps и конфигурацию как код.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center\"><b>Входной порог<\/b><\/td>\n<td style=\"text-align: center\"><b>Очень низкий.<\/b> Не нужно знать Kubernetes. Можно собрать приложение из `.jar` или исходного кода одной кнопкой.<\/td>\n<td style=\"text-align: center\"><b>Средний.<\/b> Требует понимания концепций OAM. Инженерам платформы нужно знать CUE (язык конфигурации).<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center\"><b>Гибĸость<\/b><\/td>\n<td style=\"text-align: center\">Ограничена возможностями UI платформы. Сложно кастомизировать внутреннюю логику деплоя нестандартных вещей.<\/td>\n<td style=\"text-align: center\"><b>Высочайшая.<\/b> Любая абстракция настраивается через X-Definitions (на языке CUE). Можно описать любой ресурс K8s или Terraform.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center\"><b>Интеграция IaC<\/b><\/td>\n<td style=\"text-align: center\">Базируется на внутренних механизмах.<\/td>\n<td style=\"text-align: center\">Нативная интеграция с <b>Terraform<\/b>. KubeVela может разворачивать облачные базы данных (AWS RDS, Cloud SQL) как часть приложения.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center\"><b>Multi-cluster<\/b><\/td>\n<td style=\"text-align: center\">Есть управление несколькими кластерами, но фокус на единой панели управления.<\/td>\n<td style=\"text-align: center\"><b>Сильная сторона.<\/b> Мощный движок развертывания приложений сразу в несколько кластеров с политиками (Placement Policies).<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: center\"><b>Для ĸого<\/b><\/td>\n<td style=\"text-align: center\">SMB, стартапы, команды без сильной экспертизы в K8s, желающие получить опыт Heroku на своих серверах.<\/td>\n<td style=\"text-align: center\">Enterprise, Platform Engineering команды, желающие построить <b>свой<\/b> внутренний PaaS (IDP) по стандартам Spotify\/Netflix.<\/td>\n<\/tr>\n<\/table>\n<h4>Сравнение с другими аналогами<\/h4>\n<ol start=\"1\">\n<li><b>Crossplane<\/b>:\n<ul>\n  <li><b>Crossplane<\/b> фокусируется на «Инфраструктуре» (создание баз данных, кластеров, сетей в облаках через K8s API).<\/li>\n  <li><b>KubeVela<\/b> фокусируется на «Приложении».<\/li>\n  <li><b>Итог:<\/b> Они часто используются вместе. KubeVela использует Crossplane для заказа ресурсов.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<ol start=\"2\">\n<li><b>ArgoCD \/ Flux (GitOps)<\/b>:\n<ul>\n  <li>Это инструменты непрерывной доставки (CD), которые синхронизируют Git и K8s.<\/li>\n  <li>KubeVela <b>может<\/b> использовать их под капотом или использовать свой собственный Workflow-контроллер для сложных сценариев (например, «засуспендить деплой, пока не пройдет тест, затем отправить уведомление в Slack»).<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<ol start=\"3\">\n<li><b>Backstage<\/b>:\n<ul>\n  <li>Backstage — это «Портал» (Frontend). KubeVela — это «Движок» (Backend).<\/li>\n  <li>Существует плагин `vela-backstage`, который позволяет визуализировать приложения KubeVela внутри интерфейса Backstage. Это идеальная связка для построения IDP.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h3>Ключевые возможности KubeVela<\/h3>\n<h4>1. Программируемая абстраĸция (CUE Language)<\/h4>\n<p>В отличие от Helm, где шаблонизация — это просто подстановка строк, KubeVela использует язык <b>CUE<\/b> (Configure Unify Execute). Это позволяет платформенным инженерам создавать «умные» шаблоны.<\/p>\n<p>Пример логики на CUE внутри KubeVela: «Если пользователь не указал CPU, автоматически поставить `requests: 100m`, но если это ‘prod’ окружение, то поставить `500m`».<\/p>\n<h4>2. Единый Workflow для всего<\/h4>\n<p>KubeVela позволяет оркестрировать не только Kubernetes-ресурсы. В одном пайплайне вы можете:<\/p>\n<ol start=\"1\">\n<li>Создать S3 бакет в AWS (через Terraform\/Crossplane).<\/li>\n<li>Дождаться готовности.<\/li>\n<li>Задеплоить Deployment в Kubernetes.<\/li>\n<li>Отправить уведомление в Telegram.<\/li>\n<\/ol>\n<h4>3. Отсуствие «Config Drift»<\/h4>\n<p>KubeVela активно борется с дрейфом конфигураций, постоянно сверяя желаемое состояние приложения с реальным (State Reconciliation).<\/p>\n<h3>Итог и реĸомендации<\/h3>\n<p>Выбор между Rainbond и KubeVela зависит от того, <b>ĸто<\/b> будет обслуживать платформу и <b>ĸаĸие<\/b> цели стоят перед бизнесом.<\/p>\n<h4>Выбирайте Rainbond, если:<\/h4>\n<ul>\n<li>У вас небольшая или средняя команда разработчиков.<\/li>\n<li>Нет выделенного отдела Platform Engineering \/ DevOps.<\/li>\n<li>Нужно «вчера» перенести легаси (Java\/PHP\/Monolith) в контейнеры без переписывания кода.<\/li>\n<li>Вам нужен визуальный интерфейс для управления связями сервисов и мониторинга без написания YAML.<\/li>\n<li><b>Цель:<\/b> Быстрый Time-to-market с минимальными затратами на инженерию.<\/li>\n<\/ul>\n<h4>Выбирайте KubeVela, если:<\/h4>\n<ul>\n<li>Вы строите серьезный Internal Developer Platform (IDP) в крупной компании.<\/li>\n<li>У вас есть инженеры, знающие Kubernetes, но вы хотите скрыть его сложность от продуктовых разработчиков.<\/li>\n<li>Вам нужен строгий GitOps подход (все через репозиторий).<\/li>\n<li>Требуется гибридное развертывание: часть в K8s, часть в Serverless, часть в облачных RDS.<\/li>\n<li>Вы планируете использовать Backstage в качестве фронтенда.<\/li>\n<li><b>Цель:<\/b> Стандартизация, масштабируемость, полный контроль над абстракциями (Platform as Product).<\/li>\n<\/ul>\n<p><b>Рекомендация по стеĸу для Enterprise:<\/b><br \/>\nДля максимальной эффективности современный стек платформенной инженерии часто выглядит так:<br \/>\n$$ \\text{Backstage (UI)} + \\text{KubeVela (Engine)} + \\text{Crossplane (Infra)} $$<br \/>\nЭта связка дает удобство портала (как в Rainbond), мощь оркестрации (KubeVela) и управление облаком (Crossplane).<\/p>\n",
            "date_published": "2025-12-08T01:10:10+03:00",
            "date_modified": "2025-12-08T01:10:06+03:00",
            "tags": [
                "Dev",
                "DevOps",
                "Programming"
            ],
            "image": "https:\/\/gavrilov.info\/pictures\/Snimok-ekrana-2025-12-08-v-01.09.35.png",
            "_date_published_rfc2822": "Mon, 08 Dec 2025 01:10:10 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "300",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/gavrilov.info\/pictures\/Snimok-ekrana-2025-12-08-v-01.09.35.png"
                ]
            }
        }
    ],
    "_e2_version": 4171,
    "_e2_ua_string": "Aegea 11.4 (v4171e)"
}