

= stalwart-mail

image::https://img.shields.io/badge/Version-0.0.1-informational?style=flat-square[Version: 0.0.1]
image::https://img.shields.io/badge/Version-application-informational?style=flat-square[Type: application]
image::https://img.shields.io/badge/AppVersion-0.5.3-informational?style=flat-square[AppVersion: 0.5.3]
== Maintainers

.Maintainers
|===
| Name | Email | Url

| WrenIX
|
| <https://wrenix.eu>
|===

= Alpha

WARNING
====
We stop working on this Helm-Chart.
There are still many breaking change like:

* https://github.com/stalwartlabs/mail-server/issues/211[storage.fts in toml configuration has two meanings]

We hope that stalward mail-server becomes more stable.

====

== Usage

Helm must be installed and setup to your kubernetes cluster to use the charts.
Refer to Helm's https://helm.sh/docs[documentation] to get started.
Once Helm has been set up correctly, fetch the charts as follows:

[source,bash]
----
helm pull oci://codeberg.org/wrenix/helm-charts/stalwart-mail
----

You can install a chart release using the following command:

[source,bash]
----
helm install stalwart-mail-release oci://codeberg.org/wrenix/helm-charts/stalwart-mail --values values.yaml
----

To uninstall a chart release use `helm`'s delete command:

[source,bash]
----
helm uninstall stalwart-mail-release
----

== Values

.Values
|===
| Key | Type | Default | Description

| affinity
| object
| `{}`
|

| autoscaling.enabled
| bool
| `false`
|

| autoscaling.maxReplicas
| int
| `100`
|

| autoscaling.minReplicas
| int
| `1`
|

| autoscaling.targetCPUUtilizationPercentage
| int
| `80`
|

| certificate.certmanager.dnsNames[0]
| string
| `"chart-example.local"`
|

| certificate.certmanager.enabled
| bool
| `true`
|

| certificate.certmanager.issuerRef.group
| string
| `"cert-manager.io"`
|

| certificate.certmanager.issuerRef.kind
| string
| `"ClusterIssuer"`
|

| certificate.certmanager.issuerRef.name
| string
| `"letsencrypt-prod"`
|

| certificate.secretName
| string
| `nil`
| not needed if certmanager is used

| config.acme.letsencrypt
| object
| `{"cache":"/opt/stalwart-mail/etc/acme","contact":["postmaster@%{DEFAULT_DOMAIN}%"],"directory":"https://acme-v02.api.letsencrypt.org/directory","port":443,"renew-before":"30d"}`
| acme with name letsencrypt (from: common/tls.toml)

| config.acme.letsencrypt.cache
| string
| `"/opt/stalwart-mail/etc/acme"`
| acme cache (from: common/tls.toml)

| config.acme.letsencrypt.contact
| list
| `["postmaster@%{DEFAULT_DOMAIN}%"]`
| acme contact (from: common/tls.toml)

| config.acme.letsencrypt.directory
| string
| `"https://acme-v02.api.letsencrypt.org/directory"`
| acme directory (from: common/tls.toml)

| config.acme.letsencrypt.port
| int
| `443`
| acme port (from: common/tls.toml)

| config.acme.letsencrypt.renew-before
| string
| `"30d"`
| acme renew-before (from: common/tls.toml)

| config.certificate.default
| object
| `{"cert":"file:///opt/stalwart-mail/etc/certs/tls.crt","private-key":"file:///opt/stalwart-mail/etc/certs/tls.key"}`
| certificate with name default (from: common/tls.toml)

| config.certificate.default.cert
| string
| `"file:///opt/stalwart-mail/etc/certs/tls.crt"`
| certificate cert (from: common/tls.toml)

| config.certificate.default.private-key
| string
| `"file:///opt/stalwart-mail/etc/certs/tls.key"`
| certificate private-key (from: common/tls.toml)

| config.directory.memory
| object
| `{"disable":false,"options":{"catch-all":true,"subaddressing":true},"principals":[{"description":"Superuser","mail":["postmaster@%{DEFAULT_DOMAIN}%"],"name":"admin","secret":"changeme","type":"admin"}],"type":"memory"}`
| directory - with name memory (from: directory/internal.yaml)

