Skip to main content

appsettings.json Reference Guide

Complete reference for configuring Muonroi applications. Each configuration section maps to a .NET IOptions<T> pattern and supports environment variable overrides.

Quick Start

Copy the Complete Example below and customize for your environment.


LicenseConfigs

License activation and verification settings for offline and online modes.

KeyTypeDefaultRequiredDescription
Modestring"Online"NoOnline (phone-home to license server) or Offline (use stored proof). Requires Online section if Online mode.
LicenseFilePathstring"licenses/license.key"NoRelative or absolute path to license key JSON file. File format: { "LicenseKey": "MRR-xxxxx" }
ActivationProofPathstring"licenses/activation_proof.json"NoRelative or absolute path to signed activation proof. Created by license server on first activation.
FallbackToOnlineActivationbooltrueNoIf Offline mode and proof is missing/expired, attempt fallback to Online activation. Requires internet connectivity.
PublicKeyPathstringNoPath to license server's RSA-2048 public key (PEM format). Used to verify activation proof signature. Auto-bundled if not specified.
Online:EndpointstringYes (if Mode=Online)License server base URL (e.g., https://license.truyentm.xyz). No trailing slash.
Online:EnableHeartbeatbooltrueNoEnable automatic heartbeat verification every HeartbeatIntervalMinutes. Prevents long-running apps from skipping nonce rotation.
Online:HeartbeatIntervalMinutesint240NoMinutes between heartbeat checks (4h default = 6 checks/day). Range: 1–10080 (7 days).
Online:RevocationGraceHoursint24NoGrace period (hours) to retry after heartbeat failure before degrading to Free tier. Handles network outages.
Online:TimeoutSecondsint10NoHTTP request timeout for activation and heartbeat. Increase if license server is slow.

Example:

"LicenseConfigs": {
"Mode": "Online",
"LicenseFilePath": "licenses/license.key",
"ActivationProofPath": "licenses/activation_proof.json",
"FallbackToOnlineActivation": true,
"Online": {
"Endpoint": "https://license.truyentm.xyz",
"EnableHeartbeat": true,
"HeartbeatIntervalMinutes": 240,
"RevocationGraceHours": 24,
"TimeoutSeconds": 10
}
}

See also: License Activation Guide


ControlPlaneAuth

JWT and authorization settings for Control Plane API.

KeyTypeDefaultRequiredDescription
DisableAuthorizationbooltrueNoDevelopment only. Disables auth checks for easier testing. Must be false in production.
SigningKeystring"dev-control-plane-signing-key-change-this"YesHMAC signing key for JWT tokens. Change in production. Min 32 chars.
Issuerstring"muonroi-control-plane"NoJWT issuer claim. Used for token validation.
Audiencestring"muonroi-control-plane-clients"NoJWT audience claim. Identifies intended API clients.

Example:

"ControlPlaneAuth": {
"DisableAuthorization": false,
"SigningKey": "your-super-secret-key-min-32-chars-here!",
"Issuer": "muonroi-control-plane",
"Audience": "muonroi-control-plane-clients"
}
Production Security

Never commit actual signing keys to version control. Use environment variables (ControlPlaneAuth__SigningKey) or Azure Key Vault / AWS Secrets Manager.


RuleControlPlane

Rule management workflow settings (approval, canary, audit).

KeyTypeDefaultRequiredDescription
RequireApprovalbooltrueNoRequire manual approval before activating new rule versions. Prevents accidental deployments.
NotifyOnStateChangebooltrueNoSend notifications (email/Slack) when rules are created, submitted, approved, or activated. Requires external notifier integration.
EnableCanarybooltrueNoEnable canary deployments (gradual rollout to percentage of tenants).
AuditSignerKeyIdstring"ruleset-control-plane"NoKey ID for audit trail signing. Used to link audit records to signing keys.
AuditPrivateKeyPemPathstring""NoPath to RSA private key (PEM) for signing audit trail entries. Empty = disable audit signing.

Example:

"RuleControlPlane": {
"RequireApproval": true,
"NotifyOnStateChange": true,
"EnableCanary": true,
"AuditSignerKeyId": "ruleset-control-plane",
"AuditPrivateKeyPemPath": "config/audit-signer.pem"
}

See also: Rule Workflow Guide


DecisionTableEngineOptions

Decision table execution engine configuration.

KeyTypeDefaultRequiredDescription
PostgresConnectionStringstringConditionalPostgreSQL connection string. Use if backing decision tables with PostgreSQL.
SqlServerConnectionStringstringConditionalSQL Server connection string. Use if backing decision tables with SQL Server.
Schemastring"public"NoDatabase schema for decision table storage (PostgreSQL) or prefix (SQL Server).
AutoMigrateDatabasebooltrueNoAutomatically run pending migrations on startup. Disable in production if you manage migrations separately.
DefaultHitPolicystring"FIRST"NoDefault hit policy for new decision tables: FIRST, UNIQUE, COLLECT, PRIORITY, RULE_ORDER.
MaxTableSizeint10000NoMaximum rows per decision table. Enforced at evaluation time.

Example:

"DecisionTableEngineOptions": {
"PostgresConnectionString": "Server=db.example.com;Database=muonroi_rules;User=muonroi;Password=***",
"Schema": "public",
"AutoMigrateDatabase": true,
"DefaultHitPolicy": "FIRST",
"MaxTableSize": 10000
}

See also: Decision Table Guide


TokenConfigs

JWT and token lifetime settings (Access Token / Refresh Token).

KeyTypeDefaultRequiredDescription
IssuerstringYesToken issuer. Must match ControlPlaneAuth:Issuer or client validation fails.
AudiencestringYesToken audience. Clients validate this claim.
AccessTokenExpireMinutesint60NoAccess token lifetime (minutes). Short-lived. Typical: 15–60 min.
RefreshTokenExpireDaysint7NoRefresh token lifetime (days). Long-lived. Used to obtain new access tokens.
SecretKeystringYesHMAC secret for token signing (same as ControlPlaneAuth:SigningKey).

Example:

"TokenConfigs": {
"Issuer": "muonroi-control-plane",
"Audience": "muonroi-control-plane-clients",
"AccessTokenExpireMinutes": 60,
"RefreshTokenExpireDays": 7,
"SecretKey": "your-super-secret-key-min-32-chars-here!"
}

See also: Authentication Guide


TenancyConfigs

Multi-tenancy and data isolation configuration.

KeyTypeDefaultRequiredDescription
IsolationModestring"SharedSchema"NoData isolation strategy: SharedSchema (EF query filters), SeparateSchema (PostgreSQL SearchPath), SeparateDatabase (DB per tenant).
DefaultTenantIdstringNoSystem tenant ID for background jobs and system operations. If omitted, job execution requires explicit tenant context.
EnableQuotaEnforcementbooltrueNoEnforce per-tenant quotas (max workflows, concurrent rules, requests/day).
QuotaCacheExpiryMinutesint5NoCache quota checks for N minutes. Lower = more accurate but higher DB load.

Example:

"TenancyConfigs": {
"IsolationMode": "SharedSchema",
"DefaultTenantId": "system",
"EnableQuotaEnforcement": true,
"QuotaCacheExpiryMinutes": 5
}

See also: Multi-Tenancy Architecture


CacheConfigs

In-memory and distributed cache configuration.

KeyTypeDefaultRequiredDescription
Providerstring"InMemory"NoCache provider: InMemory (single-server), Redis (distributed).
DefaultTTLSecondsint300NoDefault cache TTL (seconds) if not explicitly set per entry. Typical: 300–3600.
Redis:ConnectionStringstringConditionalRedis connection string (e.g., localhost:6379). Required if Provider=Redis.
Redis:InstanceNamestring"muonroi:"NoKey prefix for all Redis entries. Allows multiple apps to share Redis instance.
MaxMemoryMBint256NoInMemory only. Maximum memory before eviction. -1 = unlimited.

Example:

"CacheConfigs": {
"Provider": "Redis",
"DefaultTTLSeconds": 300,
"Redis": {
"ConnectionString": "localhost:6379,ssl=false",
"InstanceName": "muonroi:"
}
}

See also: Caching Guide


MessagingConfigs

Message bus and event publishing configuration.

KeyTypeDefaultRequiredDescription
Providerstring"InMemory"NoMessage bus provider: InMemory, RabbitMQ, AzureServiceBus, EventBridge.
ConnectionStringstringConditionalConnection string for external bus. Required if Provider is not InMemory.
Topics:RuleSetChangedstring"ruleset-changes"NoTopic/queue name for rule set change events.
Topics:AuditLogstring"audit-logs"NoTopic/queue name for audit trail events.
PublisherBatchSizeint100NoBatch events before publishing. Higher = better throughput, higher latency.

Example:

"MessagingConfigs": {
"Provider": "RabbitMQ",
"ConnectionString": "amqp://guest:guest@localhost:5672/",
"Topics": {
"RuleSetChanged": "ruleset-changes",
"AuditLog": "audit-logs"
},
"PublisherBatchSize": 100
}

See also: Event Messaging Guide


ObservabilityConfigs

OpenTelemetry tracing and Prometheus metrics configuration.

KeyTypeDefaultRequiredDescription
EnableTracingbooltrueNoEnable distributed tracing via OpenTelemetry.
EnableMetricsbooltrueNoEnable Prometheus metrics export.
OtlpEndpointstringConditionalOTLP exporter endpoint (e.g., http://localhost:4317). Required if EnableTracing=true and using external collector.
LogLevelstring"Information"NoMinimum log level: Trace, Debug, Information, Warning, Error, Critical.
SamplingFractiondouble1.0NoTrace sampling ratio (0.0–1.0). 0.1 = 10% of traces. Use in high-volume scenarios.

Example:

"ObservabilityConfigs": {
"EnableTracing": true,
"EnableMetrics": true,
"OtlpEndpoint": "http://localhost:4317",
"LogLevel": "Information",
"SamplingFraction": 1.0
}

See also: Observability Guide


Connection Strings

Standard database and external service connections.

KeyDescription
RuleControlPlaneDbPrimary PostgreSQL or SQL Server connection for rule definitions, versions, approvals, and metadata.
RedisRedis connection for caching and session state. Format: host:port[,ssl=true/false].
AuditDb(Optional) Separate database for immutable audit trail storage. If omitted, uses RuleControlPlaneDb.

Example:

"ConnectionStrings": {
"RuleControlPlaneDb": "Server=localhost;Database=muonroi_rules;User=muonroi;Password=***",
"Redis": "localhost:6379,ssl=false",
"AuditDb": "Server=localhost;Database=muonroi_audit;User=muonroi;Password=***"
}

Environment Variable Overrides

All configuration keys can be overridden via environment variables using double-underscore (__) notation:

appsettings KeyEnvironment Variable
LicenseConfigs:ModeLicenseConfigs__Mode
LicenseConfigs:Online:EndpointLicenseConfigs__Online__Endpoint
ControlPlaneAuth:SigningKeyControlPlaneAuth__SigningKey
CacheConfigs:Redis:ConnectionStringCacheConfigs__Redis__ConnectionString
ConnectionStrings:RuleControlPlaneDbConnectionStrings__RuleControlPlaneDb

Example (Docker):

docker run \
-e "LicenseConfigs__Mode=Online" \
-e "LicenseConfigs__Online__Endpoint=https://license.truyentm.xyz" \
-e "ControlPlaneAuth__SigningKey=your-production-key" \
-e "CacheConfigs__Redis__ConnectionString=redis:6379" \
muonroi-app:latest

Example (Linux Bash):

export LicenseConfigs__Mode="Online"
export LicenseConfigs__Online__Endpoint="https://license.truyentm.xyz"
export ControlPlaneAuth__SigningKey="your-production-key"
dotnet MyApp.dll

Complete Example

Minimal production-ready appsettings.json with all major sections:

{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Muonroi": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"RuleControlPlaneDb": "Server=db.example.com;Database=muonroi_rules;User=muonroi;Password=***;SSL Mode=Require",
"Redis": "cache.example.com:6379,ssl=true",
"AuditDb": "Server=db.example.com;Database=muonroi_audit;User=muonroi;Password=***;SSL Mode=Require"
},
"LicenseConfigs": {
"Mode": "Online",
"LicenseFilePath": "licenses/license.key",
"ActivationProofPath": "licenses/activation_proof.json",
"FallbackToOnlineActivation": true,
"Online": {
"Endpoint": "https://license.truyentm.xyz",
"EnableHeartbeat": true,
"HeartbeatIntervalMinutes": 240,
"RevocationGraceHours": 24,
"TimeoutSeconds": 10
}
},
"ControlPlaneAuth": {
"DisableAuthorization": false,
"SigningKey": "your-super-secret-key-min-32-chars-here!",
"Issuer": "muonroi-control-plane",
"Audience": "muonroi-control-plane-clients"
},
"TokenConfigs": {
"Issuer": "muonroi-control-plane",
"Audience": "muonroi-control-plane-clients",
"AccessTokenExpireMinutes": 60,
"RefreshTokenExpireDays": 7,
"SecretKey": "your-super-secret-key-min-32-chars-here!"
},
"RuleControlPlane": {
"RequireApproval": true,
"NotifyOnStateChange": true,
"EnableCanary": true,
"AuditSignerKeyId": "ruleset-control-plane",
"AuditPrivateKeyPemPath": "config/audit-signer.pem"
},
"DecisionTableEngineOptions": {
"PostgresConnectionString": "Server=db.example.com;Database=muonroi_rules;User=muonroi;Password=***;SSL Mode=Require",
"Schema": "public",
"AutoMigrateDatabase": true,
"DefaultHitPolicy": "FIRST",
"MaxTableSize": 10000
},
"TenancyConfigs": {
"IsolationMode": "SharedSchema",
"DefaultTenantId": "system",
"EnableQuotaEnforcement": true,
"QuotaCacheExpiryMinutes": 5
},
"CacheConfigs": {
"Provider": "Redis",
"DefaultTTLSeconds": 300,
"Redis": {
"ConnectionString": "cache.example.com:6379,ssl=true",
"InstanceName": "muonroi:"
}
},
"MessagingConfigs": {
"Provider": "RabbitMQ",
"ConnectionString": "amqp://guest:[email protected]:5672/",
"Topics": {
"RuleSetChanged": "ruleset-changes",
"AuditLog": "audit-logs"
},
"PublisherBatchSize": 100
},
"ObservabilityConfigs": {
"EnableTracing": true,
"EnableMetrics": true,
"OtlpEndpoint": "http://otel-collector.example.com:4317",
"LogLevel": "Information",
"SamplingFraction": 1.0
}
}

Development vs. Production Checklist

SettingDevelopmentProduction
LicenseConfigs:ModeOffline (local testing)Online (with heartbeat)
ControlPlaneAuth:DisableAuthorizationtrue (optional)false (required)
ControlPlaneAuth:SigningKeyTest valueUnique 32+ char secret from Key Vault
RuleControlPlane:RequireApprovalfalse (optional)true (required)
CacheConfigs:ProviderInMemoryRedis
ObservabilityConfigs:SamplingFraction1.0 (all traces)0.1–0.5 (reduce noise)
Security Checklist
  • Never commit production secrets to Git. Use environment variables or managed secrets.
  • Rotate signing keys every 90 days.
  • Use HTTPS for all external endpoints (license server, OTLP, Redis, RabbitMQ).
  • Enable RequireApproval for all non-development environments.
  • Review audit logs monthly.

See Also