OpenHub
OpenHub
Войти

openhubпакет

Открытый хаб пакетов OneScript

автор: e.ivanovскачиваний: 0лицензия: MITрепозиторий: github.com/Segate-ekb/openhub

Пакет лежит в основном пуле хаба: короткой формы достаточно, если хаб прописан сервером пакетов в opm.cfg.

opm install openhub

Установка на opm младше 1.7.0

Легаси-флоу. Клиент младше 1.7.0 адрес пула в аргументе не разбирает: пул сначала прописывают сервером пакетов, и только потом ставят через него. На 1.7.0 и новее этот раздел не нужен — хватает команды из шапки страницы.

Добавьте пул сервером пакетов в opm.cfg. Порт продублирован в «Сервер»: у opm push поле «Порт» не читается.

{ "СервераПакетов": [ { "Имя": "default", "Сервер": "https://hub.1cdevelopers.ru", "Порт": 443, "ПутьНаСервере": "/api/v1/pools/default/download/", "РесурсПубликацииПакетов": "/api/v1/pools/default/push", "Приоритет": 1 } ] }

И ставьте пакет, указывая сервер:

opm install -m default openhub

Описание

OpenHub

Открытый хаб пакетов OneScript: пулы пакетов (публичные, приватные, личные, зеркала апстрима), веб-каталог, теги обновлений и semver. Работает со стоковым opm — ни плагинов, ни патчей клиенту не нужно.

Стек: чистый OneScript + ОСень + winow.


Установка

Docker

docker run -d --name openhub -p 3333:3333 \
  -v openhub-data:/var/lib/openhub \
  segateekb/openhub

Хаб поднимется на http://localhost:3333 и будет работать без единой внешней системы: база — SQLite (/var/lib/openhub/openhub.db), артефакты — файлы там же. Всё состояние инсталляции лежит на томе /var/lib/openhub, его обязательно монтировать.

S3 включается по требованию (-e OSHUB_STORAGE_BACKEND=s3 и параметры из раздела «Хранилище пакетов»); готовый стенд «хаб + MinIO» — docker compose up в каталоге build/. Конфигурацию можно подсунуть и файлом: -v ./autumn-properties.json:/opt/openhub/autumn-properties.json:ro.

Образ собран под linux/amd64 (других платформ базовый образ OneScript не публикует). На Apple Silicon добавьте --platform linux/amd64 -e DOTNET_EnableWriteXorExecute=0: без первого не скачается, без второго qemu ломает JIT .NET.

Пакетом OneScript

Нужен OneScript 2.0+.

opm install openhub          # хаб и все зависимости; ставит команду openhub в PATH
mkdir ~/openhub && cd ~/openhub
openhub                      # http://localhost:3333

Команда openhub берёт настройки и складывает данные в текущем каталоге, поэтому хаб живёт там, откуда его запустили.


Первоначальная настройка

1. Файл настроек

Рядом с местом запуска положите autumn-properties.json. Минимальный рабочий файл — хаб на файловой базе, без внешних сервисов:

{
    "winow": { "Порт": 3333 },
    "data": {
        "ИсточникиДанных": {
            "ТипКоннектора": "КоннекторJSON",
            "СтрокаСоединения": "./data/entities"
        }
    },
    "oshub": {
        "storage": { "root": "./data" }
    }
}

Этого достаточно для старта. Что здесь что:

Ключ Назначение
winow.Порт порт HTTP-сервера
data.ИсточникиДанных база данных: коннектор и строка соединения (см. «База данных»)
oshub.storage.root каталог данных: артефакты файлового хранилища и аудит.log

В файл кладут только то, что нужно до подключения к базе: порт, БД, хранилище. Всё остальное — квоты, режим регистрации, провайдеры входа, сроки токенов, TTL прокси — настраивается в веб-интерфейсе и хранится в базе. Ключ, заданный в файле, в интерфейсе показывается как «управляется конфигурацией» и не редактируется.

