Skip to main content

Configuration Reference

Introduction

This document provides a complete reference for all configuration settings used by the Ravenxcope backend. Configuration is managed through the standard ASP.NET Core configuration system using appsettings.json files, with environment variable overrides for container deployments.


Configuration Files

FilePurposeGitignored
appsettings.jsonProduction configuration templateNo
appsettings.Development.jsonDevelopment environment overridesYes

Placeholder Pattern

Production appsettings.json uses double-curly-brace placeholders for values that must be provided at runtime:

"Host": "{{PostgresqlSettings__Host}}"

The configuration validation at startup detects these placeholders and treats them as missing values, causing startup failure if they are not overridden by environment variables.


Configuration Sections

PostgresqlSettings

{
"PostgresqlSettings": {
"Host": "{{PostgresqlSettings__Host}}",
"Port": "{{PostgresqlSettings__Port}}",
"Username": "{{PostgresqlSettings__Username}}",
"Password": "{{PostgresqlSettings__Password}}",
"Database": "{{PostgresqlSettings__Database}}",
"MaxPoolSize": "100"
}
}
KeyTypeDefaultRequiredValidated
HoststringlocalhostYesNot empty
Portstring5432YesPositive integer
UsernamestringhduserYesNot empty
PasswordstringYesNot empty
DatabasestringmeYesNot empty
MaxPoolSizestring20No

Connection string format:

Host={Host};Port={Port};Username={Username};Password={Password};Database={Database};Maximum Pool Size={MaxPoolSize}

RedisSettings

{
"RedisSettings": {
"Host": "{{RedisSettings__Host}}",
"Port": "{{RedisSettings__Port}}",
"Password": "{{RedisSettings__Password}}",
"DefaultDatabase": "{{RedisSettings__DefaultDatabase}}"
}
}
KeyTypeDefaultRequiredValidated
HoststringlocalhostYesNot empty
Portstring6379YesPositive integer
PasswordstringnullNo
DefaultDatabasestring0No

Connection string format:

  • With password: {Host}:{Port},password={Password},defaultDatabase={DefaultDatabase}
  • Without password: {Host}:{Port},defaultDatabase={DefaultDatabase}

JwtSettings

{
"JwtSettings": {
"Secret": "{{JwtSettings__Secret}}",
"Issuer": "{{JwtSettings__Issuer}}",
"Audience": "{{JwtSettings__Audience}}",
"ExpiryMinutes": 1440
}
}
KeyTypeDefaultRequiredNotes
SecretstringYesMin 32 chars recommended
IssuerstringRavenxcope.BackendNoJWT issuer claim
AudiencestringRavenxcopeUsersNoJWT audience claim
ExpiryMinutesint1440NoToken lifetime (24h)

Security Warning: If Secret is shorter than 32 characters, a startup warning is emitted. The JwtService will throw an InvalidOperationException if the secret is empty or less than 32 characters.


InfluxDb

{
"InfluxDb": {
"Url": "{{InfluxDb__Url}}",
"Token": "{{InfluxDb__Token}}",
"Org": "{{InfluxDb__Org}}",
"Bucket": "{{InfluxDb__Bucket}}",
"Precision": "ms",
"TimeoutSeconds": 30
}
}
KeyTypeDefaultRequired
UrlstringYes
TokenstringYes
OrgstringYes
BucketstringYes
PrecisionstringmsNo
TimeoutSecondsint30No

OpenSearch

{
"OpenSearch": {
"Url": "{{OpenSearch__Url}}",
"Username": "{{OpenSearch__Username}}",
"Password": "{{OpenSearch__Password}}",
"IndexName": "{{OpenSearch__IndexName}}"
}
}
KeyTypeDefaultRequired
Urlstringhttps://localhost:9200Yes
UsernamestringadminYes
PasswordstringYes
IndexNamestringmataelang-sensor-events-streamYes

AnalyticsChatEnrichment

{
"AnalyticsChatEnrichment": {
"Enabled": true,
"MispEnabled": "{{AnalyticsChatEnrichment__MispEnabled}}",
"MispBaseUrl": "{{AnalyticsChatEnrichment__MispBaseUrl}}",
"MispApiKey": "{{AnalyticsChatEnrichment__MispApiKey}}",
"MispVerifySsl": "{{AnalyticsChatEnrichment__MispVerifySsl}}",
"HistoricalEnabled": "{{AnalyticsChatEnrichment__HistoricalEnabled}}",
"PlaybooksEnabled": "{{AnalyticsChatEnrichment__PlaybooksEnabled}}",
"MaxIocsPerRequest": "{{AnalyticsChatEnrichment__MaxIocsPerRequest}}",
"MaxMispMatchesPerIoc": "{{AnalyticsChatEnrichment__MaxMispMatchesPerIoc}}",
"HistoricalLookbackDays": "{{AnalyticsChatEnrichment__HistoricalLookbackDays}}",
"ProviderTimeoutSeconds": "{{AnalyticsChatEnrichment__ProviderTimeoutSeconds}}",
"PlaybookPath": "Knowledge/analytics-chat-playbooks.json"
}
}

