Справочник по конфигурации
NORA использует многоуровневую модель конфигурации с тремя уровнями приоритета:
- Переменные окружения (наивысший приоритет)
- Файл config.toml
- Встроенные значения по умолчанию (наименьший приоритет)
Порядок поиска конфигурационного файла:
- Переменная окружения
NORA_CONFIG_PATH(критическая ошибка, если задана, но файл не найден) config.tomlв текущей рабочей директории (необязательно)- Встроенные значения по умолчанию, если файл не найден
Переменные окружения
Заголовок раздела «Переменные окружения»| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_HOST | 127.0.0.1 | Адрес привязки |
NORA_PORT | 4000 | Порт прослушивания |
NORA_PUBLIC_URL | (нет) | Публичный URL для генерируемых ссылок на скачивание (например, https://registry.example.com). Обязателен при NORA_HOST=0.0.0.0 или при работе за reverse proxy, иначе клиенты получат недоступные URL в ответах Cargo, PyPI, npm, NuGet и Terraform. |
NORA_BODY_LIMIT_MB | 2048 | Максимальный размер тела запроса в МБ |
NORA_LOG_FILE | (нет) | Дополнительно писать логи в этот файл (дописывается; недостающие родительские директории создаются). Формат и уровень RUST_LOG те же, что у stdout, запись неблокирующая. Если файл не открывается, NORA предупреждает в stderr и пишет только в stdout. Пример: /var/log/nora/nora.log |
NORA_SHUTDOWN_TIMEOUT | 15 | Сколько секунд открытым запросам даётся на завершение после SIGTERM/SIGINT, прежде чем соединения закрываются и остановка продолжается. Держите значение ниже grace period оркестратора — при 30 с terminationGracePeriodSeconds в Kubernetes дефолт оставляет запас на 10-секундное ожидание фоновых планировщиков |
NORA_CONFIG_PATH | (нет) | Путь к файлу config.toml |
NORA_CONFIG_STRICT | false | Не запускаться, если в файле конфигурации есть ключи, которые не читает ни одна настройка (true/1). Выключено: неизвестные ключи только пишутся в лог |
NORA_TRUST_UPSTREAM_DATES | false | Доверять заголовкам upstream Last-Modified/Date при оценке свежести закешированных артефактов. По умолчанию выключено — NORA ставит своё время получения |
NORA_TLS_CA_CERT | (нет) | Путь к PEM-сертификату CA, который добавляется как доверенный корень для исходящего TLS от NORA к upstream (например, корпоративный TLS-инспектирующий прокси или частный реестр с внутренним CA) |
Хранилище
Заголовок раздела «Хранилище»| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_STORAGE_MODE | local | Бэкенд хранилища: local, s3 или gcs |
NORA_STORAGE_PATH | data/storage | Директория локального хранилища |
NORA_STORAGE_S3_URL | http://127.0.0.1:9000 | URL S3-совместимого эндпоинта |
NORA_STORAGE_BUCKET | registry | Имя бакета S3 |
NORA_STORAGE_S3_ACCESS_KEY | (нет) | Ключ доступа S3 |
NORA_STORAGE_S3_SECRET_KEY | (нет) | Секретный ключ S3 |
NORA_STORAGE_S3_REGION | us-east-1 | Регион S3 |
NORA_STORAGE_S3_VIRTUAL_HOSTED | false | Запросы S3 в virtual-hosted-стиле: NORA_STORAGE_S3_URL берётся как есть и уже должен содержать хост бакета (нужно провайдерам, которые отвергают path-style, например Alibaba Cloud OSS) |
NORA_STORAGE_GCS_SERVICE_ACCOUNT_PATH | (нет) | GCS: путь к JSON-ключу сервисного аккаунта. Не задан — учётные данные из окружения (GOOGLE_*, затем сервер метаданных инстанса) |
NORA_STORAGE_GCS_BASE_URL | (нет) | GCS: другой эндпоинт для эмуляторов или Private Google Access. Не задан — https://storage.googleapis.com. Значение http:// также отключает подпись запросов — только для эмуляторов |
Аутентификация
Заголовок раздела «Аутентификация»| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_AUTH_ENABLED | false | Включить аутентификацию |
NORA_AUTH_ANONYMOUS_READ | false | Разрешить неаутентифицированный доступ на чтение (pull) |
NORA_AUTH_HTPASSWD_FILE | users.htpasswd | Путь к файлу htpasswd |
NORA_AUTH_TOKEN_STORAGE | data/tokens | Директория для хранения API-токенов |
NORA_AUTH_DOCKER_ANON_PULL | false | Разрешить неаутентифицированный docker pull (отдельный переключатель, по умолчанию закрыт — NORA_AUTH_ANONYMOUS_READ Docker не открывает) |
NORA_AUTH_ADMIN_USERS | (нет) | Имена пользователей через запятую, которым выдаётся роль admin (резервный путь для начальной настройки; см. Аутентификация) |
NORA_AUTH_TOKEN_CACHE_TTL | 300 | TTL кэша проверки API-токенов в секундах |
NORA_AUTH_TRUSTED_PROXIES | 127.0.0.1,::1 | IP и CIDR через запятую, чьему заголовку X-Forwarded-For можно доверять |
NORA_AUTH_PUBLIC_WEB_UI | false | Отдавать веб-интерфейс и документацию API без аутентификации. Пробы здоровья публичны всегда |
NORA_AUTH_PUBLIC_METRICS | true | Отдавать /metrics без аутентификации. false — требовать аутентификацию и там |
NORA_AUTH_OIDC_ENABLED | false | Включить OIDC workload identity; провайдеры настраиваются в config.toml (см. Аутентификация, раздел на английском) |
Включение/отключение реестров
Заголовок раздела «Включение/отключение реестров»NORA_REGISTRIES_ENABLE выбирает реестры одной строкой (например, docker,npm,pypi или all); если она задана, отдельные флаги NORA_*_ENABLED ниже не действуют. all не включает прокси Hugging Face, который включается явно: all,hf добавляет его.
| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_DOCKER_ENABLED | true | Включить реестр Docker (OCI) |
NORA_MAVEN_ENABLED | true | Включить реестр Maven |
NORA_NPM_ENABLED | true | Включить реестр npm |
NORA_CARGO_ENABLED | true | Включить реестр Cargo (Rust) |
NORA_PYPI_ENABLED | true | Включить реестр PyPI (Python) |
NORA_GO_ENABLED | true | Включить прокси модулей Go |
NORA_RAW_ENABLED | true | Включить хранилище необработанных файлов |
NORA_GEMS_ENABLED | false | Включить реестр RubyGems |
NORA_TF_ENABLED | false | Включить реестр провайдеров Terraform |
NORA_ANSIBLE_ENABLED | false | Включить реестр Ansible Galaxy |
NORA_NUGET_ENABLED | false | Включить реестр NuGet |
NORA_PUB_ENABLED | false | Включить реестр Dart/Flutter pub |
NORA_CONAN_ENABLED | false | Включить реестр Conan (C/C++) |
NORA_RPM_ENABLED | false | Включить реестр RPM (yum/dnf) |
NORA_DEB_ENABLED | false | Включить реестр Debian/APT |
NORA_CPAN_ENABLED | false | Включить прокси CPAN |
NORA_HF_ENABLED | false | Включить прокси Hugging Face Hub (включается явно, в all не входит) |
| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_MAVEN_PROXIES | https://repo1.maven.org/maven2 | Вышестоящие прокси. Формат: url1,url2 или url1|auth1,url2|auth2 |
NORA_MAVEN_PROXY_TIMEOUT | 30 | Таймаут прокси в секундах |
NORA_MAVEN_CHECKSUM_VERIFY | true | Проверять загруженные контрольные суммы по вычисленным на сервере значениям |
NORA_MAVEN_IMMUTABLE_RELEASES | true | Запретить перезапись выпущенных (не-SNAPSHOT) артефактов |
NORA_MAVEN_METADATA_TTL | 300 | TTL кэша метаданных в секундах (0 и меньше — ревалидировать при каждом запросе) |
| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_NPM_PROXY | https://registry.npmjs.org | Вышестоящий реестр npm |
NORA_NPM_PROXY_AUTH | (нет) | Аутентификация вышестоящего реестра (user:pass) |
NORA_NPM_PROXY_TIMEOUT | 30 | Таймаут прокси в секундах |
NORA_NPM_METADATA_TTL | 300 | TTL кэша метаданных в секундах (0 — ревалидировать всегда, -1 — не истекает) |
NORA_NPM_SERVE_STALE | true | Отдавать устаревшие метаданные из кэша, когда upstream недоступен |
NORA_NPM_REVALIDATE | true | Перед отдачей метаданных из кэша ревалидировать их условным запросом (304) к upstream |
Несколько upstream npm по scope (npm.proxies, у каждого свои учётные данные) настраиваются только в config.toml — см. npm.
| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_PYPI_PROXY | https://pypi.org/simple/ | Вышестоящий реестр PyPI |
NORA_PYPI_PROXY_AUTH | (нет) | Аутентификация вышестоящего реестра (user:pass) |
NORA_PYPI_PROXY_TIMEOUT | 30 | Таймаут прокси в секундах |
NORA_PYPI_PROXIES | (нет) | Несколько upstream (через запятую url или url|auth); приоритетнее NORA_PYPI_PROXY |
| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_DOCKER_PROXIES | https://registry-1.docker.io | Вышестоящие реестры. Формат: url1,url2 или url1|auth1,url2|auth2 |
NORA_DOCKER_PROXY_TIMEOUT | 300 | Таймаут прокси в секундах |
NORA_DOCKER_DEFAULT_ACTION | allow | Действие для репозиториев без явного правила: allow (проксировать upstream) или deny |
NORA_MAX_UPLOAD_SESSIONS | 100 | Максимум одновременных сессий загрузки блобов; сверх него push получает 429 TOOMANYREQUESTS с Retry-After |
NORA_MAX_UPLOAD_SESSION_SIZE_MB | 2048 | Максимум данных на одну сессию загрузки в МБ |
NORA_DOCKER_UPSTREAMS | (нет) | Устаревший синоним NORA_DOCKER_PROXIES (действует, только если тот не задан; пишет предупреждение) |
Docker также читает NORA_DOCKER_METADATA_TTL, NORA_DOCKER_SERVE_STALE и NORA_DOCKER_READ_TIMEOUT — см. Docker-прокси.
| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_GO_PROXY | https://proxy.golang.org | Вышестоящий прокси модулей Go |
NORA_GO_PROXY_AUTH | (нет) | Аутентификация вышестоящего реестра (user:pass) |
NORA_GO_PROXY_TIMEOUT | 30 | Таймаут прокси в секундах |
NORA_GO_PROXY_TIMEOUT_ZIP | 120 | Таймаут загрузки .zip в секундах |
NORA_GO_MAX_ZIP_SIZE | 104857600 | Максимальный размер zip-архива модуля в байтах (по умолчанию 100 МБ) |
NORA_GO_METADATA_TTL | 300 | TTL кэша метаданных в секундах (0 и меньше — ревалидировать при каждом запросе) |
| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_CARGO_PROXY | https://crates.io | Вышестоящий реестр Cargo |
NORA_CARGO_PROXY_AUTH | (нет) | Аутентификация вышестоящего реестра (user:pass) |
NORA_CARGO_PROXY_TIMEOUT | 30 | Таймаут прокси в секундах |
NORA_CARGO_METADATA_TTL | 300 | TTL кэша метаданных в секундах (0 и меньше — ревалидировать при каждом запросе) |
| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_RAW_MAX_FILE_SIZE | 104857600 | Максимальный размер файла в байтах (по умолчанию 100 МБ) |
NORA_RAW_CACHE_CONTROL | no-cache | Заголовок Cache-Control для GET/HEAD ответов |
RubyGems
Заголовок раздела «RubyGems»| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_GEMS_PROXY | https://rubygems.org | Вышестоящий реестр RubyGems |
NORA_GEMS_PROXY_AUTH | (нет) | Аутентификация вышестоящего реестра (user:pass) |
NORA_GEMS_PROXY_TIMEOUT | 30 | Таймаут прокси в секундах |
NORA_GEMS_METADATA_TTL | 300 | TTL кэша индекса в секундах |
NORA_GEMS_SERVE_STALE | true | Отдавать устаревшие метаданные из кэша, когда upstream недоступен |
NORA_GEMS_REVALIDATE | true | Перед отдачей метаданных из кэша ревалидировать их условным запросом (304) к upstream |
Terraform
Заголовок раздела «Terraform»| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_TF_PROXY | https://registry.terraform.io | Вышестоящий реестр Terraform |
NORA_TF_PROXY_AUTH | (нет) | Аутентификация вышестоящего реестра (user:pass) |
NORA_TF_PROXY_TIMEOUT | 30 | Таймаут прокси в секундах |
NORA_TF_PROXY_TIMEOUT_DL | 120 | Таймаут загрузки бинарных файлов в секундах |
NORA_TF_METADATA_TTL | 300 | TTL кэша метаданных в секундах |
NORA_TF_SERVE_STALE | true | Отдавать устаревшие метаданные из кэша, когда upstream недоступен |
Ansible Galaxy
Заголовок раздела «Ansible Galaxy»| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_ANSIBLE_PROXY | https://galaxy.ansible.com | Вышестоящий сервер Galaxy |
NORA_ANSIBLE_PROXY_AUTH | (нет) | Аутентификация вышестоящего реестра (user:pass) |
NORA_ANSIBLE_PROXY_TIMEOUT | 30 | Таймаут прокси в секундах |
NORA_ANSIBLE_METADATA_TTL | 3600 | TTL кэша метаданных в секундах (0 — ревалидировать всегда, -1 — не истекает) |
NORA_ANSIBLE_SERVE_STALE | true | Отдавать устаревшие метаданные из кэша, когда upstream недоступен |
NORA_ANSIBLE_REVALIDATE | true | Перед отдачей метаданных из кэша ревалидировать их условным запросом (304) к upstream |
| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_NUGET_PROXY | https://api.nuget.org | Вышестоящий API NuGet |
NORA_NUGET_PROXY_AUTH | (нет) | Аутентификация вышестоящего реестра (user:pass) |
NORA_NUGET_PROXY_TIMEOUT | 30 | Таймаут прокси в секундах |
NORA_NUGET_METADATA_TTL | 300 | TTL кэша метаданных в секундах |
NORA_NUGET_METADATA_TIMEOUT | 2 | Таймаут в секундах для запросов service index и метаданных к upstream |
NORA_NUGET_SEARCH_SERVICE | https://azuresearch-usnc.nuget.org/query | URL сервиса поиска upstream |
NORA_NUGET_AUTOCOMPLETE | https://azuresearch-usnc.nuget.org/autocomplete | URL сервиса автодополнения upstream |
NORA_NUGET_SERVE_STALE | true | Отдавать устаревшие метаданные из кэша, когда upstream недоступен |
NORA_NUGET_REVALIDATE | true | Перед отдачей метаданных из кэша ревалидировать их условным запросом (304) к upstream |
Pub (Dart/Flutter)
Заголовок раздела «Pub (Dart/Flutter)»| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_PUB_PROXY | https://pub.dev | Вышестоящий реестр pub |
NORA_PUB_PROXY_AUTH | (нет) | Аутентификация вышестоящего реестра (user:pass) |
NORA_PUB_PROXY_TIMEOUT | 30 | Таймаут прокси в секундах |
NORA_PUB_METADATA_TTL | 300 | TTL кэша метаданных в секундах (0 — ревалидировать всегда, -1 — не истекает) |
NORA_PUB_SERVE_STALE | true | Отдавать устаревшие метаданные из кэша, когда upstream недоступен |
NORA_PUB_REVALIDATE | true | Перед отдачей метаданных из кэша ревалидировать их условным запросом (304) к upstream |
Conan (C/C++)
Заголовок раздела «Conan (C/C++)»| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_CONAN_PROXY | https://center2.conan.io | Вышестоящий реестр Conan |
NORA_CONAN_PROXY_AUTH | (нет) | Аутентификация вышестоящего реестра (user:pass) |
NORA_CONAN_PROXY_TIMEOUT | 30 | Таймаут прокси в секундах |
NORA_CONAN_PROXY_TIMEOUT_DL | 120 | Таймаут загрузки бинарных файлов в секундах |
NORA_CONAN_METADATA_TTL | 300 | TTL кэша метаданных в секундах |
NORA_CONAN_SERVE_STALE | true | Отдавать устаревшие метаданные из кэша, когда upstream недоступен |
NORA_CONAN_REVALIDATE | true | Перед отдачей метаданных из кэша ревалидировать их условным запросом (304) к upstream |
| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_RPM_MAX_FILE_SIZE | 1073741824 | Максимальный размер загружаемого .rpm в байтах (1 ГиБ) |
NORA_RPM_CHANGELOG_LIMIT | 10 | Записей changelog на пакет в other.xml |
NORA_RPM_PROXIES | (нет) | Проксирующие репозитории: name=url[|user:pass],… |
NORA_RPM_PROXY_TIMEOUT | 30 | Таймаут upstream в секундах |
NORA_RPM_METADATA_TTL | 300 | Сколько секунд метаданные upstream считаются свежими (0 и меньше — ревалидировать при каждом запросе) |
См. RPM.
Debian/APT
Заголовок раздела «Debian/APT»| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_DEB_MAX_FILE_SIZE | 1073741824 | Максимальный размер загружаемого .deb в байтах (1 ГиБ) |
NORA_DEB_PROXIES | (нет) | Проксирующие репозитории: name=url[|user:pass],… |
NORA_DEB_PROXY_TIMEOUT | 30 | Таймаут upstream в секундах |
NORA_DEB_METADATA_TTL | 300 | Сколько секунд метаданные upstream считаются свежими (0 и меньше — ревалидировать при каждом запросе) |
См. Debian/APT.
| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_CPAN_PROXY | https://www.cpan.org | Upstream-зеркало CPAN |
NORA_CPAN_PROXY_AUTH | (нет) | Аутентификация upstream (user:pass) |
NORA_CPAN_PROXY_TIMEOUT | 30 | Таймаут прокси в секундах |
NORA_CPAN_METADATA_TTL | 300 | TTL кэша индексов в секундах |
NORA_CPAN_SERVE_STALE | true | Отдавать устаревшую копию из кэша, когда upstream недоступен |
Hugging Face Hub
Заголовок раздела «Hugging Face Hub»| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_HF_PROXY | https://huggingface.co | Upstream Hub; пустое значение отключает upstream |
NORA_HF_PROXY_TIMEOUT | 30 | Таймаут прокси в секундах |
NORA_HF_CDN_HOSTS | hf.co,huggingface.co | Хосты, куда может вести редирект файла, через запятую: каждая запись и имена под ней |
См. Hugging Face Hub.
Подпись репозиториев
Заголовок раздела «Подпись репозиториев»| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_SIGNING_ENABLED | true | Подписывать индексы репозиториев RPM и Debian |
NORA_SIGNING_KEY_PATH | <storage>/.signing/nora.key | Секретный ключ OpenPGP в armored-виде. Обязателен на S3/GCS, иначе подпись выключается с предупреждением при старте |
Ограничение частоты запросов
Заголовок раздела «Ограничение частоты запросов»| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_RATE_LIMIT_ENABLED | true | Включить ограничение частоты запросов |
NORA_RATE_LIMIT_AUTH_RPS | 1 | Запросов в секунду к эндпоинту аутентификации |
NORA_RATE_LIMIT_AUTH_BURST | 5 | Размер всплеска для эндпоинта аутентификации |
NORA_RATE_LIMIT_UPLOAD_RPS | 200 | Запросов на загрузку в секунду |
NORA_RATE_LIMIT_UPLOAD_BURST | 500 | Размер всплеска для загрузки |
NORA_RATE_LIMIT_GENERAL_RPS | 100 | Общих запросов в секунду |
NORA_RATE_LIMIT_GENERAL_BURST | 200 | Размер всплеска для общих запросов |
Сборка мусора
Заголовок раздела «Сборка мусора»| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_GC_ENABLED | false | Включить фоновую сборку мусора |
NORA_GC_INTERVAL | 86400 | Интервал между запусками GC в секундах (по умолчанию 24 ч) |
NORA_GC_DRY_RUN | false | Только отчёт об orphan-объектах без удаления |
NORA_GC_GRACE | 604800 | Сколько секунд orphan-блоб выжидает, прежде чем его можно удалить (по умолчанию 7 дней; должно превышать самый долгий разрыв между загрузкой блоба и манифеста) |
NORA_GC_PROXY_CACHE_MAX_BYTES | 0 | Предел для закешированных через прокси пакетов RPM/Debian и файлов Hugging Face; сверх него GC удаляет самые старые файлы. 0 — без предела |
Политики хранения
Заголовок раздела «Политики хранения»| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_RETENTION_ENABLED | false | Включить фоновые политики хранения |
NORA_RETENTION_INTERVAL | 86400 | Интервал между запусками в секундах (по умолчанию 24 ч) |
NORA_RETENTION_DRY_RUN | false | Только отчёт о том, что будет удалено |
Правила retention задаются в config.toml (см. пример ниже). Правило может ограничить имена версий, которые оно удаляет, через include_tags: пустой или отсутствующий список рассматривает все имена, exclude_tags по-прежнему защищает совпавшие, и в бюджет keep_last входят только подходящие и не исключённые имена. Это правило оставляет десять новейших preview-тегов в каждом подходящем репозитории и удаляет старые только через 14 дней, считая от изменения объекта, а не от последнего обращения:
[[retention.rules]]registry = "docker"name_glob = "myapp*"include_tags = ["preview-*"]exclude_tags = ["preview-protected"]keep_last = 10older_than_days = 14Circuit breaker
Заголовок раздела «Circuit breaker»| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_CB_ENABLED | false | Включить circuit breaker для upstream |
NORA_CB_THRESHOLD | 5 | Сколько ошибок upstream подряд размыкают цепь |
NORA_CB_RESET_TIMEOUT | 30 | Через сколько секунд снова пробовать упавший upstream |
См. Circuit breaker.
Журнал аудита
Заголовок раздела «Журнал аудита»| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_AUDIT_LOG | file | Куда писать журнал аудита: file, stdout, both или off (см. Журнал аудита) |
Курирование
Заголовок раздела «Курирование»| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_CURATION_MODE | off | Режим курирования: off, audit, enforce |
NORA_CURATION_ON_FAILURE | closed | Поведение при ошибке фильтра: closed (блокировать) или open (разрешить) |
NORA_CURATION_ALLOWLIST_PATH | (нет) | Путь к JSON-файлу списка разрешений |
NORA_CURATION_BLOCKLIST_PATH | (нет) | Путь к JSON-файлу списка блокировки |
NORA_CURATION_BYPASS_TOKEN | (нет) | Токен для обхода проверок курирования |
NORA_CURATION_REQUIRE_INTEGRITY | false | Требовать метаданные целостности в записях списка разрешений |
NORA_CURATION_INTERNAL_NS | (нет) | Разделённые запятой glob-паттерны для внутренних пространств имён |
NORA_CURATION_MIN_RELEASE_AGE | (нет) | Глобальный мин. возраст релиза (7d, 12h, 2w) |
NORA_CURATION_NPM_MIN_RELEASE_AGE | (нет) | Мин. возраст релиза для npm |
NORA_CURATION_PYPI_MIN_RELEASE_AGE | (нет) | Мин. возраст релиза для PyPI |
NORA_CURATION_CARGO_MIN_RELEASE_AGE | (нет) | Мин. возраст релиза для Cargo |
NORA_CURATION_GO_MIN_RELEASE_AGE | (нет) | Мин. возраст релиза для Go |
NORA_CURATION_DOCKER_MIN_RELEASE_AGE | (нет) | Мин. возраст релиза для Docker |
NORA_CURATION_QUARANTINE | off | Режим карантина дайджестов для проксируемых артефактов: off, observe (записать и залогировать), enforce (блокировать неизвестные и ожидающие дайджесты) |
NORA_CURATION_QUARANTINE_TTL | (нет) | Срок карантина (7d, 12h), после которого проксируемый дайджест отпускается |
NORA_CURATION_DOCKER_QUARANTINE | (нет) | Режим карантина для Docker |
NORA_CURATION_DOCKER_QUARANTINE_TTL | (нет) | Срок карантина для Docker |
NORA_CURATION_<REGISTRY>_MIN_RELEASE_AGE | (наследуется) | Мин. возраст релиза для одного реестра, с глобальным значением или без него: NPM, PYPI, CARGO, GO, DOCKER, MAVEN, GEMS, TERRAFORM, ANSIBLE, NUGET, PUB, CONAN. Для RPM, DEB и CPAN при старте отвергается; на включённом прокси нужен карантин этого реестра |
NORA_CURATION_<REGISTRY>_QUARANTINE | (наследуется) | Режим карантина для отдельного реестра, те же имена |
NORA_CURATION_<REGISTRY>_QUARANTINE_TTL | (наследуется) | Срок карантина для отдельного реестра |
Секреты
Заголовок раздела «Секреты»| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_SECRETS_PROVIDER | env | Провайдер секретов: env, aws-secrets, vault, k8s |
NORA_SECRETS_CLEAR_ENV | false | Очищать переменные окружения после чтения (провайдер env) |
Справочник config.toml
Заголовок раздела «Справочник config.toml»Ниже приведён полный файл config.toml со всеми секциями и значениями по умолчанию.
# =============================================================================# Server# =============================================================================[server]host = "127.0.0.1"port = 4000# public_url = "https://registry.example.com" # Обязательно при host = 0.0.0.0 или за reverse proxybody_limit_mb = 2048
# =============================================================================# Storage# =============================================================================[storage]mode = "local" # "local", "s3" or "gcs"path = "data/storage"
# S3 settings (used when mode = "s3")s3_url = "http://127.0.0.1:9000"bucket = "registry"# s3_access_key = ""# s3_secret_key = ""s3_region = "us-east-1"# s3_virtual_hosted = false # true: s3_url already includes the bucket host
# GCS settings (used when mode = "gcs")# gcs_service_account_path = "/etc/nora/sa.json" # unset = ambient credentials
# =============================================================================# Authentication# =============================================================================[auth]enabled = falseanonymous_read = falsehtpasswd_file = "users.htpasswd"token_storage = "data/tokens"
# =============================================================================# Secrets# =============================================================================[secrets]provider = "env" # "env", "aws-secrets", "vault", "k8s"clear_env = false
# =============================================================================# Rate Limiting# =============================================================================[rate_limit]enabled = trueauth_rps = 1auth_burst = 5upload_rps = 200upload_burst = 500general_rps = 100general_burst = 200
# =============================================================================# Docker (OCI) Registry# =============================================================================[docker]enabled = trueproxy_timeout = 300
[[docker.upstreams]]url = "https://registry-1.docker.io"# auth = "user:pass"
# =============================================================================# Maven Registry# =============================================================================[maven]enabled = trueproxy_timeout = 30checksum_verify = trueimmutable_releases = trueproxies = ["https://repo1.maven.org/maven2"]
# Authenticated upstream example:# [[maven.proxies]]# url = "https://private.repo.com/maven2"# auth = "user:pass"
# =============================================================================# npm Registry# =============================================================================[npm]enabled = trueproxy = "https://registry.npmjs.org"# proxy_auth = "user:pass"proxy_timeout = 30metadata_ttl = 300# Несколько upstream по scope (вместо proxy/proxy_auth):# proxies = [# "https://registry.npmjs.org",# { url = "https://npm.vendor.example", scopes = ["@vendor"], auth_bearer_env = "VENDOR_NPM_TOKEN" },# ]
# =============================================================================# Cargo (Rust) Registry# =============================================================================[cargo]enabled = trueproxy = "https://crates.io"# proxy_auth = "user:pass"proxy_timeout = 30
# =============================================================================# PyPI (Python) Registry# =============================================================================[pypi]enabled = trueproxy = "https://pypi.org/simple/"# proxy_auth = "user:pass"proxy_timeout = 30
# =============================================================================# Go Module Proxy# =============================================================================[go]enabled = trueproxy = "https://proxy.golang.org"# proxy_auth = "user:pass"proxy_timeout = 30proxy_timeout_zip = 120max_zip_size = 104857600 # 100MB
# =============================================================================# Raw File Storage# =============================================================================[raw]enabled = truemax_file_size = 104857600 # 100MBcache_control = "no-cache"
# =============================================================================# RubyGems Registry# =============================================================================[gems]enabled = falseproxy = "https://rubygems.org"# proxy_auth = "user:pass"proxy_timeout = 30metadata_ttl = 300
# =============================================================================# Terraform Provider Registry# =============================================================================[terraform]enabled = falseproxy = "https://registry.terraform.io"# proxy_auth = "user:pass"proxy_timeout = 30proxy_timeout_dl = 120
# =============================================================================# Ansible Galaxy Registry# =============================================================================[ansible]enabled = falseproxy = "https://galaxy.ansible.com"# proxy_auth = "user:pass"proxy_timeout = 30
# =============================================================================# NuGet Registry# =============================================================================[nuget]enabled = falseproxy = "https://api.nuget.org"# proxy_auth = "user:pass"proxy_timeout = 30metadata_ttl = 300
# =============================================================================# Dart/Flutter Pub Registry# =============================================================================[pub_dart]enabled = falseproxy = "https://pub.dev"# proxy_auth = "user:pass"proxy_timeout = 30
# =============================================================================# Conan (C/C++) Registry# =============================================================================[conan]enabled = falseproxy = "https://center2.conan.io"# proxy_auth = "user:pass"proxy_timeout = 30proxy_timeout_dl = 120metadata_ttl = 300
# =============================================================================# RPM (yum/dnf) Registry# =============================================================================[rpm]enabled = falsemax_file_size = 1073741824 # 1 GiBchangelog_limit = 10proxy_timeout = 30metadata_ttl = 300# [rpm.proxies]# fedora = "https://dl.fedoraproject.org/pub/fedora/linux/releases/42/Everything/x86_64/os"
# =============================================================================# Debian/APT Registry# =============================================================================[deb]enabled = falsemax_file_size = 1073741824 # 1 GiBproxy_timeout = 30metadata_ttl = 300# [deb.proxies]# debian = "https://deb.debian.org/debian"
# =============================================================================# CPAN Proxy# =============================================================================[cpan]enabled = falseproxy = "https://www.cpan.org"proxy_timeout = 30metadata_ttl = 300serve_stale = true
# =============================================================================# Hugging Face Hub Proxy (opt-in, not in "all")# =============================================================================[hf]enabled = falseproxy = "https://huggingface.co" # "" disables the upstreamproxy_timeout = 30cdn_hosts = ["hf.co", "huggingface.co"] # where a file redirect may go
# =============================================================================# Repository Signing (RPM and Debian indexes)# =============================================================================[signing]enabled = true# key_path = "/etc/nora/signing.key" # required on S3/GCS storage
# =============================================================================# Garbage Collection# =============================================================================[gc]enabled = falseinterval = 86400 # 24 hoursdry_run = falsegrace_secs = 604800 # 7 daysproxy_cache_max_bytes = 0 # cap for proxy-cached RPM/Debian packages and Hugging Face files; 0 = no cap
# =============================================================================# Retention Policies# =============================================================================[retention]enabled = falseinterval = 86400 # 24 hoursdry_run = false
# Retention rules: registry = "*" applies to all formats# [[retention.rules]]# registry = "docker"# keep_last = 10# older_than_days = 90# exclude_tags = ["latest", "v*"]
# [[retention.rules]]# registry = "*"# older_than_days = 180
# =============================================================================# Curation (Package Access Control)# =============================================================================[curation]mode = "off" # "off", "audit", "enforce"on_failure = "closed" # "closed" (fail-safe) or "open" (fail-open)# allowlist_path = "/etc/nora/allowlist.json"# blocklist_path = "/etc/nora/blocklist.json"# bypass_token = "" # prefer NORA_CURATION_BYPASS_TOKEN env varrequire_integrity = falseinternal_namespaces = [] # e.g., ["@mycompany/**", "com.mycompany.**"]Приоритет конфигурации
Заголовок раздела «Приоритет конфигурации»Когда один и тот же параметр задан в нескольких местах, источник с наивысшим приоритетом имеет преимущество:
Переменная окружения > config.toml > встроенное значение по умолчаниюНапример, если в config.toml задано port = 8080, но также установлена переменная NORA_PORT=4000, NORA будет слушать порт 4000.
Безопасность учётных данных
Заголовок раздела «Безопасность учётных данных»NORA выдаёт предупреждение при запуске, если учётные данные (аутентификация прокси, ключи S3) обнаружены в config.toml в открытом виде. Рекомендуется передавать учётные данные через переменные окружения или провайдер секретов:
# Use env vars for credentialsexport NORA_STORAGE_S3_ACCESS_KEY="your-key"export NORA_STORAGE_S3_SECRET_KEY="your-secret"export NORA_DOCKER_PROXIES="https://registry-1.docker.io|user:pass"В Kubernetes монтируйте учётные данные из Secret в окружение контейнера вместо хранения их в config.toml.
Смотрите также
Заголовок раздела «Смотрите также»- Аутентификация — управление пользователями и API-токены
- Курирование — контроль доступа к пакетам
- Ограничение частоты запросов — настройка ограничений
- Развёртывание в продакшене — руководство по продакшен-развёртыванию