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

Integration and Runtime Keys

{
"AnsibleSettings": { "ServiceUrl": "{{AnsibleSettings__ServiceUrl}}" },
"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
AnsibleSettings:ServiceUrlstringYesNot empty
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
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
AnsibleSettingsOptionsAnsibleSettingsServiceUrl only
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