This section configures the free enrichment v1 layer used by analytics chat. The current implementation uses direct REST calls to a self-hosted MISP instance.

KeyTypeDefaultRequiredNotes
EnabledbooltrueNoGlobal switch for all analytics chat enrichment
MispEnabledboolfalseNoEnables direct MISP REST lookups when base URL and API key are also set
MispBaseUrlstring""MISP onlyMust be an absolute URL for the provider to become available
MispApiKeystring""MISP onlyRead-only API key recommended
MispVerifySslbooltrueNoSet to false only for trusted environments with self-signed certs
HistoricalEnabledbooltrueNoEnables OpenSearch recurrence lookups for IOC and pattern history
PlaybooksEnabledbooltrueNoEnables local playbook matching
MaxIocsPerRequestint5NoCaps the number of extracted IOC candidates queried per chat turn
MaxMispMatchesPerIocint3NoCaps the number of normalized MISP matches kept per IOC
HistoricalLookbackDaysint7NoLookback window used by historical recurrence queries
ProviderTimeoutSecondsint5NoPer-provider timeout for MISP and other enrichment lookups
PlaybookPathstringKnowledge/analytics-chat-playbooks.jsonNoRelative paths are resolved from AppContext.BaseDirectory

MISP threat intel is considered available only when:

  • AnalyticsChatEnrichment:Enabled is true
  • AnalyticsChatEnrichment:MispEnabled is true
  • AnalyticsChatEnrichment:MispBaseUrl is a valid absolute URL
  • AnalyticsChatEnrichment:MispApiKey is non-empty

If these conditions are not met, analytics chat can still run with historical enrichment, playbooks, or analytics-only evidence.


Integration and Runtime Keys

{
"NatsMessaging": {
"Enabled": "{{NatsMessaging__Enabled}}",
"Url": "{{NatsMessaging__Url}}",
"CredsFile": "{{NatsMessaging__CredsFile}}",
"CommandStream": "{{NatsMessaging__CommandStream}}"
},
"SensorApiSettings": { "ApiKey": "{{SensorApiSettings__ApiKey}}" },
"SensorSettings": {
"HeartbeatTimeoutMinutes": "{{SensorSettings__HeartbeatTimeoutMinutes}}",
"ProvisioningSudoPassword": "{{SensorSettings__ProvisioningSudoPassword}}"
},
"OpenSearchAnalytics": {
"DefaultTimeoutSeconds": "{{OpenSearchAnalytics__DefaultTimeoutSeconds}}",
"DashboardTimeoutSeconds": "{{OpenSearchAnalytics__DashboardTimeoutSeconds}}",
"AggregationTimeoutSeconds": "{{OpenSearchAnalytics__AggregationTimeoutSeconds}}",
"ListQueryTimeoutSeconds": "{{OpenSearchAnalytics__ListQueryTimeoutSeconds}}"
},
"AnalyticsCacheWarming": {
"Enabled": "{{AnalyticsCacheWarming__Enabled}}",
"IntervalMinutes": "{{AnalyticsCacheWarming__IntervalMinutes}}",
"InitialDelaySeconds": "{{AnalyticsCacheWarming__InitialDelaySeconds}}"
},
"DockerRegistry": {
"Registry": "{{DockerRegistry__Registry}}",
"Username": "{{DockerRegistry__Username}}",
"Password": "{{DockerRegistry__Password}}"
},
"DataCollector": {
"Endpoint": "{{DataCollector__Endpoint}}",
"Port": "{{DataCollector__Port}}"
},
"BackendUrl": "{{BackendUrl}}"
}
KeyTypeDefaultRequiredValidated
NatsMessaging:EnabledboolfalseNo
NatsMessaging:UrlstringWhen enabledNot empty
NatsMessaging:CredsFilestringWhen enabledNot empty
NatsMessaging:CommandStreamstringRXC_CMDNo
SensorApiSettings:ApiKeystringYesNot placeholder
SensorSettings:HeartbeatTimeoutMinutesint1No
SensorSettings:ProvisioningSudoPasswordstringYesNot empty
OpenSearchAnalytics:DefaultTimeoutSecondsint20NoPositive integer (recommended)
OpenSearchAnalytics:DashboardTimeoutSecondsint30NoPositive integer (recommended)
OpenSearchAnalytics:AggregationTimeoutSecondsint15NoPositive integer (recommended)
OpenSearchAnalytics:ListQueryTimeoutSecondsint25NoPositive integer (recommended)
AnalyticsCacheWarming:EnabledbooltrueNo
AnalyticsCacheWarming:IntervalMinutesint5NoPositive integer (recommended)
AnalyticsCacheWarming:InitialDelaySecondsint20NoNon-negative integer (recommended)
DockerRegistry:RegistrystringNo
DockerRegistry:UsernamestringNo
DockerRegistry:PasswordstringNo
DataCollector:EndpointstringYesNot empty
DataCollector:PortstringYesPositive integer
BackendUrlstringYesNot empty

