Configurazione¶
Nexo ha due livelli di configurazione:
- statica: letta all'avvio da flag, variabili d'ambiente
NEXO_*e un file JSON opzionale; cambiarla richiede un riavvio; - dinamica: sottosistemi chiave=valore salvati nel deployment (su tutti i nodi), modificabili a caldo
dalla console (Configurazione), da
nexoctl admin configo dall'Admin API (/api/v1/config).
Configurazione statica¶
Precedenza: flag > variabili d'ambiente > file --config > default. Ogni flag di nexo server ha la
sua variabile NEXO_<FLAG> (trattini → underscore, maiuscole), con le eccezioni indicate (--config è
NEXO_CONFIG_FILE, --dry-run non ha variabile). I valori di
tipo lista accettano più voci separate da virgola nelle variabili e flag ripetuti o separati da virgola
sulla riga di comando.
Credenziali e endpoint¶
| Variabile | Flag | Default | Descrizione |
|---|---|---|---|
NEXO_ROOT_USER / NEXO_ROOT_USER_FILE |
— | obbligatoria | Utente root (≥ 3 caratteri). Solo da ambiente o file, mai da flag |
NEXO_ROOT_PASSWORD / NEXO_ROOT_PASSWORD_FILE |
— | obbligatoria | Password root (≥ 8 caratteri). La variante _FILE vince sulla variabile semplice |
NEXO_ENDPOINTS |
argomenti di nexo server |
— | Dischi e nodi, separati da spazi (gli argomenti sulla riga di comando vincono). Vedi Modalità |
NEXO_CONFIG_FILE |
--config |
— | File JSON di configurazione (precedenza più bassa) |
Rete e URL pubblici¶
| Variabile | Flag | Default | Descrizione |
|---|---|---|---|
NEXO_ADDRESS |
--address |
:9000 |
Listener API S3 (anche health, metriche e RPC tra i nodi) |
NEXO_CONSOLE_ADDRESS |
--console-address |
:9001 |
Listener console e Admin API |
NEXO_REGION |
--region |
us-east-1 |
Regione S3 riportata ai client e usata nella firma |
NEXO_DOMAIN |
--domain |
— | Abilita le richieste virtual-host (<bucket>.<dominio>) |
NEXO_SERVER_URL |
--server-url |
— | URL pubblico S3 usato nei link presigned e di condivisione (dietro proxy) |
NEXO_BROWSER_REDIRECT_URL |
--browser-redirect-url |
— | URL pubblico della console |
NEXO_TRUSTED_PROXIES |
--trusted-proxies |
— | IP o CIDR dei reverse proxy fidati |
NEXO_FORWARDED_HEADERS |
--forwarded-headers |
x-forwarded |
Famiglia di header letta dai proxy fidati: x-forwarded (X-Forwarded-For/Proto/Host) o forwarded (RFC 7239) |
NEXO_TRUST_FORWARDED_HOST |
--trust-forwarded-host |
false |
Usa l'host inoltrato al posto dell'header Host (solo per proxy che lo riscrivono) |
NEXO_PROXY_PROTOCOL |
--proxy-protocol |
— | Listener che accettano il PROXY protocol v1/v2 dai proxy fidati: s3, console, web |
NEXO_WEB_ADDRESS |
--web-address |
— | Listener HTTP che serve solo le distribuzioni e le challenge ACME HTTP-01 (es. :80) |
NEXO_WEB_TLS_ADDRESS |
--web-tls-address |
— | Listener TLS delle sole distribuzioni, con i loro certificati per SNI (es. :443) |
NEXO_UNKNOWN_HOST |
--unknown-host |
path-style |
Risposta del listener S3 a un host sconosciuto: path-style (API S3) o misdirected (421) |
NEXO_S3_DISTRIBUTIONS |
--s3-distributions |
auto |
Distribuzioni servite anche dal listener S3: auto (solo se NEXO_SERVER_URL o NEXO_DOMAIN dichiarano i nomi dell'endpoint S3), on (opt-in esplicito), off (solo i listener web) |
NEXO_NO_DISTRIBUTIONS |
--no-distributions |
false |
Ripristino: nessun host instradato a una distribuzione su nessun listener (restano modificabili dall'Admin API) |
TLS¶
| Variabile | Flag | Default | Descrizione |
|---|---|---|---|
NEXO_CERTS_DIR |
--certs-dir |
— (HTTP) | Directory con public.crt e private.key (abilita TLS su tutti i listener), ricaricata a caldo |
NEXO_TLS_MIN_VERSION |
--tls-min-version |
1.2 |
Versione TLS minima: 1.2 o 1.3 |
NEXO_TLS_INTERNODE_VERIFY |
--tls-internode-verify |
false |
mTLS tra i nodi (endpoint https://) |
Dettagli in TLS e certificati.
Storage ed erasure coding¶
| Variabile | Flag | Default | Descrizione |
|---|---|---|---|
NEXO_STORAGE_CLASS_STANDARD |
--storage-class-standard |
automatico | Parità della classe STANDARD come EC:n (SNMD e cluster) |
NEXO_STORAGE_CLASS_RRS |
--storage-class-rrs |
EC:1 |
Parità della classe REDUCED_REDUNDANCY (al più quella di STANDARD) |
Accessi e distribuzioni¶
| Variabile | Flag | Default | Descrizione |
|---|---|---|---|
NEXO_ACCESS_RULES_MAX |
--access-rules-max |
200 |
Numero massimo di regole di accesso per bucket |
NEXO_KEY_NORMALIZATION |
--key-normalization |
nfc |
Normalizzazione Unicode delle chiavi confrontate dalle regole: nfc o none |
NEXO_BLOCK_PUBLIC_ACCESS |
--block-public-access |
false |
Block public access a livello di cluster (finché non viene cambiato a caldo) |
NEXO_BLOCK_PUBLIC_ACCESS_MODE |
--block-public-access-mode |
reject |
reject (regole pubbliche rifiutate al salvataggio) o ignore (ignorate in valutazione) |
NEXO_SECRET_<NOME> / NEXO_SECRET_<NOME>_FILE |
— | — | Segreti referenziati come ${secret:<nome>} da regole di accesso, origin secret e webhook (nome in minuscolo, - e _ equivalenti) |
NEXO_ACME_DIRECTORY |
--acme-directory |
Let's Encrypt | Directory ACME dei certificati automatici |
NEXO_ACME_EMAIL |
--acme-email |
— | Contatto dell'account ACME |
NEXO_ACME_CHALLENGE |
--acme-challenge |
http-01 |
http-01 (sul listener web) o tls-alpn-01 (sul listener web TLS) |
NEXO_ACME_CA_CERT |
--acme-ca-cert |
— | CA (PEM) di un server ACME privato |
NEXO_ACME_DNS_NAMESERVERS |
--acme-dns-nameservers |
— | nameserver (host[:porta], separati da virgola) interrogati dalla verifica di propagazione DNS-01 al posto di quelli autoritativi della zona (DNS split-horizon) |
Cache delle distribuzioni¶
| Variabile | Flag | Default | Descrizione |
|---|---|---|---|
NEXO_CACHE_DIR |
--cache-dir |
— (solo memoria) | Directory del livello su disco (SSD/NVMe separato dai dischi dati) |
NEXO_CACHE_SIZE |
--cache-size |
10GiB |
Dimensione del livello su disco (di quello in memoria senza --cache-dir) |
NEXO_CACHE_MEMORY |
--cache-memory |
256MiB |
Dimensione del livello in memoria |
NEXO_CACHE_MODE |
--cache-mode |
local |
In cluster: local, shared o shared+local |
NEXO_CACHE_WEBHOOK_ALLOW |
--cache-webhook-allow |
— | Reti interne raggiungibili dai webhook di purge (di default solo indirizzi pubblici) |
Le dimensioni accettano KiB, MiB, GiB, TiB (e KB, MB, GB, TB).
Cifratura (KMS e SSE)¶
| Variabile | Default | Descrizione |
|---|---|---|
NEXO_KMS_SECRET_KEY / _FILE |
— | Master key del KMS integrato: <nome>:<base64 di 32 byte> |
NEXO_KMS_SECRET_KEY_PREVIOUS / _FILE |
— | Master key sostituite (separate da virgola), solo per la rotazione |
NEXO_KMS_ENDPOINT |
— | URL https:// dei server KES (separati da virgola) |
NEXO_KMS_KEY_NAME |
— | Chiave di default su KES |
NEXO_KMS_CLIENT_CERT / NEXO_KMS_CLIENT_KEY |
— | Certificato e chiave client per l'mTLS verso KES |
NEXO_KMS_CAPATH |
radici di sistema | CA dei server KES (file o directory) |
NEXO_SSEC_ALLOW_INSECURE |
off |
Accetta chiavi SSE-C su HTTP in chiaro: solo test |
Solo da ambiente (nessun flag). Dettagli in KMS e SSE.
Log, metriche e tracing¶
| Variabile | Flag | Default | Descrizione |
|---|---|---|---|
NEXO_LOG_LEVEL |
--log-level |
info |
debug, info, warn, error (modificabile a caldo con il sottosistema logger) |
NEXO_LOG_FORMAT |
--log-format |
json |
json o text |
NEXO_PROMETHEUS_AUTH_TYPE |
— | jwt |
Endpoint /nexo/metrics/v1/*: jwt (bearer token) o public |
NEXO_OTEL_EXPORTER_OTLP_ENDPOINT |
— | — (disattivato) | Collector OpenTelemetry (http(s)://…) |
NEXO_OTEL_EXPORTER_OTLP_PROTOCOL |
— | http/protobuf |
http/protobuf o grpc |
NEXO_OTEL_TRACES_SAMPLER_ARG |
— | 1 |
Quota (0–1) delle tracce campionate |
Valgono anche le variabili standard OTEL_EXPORTER_OTLP_HEADERS, OTEL_EXPORTER_OTLP_TIMEOUT e
OTEL_EXPORTER_OTLP_CERTIFICATE. Vedi Monitoraggio e
Trace, log e audit.
Parametri avanzati del cluster (solo ambiente)¶
| Variabile | Default | Descrizione |
|---|---|---|
NEXO_LOCK_STALE_AFTER |
60s |
Dopo quanto un lock non più rinnovato da un nodo viene rilasciato |
NEXO_LOCK_REFRESH_INTERVAL |
10s |
Intervallo di rinnovo dei lock (minore di NEXO_LOCK_STALE_AFTER) |
NEXO_RPC_CALL_TIMEOUT |
30s |
Durata massima di una chiamata tra nodi |
NEXO_HEAL_RETRY_MAX_DELAY |
5m |
Attesa massima tra due tentativi di healing in background di un oggetto |
NEXO_CACHE_RESYNC_INTERVAL |
2m |
Ricarica periodica dello stato condiviso (IAM, policy, configurazione) su ogni nodo |
NEXO_SEND_TIMEOUT |
20s |
Dopo quanto una risposta il cui client ha smesso di leggere viene interrotta: download S3 e dei siti delle distribuzioni, console e Admin API, su tutti i listener; una connessione HTTP/2 che non accetta byte per lo stesso tempo viene chiusa con tutti i suoi stream |
File di configurazione¶
--config nexo.json (o NEXO_CONFIG_FILE) legge un documento JSON con le chiavi in camelCase dei flag;
le chiavi assenti restano ai default. Le credenziali root, i segreti e i parametri "solo ambiente" non si
possono mettere nel file.
{
"address": ":9000",
"consoleAddress": ":9001",
"region": "eu-south-1",
"serverUrl": "https://s3.example.com",
"browserRedirectUrl": "https://console.example.com",
"certsDir": "/etc/nexo/certs",
"trustedProxies": ["10.0.0.0/8"],
"logLevel": "info",
"logFormat": "json",
"endpoints": ["/mnt/disk{1...4}"],
"storageClassStandard": "EC:2",
"cacheDir": "/var/cache/nexo",
"cacheMode": "local"
}
Validare senza avviare¶
nexo server --dry-run applica la stessa precedenza, valida tutti i valori (credenziali, URL, CIDR,
parità, KMS, cache…), la topologia, i permessi dei dischi, le porte e i certificati, e stampa un
riepilogo; con un errore esce con codice diverso da zero e l'elenco di tutti i problemi trovati.
Configurazione dinamica¶
nexoctl admin config get local # tutti i sottosistemi
nexoctl admin config get local logger api # solo alcuni
nexoctl admin config set local logger level=debug # le altre chiavi restano
nexoctl admin config reset local logger # torna ai default
nexoctl admin config export local --output config.json
nexoctl admin config import local config.json
Le modifiche valgono per tutto il deployment (in cluster vengono propagate a tutti i nodi). I valori
sensibili (password, token, credenziali negli URL) sono mostrati mascherati; reinviare il valore
mascherato conserva quello salvato. Lo schema completo, con il default di ogni chiave e se il server la
applica, è su GET /api/v1/config/schema e nella pagina Configurazione della console.
| Sottosistema | Chiavi | Applicato a caldo |
|---|---|---|
logger |
level (debug…error), format (text, json) |
✅ |
api |
cors_allow_origin (default *), root_access (default on; off nega le credenziali root sull'API S3) |
✅ |
api |
requests_max (default 0: nessun limite), requests_deadline (default 10s): vedi Limiti di richieste |
✅ alla richiesta successiva |
ratelimit |
s3_ip, s3_access_key, s3_bucket, admin_ip, admin_user e i loro _burst: vedi Limiti di richieste |
✅ alla richiesta successiva |
scanner |
speed (fastest…slowest), cycle (default 1m) |
✅ all'inizio di ogni ciclo |
access |
block_public, block_public_mode (reject, ignore) |
✅ |
notify_webhook, notify_kafka, notify_nats, notify_amqp, notify_redis, notify_postgres (anche :<id>) |
enable, chiavi del target, queue_dir, queue_limit, comment |
✅ (vedi Eventi) |
audit_webhook, audit_kafka (anche :<id>) |
come i notify_* dello stesso tipo |
✅ (vedi Audit) |
browser |
session_duration (12h), upload_max_size |
❌ non ancora applicati |
region |
name, comment |
❌ la regione effettiva è quella di --region |
nexoctl admin config set avvisa quando imposta una chiave non applicata (region.name is stored but not
applied yet by the server); la console la segnala allo stesso modo.
Limiti di richieste¶
Ogni nodo limita le richieste che serve con dei token bucket: una chiave ammette in media il suo valore in
richieste al secondo e il suo _burst (default: il valore stesso) tutte insieme. Sono tutte 0 per default:
nessun limite.
| Chiave | Limita | Risposta oltre la soglia |
|---|---|---|
ratelimit.s3_ip |
Richieste S3 di un indirizzo client (il client dietro i proxy fidati; IPv6 per rete /64) | 503 SlowDown (XML S3) |
ratelimit.s3_access_key |
Richieste S3 di una access key (richieste autenticate; le URL presigned contano sull'indirizzo e sul bucket) | 503 SlowDown |
ratelimit.s3_bucket |
Richieste S3 a un bucket, chiunque le invii | 503 SlowDown |
ratelimit.admin_ip |
Richieste all'Admin API di un indirizzo client (console e nexoctl admin) |
429 too_many_requests (problem+json) |
ratelimit.admin_user |
Richieste all'Admin API di un utente autenticato | 429 too_many_requests |
api.requests_max |
Richieste S3 servite insieme da un nodo; una richiesta oltre la soglia attende uno slot per api.requests_deadline |
503 SlowDown |
Ogni rifiuto porta Retry-After (secondi): gli SDK S3 ripetono le SlowDown con backoff. I probe di salute
(/nexo/health/*), le raccolte delle metriche (/nexo/metrics/*) e l'RPC tra i nodi non sono mai limitati; le
distribuzioni hanno un limite proprio. Le richieste rifiutate sono
contate in nexo_ratelimit_throttled_total{api,kind} e marcate nell'audit log (tag throttled con il tipo di
limite) e nella trace live (error: Service Unavailable (rate limit: ip)).
nexoctl admin config set local ratelimit s3_ip=200 s3_ip_burst=400 admin_ip=20
nexoctl admin config set local api requests_max=1024 requests_deadline=5s
nexoctl admin config reset local ratelimit
In un cluster i limiti sono per nodo. La configurazione è la stessa su ogni nodo (una modifica li raggiunge tutti subito), ma ogni nodo conta le proprie richieste: dietro un load balancer che distribuisce i client su N nodi il deployment ammette fino a N volte ciascun limite (un client che invia a un solo nodo incontra il limite di quel nodo). Dividi il limite voluto per il deployment per il numero dei nodi. Così il controllo resta locale (nessuna chiamata tra i nodi per richiesta) e continua a funzionare quando dei nodi cadono.