Skip to content

Application Settings Reference

RAMP is configured through appsettings.json files in the src/RAMP.API/ directory. Configuration follows ASP.NET Core conventions with environment-specific overrides.

FilePurpose
appsettings.jsonBase configuration (always loaded)
appsettings.Development.jsonDevelopment overrides
appsettings.Production.jsonProduction overrides
appsettings.Docker.jsonDocker deployment overrides

Base settings are loaded first, then environment-specific files override matching keys. Later files win.

All settings can be overridden via environment variables with the RAMP_ prefix:

RAMP_Database__Provider=Sqlite
RAMP_Jwt__Secret=MyProductionSecret123456789012345
RAMP_Cache__Provider=Redis

Use double underscores (__) to separate nested keys.


Configures the database provider and connection.

{
"Database": {
"Provider": "SqlServer",
"ConnectionString": "Server=localhost,1433;Database=RAMP;User Id=sa;Password=YourPassword;TrustServerCertificate=True",
"AutoMigrate": true,
"RequireUpToDateSchema": false,
"RequireUpToDateTranslations": false
}
}
PropertyTypeDefaultDescription
ProviderenumSqlServerDatabase provider: SqlServer, Sqlite, PostgreSQL, MySQL
ConnectionStringstring(empty)Database connection string. Falls back to ConnectionStrings:DefaultConnection if empty.
AutoMigratebooltrueAutomatically apply Entity Framework Core migrations on startup. Set to false in production for controlled migration deployments.
RequireUpToDateSchemaboolfalseIf true and pending migrations exist, the API will fail to start. Useful for catching missed migrations in CI/CD.
RequireUpToDateTranslationsboolfalseIf true and built-in translations are outdated, the API will fail to start.
Server=hostname,1433;Database=RAMP;User Id=sa;Password=YourPassword;TrustServerCertificate=True

For backward compatibility, RAMP also checks the standard ConnectionStrings section:

{
"ConnectionStrings": {
"DefaultConnection": "Server=localhost,1433;Database=RAMP;..."
}
}

If Database:ConnectionString is empty, RAMP falls back to ConnectionStrings:DefaultConnection.


Configures JSON Web Token authentication for API access.

{
"Jwt": {
"Secret": "YourSuperSecretKeyThatIsAtLeast32CharactersLong!",
"Issuer": "RAMP.API",
"Audience": "RAMP.Web",
"ExpiryHours": 8
}
}
PropertyTypeDefaultDescription
Secretstring(see default)HMAC-SHA256 signing key. Minimum 32 characters. Must be changed in production.
IssuerstringRAMP.APIJWT token issuer claim
AudiencestringRAMP.WebJWT token audience claim
ExpiryHoursint8JWT token lifetime in hours

Configures where uploaded files (attachments, evidence) are stored.

{
"FileStorage": {
"Provider": "Local",
"Local": {
"Path": "uploads"
},
"MinIO": {
"Endpoint": "localhost:9000",
"AccessKey": "admin",
"SecretKey": "minio_password",
"BucketName": "ramp-uploads",
"UseSSL": false,
"Region": "us-east-1"
},
"AzureBlob": {
"ConnectionString": "",
"ContainerName": "ramp-uploads"
},
"S3": {
"AccessKey": "",
"SecretKey": "",
"BucketName": "ramp-uploads",
"Region": "us-east-1",
"ServiceUrl": ""
}
}
}
ProviderDescriptionBest For
LocalFiles stored on local filesystemDevelopment, single-server deployments
MinIOS3-compatible object storageDocker deployments, self-hosted clusters
AzureBlobAzure Blob StorageAzure cloud deployments
S3Amazon S3 or S3-compatible servicesAWS deployments, S3-compatible storage
PropertyTypeDefaultDescription
PathstringuploadsDirectory path for file storage. Relative to the API working directory.
PropertyTypeDefaultDescription
Endpointstringlocalhost:9000MinIO server endpoint (host:port)
AccessKeystring(empty)MinIO access key
SecretKeystring(empty)MinIO secret key
BucketNamestringramp-uploadsStorage bucket name
UseSSLboolfalseUse HTTPS for MinIO connections
Regionstringus-east-1MinIO region
PropertyTypeDefaultDescription
ConnectionStringstring(empty)Azure Storage connection string
ContainerNamestringramp-uploadsBlob container name
PropertyTypeDefaultDescription
AccessKeystring(empty)AWS access key ID
SecretKeystring(empty)AWS secret access key
BucketNamestringramp-uploadsS3 bucket name
Regionstringus-east-1AWS region
ServiceUrlstring(empty)Custom endpoint for S3-compatible services