Секреты в этот файл не пишут. Пароли, ключи S3 и клиентские секреты OIDC передаются переменными окружения или файлами-секретами.

Переменные окружения

Любую детальку можно переопределить переменной OSHUB_*: порядок — окружение → файл → умолчания. Имя получается заменой _.___): OSHUB_STORAGE_ROOToshub.storage.root. Отдельно стоят OSHUB_PORT, OSHUB_DB_CONNECTOR, OSHUB_DB_CONNECTION и OSHUB_DEFAULT_POOL.

2. Первый администратор

На свежей базе пользователей нет, и хаб включает режим онбординга: публичные страницы уводят на /setup. Откройте http://localhost:3333/setup и заведите админа — после этого мастер закрывается навсегда.

Для автоматического развёртывания есть headless-путь:

OSHUB_ADMIN_LOGIN=admin OSHUB_ADMIN_PASSWORD_FILE=/run/secrets/openhub_admin openhub

Админ создаётся при старте с требованием сменить пароль при первом входе, мастер /setup пропускается. OSHUB_ADMIN_PASSWORD со значением тоже работает, но файл-секрет безопаснее.

3. Первый пул

Пакеты публикуются не «в хаб», а в конкретный пул. Сразу после онбординга хаб приводит вас на /tour — проводник первой публикации, который отмечает шаги по факту.

Заведите пул в /hub/settings/pools. Пул с именем из oshub.pools.default (в примере выше — public) автоматически станет основным: на него начнут отвечать короткие адреса /download и /push. Пока основного пула нет, хаб пишет об этом предупреждение в журнал.

Типы пулов:

Тип Адрес пакета Для чего
основной /{пакет} общий публичный реестр, цель opm push по умолчанию
личный /{логин}/{пакет} личное пространство, заводится при регистрации
произвольный /{пул}/{пакет} команда, приватный контур, зеркало апстрима

Произвольный пул можно сделать приватным (тогда приватны все его пакеты), закрыть публикацию, раздать права пользователям и группам и назначить ему апстрим — тогда недостающий пакет хаб докачает с внешнего хаба и закэширует у себя.


Публикация и установка пакетов

Вход по паролю нужен только браузеру; opm ходит по токену.

opm login hub.example.ru/public --browser

Хаб покажет короткий код, вы подтверждаете вход в кабинете — opm получит токен и сам пропишет сервер в opm.cfg. Дальше всё как обычно:

opm build .
opm push hub.example.ru/public мойпакет-1.0.0.ospx
opm install hub.example.ru/public/мойпакет

Адресная форма команд требует opm 1.7+. Клиент любой версии подключается записью в opm.cfg — токен выпускается в кабинете, /me/settings/tokens:

{ "СервераПакетов": [
  { "Имя": "openhub", "Сервер": "https://hub.example.ru", "Порт": 443,
    "ПутьНаСервере": "/api/v1/pools/public/download/",
    "РесурсПубликацииПакетов": "/api/v1/pools/public/push",
    "Авторизация": "Bearer ${OSHUB_TOKEN}", "Приоритет": 0 }
] }

Токен держите в переменной окружения, а не в файле.

Беспрефиксные адреса старых хабов (/download/, /push, /dev-channel/, /pools/{пул}/download/) — вечные алиасы: конфигурации, написанные до переезда адресов под /api/v1, работают без правок.


Хранилище пакетов

Куда ложатся .ospx, выбирает oshub.storage.backend:

Бэкенд Где лежат файлы Когда
fs (по умолчанию) {oshub.storage.root}/pools/{пул}/{пакет}/ одна машина, том или сетевой диск
s3 {префикс}pools/{пул}/{пакет}/ в бакете AWS S3, MinIO, Ceph — и несколько инстансов хаба

Параметры S3 (не-секретные можно держать в файле настроек):

