Debian / APT
NORA обслуживает APT-репозитории для apt. Каждый {repo} под /deb/ — независимый репозиторий одного из двух видов:
- Собственный (hosted) — пакеты публикуете вы. При
PUTфайла.debNORA разбирает его control-параграф на сервере (dpkg-scanpackagesне нужен) и перегенерирует все затронутые индексы, подписанные ключом экземпляра. Собственный репозиторий может использовать плоскую раскладку, структурированную раскладкуdists/или обе — выбор делается для каждого пакета при загрузке. - Проксирующий (pull-through) — имя репозитория, сопоставленное одному upstream APT-репозиторию в
[deb.proxies]. Только чтение; см. Проксирование upstream.
Настройка клиента
Заголовок раздела «Настройка клиента»Скачайте ключ подписи и добавьте репозиторий. Ключ отдаётся в armored-виде, а signed-by принимает его как файл .asc:
sudo mkdir -p /etc/apt/keyringscurl -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
Заголовок раздела «Проксирование upstream»Сопоставьте локальное имя репозитория 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 = truemax_file_size = 1073741824 # 1 ГиБproxy_timeout = 30metadata_ttl = 300Переменные окружения:
| Переменная | Описание | По умолчанию |
|---|---|---|
NORA_DEB_ENABLED | Включить реестр Debian/APT | false |
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-архив отклоняется.