Configures the caching provider for application data and token blacklisting.

{
"Cache": {
"Provider": "InMemory",
"InMemory": {
"SizeLimit": 100000000,
"ExpirationScanFrequency": 60
},
"Redis": {
"ConnectionString": "localhost:6379",
"InstanceName": "RAMP:",
"Database": 0,
"AbortOnConnectFail": false,
"ConnectTimeout": 5000,
"SyncTimeout": 5000
}
}
}
ProviderDescriptionBest For
InMemoryIn-process memory cacheSingle-server deployments, development
RedisRedis distributed cacheMulti-server deployments, production
PropertyTypeDefaultDescription
SizeLimitlong100000000Maximum cache size in bytes (100 MB)
ExpirationScanFrequencyint60How often to scan for expired entries (seconds)
PropertyTypeDefaultDescription
ConnectionStringstringlocalhost:6379Redis server connection string
InstanceNamestringRAMP:Key prefix for cache entries
Databaseint0Redis database number (0-15)
AbortOnConnectFailboolfalseThrow exception if initial connection fails. Set false for resilience.
ConnectTimeoutint5000Connection timeout in milliseconds
SyncTimeoutint5000Synchronous operation timeout in milliseconds

Configures SignalR for real-time browser notifications and collaboration features.

{
"SignalR": {
"UseRedisBackplane": false,
"Redis": {
"ConnectionString": "localhost:6379",
"ChannelPrefix": "RAMP:SignalR:",
"ConnectTimeout": 5000,
"SyncTimeout": 5000
}
}
}
PropertyTypeDefaultDescription
UseRedisBackplaneboolfalseEnable Redis backplane for multi-server SignalR. Required for load-balanced deployments.
PropertyTypeDefaultDescription
ConnectionStringstringlocalhost:6379Redis server for SignalR backplane
ChannelPrefixstringRAMP:SignalR:Redis channel prefix for SignalR messages
ConnectTimeoutint5000Connection timeout in milliseconds
SyncTimeoutint5000Synchronous operation timeout in milliseconds

These values are configured in code and cannot be changed via configuration:

SettingValueDescription
KeepAliveInterval15 secondsInterval between keep-alive pings
ClientTimeoutInterval30 secondsClient considered disconnected after this
HandshakeTimeout15 secondsMaximum time for initial handshake
MaximumReceiveMessageSize32 KBMaximum incoming message size
EnableDetailedErrorsDevelopment onlyDetailed error messages in development

Configures SMTP for email notifications (password reset, escalations, digests).

{
"EmailSettings": {
"SmtpHost": "localhost",
"SmtpPort": 25,
"UseSsl": false,
"Username": null,
"Password": null,
"FromAddress": "noreply@ramp.local",
"FromName": "RAMP Notifications"
}
}
PropertyTypeDefaultDescription
SmtpHoststringlocalhostSMTP server hostname
SmtpPortint25SMTP server port (25, 587, or 465)
UseSslboolfalseEnable SSL/TLS for SMTP connections. Use true with port 587 (STARTTLS) or 465 (implicit TLS).
UsernamestringnullSMTP authentication username (optional)
PasswordstringnullSMTP authentication password (optional)
FromAddressstringnoreply@ramp.localSender email address
FromNamestringRAMP NotificationsSender display name

Configures multi-tenancy support. When disabled, RAMP operates as a single-tenant installation.

