Сервис развивается: тестируем формат, собираем идеи, улучшаем сервис. Есть идеи?

Написать
Войти
Дайджесты
Пиксельная серверная стойка с контейнерами приложений в режиме сна

OpenRun: декларативная альтернатива Dokku и Coolify для деплоя внутренних инструментов

Проект OpenRun предлагает открытую платформу для декларативного GitOps-деплоя контейнеризованных приложений. Платформа поддерживает автоматическое масштабирование до нуля, интеграцию OIDC/SAML, управление TLS-сертификатами и работает как на одиночном сервере с Docker, так и в кластере Kubernetes.

OpenRun: декларативная альтернатива Dokku и Coolify для деплоя внутренних инструментов

Создание внутренних инструментов на Streamlit, Flask или Gradio занимает минимум времени. Основная сложность — безопасность деплоя: настройка HTTPS, корпоративной аутентификации (OIDC/SAML), прав доступа (RBAC), секретов и автоматических обновлений.

Обычно для деплоя используют Dokku или Coolify, но они требуют ручного конфигурирования через UI или CLI, что ведет к конфигурационному дрейфу. Проект OpenRun (лицензия Apache-2.0) предлагает декларативное управление инфраструктурой прямо из Git по принципам GitOps.

Зачем внутренним инструментам отдельная платформа

Внутренние панели администрирования часто создаются хаотично. Развертывание таких сервисов на классических PaaS-платформах сопряжено со следующими сложностями:

  • Отсутствие декларативности для инфраструктуры: В большинстве популярных систем (Dokku, Coolify, CapRover) через Git управляется только сам исходный код приложения. Настройка доменных имен, лимитов ресурсов или прав доступа выполняется администратором вручную в графической панели или через команды в терминале. Это затрудняет аудит конфигурации и лишает команду возможности рецензировать изменения инфраструктуры (code review).
  • Сложность масштабирования: Если команда вырастает и решает перенести приложения с одиночного сервера в кластер Kubernetes, ей приходится переписывать всю конфигурацию с нуля, изучать Helm-чарты и настраивать Ingress-контроллеры.
  • Избыточное потребление ресурсов: Внутренние сервисы часто нужны лишь периодически — например, несколько раз в неделю. Тем не менее, контейнеры продолжают работать круглосуточно, расходуя оперативную память и процессорное время сервера.

OpenRun решает эти проблемы, предлагая единый декларативный формат описания приложений на языке Starlark (диалекте Python), который преобразуется в работающие контейнеры как на одном сервере, так и в кластере Kubernetes.

Декларативный GitOps вместо ручной конфигурации

Главная отличительная черта OpenRun — глубокая декларативность. Все операции с инфраструктурой выполняются через обновление файлов конфигурации в Git-репозитории. Разработчик описывает параметры приложения в конфигурационном файле Starlark (Appspec). После слияния изменений в основную ветку репозитория платформа OpenRun автоматически синхронизирует состояние окружения. Это позволяет применить к конфигурации приложений полноценный цикл разработки (SDLC): историю изменений, ветвление, согласование пулл-реквестов и быстрый откат к предыдущим версиям.

Встроенный планировщик OpenRun регулярно опрашивает Git-репозиторий на предмет изменений. Если обнаруживается новая конфигурация, платформа выполняет сборку образа и обновление приложения. Для безопасного деплоя поддерживается механизм staged deployment (двухэтапное развертывание) и blue-green обновления: новые контейнеры запускаются параллельно со старыми и переключают трафик только после успешного прохождения проверок работоспособности (health checks). В случае сбоя при обновлении группы взаимосвязанных приложений OpenRun выполняет атомарный откат всей группы.

Под капотом: Scale-to-Zero и собственная маршрутизация

