RPM
NORA обслуживает RPM-репозитории для yum / dnf. Каждый {repo} под /rpm/ — независимый репозиторий одного из двух видов:
- Собственный (hosted) — пакеты публикуете вы. При
PUTфайла.rpmNORA разбирает заголовок пакета на сервере (createrepo_cне нужен) и перегенерируетrepodata/репозитория:repomd.xmlиprimary,filelists,otherс именами по sha256, подписанные ключом экземпляра. - Проксирующий (pull-through) — имя репозитория, сопоставленное одному upstream yum-репозиторию в
[rpm.proxies]. Только чтение; см. Проксирование upstream.
Настройка клиента
Заголовок раздела «Настройка клиента»Создайте файл .repo (например, /etc/yum.repos.d/nora.repo):
[nora]name=NORAbaseurl=http://nora.example.com:4000/rpm/myrepoenabled=1gpgcheck=0repo_gpgcheck=1gpgkey=http://nora.example.com:4000/rpm/myrepo/repodata/repomd.xml.keyЗатем устанавливайте как обычно:
dnf install mypackagerepo_gpgcheck=1 проверяет подпись repodata ключом из gpgkey=. Оставьте gpgcheck=0: NORA подписывает метаданные репозитория, а не пакеты, и с gpgcheck=1 dnf отказывается ставить любой пакет, который не подписал его сборщик («The package is not signed»). Если пакеты подписаны поставщиком, включите gpgcheck=1 и добавьте ключ поставщика в gpgkey=. При выключенной подписи (NORA_SIGNING_ENABLED=false) укажите repo_gpgcheck=0.
Публикация
Заголовок раздела «Публикация»Загрузите пакет в собственный репозиторий через PUT — repodata перегенерируется автоматически:
curl -u user:pass -T mypackage-1.0-1.x86_64.rpm \ http://nora.example.com:4000/rpm/myrepo/mypackage-1.0-1.x86_64.rpmDELETE по тому же пути удаляет пакет и перегенерирует индексы. Невалидные RPM отклоняются.
Если пакеты добавили или удалили в хранилище в обход NORA, POST /rpm/{repo}/-/reindex согласует репозиторий: убирает осиротевшие метаданные, подхватывает добавленные пакеты, пересобирает и заново подписывает repodata.
Проксирование upstream
Заголовок раздела «Проксирование upstream»Сопоставьте локальное имя репозитория upstream yum-репозиторию (каталогу, в котором лежит repodata/):
[rpm]enabled = true
[rpm.proxies]fedora = "https://dl.fedoraproject.org/pub/fedora/linux/releases/42/Everything/x86_64/os"epel = { url = "https://mirror.internal.example.com/epel/9/Everything/x86_64", auth = "user:pass" }или NORA_RPM_PROXIES="fedora=https://…/os,epel=https://…/x86_64|user:pass". Клиенты указывают baseurl=http://nora.example.com:4000/rpm/fedora.
- Проксирующий репозиторий только для чтения:
PUT,DELETEи reindex отвечают409. - Метаданные upstream —
repodata/вместе с подписью и ключом самого upstream — отдаются как есть и обновляются черезmetadata_ttlсекунд (по умолчанию300). Проверяйте их ключом upstream вgpgkey=, а не ключом NORA. - Пакеты кешируются навсегда при первом скачивании.
- Когда upstream недоступен, отдаётся устаревшая копия из кеша с заголовком
x-nora-stale: true.
Офлайн-зеркало
Заголовок раздела «Офлайн-зеркало»nora mirror rpm скачивает через NORA все пакеты проксируемого репозитория, чтобы клиенты в закрытом контуре ставили пакеты без upstream:
nora mirror --registry http://nora.example.com:4000 rpm --repo fedora --arch x86_64,noarchКонфигурация
Заголовок раздела «Конфигурация»config.toml:
[rpm]enabled = truemax_file_size = 1073741824 # 1 ГиБchangelog_limit = 10 # записей changelog на пакет в other.xmlproxy_timeout = 30metadata_ttl = 300Переменные окружения:
| Переменная | Описание | По умолчанию |
|---|---|---|
NORA_RPM_ENABLED | Включить реестр RPM | false |
NORA_RPM_MAX_FILE_SIZE | Максимальный размер загружаемого .rpm в байтах | 1073741824 (1 ГиБ) |
NORA_RPM_CHANGELOG_LIMIT | Записей changelog на пакет в other.xml | 10 |
NORA_RPM_PROXIES | Проксирующие репозитории: name=url[|user:pass],… | — |
NORA_RPM_PROXY_TIMEOUT | Таймаут upstream в секундах | 30 |
NORA_RPM_METADATA_TTL | Сколько секунд метаданные upstream считаются свежими (0 и меньше — ревалидировать при каждом запросе) | 300 |
Подпись
Заголовок раздела «Подпись»Repodata собственных репозиториев подписывается при каждой перегенерации (repodata/repomd.xml.asc). На локальном хранилище ключ экземпляра (Ed25519) создаётся при первом запуске в <storage>/.signing/nora.key; открытый ключ в armored-виде отдаётся по repodata/repomd.xml.key. Тот же ключ подписывает индексы Debian/APT.
| Переменная | Описание | По умолчанию |
|---|---|---|
NORA_SIGNING_ENABLED | Подписывать индексы репозиториев RPM и Debian | true |
NORA_SIGNING_KEY_PATH | Секретный ключ OpenPGP в armored-виде. Обязателен на S3/GCS | <storage>/.signing/nora.key |
На S3/GCS без NORA_SIGNING_KEY_PATH подпись выключается с предупреждением при старте. Смонтируйте один и тот же ключ на все реплики.
Возможности
Заголовок раздела «Возможности»| Функция | Статус | Примечание |
|---|---|---|
Загрузка пакета (PUT) | Полная | Заголовок разбирается и проверяется; repodata перегенерируется |
Скачивание пакета (GET) | Полная | Байт в байт |
Удаление (DELETE) | Полная | Repodata перегенерируется |
Генерация repodata/ | Полная | repomd.xml + primary / filelists / other (.xml.gz) |
Подписанная repodata (repomd.xml.asc) | Полная | Проверка через repo_gpgcheck=1 |
Открытый ключ (repomd.xml.key) | Полная | Для gpgkey= |
Согласование (POST {repo}/-/reindex) | Полная | Чинит изменения хранилища в обход NORA |
| Проксирование upstream | Полная | [rpm.proxies], только чтение, устаревшая копия при сбое |
| Офлайн-зеркало | Полная | nora mirror rpm |
Подписи пакетов (gpgcheck=1) | — | NORA подписывает метаданные, а не пакеты |
sqlite-метаданные (*_db) | — | Только XML-метаданные |
Delta RPM, modules.yaml | — | Не генерируются |
Известные ограничения
Заголовок раздела «Известные ограничения»- NORA не подписывает пакеты. Используйте
gpgcheck=0, если пакеты не несут подписи поставщика. - Отключён по умолчанию. Установите
NORA_RPM_ENABLED=trueдля активации. - Проксирующий репозиторий соответствует ровно одному upstream-репозиторию; публиковать в него нельзя.