{
"MultiTenant": {
"Enabled": false,
"ResolutionStrategy": "Cookie",
"FallbackStrategy": "None",
"AllowDomain": false,
"AllowPath": false,
"AllowDatabasePerTenant": false,
"DomainPattern": "{tenant}.localhost",
"PathPrefix": "/tenant",
"DefaultTenantSlug": "default",
"RequireTenant": false
}
}
PropertyTypeDefaultDescription
EnabledboolfalseEnable multi-tenancy. When false, RAMP operates as single-tenant.
ResolutionStrategyenumCookiePrimary tenant resolution method: Cookie, DomainSlug, Header
FallbackStrategyenumNoneFallback resolution if primary fails: Cookie, DomainSlug, Header, None
AllowDomainboolfalseAllow domain-based tenant resolution (e.g., acme.ramp.example.com)
AllowPathboolfalseAllow path-based tenant resolution (e.g., /tenant/acme/)
AllowDatabasePerTenantboolfalseAllow separate databases per tenant (advanced)
DomainPatternstring{tenant}.localhostDomain pattern for domain-based resolution. {tenant} is replaced with tenant slug.
PathPrefixstring/tenantPath prefix for path-based resolution
DefaultTenantSlugstringdefaultDefault tenant slug when no tenant is resolved
RequireTenantboolfalseIf true, requests without a resolved tenant are rejected
StrategyHow It WorksUse Case
CookieTenant stored in browser cookie after loginDefault. Works with any deployment.
DomainSlugTenant extracted from subdomainWhen each tenant has its own subdomain
HeaderTenant from X-Tenant-Id headerAPI-only access, reverse proxy setups

Configures the Tenant Administration area, including authentication methods for tenant administrators.

{
"TenantAdmin": {
"Authentication": {
"AllowRampInternal": true,
"AllowWindowsAuth": false,
"Oidc": {
"Enabled": false,
"Authority": "",
"ClientId": "",
"ClientSecret": "",
"Scopes": ["openid", "profile", "email"],
"DisplayName": "Single Sign-On"
},
"Ldap": {
"Enabled": false,
"Server": "",
"Port": 389,
"UseSsl": false,
"BaseDn": "",
"UserFilter": "(uid={0})",
"BindDn": null,
"BindPassword": null,
"DisplayName": "LDAP Directory"
}
},
"Administrators": [
{ "Username": "admin", "Provider": "RampInternal" }
]
}
}
PropertyTypeDefaultDescription
AllowRampInternalbooltrueAllow username/password login for tenant admins
AllowWindowsAuthboolfalseAllow Windows Integrated Authentication
PropertyTypeDefaultDescription
EnabledboolfalseEnable OIDC authentication for tenant admins
Authoritystring(empty)OIDC authority URL (e.g., https://keycloak.example.com/realms/ramp)
ClientIdstring(empty)OIDC client ID
ClientSecretstring(empty)OIDC client secret
Scopesstring[]["openid", "profile", "email"]OIDC scopes to request
DisplayNamestringSingle Sign-OnButton label on login page
PropertyTypeDefaultDescription
EnabledboolfalseEnable LDAP authentication for tenant admins
Serverstring(empty)LDAP server hostname
Portint389LDAP server port
UseSslboolfalseUse SSL/TLS (LDAPS)
BaseDnstring(empty)Base DN for user search
UserFilterstring(uid={0})LDAP user filter. {0} is replaced with the username.
BindDnstringnullBind DN for LDAP service account
BindPasswordstringnullBind password for LDAP service account
DisplayNamestringLDAP DirectoryButton label on login page

Pre-authorized tenant administrators. Matched during login to determine who has TenantAdministrator access.

PropertyTypeDescription
UsernamestringUsername to match (for RampInternal, WindowsAD, Ldap)
EmailstringEmail to match (for Oidc)
ProviderstringAuthentication provider: RampInternal, WindowsAD, Oidc, Ldap

Configures initial administrator accounts created on first startup. Used for initial setup or emergency access recovery.

{
"Bootstrap": {
"Administrators": [
{
"IdentityProvider": "RAMP",
"Username": "admin",
"Email": "admin@example.com",
"FirstName": "System",
"LastName": "Administrator",
"Password": "Passw0rd"
}
],
"TenantAdministrators": [
{
"IdentityProvider": "RAMP",
"Username": "tenantadmin",
"Email": "tenantadmin@ramp.local",
"FirstName": "Tenant",
"LastName": "Administrator",
"Password": "Passw0rd"
}
]
}
}
PropertyTypeDefaultDescription
IdentityProviderstringRAMPIdentity provider type: RAMP (internal)
Usernamestring(required)Login username
Emailstring(required)Email address
FirstNamestringnullFirst name
LastNamestringnullLast name
PasswordstringnullPassword. If not set, a random password is generated and logged.
ProviderSubjectIdstringnullExternal provider subject ID (for OIDC/LDAP bootstrap)

On startup, RAMP checks if these users exist. If they don’t, they are created with the specified credentials and assigned the appropriate role (Administrator or TenantAdministrator).

See Bootstrap Administrators for detailed setup instructions.


Configures Windows Integrated Authentication (IIS/Kestrel with Negotiate/NTLM).

{
"Authentication": {
"WindowsAuthentication": {
"AutoProvision": false,
"Administrators": [],
"TenantAdministrators": []
}
}
}
PropertyTypeDefaultDescription
AutoProvisionboolfalseAutomatically create RAMP user accounts on first Windows auth login
Administratorsstring[][]Windows domain usernames that receive the Administrator role on login
TenantAdministratorsstring[][]Windows domain usernames that receive TenantAdministrator role on login

Enables the OIDC Resource Owner Password Credentials (ROPC) flow for development and testing.

{
"OidcDirectAccess": {
"Enabled": false
}
}
PropertyTypeDefaultDescription
EnabledboolfalseEnable ROPC flow. Development only — never enable in production.

Configures application logging via Serilog.

{
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"Microsoft.AspNetCore": "Warning",
"Microsoft.AspNetCore.Authentication": "Error",
"Microsoft.IdentityModel": "Error",
"System": "Warning"
}
}
}
}
LevelDescription
VerboseMost detailed logging
DebugDeveloper diagnostics
InformationNormal operational events
WarningUnexpected but handled situations
ErrorFailures requiring attention
FatalApplication crash-level errors
NamespaceProductionDevelopmentWhy
DefaultInformationDebugGeneral application logging
MicrosoftWarningInformationASP.NET Core framework
Microsoft.AspNetCoreWarningInformationHTTP request pipeline
Microsoft.AspNetCore.AuthenticationErrorErrorAuth middleware (very noisy at Info/Warning)
Microsoft.IdentityModelErrorErrorJWT token validation (noisy)
SystemWarningWarning.NET runtime

