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

Справочник по конфигурации

NORA использует многоуровневую модель конфигурации с тремя уровнями приоритета:

  1. Переменные окружения (наивысший приоритет)
  2. Файл config.toml
  3. Встроенные значения по умолчанию (наименьший приоритет)

Порядок поиска конфигурационного файла:

  • Переменная окружения NORA_CONFIG_PATH (критическая ошибка, если задана, но файл не найден)
  • config.toml в текущей рабочей директории (необязательно)
  • Встроенные значения по умолчанию, если файл не найден

ПеременнаяПо умолчаниюОписание
NORA_HOST127.0.0.1Адрес привязки
NORA_PORT4000Порт прослушивания
NORA_PUBLIC_URL(нет)Публичный URL для команд pull (например, registry.example.com)
NORA_BODY_LIMIT_MB2048Максимальный размер тела запроса в МБ
NORA_CONFIG_PATH(нет)Путь к файлу config.toml
ПеременнаяПо умолчаниюОписание
NORA_STORAGE_MODElocalБэкенд хранилища: local или s3
NORA_STORAGE_PATHdata/storageДиректория локального хранилища
NORA_STORAGE_S3_URLhttp://127.0.0.1:9000URL S3-совместимого эндпоинта
NORA_STORAGE_BUCKETregistryИмя бакета S3
NORA_STORAGE_S3_ACCESS_KEY(нет)Ключ доступа S3
NORA_STORAGE_S3_SECRET_KEY(нет)Секретный ключ S3
NORA_STORAGE_S3_REGIONus-east-1Регион S3
ПеременнаяПо умолчаниюОписание
NORA_AUTH_ENABLEDfalseВключить аутентификацию
NORA_AUTH_ANONYMOUS_READfalseРазрешить неаутентифицированный доступ на чтение (pull)
NORA_AUTH_HTPASSWD_FILEusers.htpasswdПуть к файлу htpasswd
NORA_AUTH_TOKEN_STORAGEdata/tokensДиректория для хранения API-токенов
ПеременнаяПо умолчаниюОписание
NORA_DOCKER_ENABLEDtrueВключить реестр Docker (OCI)
NORA_MAVEN_ENABLEDtrueВключить реестр Maven
NORA_NPM_ENABLEDtrueВключить реестр npm
NORA_CARGO_ENABLEDtrueВключить реестр Cargo (Rust)
NORA_PYPI_ENABLEDtrueВключить реестр PyPI (Python)
NORA_GO_ENABLEDtrueВключить прокси модулей Go
NORA_RAW_ENABLEDtrueВключить хранилище необработанных файлов
NORA_GEMS_ENABLEDfalseВключить реестр RubyGems
NORA_TERRAFORM_ENABLEDfalseВключить реестр провайдеров Terraform
NORA_ANSIBLE_ENABLEDfalseВключить реестр Ansible Galaxy
NORA_NUGET_ENABLEDfalseВключить реестр NuGet
NORA_PUB_ENABLEDfalseВключить реестр Dart/Flutter pub
NORA_CONAN_ENABLEDfalseВключить реестр Conan (C/C++)
ПеременнаяПо умолчаниюОписание
NORA_MAVEN_PROXIEShttps://repo1.maven.org/maven2Вышестоящие прокси. Формат: url1,url2 или url1|auth1,url2|auth2
NORA_MAVEN_PROXY_TIMEOUT30Таймаут прокси в секундах
NORA_MAVEN_CHECKSUM_VERIFYtrueПроверять загруженные контрольные суммы по вычисленным на сервере значениям
NORA_MAVEN_IMMUTABLE_RELEASEStrueЗапретить перезапись выпущенных (не-SNAPSHOT) артефактов
ПеременнаяПо умолчаниюОписание
NORA_NPM_PROXYhttps://registry.npmjs.orgВышестоящий реестр npm
NORA_NPM_PROXY_AUTH(нет)Аутентификация вышестоящего реестра (user:pass)
NORA_NPM_PROXY_TIMEOUT30Таймаут прокси в секундах
NORA_NPM_METADATA_TTL300TTL кэша метаданных в секундах (0 = кэшировать навсегда)
ПеременнаяПо умолчаниюОписание
NORA_PYPI_PROXYhttps://pypi.org/simple/Вышестоящий реестр PyPI
NORA_PYPI_PROXY_AUTH(нет)Аутентификация вышестоящего реестра (user:pass)
NORA_PYPI_PROXY_TIMEOUT30Таймаут прокси в секундах
ПеременнаяПо умолчаниюОписание
NORA_DOCKER_PROXIEShttps://registry-1.docker.ioВышестоящие реестры. Формат: url1,url2 или url1|auth1,url2|auth2
NORA_DOCKER_PROXY_TIMEOUT60Таймаут прокси в секундах
ПеременнаяПо умолчаниюОписание
NORA_GO_PROXYhttps://proxy.golang.orgВышестоящий прокси модулей Go
NORA_GO_PROXY_AUTH(нет)Аутентификация вышестоящего реестра (user:pass)
NORA_GO_PROXY_TIMEOUT30Таймаут прокси в секундах
NORA_GO_PROXY_TIMEOUT_ZIP120Таймаут загрузки .zip в секундах
NORA_GO_MAX_ZIP_SIZE104857600Максимальный размер zip-архива модуля в байтах (по умолчанию 100 МБ)
ПеременнаяПо умолчаниюОписание
NORA_CARGO_PROXYhttps://crates.ioВышестоящий реестр Cargo
NORA_CARGO_PROXY_AUTH(нет)Аутентификация вышестоящего реестра (user:pass)
NORA_CARGO_PROXY_TIMEOUT30Таймаут прокси в секундах
ПеременнаяПо умолчаниюОписание
NORA_RAW_MAX_FILE_SIZE104857600Максимальный размер файла в байтах (по умолчанию 100 МБ)
ПеременнаяПо умолчаниюОписание
NORA_GEMS_PROXYhttps://rubygems.orgВышестоящий реестр RubyGems
NORA_GEMS_PROXY_AUTH(нет)Аутентификация вышестоящего реестра (user:pass)
NORA_GEMS_PROXY_TIMEOUT30Таймаут прокси в секундах
NORA_GEMS_INDEX_TTL300TTL кэша индекса в секундах
ПеременнаяПо умолчаниюОписание
NORA_TERRAFORM_PROXYhttps://registry.terraform.ioВышестоящий реестр Terraform
NORA_TERRAFORM_PROXY_AUTH(нет)Аутентификация вышестоящего реестра (user:pass)
NORA_TERRAFORM_PROXY_TIMEOUT30Таймаут прокси в секундах
NORA_TERRAFORM_PROXY_TIMEOUT_DOWNLOAD120Таймаут загрузки бинарных файлов в секундах
ПеременнаяПо умолчаниюОписание
NORA_ANSIBLE_PROXYhttps://galaxy.ansible.comВышестоящий сервер Galaxy
NORA_ANSIBLE_PROXY_AUTH(нет)Аутентификация вышестоящего реестра (user:pass)
NORA_ANSIBLE_PROXY_TIMEOUT30Таймаут прокси в секундах
ПеременнаяПо умолчаниюОписание
NORA_NUGET_PROXYhttps://api.nuget.orgВышестоящий API NuGet
NORA_NUGET_PROXY_AUTH(нет)Аутентификация вышестоящего реестра (user:pass)
NORA_NUGET_PROXY_TIMEOUT30Таймаут прокси в секундах
NORA_NUGET_METADATA_TTL300TTL кэша метаданных в секундах
ПеременнаяПо умолчаниюОписание
NORA_PUB_PROXYhttps://pub.devВышестоящий реестр pub
NORA_PUB_PROXY_AUTH(нет)Аутентификация вышестоящего реестра (user:pass)
NORA_PUB_PROXY_TIMEOUT30Таймаут прокси в секундах
ПеременнаяПо умолчаниюОписание
NORA_CONAN_PROXYhttps://center2.conan.ioВышестоящий реестр Conan
NORA_CONAN_PROXY_AUTH(нет)Аутентификация вышестоящего реестра (user:pass)
NORA_CONAN_PROXY_TIMEOUT30Таймаут прокси в секундах
NORA_CONAN_PROXY_TIMEOUT_DOWNLOAD120Таймаут загрузки бинарных файлов в секундах
NORA_CONAN_METADATA_TTL300TTL кэша метаданных в секундах
ПеременнаяПо умолчаниюОписание
NORA_RATE_LIMIT_ENABLEDtrueВключить ограничение частоты запросов
NORA_RATE_LIMIT_AUTH_RPS1Запросов в секунду к эндпоинту аутентификации
NORA_RATE_LIMIT_AUTH_BURST5Размер всплеска для эндпоинта аутентификации
NORA_RATE_LIMIT_UPLOAD_RPS200Запросов на загрузку в секунду
NORA_RATE_LIMIT_UPLOAD_BURST500Размер всплеска для загрузки
NORA_RATE_LIMIT_GENERAL_RPS100Общих запросов в секунду
NORA_RATE_LIMIT_GENERAL_BURST200Размер всплеска для общих запросов
ПеременнаяПо умолчаниюОписание
NORA_GC_ENABLEDfalseВключить фоновую сборку мусора
NORA_GC_INTERVAL86400Интервал между запусками GC в секундах (по умолчанию 24 ч)
NORA_GC_DRY_RUNfalseТолько отчёт об orphan-объектах без удаления
ПеременнаяПо умолчаниюОписание
NORA_RETENTION_ENABLEDfalseВключить фоновые политики хранения
NORA_RETENTION_INTERVAL86400Интервал между запусками в секундах (по умолчанию 24 ч)
NORA_RETENTION_DRY_RUNfalseТолько отчёт о том, что будет удалено
ПеременнаяПо умолчаниюОписание
NORA_CURATION_MODEoffРежим курирования: off, audit, enforce
NORA_CURATION_ON_FAILUREclosedПоведение при ошибке фильтра: closed (блокировать) или open (разрешить)
NORA_CURATION_ALLOWLIST_PATH(нет)Путь к JSON-файлу списка разрешений
NORA_CURATION_BLOCKLIST_PATH(нет)Путь к JSON-файлу списка блокировки
NORA_CURATION_BYPASS_TOKEN(нет)Токен для обхода проверок курирования
NORA_CURATION_REQUIRE_INTEGRITYfalseТребовать метаданные целостности в записях списка разрешений
NORA_CURATION_INTERNAL_NAMESPACES(нет)Разделённые запятой glob-паттерны для внутренних пространств имён
ПеременнаяПо умолчаниюОписание
NORA_SECRETS_PROVIDERenvПровайдер секретов: env, aws-secrets, vault, k8s
NORA_SECRETS_CLEAR_ENVfalseОчищать переменные окружения после чтения (провайдер env)

