Skip to main content

Platform, Configuration & Security

Two changes here will stop a 2.0 server from behaving as expected with a 1.13 configuration: the LLM and embedding configuration move, and the new session limits.

LLM and embedding configuration moved

Breaking. Affects every deployment using semantic search, natural-language query, or any LLM feature.
Provider configuration is no longer nested inside elasticsearch.naturalLanguageSearch. It moves to a new top-level llmConfiguration block, with embeddings as a sub-section that reuses the same provider credentials.

Removed from naturalLanguageSearch

What remains under naturalLanguageSearch: semanticSearchEnabled, knnNumCandidatesMultiplier (new, default 2) and a new filterExtractor block.

The 2.0 shape

conf/openmetadata.yaml
The embedding provider might differ from the chat provider. Embeddings reuse the credentials from the provider blocks above.

Environment variable renames

The embedding-specific variables keep their names but move under llmConfiguration.embeddings.
BEDROCK_AWS_IAM_AUTH_ENABLED flips from false to true. Deployments that relied on the default being off, and supplied static keys, should confirm which credential chain is used.
LLM_ENABLED and LLM_PROVIDER gate the entire block. Both must be set before embeddings, or any other LLM feature, will run. Porting the credentials across without enabling the block leaves semantic search and NLQ switched off.
Unchanged: NATURAL_LANGUAGE_SEARCH_ENABLED, SEMANTIC_SEARCH_ENABLED, EMBEDDING_PROVIDER, MAX_CONCURRENT_EMBEDDING_REQUESTS, the COLLATE_NLQ_CACHE_* variables, and every *_EMBEDDING_MODEL_ID / *_EMBEDDING_DIMENSION variable.

Natural-language query settings consolidate

Breaking. The per-provider NLQ generation settings collapse into one set under filterExtractor.
providerClass now defaults to NoOpNLQService instead of a live provider, so NLQ filter extraction stays off until llmConfiguration is enabled. A deployment that relied on the old default will lose natural-language filtering until you set LLM_ENABLED and LLM_PROVIDER.
This configuration work applies to self-managed and BYOC deployments. On fully managed instances Collate applies it for you.
Port your configuration into llmConfiguration before upgrading. Semantic search silently degrades (the provider resolves to noop) rather than failing loudly if the block is missing.

Session management

Sessions are database-backed

Behavioural. Affects multi-pod deployments.
Collate 2.0 adds a user_session table so sessions survive pod restarts and are shared across pods. Previously each pod held its own in-memory session state, which caused spurious logouts behind a load balancer without sticky sessions.

Concurrent sessions are capped per user

Behavioural. Users will be logged out.
When the limit is exceeded, the least recently used active sessions are revoked. sessionExpiry now applies to all auth providers with a minimum of 3600 s. oidcConfiguration.sessionExpiry becomes a deprecated fallback.
Users who work across several browsers or devices, and service accounts driving many concurrent sessions, will start being silently signed out of the oldest sessions. Raise AUTHENTICATION_MAX_ACTIVE_SESSIONS_PER_USER if that is your pattern, but prefer bot tokens for automation.

Trusted redirect URIs are now required for the browser extension

Breaking. The Collate Chrome plugin will not complete login until its redirect URI is allow-listed.
Set it through the environment variable, or in the SSO configuration stored in the database. Each entry must match the requested URI exactly: scheme, host, port, path and query.

Additional trusted redirect URIs

Additive. additionalTrustedRedirectUris allows redirect URIs beyond the callback URL and the server’s own callbacks. Each entry must match the requested URI exactly. Intended for browser-extension logins.
Related SSO hardening: the server callback is trusted in the SAML redirect allowlist, SAML pending-session ids are carried in RelayState, and the OIDC login loop is hardened with an interactive fallback that preserves pending logins.

Admin test-login

Additive. POST /v1/system/security/test-login/validate-token validates a browser-obtained OIDC id_token against a candidate (unsaved) security configuration, so an admin can confirm a real login resolves the expected identity before saving.

LDAP

Additive. recursiveGroupMembership (default false) enables transitive group resolution for Active Directory nested groups.

Database connection timeouts changed