RAMP writes logs to:

  1. Console — always enabled
  2. Filelogs/ramp-{date}.log with daily rolling

Additional Serilog sinks can be configured following standard Serilog configuration patterns.


Top-level settings that don’t belong to a specific section.

{
"FrontendUrl": "http://localhost:5173",
"AllowedHosts": "*"
}
PropertyTypeDefaultDescription
FrontendUrlstring(empty)Frontend URL used for CORS policy and email link generation. Set to your web frontend URL.
AllowedHostsstring*Standard ASP.NET Core host filtering. Semicolon-separated list of allowed hostnames.

Some settings are derived automatically rather than configured directly.

  • When Database.Provider is SqlServer: Uses SQL Server storage for persistent job queues
  • All other providers: Falls back to in-memory storage (jobs lost on restart)
  • Dashboard available at /_hangfire (requires Administrator role)

Always available (no configuration needed):

EndpointDescription
/_healthOverall health status
/_health/readyReadiness probe (database connectivity)
/_health/liveLiveness probe (application is running)
  • Available at /_swagger in Development environment only
  • Automatically disabled in Production
  • Created at {BaseDirectory}/ramp-api.{pid}.pid on startup
  • Automatically deleted on process exit
  • Useful for process management scripts

SQLite + In-Memory cache for local development:

{
"FrontendUrl": "http://localhost:5173",
"Database": {
"Provider": "Sqlite",
"ConnectionString": "Data Source=ramp_dev.db"
},
"Cache": { "Provider": "InMemory" },
"SignalR": { "UseRedisBackplane": false }
}