| config.directory.memory.disable
| bool
| `false`
| overwrite me, if not wanted

| config.global.shared-map.capacity
| int
| `10`
| global shared-map capacity (from: common/server.toml)

| config.global.shared-map.shard
| int
| `32`
| global shared-map shard (from: common/server.toml)

| config.global.thread-pool
| string
| `nil`
| global thead-pool (from: common/server.toml)

| config.global.tracing
| object
| `{"level":"info","method":"stdout"}`
| global tracing (from: common/tracing.toml)

| config.imap.auth.allow-plain-text
| bool
| `false`
| imap auth allow-plain-text (from: imap/settings.toml)

| config.imap.auth.max-failures
| int
| `3`
| imap auth max-failures(from: imap/settings.toml)

| config.imap.folders.name.shared
| string
| `"Shared Folders"`
| imap folders name shared (from: imap/settings.toml)

| config.imap.protocol.uidplus
| bool
| `false`
| imap protocol uidplus (from: imap/settings.toml)

| config.imap.rate-limit.concurrent
| int
| `6`
| imap rate-limit concurrent (from: imap/settings.toml)

| config.imap.rate-limit.requests
| string
| `"2000/1m"`
| imap rate-limit requests (from: imap/settings.toml)

| config.imap.request.max-size
| int
| `52428800`
| imap request max-size (from: imap/settings.toml)

| config.imap.timeout.anonymous
| string
| `"1m"`
| imap timeout anonymous (from: imap/settings.toml)

| config.imap.timeout.authenticated
| string
| `"30m"`
| imap timeout authenticated (from: imap/settings.toml)

| config.imap.timeout.idle
| string
| `"30m"`
| imap timeout idle (from: imap/settings.toml)

| config.jmap.directory
| string
| `"%{DEFAULT_DIRECTORY}%"`
| jmap-directory (from: jmap/auth.yaml)

| config.jmap.email
| object
| `{"max-attachment-size":50000000,"max-size":75000000,"parse":{"max-items":10}}`
| jmap-email

| config.jmap.event-source
| object
| `{"throttle":"1s"}`
| jmap-event-source

| config.jmap.mailbox
| object
| `{"max-depth":10,"max-name-length":255}`
| jmap-mailbox

| config.jmap.principal
| object
| `{"allow-lookups":true}`
| jmap-principal

| config.jmap.protocol
| object
| `{"changes":{"max-results":5000},"get":{"max-objects":500},"query":{"max-results":5000},"request":{"max-calls":16,"max-concurrent":4,"max-size":10000000},"set":{"max-objects":500},"upload":{"max-concurrent":4,"max-size":50000000,"quota":{"files":1000,"size":50000000},"ttl":"1h"}}`
| jmap-protocol (from: jmap/protocol.yaml)

| config.jmap.push
| object
| `{"attempts":{"interval":"1m","max":3},"max-total":100,"retry":{"interval":"1s"},"throttle":"1ms","timeout":{"request":"10s","verify":"1s"}}`
| jmap-push (from: jmap/push.yaml)

| config.jmap.rate-limit
| object
| `{"account":"1000/1m","anonymous":"100/1m","authentication":"10/1m","cache":{"size":1024},"use-forwarded":true}`
| jmap-rate-limit (from: jmap/ratelimit.yaml)

| config.jmap.session
| object
| `{"cache":{"size":100,"ttl":"1h"},"purge":{"frequency":"0 3 *"}}`
| jmap-session (from: jmap/auth.yaml)

| config.jmap.web-sockets
| object
| `{"heartbeat":"1m","throttle":"1s","timeout":"10m"}`
| jmap-web-sockets (from: jmap/websocket.yaml)

| config.macros
| object
| `{"default_directory":"memory","default_domain":"__DOMAIN__","default_store":"sqlite","host":"__HOST__"}`
| macros (from: config.toml)

| config.oauth.auth
| object
| `{"max-attempts":3}`
| oauth - auth

| config.oauth.cache
| object
| `{"size":128}`
| oauth - cache