Ниже приведён полный файл config.toml со всеми секциями и значениями по умолчанию.

# =============================================================================
# Server
# =============================================================================
[server]
host = "127.0.0.1"
port = 4000
# public_url = "registry.example.com"
body_limit_mb = 2048
# =============================================================================
# Storage
# =============================================================================
[storage]
mode = "local" # "local" or "s3"
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"
# =============================================================================
# Authentication
# =============================================================================
[auth]
enabled = false
anonymous_read = false
htpasswd_file = "users.htpasswd"
token_storage = "data/tokens"
# =============================================================================
# Secrets
# =============================================================================
[secrets]
provider = "env" # "env", "aws-secrets", "vault", "k8s"
clear_env = false
# =============================================================================
# Rate Limiting
# =============================================================================
[rate_limit]
enabled = true
auth_rps = 1
auth_burst = 5
upload_rps = 200
upload_burst = 500
general_rps = 100
general_burst = 200
# =============================================================================
# Docker (OCI) Registry
# =============================================================================
[docker]
enabled = true
proxy_timeout = 60
[[docker.upstreams]]
url = "https://registry-1.docker.io"
# auth = "user:pass"
# =============================================================================
# Maven Registry
# =============================================================================
[maven]
enabled = true
proxy_timeout = 30
checksum_verify = true
immutable_releases = true
proxies = ["https://repo1.maven.org/maven2"]
# Authenticated upstream example:
# [[maven.proxies]]
# url = "https://private.repo.com/maven2"
# auth = "user:pass"
# =============================================================================
# npm Registry
# =============================================================================
[npm]
enabled = true
proxy = "https://registry.npmjs.org"
# proxy_auth = "user:pass"
proxy_timeout = 30
metadata_ttl = 300
# =============================================================================
# Cargo (Rust) Registry
# =============================================================================
[cargo]
enabled = true
proxy = "https://crates.io"
# proxy_auth = "user:pass"
proxy_timeout = 30
# =============================================================================
# PyPI (Python) Registry
# =============================================================================
[pypi]
enabled = true
proxy = "https://pypi.org/simple/"
# proxy_auth = "user:pass"
proxy_timeout = 30
# =============================================================================
# Go Module Proxy
# =============================================================================
[go]
enabled = true
proxy = "https://proxy.golang.org"
# proxy_auth = "user:pass"
proxy_timeout = 30
proxy_timeout_zip = 120
max_zip_size = 104857600 # 100MB
# =============================================================================
# Raw File Storage
# =============================================================================
[raw]
enabled = true
max_file_size = 104857600 # 100MB
# =============================================================================
# RubyGems Registry
# =============================================================================
[gems]
enabled = false
proxy = "https://rubygems.org"
# proxy_auth = "user:pass"
proxy_timeout = 30
index_ttl = 300
# =============================================================================
# Terraform Provider Registry
# =============================================================================
[terraform]
enabled = false
proxy = "https://registry.terraform.io"
# proxy_auth = "user:pass"
proxy_timeout = 30
proxy_timeout_download = 120
# =============================================================================
# Ansible Galaxy Registry
# =============================================================================
[ansible]
enabled = false
proxy = "https://galaxy.ansible.com"
# proxy_auth = "user:pass"
proxy_timeout = 30
# =============================================================================
# NuGet Registry
# =============================================================================
[nuget]
enabled = false
proxy = "https://api.nuget.org"
# proxy_auth = "user:pass"
proxy_timeout = 30
metadata_ttl = 300
# =============================================================================
# Dart/Flutter Pub Registry
# =============================================================================
[pub_dart]
enabled = false
proxy = "https://pub.dev"
# proxy_auth = "user:pass"
proxy_timeout = 30
# =============================================================================
# Conan (C/C++) Registry
# =============================================================================
[conan]
enabled = false
proxy = "https://center2.conan.io"
# proxy_auth = "user:pass"
proxy_timeout = 30
proxy_timeout_download = 120
metadata_ttl = 300
# =============================================================================
# Garbage Collection
# =============================================================================
[gc]
enabled = false
interval = 86400 # 24 hours
dry_run = false
# =============================================================================
# Retention Policies
# =============================================================================
[retention]
enabled = false
interval = 86400 # 24 hours
dry_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 var
require_integrity = false
internal_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 credentials
export 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.