Архитектурно OpenRun спроектирован как самостоятельный веб-сервер и маршрутизатор запросов. В отличие от аналогичных PaaS-решений, он не требует обязательной установки внешних прокси-серверов вроде Nginx или Ingress-контроллеров вроде Traefik. Платформа самостоятельно слушает порты, управляет TLS-сертификатами (с помощью библиотеки Certmagic и Let's Encrypt для продакшена или mkcert для локальной разработки) и распределяет входящий трафик по доменам и путям.

Собственный сетевой стек позволил реализовать функцию автоматического масштабирования до нуля (idle scale-to-zero). Если к внутреннему инструменту никто не обращается в течение заданного времени, OpenRun переводит контейнер в спящий режим и освобождает системные ресурсы. При поступлении HTTP-запроса платформа запускает контейнер и перенаправляет запрос пользователю. Для внутренних сервисов с низкой интенсивностью использования это позволяет экономить до 80% серверных мощностей.

Для работы с данными и обеспечения высокой производительности OpenRun использует СУБД SQLite для хранения метаданных и виртуальную файловую систему с кэшированием файлов по контентному хэшу. Это позволяет отдавать статический контент с минимальными задержками и поддержкой сжатия Brotli.

Безопасность из коробки: Auth, RBAC и аудит

Внутренние корпоративные инструменты требуют контроля доступа. Создатели OpenRun встроили механизмы безопасности непосредственно в ядро платформы:

  • Интеграция с провайдерами авторизации: Поддерживаются протоколы OAuth, OIDC (OpenID Connect) и SAML. Это позволяет подключить вход через корпоративные учетные записи (например, Google, Okta, Keycloak или GitHub) без написания дополнительного кода.
  • Ролевая модель доступа (RBAC): Платформа позволяет разграничивать права как для административных действий, так и для доступа к самим развернутым сервисам на основе групп пользователей.
  • Журнал аудита и секреты: Любые изменения конфигурации, запуски контейнеров и обращения к ресурсам фиксируются в защищенном логе аудита. OpenRun также интегрируется с менеджерами секретов, позволяя передавать API-ключи и пароли в контейнеры через переменные окружения, не раскрывая их в исходном коде Starlark-манифестов.

Руководство по развертыванию: от первого запуска до Kubernetes

Развертывание OpenRun состоит из установки управляющего демона (сервера) и последующего декларативного описания приложений. Для запуска контейнеризованных приложений на одиночном сервере необходимо установить Docker, Podman или Orbstack.

Установка управляющего демона OpenRun

Установка на сервер под управлением Linux или macOS выполняется с помощью официального скрипта:

curl -sSL https://openrun.dev/install.sh | sh

После завершения работы скрипта откройте новое окно терминала и запустите сервер:

openrun server start

Для пользователей macOS доступна альтернативная установка через Homebrew:

brew tap openrundev/homebrew-openrun
brew install openrun
brew services start openrun

По умолчанию консоль управления сервером будет доступна по адресу https://localhost:25223 (порт для HTTP-запросов — 25222).

Декларативное развертывание приложений

Чтобы развернуть приложение на основе Starlark-файла конфигурации из Git, выполните команду применения манифеста:

openrun apply --approve github.com/openrundev/openrun/examples/utils.star

Флаг --approve подтверждает запуск приложения. Для настройки автоматической синхронизации изменений в фоновом режиме (режим GitOps) добавьте расписание синхронизации:

openrun sync schedule --approve --promote github.com/openrundev/openrun/examples/utils.star

Для локального тестирования и отладки приложения можно запустить в dev-режиме:

openrun apply --dev --approve github.com/openrundev/openrun/examples/utils.star

Если вам нужно быстро запустить готовое приложение без создания GitOps-пайплайна, можно использовать императивную команду:

openrun app create --approve github.com/openrundev/apps/utils/bookmarks /book

В данном примере закладки (bookmark manager) будут доступны по адресу https://localhost:25223/book.

Масштабирование до Kubernetes

При росте нагрузки приложения можно перенести в кластер Kubernetes. Установка OpenRun в кластер осуществляется с помощью Helm-чарта или конфигурации Terraform. Благодаря абстракции OpenRun, манифесты приложений (Starlark-конфиги) переносить не требуется — OpenRun самостоятельно транслирует их в сущности Kubernetes (Services, Deployments, Pods) и выступает в роли API-сервера и маршрутизатора для кластера.

Ограничения, риски и особенности эксплуатации

При планировании внедрения OpenRun необходимо учитывать следующие факторы:

  • Зрелость проекта: Проект находится на ранней стадии (версия v0.18.3, менее 1000 звезд на GitHub) и требует тестирования перед использованием в продуктовой среде.
  • Резервное копирование: В режиме single-node состояние хранится в SQLite. Необходимо настроить бэкап рабочей директории OpenRun (OPENRUN_HOME).
  • Холодный старт: Функция scale-to-zero создает задержку при первом обращении к уснувшему приложению. Для критических систем ее лучше отключить.
  • Роль CI/CD: Отсутствие сборочного сервера не отменяет необходимость внешних CI-систем для запуска тестов, линтеров и проверок безопасности перед деплоем.
  • Сложность Kubernetes: Использование OpenRun в кластере упрощает конфигурирование приложений, но не избавляет от администрирования самого Kubernetes (безопасности, сетей, реестров образов).