maddy config for lekva.me
diff --git a/scripts/homelab/maddy-config.yaml b/scripts/homelab/maddy-config.yaml
new file mode 100644
index 0000000..c92da8c
--- /dev/null
+++ b/scripts/homelab/maddy-config.yaml
@@ -0,0 +1,178 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: config
+  namespace: app-maddy
+data:
+  maddy.conf:
+    ----
+    ## Maddy Mail Server - default configuration file (2021-03-07)
+    # Suitable for small-scale deployments. Uses its own format for local users DB,
+    # should be managed via maddyctl utility.
+    #
+    # See tutorials at https://maddy.email for guidance on typical
+    # configuration changes.
+    #
+    # See manual pages (also available at https://maddy.email) for reference
+    # documentation.
+
+    # ----------------------------------------------------------------------------
+    # Base variables
+
+    $(hostname) = mx1.lekva.me
+    $(primary_domain) = lekva.me
+    $(local_domains) = $(primary_domain)
+    
+    tls file /etc/maddy/certs/tls.crt /etc/maddy/certs/tls.key
+    
+    # ----------------------------------------------------------------------------
+    # Local storage & authentication
+    
+    # pass_table provides local hashed passwords storage for authentication of
+    # users. It can be configured to use any "table" module, in default
+    # configuration a table in SQLite DB is used.
+    # Table can be replaced to use e.g. a file for passwords. Or pass_table module
+    # can be replaced altogether to use some external source of credentials (e.g.
+    # PAM, /etc/shadow file).
+    #
+    # If table module supports it (sql_table does) - credentials can be managed
+    # using 'maddyctl creds' command.
+    
+    auth.pass_table local_authdb {
+        table sql_table {
+            driver sqlite3
+            dsn credentials.db
+            table_name passwords
+        }
+    }
+    
+    # imapsql module stores all indexes and metadata necessary for IMAP using a
+    # relational database. It is used by IMAP endpoint for mailbox access and
+    # also by SMTP & Submission endpoints for delivery of local messages.
+    #
+    # IMAP accounts, mailboxes and all message metadata can be inspected using
+    # imap-* subcommands of maddyctl utility.
+    
+    storage.imapsql local_mailboxes {
+        driver sqlite3
+        dsn imapsql.db
+    }
+    
+    # ----------------------------------------------------------------------------
+    # SMTP endpoints + message routing
+    
+    hostname $(hostname)
+    
+    msgpipeline local_routing {
+        # Insert handling for special-purpose local domains here.
+        # e.g.
+        # destination lists.example.org {
+        #     deliver_to lmtp tcp://127.0.0.1:8024
+        # }
+    
+        destination postmaster $(local_domains) {
+            modify {
+                replace_rcpt regexp "(.+)\+(.+)@(.+)" "$1@$3"
+                replace_rcpt file /etc/maddy/aliases
+            }
+    
+            deliver_to &local_mailboxes
+        }
+    
+        default_destination {
+            reject 550 5.1.1 "User doesn't exist"
+        }
+    }
+    
+    smtp tcp://0.0.0.0:25 {
+        limits {
+            # Up to 20 msgs/sec across max. 10 SMTP connections.
+            all rate 20 1s
+            all concurrency 10
+        }
+    
+        dmarc yes
+        check {
+            require_mx_record
+            dkim
+            spf
+        }
+    
+        source $(local_domains) {
+            reject 501 5.1.8 "Use Submission for outgoing SMTP"
+        }
+        default_source {
+            destination postmaster $(local_domains) {
+                deliver_to &local_routing
+            }
+            default_destination {
+                reject 550 5.1.1 "User doesn't exist"
+            }
+        }
+    }
+    
+    submission tls://0.0.0.0:465 tcp://0.0.0.0:587 {
+        limits {
+            # Up to 50 msgs/sec across any amount of SMTP connections.
+            all rate 50 1s
+        }
+    
+        auth &local_authdb
+    
+        source $(local_domains) {
+            destination postmaster $(local_domains) {
+                deliver_to &local_routing
+            }
+            default_destination {
+                modify {
+                    dkim $(primary_domain) $(local_domains) default
+                }
+                deliver_to &remote_queue
+            }
+        }
+        default_source {
+            reject 501 5.1.8 "Non-local sender domain"
+        }
+    }
+
+    target.remote outbound_delivery {
+        limits {
+            # Up to 20 msgs/sec across max. 10 SMTP connections
+            # for each recipient domain.
+            destination rate 20 1s
+            destination concurrency 10
+        }
+        mx_auth {
+            dane
+            mtasts {
+                cache fs
+                fs_dir mtasts_cache/
+            }
+            local_policy {
+                min_tls_level encrypted
+                min_mx_level none
+            }
+        }
+    }
+    
+    target.queue remote_queue {
+        target &outbound_delivery
+    
+        autogenerated_msg_domain $(primary_domain)
+        bounce {
+            destination postmaster $(local_domains) {
+                deliver_to &local_routing
+            }
+            default_destination {
+                reject 550 5.0.0 "Refusing to send DSNs to non-local addresses"
+            }
+        }
+    }
+    
+    # ----------------------------------------------------------------------------
+    # IMAP endpoints
+    
+    imap tls://0.0.0.0:993 tcp://0.0.0.0:143 {
+        auth &local_authdb
+        storage &local_mailboxes
+    }