Behavioural. Long-running queries will now be cut off.
Any statement that previously ran for more than five minutes (a large reindex batch, a heavy Data Insights aggregation, an oversized CSV import) now aborts. Raise DB_QUERY_TIMEOUT_SECONDS, DB_POSTGRESQL_SOCKET_TIMEOUT or DB_MYSQL_SOCKET_TIMEOUT if you have legitimately long statements, and check upgrade logs for statement-timeout errors.

Server & logging configuration

HTTP/2 is available (opt-in)

Additive.
Both HTTP/2 modes are backwards compatible: HTTP/1.1 clients keep working on the same port. Worth enabling when browsers hit the server directly. Not worth it behind an HTTP/2-terminating load balancer.

Response compression enabled

Behavioural. server.gzip.enabled is now true. Responses above roughly 256 bytes are gzipped. Clients that mishandle Content-Encoding: gzip need Accept-Encoding: identity.

Logging hardening

Behavioural and security-relevant.
LOG_LEVEL sets the root logger, and at DEBUG the HTTP parser prints every request header verbatim, including Authorization: Bearer <jwt> and session cookies. Since DEBUG is exactly what support asks customers to enable, and those logs get attached to tickets, the Jetty logger is now pinned independently via JETTY_LOG_LEVEL. Audit entries are logged at INFO with an audit marker and routed to logs/audit.log, and a filter keeps them out of the console appender.
If you parsed audit entries out of stdout, read logs/audit.log instead. If you need Jetty debug output, set JETTY_LOG_LEVEL=DEBUG explicitly, and be aware of what it prints.

Object storage configuration expanded

Behavioural. Affects deployments using file attachments.
The objectStorage block gains full s3 and azure sub-sections:
  • S3: endpoint, bucket, region, credentials, IAM role, prefix path, SSE algorithm and KMS key.
  • Azure: container, connection string, managed identity and blob endpoint.
The default provider changes from NOOP to s3, but enabled still defaults to false, so nothing activates until you turn it on. This backs the new /v1/attachments API for uploaded assets. For MinIO, use provider s3 and point s3.endpoint at the MinIO server.

SCIM provisioning moves

Behavioural. SCIM provisioning is decoupled from SSO and now lives under Settings > Team and Users > Provisioning. The capability is unchanged. Only its location in Settings moved.

Hybrid Runner and AI Platform images are distroless

Breaking for anything that shells into these pods. The Hybrid Runner and AI Platform images now ship distroless: only the runtime and its dependencies, with no shell, package manager or standard Unix tooling.
kubectl exec ... -- /bin/sh into these pods no longer works. Move debugging to logs, metrics and ephemeral debug containers (kubectl debug). Init containers or sidecars that assumed a shell in the main image need reworking.

The 2.0.0 database migration

Plan a maintenance window.

New tables

Altered tables

  • background_jobs gains progress, total, result, error, message, cancelRequested, completedAt.
  • tag_usage gains metadata JSON.
  • audit_log_event gains search_text.
  • thread_entity is renamed to thread_entity_legacy.

Data migrations

Index additions

Many, including (deleted, name) and (deleted, serviceType) composites on all 13 service tables (for /v1/services/overview), name indexes on the new entity tables so the distributed reindex cursor runs index-only, and an execution-id index on the workflow instance state time series.
On clusters with tens of millions of rows, composite index creation on service and entity tables is the long pole of the migration. Size your maintenance window accordingly.

Dependency and CVE updates

Additive. Not breaking, but relevant to hardened deployments.
Backend: Jetty 12.1.10 (with the Jetty BOM imported so transitive modules follow), Netty 4.1.137.Final, BouncyCastle 1.85, jackson-databind 2.18.8, log4j 2.25.5, thrift 0.24.0, reactor-netty-http 1.2.18, tomcat-jdbc/juli 11.0.11, httpcore5 5.4.3, Redshift JDBC 2.2.2, Kubernetes client-java 25.0.1 and Apache Airflow 3.2.1. Frontend: ws 8.21.0, handlebars 4.5.2, js-yaml 5.2.2, fast-uri 3.1.5, nanoid 3.3.17 and brace-expansion 1.1.18 / 5.0.9. Other operationally relevant security fixes: test-connection workflow triggers are authorised, CSRF failures fail secure and retry on the next request, testDestination redacts destination configuration, and SCIM displayName synchronisation is fixed.