| config.oauth.expiry
| object
| `{"auth-code":"10m","refresh-token":"30d","refresh-token-renew":"4d","token":"1h","user-code":"30m"}`
| oauth - expiry

| config.oauth.key
| string
| `"__OAUTH_KEY__"`
| oauth - key

| config.queue.hash
| int
| `64`
| queue-hash

| config.queue.outbound
| object
| `{"ip-strategy":"ipv4-then-ipv6","limits":{"multihomed":2,"mx":7},"next-hop":[{"if":"rcpt-domain","in-list":"%{DEFAULT_DIRECTORY}%/domains","then":"local"},{"else":false}],"timeouts":{"connect":"3m","data":"10m","ehlo":"3m","greeting":"3m","mail-from":"3m","mta-sts":"2m","rcpt-to":"3m","tls":"2m"},"tls":{"allow-invalid-certs":false,"dane":"optional","mta-sts":"optional","starttls":"require"}}`
| queue-outbound

| config.queue.path
| string
| `"/data/queue"`
| queue-path

| config.queue.schedule
| object
| `{"expire":"5d","notify":["1d","3d"],"retry":["2m","5m","10m","15m","30m","1h","2h"]}`
| queue-schedule

| config.report.analysis
| object
| `{"addresses":["dmarc@*","abuse@*","postmaster@*"],"forward":true}`
| report-analysis

| config.report.dkim
| object
| `{"from-address":"noreply-dkim@%{DEFAULT_DOMAIN}%","from-name":"Report Subsystem","send":"1/1d","sign":["rsa"],"subject":"DKIM Authentication Failure Report"}`
| report-dkim

| config.report.dmarc
| object
| `{"aggregate":{"from-address":"noreply-dmarc@%{DEFAULT_DOMAIN}%","from-name":"DMARC Report","max-size":26214400,"org-name":"%{DEFAULT_DOMAIN}%","send":"daily","sign":["rsa"]},"from-address":"noreply-dmarc@%{DEFAULT_DOMAIN}%","from-name":"Report Subsystem","send":"1/1d","sign":["rsa"],"subject":"DMARC Authentication Failure Report"}`
| report-dmarc

| config.report.dmarc.aggregate.max-size
| int
| `26214400`
| default: 25 mb

| config.report.dsn
| object
| `{"from-address":"MAILER-DAEMON@%{DEFAULT_DOMAIN}%","from-name":"Mail Delivery Subsystem","sign":["rsa"]}`
| report-dsn

| config.report.hash
| int
| `64`
| report-hash

| config.report.path
| string
| `"/data/reports"`
| report-path

| config.report.spf
| object
| `{"from-address":"noreply-spf@%{DEFAULT_DOMAIN}%","from-name":"Report Subsystem","send":"1/1d","sign":["rsa"],"subject":"SPF Authentication Failure Report"}`
| report-spf

| config.report.tls
| object
| `{"aggregate":{"from-address":"noreply-tls@%{DEFAULT_DOMAIN}%","from-name":"TLS Report","max-size":26214400,"org-name":"%{DEFAULT_DOMAIN}%","send":"daily","sign":["rsa"]}}`
| report-tls

| config.report.tls.aggregate.max-size
| int
| `26214400`
| default: 25 mb

| config.resolver.attempts
| int
| `2`
| resolver-attempts

| config.resolver.cache
| object
| `{"ipv4":1024,"ipv6":1024,"mta-sts":1024,"mx":1024,"ptr":1024,"tlsa":1024,"txt":2048}`
| resolver-cache

| config.resolver.concurrency
| int
| `2`
| resolver-concurrency

| config.resolver.preserve-intermediates
| bool
| `true`
| resolver-preserve-intermediates

| config.resolver.public-suffix
| list
| `["https://publicsuffix.org/list/public_suffix_list.dat","file:///opt/stalwart-mail/etc/spamfilter/maps/suffix_list.dat.gz"]`
| resolver-public-suffix

| config.resolver.timeout
| string
| `"5s"`
| resolver-timeout

| config.resolver.try-tcp-on-error
| bool
| `true`
| resolver-try-tcp-on-error

| config.resolver.type
| string
| `"system"`
| resolver-type

