Перейти к содержимому

RPM

NORA обслуживает RPM-репозитории для yum / dnf. Каждый {repo} под /rpm/ — независимый репозиторий одного из двух видов:

  • Собственный (hosted) — пакеты публикуете вы. При PUT файла .rpm NORA разбирает заголовок пакета на сервере (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=NORA
baseurl=http://nora.example.com:4000/rpm/myrepo
enabled=1
gpgcheck=0
repo_gpgcheck=1
gpgkey=http://nora.example.com:4000/rpm/myrepo/repodata/repomd.xml.key

Затем устанавливайте как обычно:

Окно терминала
dnf install mypackage

repo_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.rpm

DELETE по тому же пути удаляет пакет и перегенерирует индексы. Невалидные RPM отклоняются.

Если пакеты добавили или удалили в хранилище в обход NORA, POST /rpm/{repo}/-/reindex согласует репозиторий: убирает осиротевшие метаданные, подхватывает добавленные пакеты, пересобирает и заново подписывает repodata.

Сопоставьте локальное имя репозитория 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 = true
max_file_size = 1073741824 # 1 ГиБ
changelog_limit = 10 # записей changelog на пакет в other.xml
proxy_timeout = 30
metadata_ttl = 300

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

ПеременнаяОписаниеПо умолчанию
NORA_RPM_ENABLEDВключить реестр RPMfalse
NORA_RPM_MAX_FILE_SIZEМаксимальный размер загружаемого .rpm в байтах1073741824 (1 ГиБ)
NORA_RPM_CHANGELOG_LIMITЗаписей changelog на пакет в other.xml10
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 и Debiantrue
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-репозиторию; публиковать в него нельзя.