openhubпакет
Открытый хаб пакетов OneScript
Пакет лежит в основном пуле хаба: короткой формы достаточно, если хаб прописан сервером пакетов в 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_ROOT → oshub.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;"
}
}
Схему хаб создаёт сам при первом старте — миграций нет, накатывать ничего не нужно.
Что умеет хаб
- Пулы — публичные и приватные, личные пространства пользователей, командные контуры, зеркала внешних хабов с кэширующим прокси и квотами.
- Совместимость с
opm—install,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/.