| config.server.hostname
| string
| `"%{HOST}%"`
| server hostname (from: common/server.toml)

| config.server.listener
| object
| `{"http":{"bind":["[::]:80"],"protocol":"jmap","url":"https://%{HOST}%"},"imap":{"bind":["[::]:143"],"protocol":"imap"},"imaps":{"bind":["[::]:993"],"protocol":"imap","tls":{"implicit":true}},"sieve":{"bind":["[::]:4190"],"protocol":"managesieve","tls":{"implicit":true}},"smtp":{"bind":["[::]:25"],"protocol":"smtp"},"smtp-submission":{"bind":["[::]:587"],"protocol":"smtp"},"smtps":{"bind":["[::]:465"],"protocol":"smtp","tls":{"implicit":true}}}`
| server listener

| config.server.listener.http
| object
| `{"bind":["[::]:80"],"protocol":"jmap","url":"https://%{HOST}%"}`
| jmap/listener.yaml

| config.server.listener.imap
| object
| `{"bind":["[::]:143"],"protocol":"imap"}`
| server listener with name imap (from: imap/listener.toml)

| config.server.listener.imaps
| object
| `{"bind":["[::]:993"],"protocol":"imap","tls":{"implicit":true}}`
| server listener with name imaps (from: imap/listener.toml)

| config.server.listener.sieve
| object
| `{"bind":["[::]:4190"],"protocol":"managesieve","tls":{"implicit":true}}`
| server listener with name sieve (from: imap/listener.toml)

| config.server.run-as.group
| string
| `"stalwart-mail"`
| server run-as group (from: common/server.toml)

| config.server.run-as.user
| string
| `"stalwart-mail"`
| server run-as user (from: common/server.toml)

| config.server.security.blocked-networks
| object
| `{}`
| server security blocked-networks (from: common/server.toml)

| config.server.security.fail2ban
| string
| `"100/1d"`
| server security fail2ban (from: common/server.toml)

| config.server.socket.backlog
| int
| `1024`
| server socket backlog (from: common/server.toml)

| config.server.socket.linger
| int
| `1`
| server socket linger (from: common/server.toml)

| config.server.socket.nodelay
| bool
| `true`
| server socket nodelay (from: common/server.toml)

| config.server.socket.recv-buffer-size
| int
| `65535`
| server socket recv-buffer-size (from: common/server.toml)

| config.server.socket.reuse-addr
| bool
| `true`
| server socket reuse-addr (from: common/server.toml)

| config.server.socket.reuse-port
| bool
| `false`
| server socket reuse-port (from: common/server.toml)

| config.server.socket.send-buffer-size
| int
| `65535`
| server socket send-buffer-size (from: common/server.toml)

| config.server.socket.tos
| int
| `1`
| server socket tos (from: common/server.toml)

| config.server.socket.ttl
| int
| `3600`
| server socket ttl (from: common/server.toml)

| config.server.tls.acme
| string
| `nil`
| server tls acme (from: common/tls.toml) example: "letsencrypt"

| config.server.tls.certificate
| string
| `"default"`
| server tls certificate (from: common/tls.toml)

| config.server.tls.ciphers
| string
| `nil`
| server tls #ciphers (from: common/tls.toml) example: [ "TLS13_AES_256_GCM_SHA384", "TLS13_AES_128_GCM_SHA256",            "TLS13_CHACHA20_POLY1305_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",            "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",            "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",            "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256"]

| config.server.tls.enable
| bool
| `true`
| server tls enable (from: common/tls.toml)

| config.server.tls.ignore-client-order
| bool
| `true`
| server tls ignore-client-order (from: common/tls.toml)

| config.server.tls.implicit
| bool
| `false`
| server tls implicit (from: common/tls.toml)

| config.server.tls.protocols
| string
| `nil`
| server tls protocols (from: common/tls.toml) example: ["TLSv1.2", "TLSv1.3"]

| config.server.tls.sni
| string
| `nil`
| server tls sni (from: common/tls.toml) example: [{subject: "", certificate: ""}]

| config.server.tls.timeout
| string
| `"1m"`
| server tls timeout (from: common/tls.toml)

