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

Debian / APT

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

  • Собственный (hosted) — пакеты публикуете вы. При PUT файла .deb NORA разбирает его control-параграф на сервере (dpkg-scanpackages не нужен) и перегенерирует все затронутые индексы, подписанные ключом экземпляра. Собственный репозиторий может использовать плоскую раскладку, структурированную раскладку dists/ или обе — выбор делается для каждого пакета при загрузке.
  • Проксирующий (pull-through) — имя репозитория, сопоставленное одному upstream APT-репозиторию в [deb.proxies]. Только чтение; см. Проксирование upstream.

Скачайте ключ подписи и добавьте репозиторий. Ключ отдаётся в armored-виде, а signed-by принимает его как файл .asc:

Окно терминала
sudo mkdir -p /etc/apt/keyrings
curl -fsSL http://nora.example.com:4000/deb/myrepo/pubkey.gpg \
| sudo tee /etc/apt/keyrings/nora.asc >/dev/null

Плоский репозиторий — обратите внимание на ./ в конце:

Окно терминала
echo "deb [signed-by=/etc/apt/keyrings/nora.asc] http://nora.example.com:4000/deb/myrepo ./" \
| sudo tee /etc/apt/sources.list.d/nora.list

Структурированный репозиторий — дистрибутив и компонент, как у обычного зеркала:

Окно терминала
echo "deb [signed-by=/etc/apt/keyrings/nora.asc] http://nora.example.com:4000/deb/myrepo trixie main" \
| sudo tee /etc/apt/sources.list.d/nora.list

Затем:

Окно терминала
sudo apt update && sudo apt install mypackage

Связка ключей после gpg --dearmor -o /etc/apt/keyrings/nora.gpg тоже работает. При выключенной подписи (NORA_SIGNING_ENABLED=false) используйте [trusted=yes] вместо [signed-by=…].

Загрузите пакет в собственный репозиторий через PUT — индексы перегенерируются автоматически.

Плоская раскладка (по умолчанию): Packages, Packages.gz, Release, InRelease и Release.gpg в корне репозитория.

Окно терминала
curl -u user:pass -T mypackage_1.0_amd64.deb \
http://nora.example.com:4000/deb/myrepo/mypackage_1.0_amd64.deb

Структурированная раскладка: добавьте ?distribution= (и при необходимости &component=, по умолчанию main). Индексы попадают в dists/{distribution}/{component}/binary-{arch}/, для каждого дистрибутива — свой подписанный Release. Путь загрузки произвольный; pool/ — соглашение, а не требование.

Окно терминала
curl -u user:pass -T mypackage_1.0_amd64.deb \
"http://nora.example.com:4000/deb/myrepo/pool/mypackage_1.0_amd64.deb?distribution=trixie&component=main"

Пакеты с Architecture: all попадают в индекс каждой архитектуры своего дистрибутива (в binary-all, если других архитектур нет). DELETE по пути пакета удаляет его и перегенерирует индексы; опустевший дистрибутив удаляется. Невалидные .deb отклоняются.

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

Сопоставьте локальное имя репозитория upstream APT-репозиторию (каталогу, в котором лежит dists/):

[deb]
enabled = true
[deb.proxies]
debian = "https://deb.debian.org/debian"
internal = { url = "https://apt.internal.example.com/debian", auth = "user:pass" }

или NORA_DEB_PROXIES="debian=https://deb.debian.org/debian,internal=https://…|user:pass". Клиенты пишут deb [signed-by=…] http://nora.example.com:4000/deb/debian trixie main.

  • Проксирующий репозиторий только для чтения: PUT, DELETE и reindex отвечают 409.
  • Индексы upstream — dists/ вместе с InRelease / Release.gpg самого upstream — отдаются как есть и обновляются через metadata_ttl секунд (по умолчанию 300). Проверяйте их ключом upstream в signed-by (например, связкой ключей архива дистрибутива), а не ключом NORA.
  • Пакеты кешируются навсегда при первом скачивании.
  • Когда upstream недоступен, отдаётся устаревшая копия из кеша с заголовком x-nora-stale: true.

nora mirror deb скачивает через NORA все пакеты проксируемого репозитория, чтобы клиенты в закрытом контуре ставили пакеты без upstream:

Окно терминала
nora mirror --registry http://nora.example.com:4000 deb --repo debian --dist trixie --component main --arch amd64

Для плоского upstream --dist не указывайте; --component и --arch по умолчанию берут всё, что перечислено в файле Release.

config.toml:

[deb]
enabled = true
max_file_size = 1073741824 # 1 ГиБ
proxy_timeout = 30
metadata_ttl = 300

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

ПеременнаяОписаниеПо умолчанию
NORA_DEB_ENABLEDВключить реестр Debian/APTfalse
NORA_DEB_MAX_FILE_SIZEМаксимальный размер загружаемого .deb в байтах1073741824 (1 ГиБ)
NORA_DEB_PROXIESПроксирующие репозитории: name=url[|user:pass],…—
NORA_DEB_PROXY_TIMEOUTТаймаут upstream в секундах30
NORA_DEB_METADATA_TTLСколько секунд метаданные upstream считаются свежими (0 и меньше — ревалидировать при каждом запросе)300

Индексы собственных репозиториев подписываются при каждой перегенерации (InRelease — clearsign, Release.gpg — отдельная подпись; в структурированной раскладке — для каждого дистрибутива). Открытый ключ в armored-виде отдаётся по pubkey.gpg в каждом собственном репозитории. Ключ и настройки NORA_SIGNING_* общие с RPM.

ФункцияСтатусПримечание
Загрузка пакета (PUT)ПолнаяControl разбирается и проверяется; индексы перегенерируются
Скачивание пакета (GET)ПолнаяБайт в байт
Удаление (DELETE)ПолнаяИндексы перегенерируются; пустые дистрибутивы удаляются
Плоская раскладка (deb … ./)ПолнаяPackages, Packages.gz, Release в корне репозитория
Структурированная раскладка (dists/)Полная?distribution=…&component=… при загрузке
Подписанные индексы (InRelease / Release.gpg)ПолнаяПроверка через signed-by
Открытый ключ (pubkey.gpg)ПолнаяArmored
Согласование (POST {repo}/-/reindex)ПолнаяЧинит изменения хранилища в обход NORA
Проксирование upstreamПолная[deb.proxies], только чтение, устаревшая копия при сбое
Офлайн-зеркалоПолнаяnora mirror deb
by-hash—Не генерируется; индексы отдаются с Cache-Control: no-cache
Индексы Translations / Contents—Для собственных репозиториев не генерируются (проксирующие отдают их от upstream)
  • Отключён по умолчанию. Установите NORA_DEB_ENABLED=true для активации.
  • Проксирующий репозиторий соответствует ровно одному upstream-репозиторию; публиковать в него нельзя.
  • Распаковка control.tar.{gz,xz,zst} пакета ограничена по размеру; слишком большой control-архив отклоняется.