BlobStore
Configures the blob storage backend for messages and files.
This object can be configured from the WebUI under Settings › Storage › Blob Store
Fields
Section titled “Fields”BlobStore is a multi-variant object: each instance has an @type discriminator selecting one of the variants below, and each variant carries its own set of fields.
@type: "Default"
Section titled “@type: "Default"”Use data store
@type: "Sharded"
Section titled “@type: "Sharded"”Sharded Blob Store
stores
Section titled “stores”Type:
List<BlobStoreBase>· min items: 2Stores to use for sharding
@type: "S3"
Section titled “@type: "S3"”S3-compatible
region
Section titled “region”Type:
S3StoreRegion· default:{"@type":"UsEast1"}The S3 region where the bucket resides
bucket
Section titled “bucket”Type:
String· requiredThe S3 bucket where blobs (e-mail messages, Sieve scripts, etc.) will be stored
accessKeyId
Section titled “accessKeyId”Type:
PublicStringOptional· default:{"@type":"None"}Access key ID that identifies the S3 account
secretKey
Section titled “secretKey”Type:
SecretKeyOptional· default:{"@type":"None"}The secret access key for the S3 account
sessionToken
Section titled “sessionToken”Type:
SecretKeyOptional· default:{"@type":"None"}Session token for temporary credentials, sent as the x-amz-security-token header
profile
Section titled “profile”Type:
String?Used when retrieving credentials from a shared credentials file. If specified, the server will use the access key ID, secret access key, and session token (if available) associated with the given profile
timeout
Section titled “timeout”Type:
Duration· default:30000Request timeout for S3 operations
maxRetries
Section titled “maxRetries”Type:
UnsignedInt· default:3· max: 10The maximum number of times to retry failed requests. Set to 0 to disable retries
keyPrefix
Section titled “keyPrefix”Type:
String?A prefix that will be added to the keys of all objects stored in the blob store
allowInvalidCerts
Section titled “allowInvalidCerts”Type:
Boolean· default:falseAllow invalid TLS certificates when connecting to the S3 service
verifyAfterWrite
Section titled “verifyAfterWrite”Type:
Boolean· default:trueAfter each successful write, verify the object is readable on the backend. Defends against the rare case where an S3-compatible backend returns success but does not actually persist the data. Adds one extra request per write.
@type: "Azure"
Section titled “@type: "Azure"”Azure blob storage
storageAccount
Section titled “storageAccount”Type:
String· requiredThe Azure Storage Account where blobs (e-mail messages, Sieve scripts, etc.) will be stored
container
Section titled “container”Type:
String· requiredThe name of the container in the Storage Account
environment
Section titled “environment”Type:
AzureEnvironment· default:"public"Azure cloud environment, used to derive the default blob service URL and the Microsoft Entra ID authority
Type:
Uri?Custom blob service URL, for private endpoints or the Azurite emulator. When empty, it is derived from the storage account and the cloud environment
Type:
AzureAuth· requiredAuthentication method used to access the Storage Account
timeout
Section titled “timeout”Type:
Duration· default:30000Request timeout for Azure Blob Storage operations
maxRetries
Section titled “maxRetries”Type:
UnsignedInt· default:3· max: 10The maximum number of times to retry failed requests. Set to 0 to disable retries
keyPrefix
Section titled “keyPrefix”Type:
String?A prefix that will be added to the keys of all objects stored in the blob store
@type: "FileSystem"
Section titled “@type: "FileSystem"”Filesystem
Type:
String· requiredWhere to store the data in the server’s filesystem
Type:
UnsignedInt· default:2· max: 5Maximum depth of nested directories
@type: "FoundationDb"
Section titled “@type: "FoundationDb"”FoundationDB
clusterFile
Section titled “clusterFile”Type:
String?Path to the cluster file for the FoundationDB cluster
datacenterId
Section titled “datacenterId”Type:
String?Data center ID (optional)
machineId
Section titled “machineId”Type:
String?Machine ID in the FoundationDB cluster (optional)
transactionRetryDelay
Section titled “transactionRetryDelay”Type:
Duration?Transaction maximum retry delay
transactionRetryLimit
Section titled “transactionRetryLimit”Type:
UnsignedInt?· max: 1000 · min: 1Transaction retry limit
transactionTimeout
Section titled “transactionTimeout”Type:
Duration?Transaction timeout
@type: "PostgreSql"
Section titled “@type: "PostgreSql"”PostgreSQL
connectTimeout
Section titled “connectTimeout”Type:
Duration?· default:15000Maximum time to wait for a connection to the database server to be established
useTls
Section titled “useTls”Type:
Boolean· default:falseUse TLS to connect to the store
allowInvalidCerts
Section titled “allowInvalidCerts”Type:
Boolean· default:falseAllow invalid TLS certificates when connecting to the store
poolMaxConnections
Section titled “poolMaxConnections”Type:
UnsignedInt?· max: 8192 · min: 1Maximum number of connections to the store. When unset, 4 per CPU core, between 16 and 32.
poolRecyclingMethod
Section titled “poolRecyclingMethod”Type:
PostgreSqlRecyclingMethod· default:"fast"Method to use when recycling connections in the pool
readReplicas
Section titled “readReplicas”Type:
List<PostgreSqlSettings>· enterpriseList of read replicas for the store
Type:
String· requiredHostname of the database server
Type:
UnsignedInt· default:5432· max: 65535 · min: 1Port of the database server
database
Section titled “database”Type:
String· default:"stalwart"Name of the database
authUsername
Section titled “authUsername”Type:
String?· default:"stalwart"Username to connect to the store
authSecret
Section titled “authSecret”Type:
SecretKeyOptional· default:{"@type":"None"}Password to connect to the store
options
Section titled “options”Type:
String?Additional connection options
@type: "MySql"
Section titled “@type: "MySql"”mySQL
idleTimeout
Section titled “idleTimeout”Type:
Duration?· default:15000Time an idle connection may stay open before the server closes it (sets the MySQL wait_timeout session variable)
useTls
Section titled “useTls”Type:
Boolean· default:falseUse TLS to connect to the store
allowInvalidCerts
Section titled “allowInvalidCerts”Type:
Boolean· default:falseAllow invalid TLS certificates when connecting to the store
maxAllowedPacket
Section titled “maxAllowedPacket”Type:
UnsignedInt?· max: 1073741824 · min: 1024Maximum size of a packet in bytes
poolMaxConnections
Section titled “poolMaxConnections”Type:
UnsignedInt?· max: 8192 · min: 1Maximum number of connections to the store. When unset, 4 per CPU core, between 16 and 32.
poolMinConnections
Section titled “poolMinConnections”Type:
UnsignedInt?· default:5· max: 8192 · min: 1Minimum number of connections to the store
readReplicas
Section titled “readReplicas”Type:
List<MySqlSettings>· enterpriseList of read replicas for the store
Type:
String· requiredHostname of the database server
Type:
UnsignedInt· default:3306· max: 65535 · min: 1Port of the database server
database
Section titled “database”Type:
String· default:"stalwart"Name of the database
authUsername
Section titled “authUsername”Type:
String?· default:"stalwart"Username to connect to the store
authSecret
Section titled “authSecret”Type:
SecretKeyOptional· default:{"@type":"None"}Password to connect to the store
JMAP API
Section titled “JMAP API”The BlobStore singleton is available via the urn:stalwart:jmap capability.
x:BlobStore/get
Section titled “x:BlobStore/get”This is a standard Foo/get method as defined in RFC 8620, Section 5.1.
For singletons, the ids argument should be the literal singleton (or null to return the single instance).
This method requires the sysBlobStoreGet permission.
curl -X POST https://mail.example.com/jmap/ \ -H 'Authorization: Bearer $TOKEN' \ -H 'Content-Type: application/json' \ -d '{ "methodCalls": [ [ "x:BlobStore/get", { "ids": [ "singleton" ] }, "c1" ] ], "using": [ "urn:ietf:params:jmap:core", "urn:stalwart:jmap" ] }'x:BlobStore/set
Section titled “x:BlobStore/set”This is a standard Foo/set method as defined in RFC 8620, Section 5.3.
For singletons, only the update argument with id singleton is accepted; create and destroy arguments are rejected.
This method requires the sysBlobStoreUpdate permission.
curl -X POST https://mail.example.com/jmap/ \ -H 'Authorization: Bearer $TOKEN' \ -H 'Content-Type: application/json' \ -d '{ "methodCalls": [ [ "x:BlobStore/set", { "update": { "singleton": { "description": "updated value" } } }, "c1" ] ], "using": [ "urn:ietf:params:jmap:core", "urn:stalwart:jmap" ] }'stalwart-cli wraps the same JMAP calls. See the CLI reference for installation, authentication, and general usage.
stalwart-cli get BlobStoreUpdate
Section titled “Update”stalwart-cli update BlobStore --field description='updated value'Nested types
Section titled “Nested types”BlobStoreBase
Section titled “BlobStoreBase”Base blob store backends.
S3: S3-compatible. Carries the fields ofS3Store.Azure: Azure blob storage. Carries the fields ofAzureStore.FileSystem: Filesystem. Carries the fields ofFileSystemStore.FoundationDb: FoundationDB. Carries the fields ofFoundationDbStore.PostgreSql: PostgreSQL. Carries the fields ofPostgreSqlStore.MySql: mySQL. Carries the fields ofMySqlStore.
S3Store
Section titled “S3Store”S3-compatible blob store.
region
Section titled “region”Type:
S3StoreRegion· default:{"@type":"UsEast1"}The S3 region where the bucket resides
bucket
Section titled “bucket”Type:
String· requiredThe S3 bucket where blobs (e-mail messages, Sieve scripts, etc.) will be stored
accessKeyId
Section titled “accessKeyId”Type:
PublicStringOptional· default:{"@type":"None"}Access key ID that identifies the S3 account
secretKey
Section titled “secretKey”Type:
SecretKeyOptional· default:{"@type":"None"}The secret access key for the S3 account
sessionToken
Section titled “sessionToken”Type:
SecretKeyOptional· default:{"@type":"None"}Session token for temporary credentials, sent as the x-amz-security-token header
profile
Section titled “profile”Type:
String?Used when retrieving credentials from a shared credentials file. If specified, the server will use the access key ID, secret access key, and session token (if available) associated with the given profile
timeout
Section titled “timeout”Type:
Duration· default:30000Request timeout for S3 operations
maxRetries
Section titled “maxRetries”Type:
UnsignedInt· default:3· max: 10The maximum number of times to retry failed requests. Set to 0 to disable retries
keyPrefix
Section titled “keyPrefix”Type:
String?A prefix that will be added to the keys of all objects stored in the blob store
allowInvalidCerts
Section titled “allowInvalidCerts”Type:
Boolean· default:falseAllow invalid TLS certificates when connecting to the S3 service
verifyAfterWrite
Section titled “verifyAfterWrite”Type:
Boolean· default:trueAfter each successful write, verify the object is readable on the backend. Defends against the rare case where an S3-compatible backend returns success but does not actually persist the data. Adds one extra request per write.
S3StoreRegion
Section titled “S3StoreRegion”Predefined S3 regions.
UsEast1: us-east-1. No additional fields.UsEast2: us-east-2. No additional fields.UsWest1: us-west-1. No additional fields.UsWest2: us-west-2. No additional fields.CaCentral1: ca-central-1. No additional fields.AfSouth1: af-south-1. No additional fields.ApEast1: ap-east-1. No additional fields.ApSouth1: ap-south-1. No additional fields.ApNortheast1: ap-northeast-1. No additional fields.ApNortheast2: ap-northeast-2. No additional fields.ApNortheast3: ap-northeast-3. No additional fields.ApSoutheast1: ap-southeast-1. No additional fields.ApSoutheast2: ap-southeast-2. No additional fields.CnNorth1: cn-north-1. No additional fields.CnNorthwest1: cn-northwest-1. No additional fields.EuNorth1: eu-north-1. No additional fields.EuCentral1: eu-central-1. No additional fields.EuCentral2: eu-central-2. No additional fields.EuWest1: eu-west-1. No additional fields.EuWest2: eu-west-2. No additional fields.EuWest3: eu-west-3. No additional fields.IlCentral1: il-central-1. No additional fields.MeSouth1: me-south-1. No additional fields.SaEast1: sa-east-1. No additional fields.DoNyc3: Digital Ocean nyc3. No additional fields.DoAms3: Digital Ocean ams3. No additional fields.DoSgp1: Digital Ocean sgp1. No additional fields.DoFra1: Digital Ocean fra1. No additional fields.Yandex: Yandex Object Storage. No additional fields.WaUsEast1: Wasabi us-east-1. No additional fields.WaUsEast2: Wasabi us-east-2. No additional fields.WaUsCentral1: Wasabi us-central-1. No additional fields.WaUsWest1: Wasabi us-west-1. No additional fields.WaCaCentral1: Wasabi ca-central-1. No additional fields.WaEuCentral1: Wasabi eu-central-1. No additional fields.WaEuCentral2: Wasabi eu-central-2. No additional fields.WaEuWest1: Wasabi eu-west-1. No additional fields.WaEuWest2: Wasabi eu-west-2. No additional fields.WaApNortheast1: Wasabi ap-northeast-1. No additional fields.WaApNortheast2: Wasabi ap-northeast-2. No additional fields.WaApSoutheast1: Wasabi ap-southeast-1. No additional fields.WaApSoutheast2: Wasabi ap-southeast-2. No additional fields.Custom: Custom. Carries the fields ofS3StoreCustomRegion.
S3StoreCustomRegion
Section titled “S3StoreCustomRegion”Custom S3-compatible endpoint.
Type:
Uri· requiredEndpoint URL
region
Section titled “region”Type:
String· requiredRegion name
PublicStringOptional
Section titled “PublicStringOptional”An optional public value, or none.
None: No value. No additional fields.Value: Value. Carries the fields ofPublicStringValue.EnvironmentVariable: Value read from environment variable. Carries the fields ofSecretKeyEnvironmentVariable.File: Value read from file. Carries the fields ofSecretKeyFile.
PublicStringValue
Section titled “PublicStringValue”A public value provided directly.
Type:
String· requiredValue
SecretKeyEnvironmentVariable
Section titled “SecretKeyEnvironmentVariable”A secret value read from an environment variable.
variableName
Section titled “variableName”Type:
String· requiredEnvironment variable name to read the secret from
SecretKeyFile
Section titled “SecretKeyFile”A secret value read from a file.
filePath
Section titled “filePath”Type:
String· requiredFile path to read the secret from
SecretKeyOptional
Section titled “SecretKeyOptional”An optional secret value, or none.
None: No secret. No additional fields.Value: Secret value. Carries the fields ofSecretKeyValue.EnvironmentVariable: Secret read from environment variable. Carries the fields ofSecretKeyEnvironmentVariable.File: Secret read from file. Carries the fields ofSecretKeyFile.
SecretKeyValue
Section titled “SecretKeyValue”A secret value provided directly.
secret
Section titled “secret”Type:
String· required · secretPassword or secret value
AzureStore
Section titled “AzureStore”Azure Blob Storage store.
storageAccount
Section titled “storageAccount”Type:
String· requiredThe Azure Storage Account where blobs (e-mail messages, Sieve scripts, etc.) will be stored
container
Section titled “container”Type:
String· requiredThe name of the container in the Storage Account
environment
Section titled “environment”Type:
AzureEnvironment· default:"public"Azure cloud environment, used to derive the default blob service URL and the Microsoft Entra ID authority
Type:
Uri?Custom blob service URL, for private endpoints or the Azurite emulator. When empty, it is derived from the storage account and the cloud environment
Type:
AzureAuth· requiredAuthentication method used to access the Storage Account
timeout
Section titled “timeout”Type:
Duration· default:30000Request timeout for Azure Blob Storage operations
maxRetries
Section titled “maxRetries”Type:
UnsignedInt· default:3· max: 10The maximum number of times to retry failed requests. Set to 0 to disable retries
keyPrefix
Section titled “keyPrefix”Type:
String?A prefix that will be added to the keys of all objects stored in the blob store
AzureAuth
Section titled “AzureAuth”Azure Blob Storage authentication method.
SharedKey: Shared Key. Carries the fields ofAzureAuthSharedKey.SasToken: SAS Token. Carries the fields ofAzureAuthSasToken.ClientSecret: Service Principal (Client Secret). Carries the fields ofAzureAuthClientSecret.ManagedIdentity: Managed Identity. Carries the fields ofAzureAuthManagedIdentity.WorkloadIdentity: Workload Identity. Carries the fields ofAzureAuthWorkloadIdentity.
AzureAuthSharedKey
Section titled “AzureAuthSharedKey”Azure Storage Account shared key authentication.
accountKey
Section titled “accountKey”Type:
SecretKey· requiredThe shared key of the Azure Storage Account
SecretKey
Section titled “SecretKey”A secret value provided directly, from an environment variable, or from a file.
Value: Secret value. Carries the fields ofSecretKeyValue.EnvironmentVariable: Secret read from environment variable. Carries the fields ofSecretKeyEnvironmentVariable.File: Secret read from file. Carries the fields ofSecretKeyFile.
AzureAuthSasToken
Section titled “AzureAuthSasToken”Azure shared access signature (SAS) token authentication.
sasToken
Section titled “sasToken”Type:
SecretKey· requiredSAS token granting read, write and delete permissions on the container. The leading ’?’ is optional
AzureAuthClientSecret
Section titled “AzureAuthClientSecret”Microsoft Entra ID service principal authentication using a client secret.
tenantId
Section titled “tenantId”Type:
String· requiredMicrosoft Entra ID tenant ID
clientId
Section titled “clientId”Type:
String· requiredApplication (client) ID of the service principal
clientSecret
Section titled “clientSecret”Type:
SecretKey· requiredApplication client secret
AzureAuthManagedIdentity
Section titled “AzureAuthManagedIdentity”Azure managed identity authentication.
clientId
Section titled “clientId”Type:
String?Client ID of a user-assigned managed identity. When empty, the system-assigned identity is used
AzureAuthWorkloadIdentity
Section titled “AzureAuthWorkloadIdentity”Microsoft Entra Workload ID authentication using a federated token file.
tenantId
Section titled “tenantId”Type:
String?Microsoft Entra ID tenant ID. When empty, the AZURE_TENANT_ID environment variable is used
clientId
Section titled “clientId”Type:
String?Application (client) ID. When empty, the AZURE_CLIENT_ID environment variable is used
tokenFile
Section titled “tokenFile”Type:
String?Path to the federated token file. When empty, the AZURE_FEDERATED_TOKEN_FILE environment variable is used
FileSystemStore
Section titled “FileSystemStore”Filesystem blob store.
Type:
String· requiredWhere to store the data in the server’s filesystem
Type:
UnsignedInt· default:2· max: 5Maximum depth of nested directories
FoundationDbStore
Section titled “FoundationDbStore”FoundationDB data store.
clusterFile
Section titled “clusterFile”Type:
String?Path to the cluster file for the FoundationDB cluster
datacenterId
Section titled “datacenterId”Type:
String?Data center ID (optional)
machineId
Section titled “machineId”Type:
String?Machine ID in the FoundationDB cluster (optional)
transactionRetryDelay
Section titled “transactionRetryDelay”Type:
Duration?Transaction maximum retry delay
transactionRetryLimit
Section titled “transactionRetryLimit”Type:
UnsignedInt?· max: 1000 · min: 1Transaction retry limit
transactionTimeout
Section titled “transactionTimeout”Type:
Duration?Transaction timeout
PostgreSqlStore
Section titled “PostgreSqlStore”PostgreSQL data store.
connectTimeout
Section titled “connectTimeout”Type:
Duration?· default:15000Maximum time to wait for a connection to the database server to be established
useTls
Section titled “useTls”Type:
Boolean· default:falseUse TLS to connect to the store
allowInvalidCerts
Section titled “allowInvalidCerts”Type:
Boolean· default:falseAllow invalid TLS certificates when connecting to the store
poolMaxConnections
Section titled “poolMaxConnections”Type:
UnsignedInt?· max: 8192 · min: 1Maximum number of connections to the store. When unset, 4 per CPU core, between 16 and 32.
poolRecyclingMethod
Section titled “poolRecyclingMethod”Type:
PostgreSqlRecyclingMethod· default:"fast"Method to use when recycling connections in the pool
readReplicas
Section titled “readReplicas”Type:
List<PostgreSqlSettings>· enterpriseList of read replicas for the store
Type:
String· requiredHostname of the database server
Type:
UnsignedInt· default:5432· max: 65535 · min: 1Port of the database server
database
Section titled “database”Type:
String· default:"stalwart"Name of the database
authUsername
Section titled “authUsername”Type:
String?· default:"stalwart"Username to connect to the store
authSecret
Section titled “authSecret”Type:
SecretKeyOptional· default:{"@type":"None"}Password to connect to the store
options
Section titled “options”Type:
String?Additional connection options
PostgreSqlSettings
Section titled “PostgreSqlSettings”PostgreSQL connection settings.
Type:
String· requiredHostname of the database server
Type:
UnsignedInt· default:5432· max: 65535 · min: 1Port of the database server
database
Section titled “database”Type:
String· default:"stalwart"Name of the database
authUsername
Section titled “authUsername”Type:
String?· default:"stalwart"Username to connect to the store
authSecret
Section titled “authSecret”Type:
SecretKeyOptional· default:{"@type":"None"}Password to connect to the store
options
Section titled “options”Type:
String?Additional connection options
MySqlStore
Section titled “MySqlStore”MySQL data store.
idleTimeout
Section titled “idleTimeout”Type:
Duration?· default:15000Time an idle connection may stay open before the server closes it (sets the MySQL wait_timeout session variable)
useTls
Section titled “useTls”Type:
Boolean· default:falseUse TLS to connect to the store
allowInvalidCerts
Section titled “allowInvalidCerts”Type:
Boolean· default:falseAllow invalid TLS certificates when connecting to the store
maxAllowedPacket
Section titled “maxAllowedPacket”Type:
UnsignedInt?· max: 1073741824 · min: 1024Maximum size of a packet in bytes
poolMaxConnections
Section titled “poolMaxConnections”Type:
UnsignedInt?· max: 8192 · min: 1Maximum number of connections to the store. When unset, 4 per CPU core, between 16 and 32.
poolMinConnections
Section titled “poolMinConnections”Type:
UnsignedInt?· default:5· max: 8192 · min: 1Minimum number of connections to the store
readReplicas
Section titled “readReplicas”Type:
List<MySqlSettings>· enterpriseList of read replicas for the store
Type:
String· requiredHostname of the database server
Type:
UnsignedInt· default:3306· max: 65535 · min: 1Port of the database server
database
Section titled “database”Type:
String· default:"stalwart"Name of the database
authUsername
Section titled “authUsername”Type:
String?· default:"stalwart"Username to connect to the store
authSecret
Section titled “authSecret”Type:
SecretKeyOptional· default:{"@type":"None"}Password to connect to the store
MySqlSettings
Section titled “MySqlSettings”MySQL connection settings.
Type:
String· requiredHostname of the database server
Type:
UnsignedInt· default:3306· max: 65535 · min: 1Port of the database server
database
Section titled “database”Type:
String· default:"stalwart"Name of the database
authUsername
Section titled “authUsername”Type:
String?· default:"stalwart"Username to connect to the store
authSecret
Section titled “authSecret”Type:
SecretKeyOptional· default:{"@type":"None"}Password to connect to the store
AzureEnvironment
Section titled “AzureEnvironment”| Value | Label |
|---|---|
public | Public |
china | China |
us-government | US Government |
PostgreSqlRecyclingMethod
Section titled “PostgreSqlRecyclingMethod”| Value | Label |
|---|---|
fast | Fast recycling method |
verified | Verified recycling method |
clean | Clean recycling method |