| config.sieve.trusted.from-addr
| string
| `"no-reply@%{DEFAULT_DOMAIN}%"`
| sieve trusted from-addr (from: common/sieve.toml)

| config.sieve.trusted.from-name
| string
| `"Automated Message"`
| sieve trusted from-name (from: common/sieve.toml)

| config.sieve.trusted.hostname
| string
| `"%{HOST}%"`
| sieve trusted hostname (from: common/sieve.toml)

| config.sieve.trusted.limits.cpu
| int
| `1048576`
| sieve trusted limits cpu (from: common/sieve.toml)

| config.sieve.trusted.limits.duplicate-expiry
| string
| `"7d"`
| sieve trusted limits duplicate-expiry (from: common/sieve.toml)

| config.sieve.trusted.limits.nested-includes
| int
| `5`
| sieve trusted limits nested-includes (from: common/sieve.toml)

| config.sieve.trusted.limits.out-messages
| int
| `5`
| sieve trusted limits out-messages (from: common/sieve.toml)

| config.sieve.trusted.limits.received-headers
| int
| `50`
| sieve trusted limits received-headers (from: common/sieve.toml)

| config.sieve.trusted.limits.redirects
| int
| `3`
| sieve trusted limits redirects (from: common/sieve.toml)

| config.sieve.trusted.no-capability-check
| bool
| `true`
| sieve trusted no-capability-check (from: common/sieve.toml)

| config.sieve.trusted.return-path
| string
| `""`
| sieve trusted return-path (from: common/sieve.toml)

| config.sieve.trusted.scripts.connect
| string
| `nil`
| sieve trusted scripts connect (from: common/sieve.toml)

| config.sieve.trusted.scripts.ehlo
| string
| `nil`
| sieve trusted scripts ehlo (from: common/sieve.toml)

| config.sieve.trusted.scripts.mail
| string
| `nil`
| sieve trusted scripts mail (from: common/sieve.toml)

| config.sieve.trusted.sign
| list
| `["rsa"]`
| sieve trusted sign (from: common/sieve.toml)

| config.sieve.untrusted.default-expiry.duplicate
| string
| `"7d"`
| sieve untrusted default-expiry duplicate (from: common/sieve.toml)

| config.sieve.untrusted.default-expiry.vacation
| string
| `"30d"`
| sieve untrusted default-expiry vacation (from: common/sieve.toml)

| config.sieve.untrusted.disable-capabilities
| list
| `[]`
| sieve untrusted disable-capabilities (from: common/sieve.toml)

| config.sieve.untrusted.limits.cpu
| int
| `5000`
| sieve untrusted limit cpu (from: common/sieve.toml)

| config.sieve.untrusted.limits.header-size
| int
| `1024`
| sieve untrusted limit header-size (from: common/sieve.toml)

| config.sieve.untrusted.limits.includes
| int
| `3`
| sieve untrusted limit includes (from: common/sieve.toml)

| config.sieve.untrusted.limits.local-variables
| int
| `128`
| sieve untrusted limit local-variables (from: common/sieve.toml)

| config.sieve.untrusted.limits.match-variables
| int
| `30`
| sieve untrusted limit match-variables (from: common/sieve.toml)

| config.sieve.untrusted.limits.max-scripts
| int
| `256`
| sieve untrusted limit max-scripts (from: common/sieve.toml)

| config.sieve.untrusted.limits.name-length
| int
| `512`
| sieve untrusted limit name-length (from: common/sieve.toml)

| config.sieve.untrusted.limits.nested-blocks
| int
| `15`
| sieve untrusted limit nested-blocks (from: common/sieve.toml)

| config.sieve.untrusted.limits.nested-foreverypart
| int
| `3`
| sieve untrusted limit nested-foreverypart (from: common/sieve.toml)

| config.sieve.untrusted.limits.nested-includes
| int
| `3`
| sieve untrusted limit nested-includes (from: common/sieve.toml)

| config.sieve.untrusted.limits.nested-tests
| int
| `15`
| sieve untrusted limit nested-tests (from: common/sieve.toml)