Переменная Деталька По умолчанию
OSHUB_STORAGE_BACKEND oshub.storage.backend fs
OSHUB_STORAGE_S3_ENDPOINT oshub.storage.s3.endpoint — (обязателен)
OSHUB_STORAGE_S3_BUCKET oshub.storage.s3.bucket — (обязателен)
OSHUB_STORAGE_S3_REGION oshub.storage.s3.region us-east-1
OSHUB_STORAGE_S3_FORCE__PATH__STYLE oshub.storage.s3.force_path_style Истина (нужно для MinIO)
OSHUB_STORAGE_S3_PREFIX oshub.storage.s3.prefix пусто — делит бакет между инсталляциями
OSHUB_STORAGE_QUOTA_BYTES oshub.storage.quota.bytes 0 — без лимита; работает на обоих бэкендах

Ключи доступа читаются только из окружения: OSHUB_STORAGE_S3_ACCESS_KEY и OSHUB_STORAGE_S3_SECRET_KEY либо их варианты ..._FILE с путём к файлу-секрету. Без них старт с backend=s3 падает с понятной ошибкой.


База данных

Хаб работает через ORM и не привязан к конкретной СУБД. Коннектор задаётся в data.ИсточникиДанных (или переменными OSHUB_DB_CONNECTOR / OSHUB_DB_CONNECTION):

Коннектор Строка соединения Когда
КоннекторJSON (по умолчанию) каталог, например ./data/entities личный или командный хаб одним процессом, без СУБД вообще
КоннекторSQLite Data Source=./data/openhub.db малые и средние инсталляции
КоннекторPostgreSQL Host=…;Username=…;Password=…;Database=…; нагруженные хабы
"data": {
    "ИсточникиДанных": {
        "ТипКоннектора": "КоннекторPostgreSQL",
        "СтрокаСоединения": "Host=db;Username=openhub;Password=…;Database=openhub;"
    }
}

Схему хаб создаёт сам при первом старте — миграций нет, накатывать ничего не нужно.


Что умеет хаб

  • Пулы — публичные и приватные, личные пространства пользователей, командные контуры, зеркала внешних хабов с кэширующим прокси и квотами.
  • Совместимость с opminstall, push, login;
  • Версии — semver-диапазоны и теги обновлений (latest, stable, prerelease) с правилами и пинами.
  • Веб-интерфейс — каталог с поиском, карточка пакета, кабинет пользователя, настройки хаба.
  • Доступ — пользователи, группы, вход через OIDC-провайдеров, PAT-токены, гранулярные права на пулы и пакеты.
  • Интеграции — вебхуки и подписки, статистика скачиваний, HTTP API /api/v1.
  • Эксплуатация — журнал аудита, трассировка OpenTelemetry.

Пробы для оркестратора

curl http://localhost:3333/health   # liveness: процесс жив
# {"status": "ok", "version": "0.1.0", "uptime_seconds": 5}

curl -i http://localhost:3333/ready # readiness: можно слать трафик
# 200 {"status": "ready", "ready": true}   либо   503 {"status": "starting"}

Порт открывается после стартовых задач, поэтому до строки Стартовые задачи завершены — открываю порт в журнале соединение отклоняется. Пробу готовности вешайте на /ready, живости — на /health.


Разработка

opm install opm            # нужен opm 1.6+
opm install -l -s -f libs/oscript-ui-0.1.0.ospx   # временно, до публикации: libs/README.md
opm install -l --dev       # зависимости из packagedef в ./oscript_modules
oscript src/main.os        # хаб на http://localhost:3333
opm install oneunit@0.4.1  # один раз
scripts/смоук.sh           # минимум по назначению хаба
oneunit execute -T внешние # всё дерево, кроме наборов с внешними системами

Вторая строка — временная: библиотека oscript-ui ещё не опубликована и приезжает локальной сборкой. Если сборку обновили, а номер версии остался прежним, opm пакет пропустит — снесите oscript_modules/oscript-ui перед установкой. Подробности и порядок снятия — libs/README.md.

Образ собирается и запускается из каталога build/.