Configuration
See the deployment guides for container, Linux, Kubernetes, identity and recovery setup.
Demo and persistent server
go run ./cmd/server -demobinds to loopback by default.- It uses synthetic in-memory data and disables external integrations.
- Its
admin/adminUI sign-in does not protect an API deployment. Keep it local.
- For a persistent single tenant, set
DATABASE_URLand a randomAPI_TOKENof at least 24 characters.- Compose reads
.env; a native process reads only its inherited environment. - Use a URL-safe PostgreSQL password in the Compose example because it is interpolated into a connection URL.
- Back up the volume before changing or upgrading data handling.
- The public MVP does not promise zero-downtime upgrades.
- Compose reads
- Set
PROMETHEUS_URLand optionallyPROMETHEUS_BEARER_TOKEN, or useMIMIR_URL,MIMIR_TENANT_IDand optional Mimir authentication.- Do not configure both legacy primary provider modes. Sources and rule destinations are administrator-owned.
- Configure actual metrics and selectors explicitly; the platform does not invent instrumentation.
Tenant boundaries
- Use
TENANTS_FILEor-tenants-filewithexamples/tenants.yamlfor multiple workspaces. Give every tenant independent storage/source configuration.- Clients select an authorized tenant with
X-Nines-Tenant. - The server fixes provider credentials and Mimir organization headers; resources and model output cannot override them.
- Up to 20 named connections plus a primary source are supported per tenant.
- Clients select an authorized tenant with
- Owners administer tenant access and deployment.
- Editors can change definitions; viewers read; agent roles prepare bounded proposals within their allowed surface.
- Do not issue an owner token to an agent to bypass approval restrictions.
- Project/service labels do not grant access to another tenant.
Identity and CLI login
- The browser sign-in page is
/login.- Workspace pages use
/tenants/<tenant>/<page>and can be bookmarked or reloaded. - See portal URLs and browser sessions for reverse-proxy paths, safe sign-in return handling and credential storage.
- Workspace pages use
- Set
AUTH_CONFIG_FILEor-auth-fileusingexamples/auth.yaml. Use HTTPS forpublicURLoutside loopback.- OIDC providers use discovery, signed ID tokens, state, nonce and PKCE.
- LDAP supports configured TLS/StartTLS trust.
examples/auth-entra.yamlshows Microsoft Entra ID OIDC and explicit group/app-role mapping. - Native SAML, SCIM and directory synchronization are not implemented; a SAML upstream needs an OIDC broker.
- Authentication alone grants no tenant access.
- Direct membership, teams and current verified SSO evidence determine the role on each request.
- OIDC claim freshness limits bound stale upstream grants; this is not continuous access evaluation.
- Configure a recovery owner and keep provider IDs stable.
- The CLI reads
NINES_API_KEY, withAPI_TOKENas an alias.- Browser login issues a short-lived single-tenant Nines credential, not an identity-provider token.
- It reuses the configured provider and current roles. See CLI authentication and storage.
Optional outbound integrations
ALERT_WEBHOOK_URLenables at-least-once delivery of alert transitions.- Deduplicate the stable event ID at the receiver.
- Configure standard
OTEL_*variables to export server telemetry. - Browser OTLP settings are build-time
VITE_*configuration and are empty by default. - Do not put a private server credential in browser configuration.
- Models are optional.
- Intent/review model calls require explicit workflow consent and trusted provider configuration.
- The first-release core does not require OpenAI, Anthropic, Gemini or a local model.
- Review destinations and data sharing before enabling any of them.
- The intent evaluation guide documents provider/key variables, local Ollama and vLLM endpoints, repeatable checks and measured model limitations.
- Optional System One advice with Jev uses a separate tenant
systemOneconfiguration and per-runsystemOneConsent.- A Jev key alone enables no calls.
- Guided preparation can use this advisory assessment without a generative model.
Platform administrators
- Configure exact provider/subject identities under authentication
platformAdminsto enable the admin console.- Platform administration is separate from tenant ownership and does not grant implicit tenant data access.
- The console manages users, direct memberships, session revocation and per-tenant Jev request policies with an independent platform audit trail.
Local users
- A configured
localprovider enables server-authenticated username/password sign-in alongside OIDC/LDAP and API credentials. Seeexamples/auth-local.yaml.- Bootstrap passwords come from environment variables, are hashed with bcrypt cost 12, and are seeded only when absent.
- Passwords require 12–72 bytes and are never returned by APIs.
- The loopback playground explicitly enables
allowDemoCredentialsfor itsadmin/adminbootstrap account only; remote public URLs and other short passwords are rejected. - Changing a password increments the session epoch, revoking existing browser and CLI sessions.
- Configure HTTPS outside loopback and retain a recovery owner.
- Tenant owners use Access control → Users to create local identities and tenant membership, edit profiles/passwords, change roles and remove tenant access. External-provider passwords remain with that provider.
- Shared local profile/password edits require ownership of every tenant the user can access; last-owner protections and revision checks apply.
- Usernames are unique per local provider across the server.
- The API does not delete a shared global identity when removing one tenant membership.
Managed telemetry connections
- Set
NINES_SOURCE_HOSTSto a comma-separated list of exact approved hostnames to enable Telemetry connections → Add telemetry connection for tenant owners.- Set a private base64 32-byte
NINES_SOURCE_ENCRYPTION_KEYto permit bearer credentials; keep it outside source control and back it up separately from the database. - The encrypted tokens are never included in GET responses.
- Leaving a token blank on edit preserves it; clearing it is explicit.
- Managed sources are stored in the tenant's PostgreSQL schema and restored on startup.
- Set a private base64 32-byte
- Mimir organization IDs must already be authorized by the tenant's trusted YAML source configuration.
- Clients cannot select an arbitrary upstream organization.
- Managed Prometheus rule files use only
NINES_MANAGED_RULE_DIRECTORY; callers cannot choose filesystem paths. Rule namespaces are server-assigned. - Configure a shared mount,
rule_filesand a reload mechanism as described in the metrics guide. The playground includes that mechanism.
- YAML-configured sources remain read-only through HTTP.
- Managed identity edits/deletions are refused while referenced by SLOs or measurement bindings.
- Credential rotation is allowed without changing dataset identity.
- Run one collecting server; this registry does not implement cross-replica configuration invalidation.
- Keep the host/org policy and encryption key available across restarts; changing them can prevent persisted connections from loading.
- Changing or deleting a connection does not retire previously deployed external rule groups.
- Before moving an SLO to another connection, retire its old rules using the configured backend and verify they are no longer evaluating.
- Connection deletion is blocked while an SLO or measurement binding still references it.
Automatic rule delivery
rules.autoDeploy: trueis an owner opt-in per static or managed source.- Direct Prometheus sources additionally require
rules.reload: true, a writable/sharedrules.directory, a matching Prometheusrule_filesmount and lifecycle enablement. Mimir uses its pinned ruler URL/namespace/organization. - Portal operator mode can publish automatically too.
- The managed source API accepts
autoDeploy; the portal exposes the same setting. Existing non-playground sources default to manual. - Read automatic rules for retries, pause/resume, status and deployment limits.
- Direct Prometheus sources additionally require
Extension catalogs
- An administrator can provide
nines-server -extension-lock /etc/nines/extensions.lock.yamlfor a shared catalog, orsloExtensionLockin individual tenant configurations for private catalogs.- Relative tenant lock paths resolve against the tenant configuration file. These options cannot be combined.
- Only pinned local artifacts load at startup; corrupted/missing content fails startup, and no registry is contacted by rendering.
- See SLO extensions for installation, read-only deployment mounts and upgrades.