| config.sieve.untrusted.limits.outgoing-messages
| int
| `3`
| sieve untrusted limit outgoing-messages (from: common/sieve.toml)

| config.sieve.untrusted.limits.received-headers
| int
| `10`
| sieve untrusted limit received-headers (from: common/sieve.toml)

| config.sieve.untrusted.limits.redirects
| int
| `1`
| sieve untrusted limit redirects (from: common/sieve.toml)

| config.sieve.untrusted.limits.script-size
| int
| `102400`
| sieve untrusted limit script-size (from: common/sieve.toml)

| config.sieve.untrusted.limits.string-length
| int
| `4096`
| sieve untrusted limit string-length (from: common/sieve.toml)

| config.sieve.untrusted.limits.variable-name-length
| int
| `32`
| sieve untrusted limit variable-name-length (from: common/sieve.toml)

| config.sieve.untrusted.limits.variable-size
| int
| `4096`
| sieve untrusted limit variable-size (from: common/sieve.toml)

| config.sieve.untrusted.notification-uris
| list
| `["mailto"]`
| sieve untrusted notification-uris (from: common/sieve.toml)

| config.sieve.untrusted.protected-headers
| list
| `["Original-Subject","Original-From","Received","Auto-Submitted"]`
| sieve untrusted protected-headers (from: common/sieve.toml)

| config.sieve.untrusted.vacation.default-subject
| string
| `"Automated reply"`
| sieve untrusted vacation default-subject (from: common/sieve.toml)

| config.sieve.untrusted.vacation.subject-prefix
| string
| `"Auto: "`
| sieve untrusted vacation subject-prefix (from: common/sieve.toml)

| config.signature.rsa
| object
| `{"algorithm":"rsa-sha256","canonicalization":"relaxed/relaxed","domain":"%{DEFAULT_DOMAIN}%","headers":["From","To","Date","Subject","Message-ID"],"private-key":"file://opt/stalwart-mail/etc/dkim/private.key","report":true,"selector":"stalwart","set-body-length":false}`
| signature-rsa

| config.storage.blob
| string
| `"%{DEFAULT_STORE}%"`
| storage blob (from: common/store.toml)

| config.storage.cluster.node-id
| string
| `nil`
| storage - cluster - node-id (from: common/store.toml)

| config.storage.data
| string
| `"%{DEFAULT_STORE}%"`
| storage data (from: common/store.toml)

| config.storage.directory
| string
| `"%{DEFAULT_DIRECTORY}%"`
| storage directory (from: common/store.toml)

| config.storage.encryption.append
| bool
| `false`
| storage encryption append (from: common/store.toml)

| config.storage.encryption.enable
| bool
| `true`
| storage encryption enable (from: common/store.toml)

| config.storage.fts
| string
| `"%{DEFAULT_STORE}%"`
| storage fts (from: common/store.toml) BROKEN / TODO see: https://github.com/stalwartlabs/mail-server/issues/211

| config.storage.fts-table-duplicated-workaround.default-language
| string
| `"en"`
| storage - fts - default-language (from: common/store.toml)

| config.storage.lookup
| string
| `"%{DEFAULT_STORE}%"`
| storage lookup (from: common/store.toml)

| config.storage.spam.header
| string
| `"X-Spam-Status: Yes"`
| storage spam header (from: common/store.toml)

| config.store.fs
| object
| `{"depth":2,"disable":false,"path":"/data/blobs","purge":{"frequency":"0 3 *"},"type":"fs"}`
| store - with name fs

| config.store.fs.disable
| bool
| `false`
| overwrite me, if not wanted

| config.store.sqlite
| object
| `{"disable":false,"path":"/data/index.sqlite3","purge":{"frequency":"0 3 *"},"query":{"domains":"SELECT 1 FROM emails WHERE address LIKE '%@' || ? LIMIT 1","emails":"SELECT address FROM emails WHERE name = ? AND type != 'list' ORDER BY type DESC, address ASC","expand":"SELECT p.address FROM emails AS p JOIN emails AS l ON p.name = l.name WHERE p.type = 'primary' AND l.address = ? AND l.type = 'list' ORDER BY p.address LIMIT 50","members":"SELECT member_of FROM group_members WHERE name = ?","name":"SELECT name, type, secret, description, quota FROM accounts WHERE name = ? AND active = true","recipients":"SELECT name FROM emails WHERE address = ?","verify":"SELECT address FROM emails WHERE address LIKE '%' || ? || '%' AND type = 'primary' ORDER BY address LIMIT 5"},"type":"sqlite"}`
| store - with name sqlite

