Confluence Connector - Configuration — Unique AI Documentation
Confluence Connector - Configuration
15 min read
Configuration Overview
The Confluence Connector uses a YAML-based tenant configuration file for all settings. The configuration file path is specified via the TENANT_CONFIG_PATH_PATTERN environment variable.
Environment Variables
The following environment variables control application-level behavior. They are set outside the tenant configuration YAML (typically in Helm connector.env).
| Variable | Default | Description |
|---|---|---|
NODE_ENV |
production |
Environment mode (development, production, test) |
PORT |
51349 |
HTTP port the application binds to |
LOG_LEVEL |
info |
Log verbosity: error, warn, info, debug. |
LOGS_DIAGNOSTICS_DATA_POLICY |
conceal |
Controls whether diagnostic data (emails, usernames, IDs) is logged in full (disclose) or partially masked (conceal). |
TENANT_CONFIG_PATH_PATTERN |
-- | Required; Glob pattern to tenant configuration YAML files |
OTEL_METRICS_EXPORTER |
-- | OpenTelemetry metrics exporter (e.g., prometheus). |
OTEL_EXPORTER_PROMETHEUS_HOST |
-- | Prometheus exporter bind host |
OTEL_EXPORTER_PROMETHEUS_PORT |
-- | Prometheus exporter bind port |
NODE_EXTRA_CA_CERTS |
-- | Path to a PEM file containing additional CA certificates for TLS verification if the pod's trust store doesn't have them |
MAX_HEAP_MB |
1920 (Helm) / 1024 (Docker) |
Node.js V8 max old space size in MB |
HEALTH_SYNC_HISTORY_SIZE |
5 |
Number of recent sync runs kept per tenant in the sliding window for health evaluation. |
HEALTH_SYNC_TENANT_FAILURE_THRESHOLD |
0.5 |
Per-tenant failure ratio (0--1) across the window that marks the service unhealthy when exceeded. |
HEALTH_CONNECTIVITY_TIMEOUT_MS |
3000 |
Timeout in milliseconds for each reachability ping used by the health endpoint. |
The following environment variables are typically loaded from Kubernetes Secrets:
| Variable | Description |
|---|---|
CONFLUENCE_CLIENT_SECRET |
OAuth 2.0 client secret (used when confluence.auth.mode is oauth_2lo) |
CONFLUENCE_PAT |
Personal Access Token (used when confluence.auth.mode is pat; Data Center below 10.1 only) |
ZITADEL_CLIENT_SECRET |
Zitadel client secret (required when unique.serviceAuthMode is external) |
PROXY_PASSWORD |
Proxy password (required when proxy authMode is username_password) |
Secret values in tenant YAML files are referenced via the os.environ/ prefix (e.g., os.environ/CONFLUENCE_CLIENT_SECRET).
Tenant Configuration File
File Naming and Loading
Tenant configuration files must follow the naming convention {tenant-name}-tenant-config.yaml. The tenant name is extracted from the filename by removing the -tenant-config.yaml suffix and must match the pattern ^[a-z0-9]+(-[a-z0-9]+)*$ (lowercase alphanumeric with hyphens). Duplicate tenant names cause a startup failure.
The connector loads all files matching the TENANT_CONFIG_PATH_PATTERN glob at startup. At least one file must match the pattern, and at least one tenant must have active or deleted status.
Tenant Status
Each tenant configuration file can include a top-level status field:
| Status | Default | Behavior |
|---|---|---|
active |
Yes | Tenant is loaded and sync jobs are scheduled |
inactive |
-- | Tenant config is validated but no sync jobs run |
deleted |
-- | Ingested content is deleted from the Unique knowledge base and sync is stopped |
Complete Example (Cloud + External Auth)
yaml
confluence:
instanceType: cloud
baseUrl: https://your-domain.atlassian.net
cloudId: your-cloud-id
auth:
mode: oauth_2lo
clientId: your-oauth-client-id
clientSecret: os.environ/CONFLUENCE_CLIENT_SECRET
apiRateLimitPerMinute: 100
ingestSingleLabel: ai-ingest
ingestAllLabel: ai-ingest-all
unique:
serviceAuthMode: external
zitadelOauthTokenUrl: https://auth.your-unique-instance.com/oauth/v2/token
zitadelProjectId: your-zitadel-project-id
zitadelClientId: confluence-connector
zitadelClientSecret: os.environ/ZITADEL_CLIENT_SECRET
ingestionServiceBaseUrl: https://ingestion.your-unique-instance.com
scopeManagementServiceBaseUrl: https://scope-management.your-unique-instance.com
apiRateLimitPerMinute: 100
processing:
concurrency: 1
scanIntervalCron: "*/15 * * * *"
ingestion:
ingestionMode: flat
scopeId: your-scope-id
storeInternally: enabled
pageIngestionConfig:
htmlConfig:
imageContentExtraction:
enabled: true
languageModel: your-kb-visual-llm
Complete Example (Data Center + Cluster-Local Auth)
yaml
confluence:
instanceType: data-center
baseUrl: https://confluence.your-company.com
auth:
mode: oauth_2lo
clientId: your-confluence-app-client-id
clientSecret: os.environ/CONFLUENCE_CLIENT_SECRET
apiRateLimitPerMinute: 50
ingestSingleLabel: ai-ingest
ingestAllLabel: ai-ingest-all
unique:
serviceAuthMode: cluster_local
serviceExtraHeaders:
x-company-id: your-company-id
x-user-id: your-user-id
ingestionServiceBaseUrl: http://node-ingestion.<namespace>:8091
scopeManagementServiceBaseUrl: http://node-scope-management.<namespace>:8094
apiRateLimitPerMinute: 100
processing:
concurrency: 1
scanIntervalCron: "0 */2 * * *"
## Confluence Connection Settings
The `confluence` section configures how the connector connects to the Confluence instance:
yaml
confluence: instanceType: cloud baseUrl: https://your-domain.atlassian.net cloudId: your-cloud-id auth: mode: oauth_2lo clientId: your-oauth-client-id clientSecret: os.environ/CONFLUENCE_CLIENT_SECRET apiRateLimitPerMinute: 100 ingestSingleLabel: ai-ingest ingestAllLabel: ai-ingest-all
| Field | Required | Default | Description |
| --- | --- | --- | --- |
| `instanceType` | Yes | -- | `cloud` or `data-center` |
| `baseUrl` | Yes | -- | Base URL of the Confluence instance (e.g., `https://acme.atlassian.net`). Must not end with a trailing slash |
| `cloudId` | Yes (Cloud only) | -- | Atlassian Cloud ID (UUID) for the Confluence site |
| `auth` | Yes | -- | Authentication configuration |
| `apiRateLimitPerMinute` | Yes | -- | Number of Confluence API requests allowed per minute |
| `ingestSingleLabel` | Yes | -- | Confluence label that marks individual pages for synchronization |
| `ingestAllLabel` | Yes | -- | Confluence label that marks a page and all its descendants for synchronization |
**Important:**`ingestSingleLabel` and `ingestAllLabel` are required fields with no schema default. Operators must explicitly configure them.
**Important:**`apiRateLimitPerMinute` is a required field with no schema default. Atlassian recommends Data Center admins allow at least 20 requests/second (1200 RPM).
### Authentication
For full details on authentication setup, credential management, secret resolution, and token flows, see [Authentication].
### Space Scanning
The connector discovers pages via Confluence Query Language (CQL) label searches. Only pages in the following space types are scanned:
| Instance Type | Space Types Scanned |
| --- | --- |
| Cloud | `global`, `collaboration` |
| Data Center | `global` |
## Unique Platform Settings
The `unique` section configures how the connector communicates with the Unique platform. The field for selecting the auth mode is `serviceAuthMode` (not `authMode`).
yaml
unique:
serviceAuthMode: cluster_local
ingestionServiceBaseUrl: http://node-ingestion.
| Field | Required | Default | Description |
| --- | --- | --- | --- |
| `serviceAuthMode` | Yes | -- | `cluster_local` or `external` |
| `ingestionServiceBaseUrl` | Yes | -- | Base URL for the Unique ingestion service. Must not end with a trailing slash |
| `scopeManagementServiceBaseUrl` | Yes | -- | Base URL for the Unique scope management service. Must not end with a trailing slash |
| `apiRateLimitPerMinute` | No | `100` | Number of Unique API requests allowed per minute |
The additional fields required for each auth mode are documented in the [Authentication Guide -- Unique Platform Authentication Methods].
## Proxy Configuration
The connector supports HTTP/HTTPS forward proxies for environments where outbound internet access is only available through a proxy. Proxy settings are configured via environment variables.
| Mode | Description |
| --- | --- |
| `none` | Proxy disabled (default) |
| `no_auth` | Proxy enabled without authentication |
| `username_password` | Basic authentication proxy |
| `ssl_tls` | TLS client certificate proxy |
**Common options**:
| Variable | Description |
| --- | --- |
| `PROXY_HOST` | Proxy server hostname |
| `PROXY_PORT` | Proxy server port |
| `PROXY_PROTOCOL` | `http` or `https` |
| `PROXY_SSL_CA_BUNDLE_PATH` | Path to CA bundle for verifying proxy TLS certificate |
| `PROXY_HEADERS` | JSON string of custom headers for CONNECT request |
**`username_password` mode adds:**
| Variable | Description |
| --- | --- |
| `PROXY_USERNAME` | Proxy username |
| `PROXY_PASSWORD` | Proxy password (loaded from secret) |
**`ssl_tls` mode adds:**
| Variable | Description |
| --- | --- |
| `PROXY_SSL_CERT_PATH` | Path to TLS client certificate |
| `PROXY_SSL_KEY_PATH` | Path to TLS client key |
### Traffic Routing
When the proxy is enabled, traffic is routed as follows:
| Target | Routing |
| --- | --- |
| Confluence API (Cloud or Data Center) | Always through the proxy |
| Atlassian or Data Center OAuth token endpoint | Always through the proxy |
| Unique Ingestion and Scope Management services | Through the proxy only when `unique.serviceAuthMode` is `external`. |
| Attachment and content uploads to Unique | Same routing as Unique API calls above |
## Ingestion Settings
The `ingestion` section configures how content is organized and stored in the Unique knowledge base:
yaml
ingestion: ingestionMode: flat scopeId: your-scope-id storeInternally: enabled useV1KeyFormat: disabled attachments: mode: enabled allowedMimeTypes: - application/pdf - application/vnd.openxmlformats-officedocument.wordprocessingml.document - application/vnd.openxmlformats-officedocument.spreadsheetml.sheet - application/vnd.openxmlformats-officedocument.presentationml.presentation - text/plain - text/csv - text/html - image/png - image/jpeg maxFileSizeMb: 200 imageOcr: enabled pageIngestionConfig: htmlConfig: imageContentExtraction: enabled: true languageModel: your-kb-visual-llm
| Field | Required | Default | Description |
| --- | --- | --- | --- |
| `ingestionMode` | No | `flat` | Ingestion traversal mode. Currently only `flat` is supported |
| `scopeId` | Yes | -- | Root scope ID in the Unique platform. The scope must exist before the connector starts |
| `storeInternally` | No | `enabled` | Whether to store content internally in Unique (`enabled` or `disabled`) |
| `useV1KeyFormat` | No | `disabled` | Use v1-compatible ingestion key format (`spaceId_spaceKey/pageId`) without tenant prefix |
| `attachments` | No | (see sub-fields) | Configuration for file attachment ingestion |
| `pageIngestionConfig` | No | -- | Ingestion configuration applied to each ingested page. |
### Attachment Configuration
The `attachments` sub-section controls ingestion of file attachments from Confluence pages:
| Field | Required | Default | Description |
| --- | --- | --- | --- |
| `attachments.mode` | No | `enabled` | Whether to ingest file attachments (`enabled` or `disabled`) |
| `attachments.allowedMimeTypes` | No | See [Default Allowed MIME Types] | MIME types to include when ingesting attachments. |
| `attachments.maxFileSizeMb` | No | `200` | Maximum file size in megabytes. Attachments larger than this are skipped |
| `attachments.imageOcr` | No | `enabled` | Whether the connector should request OCR-based ingestion for image attachments |
## Processing Settings
The `processing` section controls sync scheduling and concurrency:
yaml
processing: concurrency: 1 scanIntervalCron: "*/15 * * * *"
| Field | Required | Default | Description |
| --- | --- | --- | --- |
| `concurrency` | No | `1` | Number of pages/attachments to submit for ingestion into Unique concurrently |
| `scanIntervalCron` | No | `*/15 * * * *` | Cron expression for the scheduled sync interval |
| `maxItemsToScan` | No | -- | Maximum number of items (pages + attachments) to scan per run. Intended for testing purposes |
## Logging
### Structured JSON Logs
The connector produces structured JSON logs. In production (`NODE_ENV=production`), logs are written as JSON to stdout. In development, logs use a human-readable format.
### Log Levels
Set via the `LOG_LEVEL` environment variable:
| Level | Description |
| --- | --- |
| `error` | Error conditions |
| `warn` | Warning conditions |
| `info` | General operational information (default) |
| `debug` | Detailed debugging information |
## Health Endpoint
The connector exposes a `GET /health` endpoint that reports operational health. The endpoint returns HTTP `200` when all checks pass and HTTP `503` when any check fails.