Skip to content

Configuration Reference

NORA uses a layered configuration model with three levels of priority:

  1. Environment variables (highest priority)
  2. config.toml file
  3. Built-in defaults (lowest priority)

Config file resolution order:

  • NORA_CONFIG_PATH env var (fatal error if set but file not found)
  • config.toml in the current working directory (optional)
  • Built-in defaults if no file is found

VariableDefaultDescription
NORA_HOST127.0.0.1Bind address
NORA_PORT4000Listen port
NORA_PUBLIC_URL(none)Public URL for pull commands (e.g., registry.example.com)
NORA_BODY_LIMIT_MB2048Maximum request body size in MB
NORA_CONFIG_PATH(none)Path to config.toml file
VariableDefaultDescription
NORA_STORAGE_MODElocalStorage backend: local or s3
NORA_STORAGE_PATHdata/storageLocal storage directory
NORA_STORAGE_S3_URLhttp://127.0.0.1:9000S3-compatible endpoint URL
NORA_STORAGE_BUCKETregistryS3 bucket name
NORA_STORAGE_S3_ACCESS_KEY(none)S3 access key
NORA_STORAGE_S3_SECRET_KEY(none)S3 secret key
NORA_STORAGE_S3_REGIONus-east-1S3 region
VariableDefaultDescription
NORA_AUTH_ENABLEDfalseEnable authentication
NORA_AUTH_ANONYMOUS_READfalseAllow unauthenticated read (pull) access
NORA_AUTH_HTPASSWD_FILEusers.htpasswdPath to htpasswd file
NORA_AUTH_TOKEN_STORAGEdata/tokensDirectory for API token storage
VariableDefaultDescription
NORA_DOCKER_ENABLEDtrueEnable Docker (OCI) registry
NORA_MAVEN_ENABLEDtrueEnable Maven registry
NORA_NPM_ENABLEDtrueEnable npm registry
NORA_CARGO_ENABLEDtrueEnable Cargo (Rust) registry
NORA_PYPI_ENABLEDtrueEnable PyPI (Python) registry
NORA_GO_ENABLEDtrueEnable Go module proxy
NORA_RAW_ENABLEDtrueEnable raw file storage
NORA_GEMS_ENABLEDfalseEnable RubyGems registry
NORA_TERRAFORM_ENABLEDfalseEnable Terraform provider registry
NORA_ANSIBLE_ENABLEDfalseEnable Ansible Galaxy registry
NORA_NUGET_ENABLEDfalseEnable NuGet registry
NORA_PUB_ENABLEDfalseEnable Dart/Flutter pub registry
NORA_CONAN_ENABLEDfalseEnable Conan (C/C++) registry
VariableDefaultDescription
NORA_MAVEN_PROXIEShttps://repo1.maven.org/maven2Upstream proxies. Format: url1,url2 or url1|auth1,url2|auth2
NORA_MAVEN_PROXY_TIMEOUT30Proxy timeout in seconds
NORA_MAVEN_CHECKSUM_VERIFYtrueVerify uploaded checksums against server-computed values
NORA_MAVEN_IMMUTABLE_RELEASEStruePrevent overwriting released (non-SNAPSHOT) artifacts
VariableDefaultDescription
NORA_NPM_PROXYhttps://registry.npmjs.orgUpstream npm registry
NORA_NPM_PROXY_AUTH(none)Upstream auth (user:pass)
NORA_NPM_PROXY_TIMEOUT30Proxy timeout in seconds
NORA_NPM_METADATA_TTL300Metadata cache TTL in seconds (0 = cache forever)
VariableDefaultDescription
NORA_PYPI_PROXYhttps://pypi.org/simple/Upstream PyPI registry
NORA_PYPI_PROXY_AUTH(none)Upstream auth (user:pass)
NORA_PYPI_PROXY_TIMEOUT30Proxy timeout in seconds
VariableDefaultDescription
NORA_DOCKER_PROXIEShttps://registry-1.docker.ioUpstream registries. Format: url1,url2 or url1|auth1,url2|auth2
NORA_DOCKER_PROXY_TIMEOUT60Proxy timeout in seconds
VariableDefaultDescription
NORA_GO_PROXYhttps://proxy.golang.orgUpstream Go module proxy
NORA_GO_PROXY_AUTH(none)Upstream auth (user:pass)
NORA_GO_PROXY_TIMEOUT30Proxy timeout in seconds
NORA_GO_PROXY_TIMEOUT_ZIP120Timeout for .zip downloads in seconds
NORA_GO_MAX_ZIP_SIZE104857600Maximum module zip size in bytes (default 100MB)
VariableDefaultDescription
NORA_CARGO_PROXYhttps://crates.ioUpstream Cargo registry
NORA_CARGO_PROXY_AUTH(none)Upstream auth (user:pass)
NORA_CARGO_PROXY_TIMEOUT30Proxy timeout in seconds
VariableDefaultDescription
NORA_RAW_MAX_FILE_SIZE104857600Maximum file size in bytes (default 100MB)
VariableDefaultDescription
NORA_GEMS_PROXYhttps://rubygems.orgUpstream RubyGems registry
NORA_GEMS_PROXY_AUTH(none)Upstream auth (user:pass)
NORA_GEMS_PROXY_TIMEOUT30Proxy timeout in seconds
NORA_GEMS_INDEX_TTL300Index cache TTL in seconds
VariableDefaultDescription
NORA_TERRAFORM_PROXYhttps://registry.terraform.ioUpstream Terraform registry
NORA_TERRAFORM_PROXY_AUTH(none)Upstream auth (user:pass)
NORA_TERRAFORM_PROXY_TIMEOUT30Proxy timeout in seconds
NORA_TERRAFORM_PROXY_TIMEOUT_DOWNLOAD120Timeout for binary downloads in seconds
VariableDefaultDescription
NORA_ANSIBLE_PROXYhttps://galaxy.ansible.comUpstream Galaxy server
NORA_ANSIBLE_PROXY_AUTH(none)Upstream auth (user:pass)
NORA_ANSIBLE_PROXY_TIMEOUT30Proxy timeout in seconds
VariableDefaultDescription
NORA_NUGET_PROXYhttps://api.nuget.orgUpstream NuGet API
NORA_NUGET_PROXY_AUTH(none)Upstream auth (user:pass)
NORA_NUGET_PROXY_TIMEOUT30Proxy timeout in seconds
NORA_NUGET_METADATA_TTL300Metadata cache TTL in seconds
VariableDefaultDescription
NORA_PUB_PROXYhttps://pub.devUpstream pub registry
NORA_PUB_PROXY_AUTH(none)Upstream auth (user:pass)
NORA_PUB_PROXY_TIMEOUT30Proxy timeout in seconds
VariableDefaultDescription
NORA_CONAN_PROXYhttps://center2.conan.ioUpstream Conan registry
NORA_CONAN_PROXY_AUTH(none)Upstream auth (user:pass)
NORA_CONAN_PROXY_TIMEOUT30Proxy timeout in seconds
NORA_CONAN_PROXY_TIMEOUT_DOWNLOAD120Timeout for binary downloads in seconds
NORA_CONAN_METADATA_TTL300Metadata cache TTL in seconds
VariableDefaultDescription
NORA_RATE_LIMIT_ENABLEDtrueEnable rate limiting
NORA_RATE_LIMIT_AUTH_RPS1Auth endpoint requests per second
NORA_RATE_LIMIT_AUTH_BURST5Auth endpoint burst size
NORA_RATE_LIMIT_UPLOAD_RPS200Upload requests per second
NORA_RATE_LIMIT_UPLOAD_BURST500Upload burst size
NORA_RATE_LIMIT_GENERAL_RPS100General requests per second
NORA_RATE_LIMIT_GENERAL_BURST200General burst size
VariableDefaultDescription
NORA_GC_ENABLEDfalseEnable background GC
NORA_GC_INTERVAL86400Interval in seconds between GC runs (default 24h)
NORA_GC_DRY_RUNfalseOnly report orphans without deleting
VariableDefaultDescription
NORA_RETENTION_ENABLEDfalseEnable background retention
NORA_RETENTION_INTERVAL86400Interval in seconds between runs (default 24h)
NORA_RETENTION_DRY_RUNfalseOnly report what would be deleted
VariableDefaultDescription
NORA_CURATION_MODEoffCuration mode: off, audit, enforce
NORA_CURATION_ON_FAILUREclosedBehavior on filter error: closed (block) or open (allow)
NORA_CURATION_ALLOWLIST_PATH(none)Path to allowlist JSON file
NORA_CURATION_BLOCKLIST_PATH(none)Path to blocklist JSON file
NORA_CURATION_BYPASS_TOKEN(none)Token to bypass curation checks
NORA_CURATION_REQUIRE_INTEGRITYfalseRequire integrity metadata in allowlist entries
NORA_CURATION_INTERNAL_NAMESPACES(none)Comma-separated glob patterns for internal namespaces
VariableDefaultDescription
NORA_SECRETS_PROVIDERenvSecrets provider: env, aws-secrets, vault, k8s
NORA_SECRETS_CLEAR_ENVfalseClear env vars after reading (env provider)

Below is a complete config.toml with all sections and their default values.

# =============================================================================
# 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.**"]

When the same setting is specified in multiple places, the highest-priority source wins:

ENV variable > config.toml > built-in default

For example, if config.toml sets port = 8080 but NORA_PORT=4000 is also set, NORA will listen on port 4000.


NORA warns at startup if credentials (proxy auth, S3 keys) are found in config.toml in plaintext. Best practice is to pass credentials via environment variables or a secrets provider:

Terminal window
# 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"

In Kubernetes, mount credentials from a Secret into the container environment instead of storing them in config.toml.