| config.store.sqlite.disable
| bool
| `false`
| overwrite me, if not wanted

| fullnameOverride
| string
| `""`
|

| global.image.pullPolicy
| string
| `nil`
| if set it will overwrite all pullPolicy

| global.image.registry
| string
| `nil`
| if set it will overwrite all registry entries

| image.pullPolicy
| string
| `"IfNotPresent"`
|

| image.registry
| string
| `"docker.io"`
|

| image.repository
| string
| `"stalwartlabs/mail-server"`
|

| image.tag
| string
| `""`
| Overrides the image tag whose default is the chart appVersion.

| imagePullSecrets
| list
| `[]`
|

| ingress.annotations
| object
| `{}`
|

| ingress.className
| string
| `""`
|

| ingress.enabled
| bool
| `false`
|

| ingress.hosts[0].host
| string
| `"chart-example.local"`
|

| ingress.hosts[0].paths[0].path
| string
| `"/"`
|

| ingress.hosts[0].paths[0].pathType
| string
| `"ImplementationSpecific"`
|

| ingress.tls
| list
| `[]`
|

| nameOverride
| string
| `""`
|

| nodeSelector
| object
| `{}`
|

| persistence.accessMode
| string
| `"ReadWriteOnce"`
| accessMode

| persistence.annotations
| object
| `{}`
|

| persistence.enabled
| bool
| `true`
| Enable persistence using Persistent Volume Claims ref: http://kubernetes.io/docs/user-guide/persistent-volumes/

| persistence.existingClaim
| string
| `nil`
| A manually managed Persistent Volume and Claim Requires persistence.enabled: true If defined, PVC must be created manually before volume will be bound

| persistence.hostPath
| string
| `nil`
| Do not create an PVC, direct use hostPath in Pod

| persistence.size
| string
| `"10Gi"`
| size

| persistence.storageClass
| string
| `nil`
| Persistent Volume Storage Class If defined, storageClassName: <storageClass> If set to "-", storageClassName: "", which disables dynamic provisioning If undefined (the default) or set to null, no storageClassName spec is   set, choosing the default provisioner.  (gp2 on AWS, standard on   GKE, AWS & OpenStack)

| podAnnotations
| object
| `{}`
|

| podLabels
| object
| `{}`
|

| podSecurityContext
| object
| `{}`
|

| replicaCount
| int
| `1`
|

| resources
| object
| `{}`
|

| securityContext
| object
| `{}`
|

| service.annotations
| object
| `{}`
|

| service.ipFamilies[0]
| string
| `"IPv4"`
|

| service.ipFamilyPolicy
| string
| `"SingleStack"`
| other option is RequireDualStack

| service.ports.http
| int
| `80`
|

| service.ports.imap
| int
| `143`
|

| service.ports.imaps
| int
| `993`
|

| service.ports.sieve
| int
| `4190`
|

| service.ports.smtp
| int
| `25`
|

| service.ports.smtp-submission
| int
| `587`
|

| service.ports.smtps
| int
| `465`
|

| service.type
| string
| `"ClusterIP"`
|

| serviceAccount.annotations
| object
| `{}`
|

| serviceAccount.automount
| bool
| `true`
|

| serviceAccount.create
| bool
| `false`
|

| serviceAccount.name
| string
| `""`
|

| tolerations
| list
| `[]`
|

| traefik.enabled
| bool
| `false`
|

| traefik.ports.http
| string
| `"websecure"`
|

| traefik.ports.imaps
| string
| `"imaps"`
|

| traefik.ports.smtps
| string
| `"smtps"`
|

| volumeMounts
| list
| `[]`
|

| volumes
| list
| `[]`
|
|===

Autogenerated from chart metadata using https://github.com/norwoodj/helm-docs[helm-docs]