Database Migration Controls

{
"Database": {
"AutoMigrate": true,
"MigrationMaxRetries": 10,
"MigrationRetryDelaySeconds": 5
}
}
KeyTypeDefaultDescription
AutoMigratebooltrueRun EF Core migrations on startup
MigrationMaxRetriesint10Max retry attempts for migration
MigrationRetryDelaySecondsint5Delay between retry attempts (seconds)

Logging (Serilog)

{
"Serilog": {
"Using": ["Serilog.Sinks.Console"],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"Microsoft.AspNetCore": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"Enrich": ["FromLogContext", "WithMachineName"],
"WriteTo": [
{
"Name": "Console",
"Args": {
"outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {SourceContext} {Message:lj}{NewLine}{Exception}"
}
}
]
}
}

Environment Variable Mapping

For container deployment, use the ASP.NET Core double-underscore convention to override appsettings values:

appsettings keyEnvironment variable
JwtSettings:SecretJwtSettings__Secret
PostgresqlSettings:HostPostgresqlSettings__Host
PostgresqlSettings:PortPostgresqlSettings__Port
RedisSettings:HostRedisSettings__Host
OpenSearch:UrlOpenSearch__Url
InfluxDb:UrlInfluxDb__Url
AnalyticsChatEnrichment:EnabledAnalyticsChatEnrichment__Enabled
AnalyticsChatEnrichment:MispEnabledAnalyticsChatEnrichment__MispEnabled
AnalyticsChatEnrichment:MispBaseUrlAnalyticsChatEnrichment__MispBaseUrl
AnalyticsChatEnrichment:MispApiKeyAnalyticsChatEnrichment__MispApiKey
AnalyticsChatEnrichment:MispVerifySslAnalyticsChatEnrichment__MispVerifySsl
AnalyticsChatEnrichment:HistoricalEnabledAnalyticsChatEnrichment__HistoricalEnabled
AnalyticsChatEnrichment:PlaybooksEnabledAnalyticsChatEnrichment__PlaybooksEnabled
AnalyticsChatEnrichment:MaxIocsPerRequestAnalyticsChatEnrichment__MaxIocsPerRequest
AnalyticsChatEnrichment:MaxMispMatchesPerIocAnalyticsChatEnrichment__MaxMispMatchesPerIoc
AnalyticsChatEnrichment:HistoricalLookbackDaysAnalyticsChatEnrichment__HistoricalLookbackDays
AnalyticsChatEnrichment:ProviderTimeoutSecondsAnalyticsChatEnrichment__ProviderTimeoutSeconds
AnalyticsChatEnrichment:PlaybookPathAnalyticsChatEnrichment__PlaybookPath
BackendUrlBackendUrl
DataCollector:EndpointDataCollector__Endpoint

Typed Options Class Summary

All options classes are defined in Extensions/BackendConfiguration.cs:

ClassConfig SectionNotes
PostgresqlSettingsOptionsPostgresqlSettingsIncludes MaxPoolSize
RedisSettingsOptionsRedisSettingsPassword is nullable
JwtSettingsOptionsJwtSettingsIncludes ExpiryMinutes
InfluxDbOptionsInfluxDbAll required fields
OpenSearchOptionsOpenSearchHas sensible defaults
AnalyticsChatEnrichmentOptionsAnalyticsChatEnrichmentControls MISP, history, playbooks, and provider limits
NatsMessagingOptionsNatsMessagingEnabled, Url, CredsFile, CommandStream
NatsProvisionerOptionsNatsProvisionerProvisioner URL + shared secret
SensorApiSettingsOptionsSensorApiSettingsApiKey only
DataCollectorOptionsDataCollectorEndpoint and Port
DockerRegistryOptionsDockerRegistryRegistry, Username, Password
SensorSettingsOptionsSensorSettingsHeartbeatTimeoutMinutes, ProvisioningSudoPassword
OpenSearchAnalyticsOptionsOpenSearchAnalyticsQuery-type timeout controls
AnalyticsCacheWarmingOptionsAnalyticsCacheWarmingCache warming schedule controls
DatabaseOptionsDatabaseMigration controls
BackendAppOptions(composite)Url from BackendUrl key
SensorRuntimeOptions(composite)Aggregates multiple sections

Preflight Validation

Use defense_center/scripts/preflight-env.sh to detect missing or weak configuration values before Docker Compose startup:

sh defense_center/scripts/preflight-env.sh defense_center/.env

This script checks for:

  • Missing required environment variables
  • Placeholder values that weren't replaced
  • Weak JWT secrets