From c61d7de9930eb2b57e8589b8741bb63bec79130d Mon Sep 17 00:00:00 2001 From: t6harsh Date: Wed, 11 Feb 2026 09:50:37 +0530 Subject: [PATCH 1/2] feat: add Docker Mailserver one-click service template --- svgs/docker-mailserver.svg | 7 ++ templates/compose/docker-mailserver.yaml | 91 ++++++++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 svgs/docker-mailserver.svg create mode 100644 templates/compose/docker-mailserver.yaml diff --git a/svgs/docker-mailserver.svg b/svgs/docker-mailserver.svg new file mode 100644 index 000000000..e907d456d --- /dev/null +++ b/svgs/docker-mailserver.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/templates/compose/docker-mailserver.yaml b/templates/compose/docker-mailserver.yaml new file mode 100644 index 000000000..6a0aae661 --- /dev/null +++ b/templates/compose/docker-mailserver.yaml @@ -0,0 +1,91 @@ +# documentation: https://docker-mailserver.github.io/docker-mailserver/latest/ +# slogan: A fullstack, production-ready, self-hosted mail server (SMTP, IMAP, DKIM, antispam, antivirus, etc.) +# category: email +# tags: email,mail,smtp,imap,postfix,dovecot,dkim,spf,dmarc,antispam +# logo: svgs/docker-mailserver.svg +# port: 25 + +services: + docker-mailserver: + image: docker.io/mailserver/docker-mailserver:14.0.0 + hostname: ${MAIL_HOSTNAME:?mail} + domainname: ${MAIL_DOMAIN:?} + ports: + - "25:25" + - "465:465" + - "587:587" + - "993:993" + volumes: + - mail-data:/var/mail + - mail-state:/var/mail-state + - mail-logs:/var/log/mail + - mail-config:/tmp/docker-mailserver + environment: + # Postmaster account — the initial admin mailbox created on first boot + - POSTMASTER_ADDRESS=postmaster@${MAIL_DOMAIN:?} + - POSTMASTER_PASSWORD=${SERVICE_PASSWORD_POSTMASTER} + + # General configuration + - OVERRIDE_HOSTNAME=${MAIL_HOSTNAME:?mail}.${MAIL_DOMAIN:?} + - LOG_LEVEL=${LOG_LEVEL:-info} + - SUPERVISOR_LOGLEVEL=${SUPERVISOR_LOGLEVEL:-warn} + - TZ=${TZ:-UTC} + - ONE_DIR=1 + - PERMIT_DOCKER=none + + # TLS — use letsencrypt when paired with Coolify's proxy, or manual certs + - SSL_TYPE=${SSL_TYPE:-} + - SSL_CERT_PATH=${SSL_CERT_PATH:-} + - SSL_KEY_PATH=${SSL_KEY_PATH:-} + + # DKIM / SPF / DMARC + - ENABLE_OPENDKIM=${ENABLE_OPENDKIM:-1} + - ENABLE_OPENDMARC=${ENABLE_OPENDMARC:-1} + - ENABLE_POLICYD_SPF=${ENABLE_POLICYD_SPF:-1} + + # Optional features — disabled by default to save resources + - ENABLE_CLAMAV=${ENABLE_CLAMAV:-0} + - ENABLE_SPAMASSASSIN=${ENABLE_SPAMASSASSIN:-0} + - SPAMASSASSIN_SPAM_TO_INBOX=${SPAMASSASSIN_SPAM_TO_INBOX:-1} + - MOVE_SPAM_TO_JUNK=${MOVE_SPAM_TO_JUNK:-1} + + # Fail2Ban — requires NET_ADMIN capability + - ENABLE_FAIL2BAN=${ENABLE_FAIL2BAN:-1} + + # Relay host — useful when ISP blocks port 25 outbound + - DEFAULT_RELAY_HOST=${DEFAULT_RELAY_HOST:-} + + # Rate limiting + - POSTFIX_MESSAGE_SIZE_LIMIT=${POSTFIX_MESSAGE_SIZE_LIMIT:-25600000} + - ENABLE_QUOTAS=${ENABLE_QUOTAS:-1} + - POSTFIX_MAILBOX_SIZE_LIMIT=${POSTFIX_MAILBOX_SIZE_LIMIT:-0} + + # Fetchmail — pull mail from external accounts + - ENABLE_FETCHMAIL=${ENABLE_FETCHMAIL:-0} + - FETCHMAIL_POLL=${FETCHMAIL_POLL:-300} + + # ManageSieve — client-side mail filtering rules (Thunderbird, etc.) + - ENABLE_MANAGESIEVE=${ENABLE_MANAGESIEVE:-0} + cap_add: + - NET_ADMIN + - SYS_PTRACE + restart: unless-stopped + entrypoint: + - /bin/bash + - -c + - | + # Create the postmaster account on first boot if it does not exist + if [ ! -f /tmp/docker-mailserver/postfix-accounts.cf ] || \ + ! grep -q "^postmaster@" /tmp/docker-mailserver/postfix-accounts.cf 2>/dev/null; then + setup email add "postmaster@${MAIL_DOMAIN}" "${POSTMASTER_PASSWORD}" + fi + + # Start the mail server + exec /usr/bin/dumb-init -- supervisord -c /etc/supervisor/supervisord.conf + stop_grace_period: 1m + healthcheck: + test: ["CMD-SHELL", "ss -tlnp | grep -q ':25 '"] + interval: 30s + timeout: 10s + retries: 5 + start_period: 120s From 3488acff9831aabb7d9d98b34f0bb48f4e785d05 Mon Sep 17 00:00:00 2001 From: t6harsh Date: Wed, 11 Feb 2026 16:00:53 +0530 Subject: [PATCH 2/2] fix: address PR review - Traefik TLS, restart policy, logo --- svgs/docker-mailserver.svg | 8 +------- templates/compose/docker-mailserver.yaml | 12 +++++++----- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/svgs/docker-mailserver.svg b/svgs/docker-mailserver.svg index e907d456d..ff0863fdd 100644 --- a/svgs/docker-mailserver.svg +++ b/svgs/docker-mailserver.svg @@ -1,7 +1 @@ - - - - - - - + diff --git a/templates/compose/docker-mailserver.yaml b/templates/compose/docker-mailserver.yaml index 6a0aae661..94686dbde 100644 --- a/templates/compose/docker-mailserver.yaml +++ b/templates/compose/docker-mailserver.yaml @@ -20,6 +20,9 @@ services: - mail-state:/var/mail-state - mail-logs:/var/log/mail - mail-config:/tmp/docker-mailserver + # Mount Traefik's ACME certificate store (read-only) + # DMS natively reads acme.json and auto-reloads on cert renewal + - /data/coolify/proxy/acme.json:/etc/letsencrypt/acme.json:ro environment: # Postmaster account — the initial admin mailbox created on first boot - POSTMASTER_ADDRESS=postmaster@${MAIL_DOMAIN:?} @@ -33,10 +36,10 @@ services: - ONE_DIR=1 - PERMIT_DOCKER=none - # TLS — use letsencrypt when paired with Coolify's proxy, or manual certs - - SSL_TYPE=${SSL_TYPE:-} - - SSL_CERT_PATH=${SSL_CERT_PATH:-} - - SSL_KEY_PATH=${SSL_KEY_PATH:-} + # TLS — pre-configured for Coolify's Traefik proxy + # DMS reads Traefik's acme.json and extracts the matching certificate + - SSL_TYPE=letsencrypt + - SSL_DOMAIN=${MAIL_HOSTNAME:?mail}.${MAIL_DOMAIN:?} # DKIM / SPF / DMARC - ENABLE_OPENDKIM=${ENABLE_OPENDKIM:-1} @@ -69,7 +72,6 @@ services: cap_add: - NET_ADMIN - SYS_PTRACE - restart: unless-stopped entrypoint: - /bin/bash - -c