Contribution guidelines
Checklist prior issue creation
Description
When Found certificate with issuer other than mailcow snake-oil CA and Let's Encrypt, skipping ACME client... ist set to connect to an internal CA the renewal fails with:
``Found certificate with issuer other than mailcow snake-oil CA and Let's Encrypt, skipping ACME client...
Workaround:
cp data/assets/ssl-example/cert.pem data/assets/ssl/cert.pem
cp data/assets/ssl-example/key.pem data/assets/ssl/key.pem
touch data/assets/ssl/force_renew
docker compose restart acme-mailcow
Fix:
Remove lines 110 to 117 and 130 from /srv/acme.sh or add condition to cover DIRECTORY_URL set.
Steps to reproduce:
- set DIRECTORY_URL in .env
- initial setup works
- wait for renewal
Logs:
acme-mailcow-1 | Fri Jun 26 09:26:49 CEST 2026 - Waiting for Docker API...
acme-mailcow-1 | Fri Jun 26 09:26:49 CEST 2026 - Docker API OK
acme-mailcow-1 | Fri Jun 26 09:26:49 CEST 2026 - Waiting for Postfix...
acme-mailcow-1 | Fri Jun 26 09:26:50 CEST 2026 - Postfix OK
acme-mailcow-1 | Fri Jun 26 09:26:50 CEST 2026 - Waiting for Dovecot...
acme-mailcow-1 | Fri Jun 26 09:26:50 CEST 2026 - Dovecot OK
acme-mailcow-1 | Fri Jun 26 09:26:50 CEST 2026 - Found certificate with issuer other than mailcow snake-oil CA and Let's Encrypt, skipping ACME client...
Which branch are you using?
master (stable)
Which architecture are you using?
x86_64
Operating System:
Debian 13
Server/VM specifications:
4 GB, 4 Cores
Is Apparmor, SELinux or similar active?
NO
Virtualization technology:
KVM
Docker version:
29.6.0
docker-compose version or docker compose version:
5.2.0
mailcow version:
2026-03a
Reverse proxy:
none
Logs of git diff:
diff --git a/data/conf/postfix/main.cf b/data/conf/postfix/main.cf
index f091cb3f..aef814cf 100644
--- a/data/conf/postfix/main.cf
+++ b/data/conf/postfix/main.cf
@@ -142,8 +142,8 @@ virtual_mailbox_maps = proxy:mysql:/opt/postfix/conf/sql/mysql_virtual_mailbox_m
virtual_minimum_uid = 104
virtual_transport = lmtp:inet:dovecot:24
virtual_uid_maps = static:5000
-smtpd_milters = inet:rspamd:9900
-non_smtpd_milters = inet:rspamd:9900
+#smtpd_milters = inet:rspamd:9900
+#non_smtpd_milters = inet:rspamd:9900
milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen}
mydestination = localhost.localdomain, localhost
smtp_address_preference = any
@@ -174,3 +174,30 @@ lmtp_destination_recipient_limit=1
# DO NOT EDIT ANYTHING BELOW #
# Overrides #
+
+postscreen_dnsbl_sites = wl.mailspike.net=127.0.0.[18;19;20]*-2
+ hostkarma.junkemailfilter.com=127.0.0.1*-2
+ list.dnswl.org=127.0.[0..255].0*-2
+ list.dnswl.org=127.0.[0..255].1*-4
+ list.dnswl.org=127.0.[0..255].2*-6
+ list.dnswl.org=127.0.[0..255].3*-8
+ bl.spamcop.net*2
+ bl.suomispam.net*2
+ hostkarma.junkemailfilter.com=127.0.0.2*3
+ hostkarma.junkemailfilter.com=127.0.0.4*2
+ hostkarma.junkemailfilter.com=127.0.1.2*1
+ backscatter.spameatingmonkey.net*2
+ bl.ipv6.spameatingmonkey.net*2
+ bl.spameatingmonkey.net*2
+ b.barracudacentral.org=127.0.0.2*7
+ bl.mailspike.net=127.0.0.2*5
+ bl.mailspike.net=127.0.0.[10;11;12]*4
+ zen.spamhaus.org=127.0.0.[10;11]*8
+ zen.spamhaus.org=127.0.0.[4..7]*6
+ zen.spamhaus.org=127.0.0.3*4
+ zen.spamhaus.org=127.0.0.2*3
+
+# User Overrides
+myhostname = mail.mhc.loc
+
+mynetworks = 127.0.0.0/8 [::1]/128 192.168.0.0/16
diff --git a/data/conf/unbound/unbound.conf b/data/conf/unbound/unbound.conf
index 27110c04..dbaf1506 100644
--- a/data/conf/unbound/unbound.conf
+++ b/data/conf/unbound/unbound.conf
@@ -43,3 +43,8 @@ remote-control:
server-cert-file: "/etc/unbound/unbound_server.pem"
control-key-file: "/etc/unbound/unbound_control.key"
control-cert-file: "/etc/unbound/unbound_control.pem"
+
+#forward-zone:
+# name: "."
+# forward-addr: 192.168.100.252
+
diff --git a/docker-compose.yml b/docker-compose.yml
index edddc655..f9267e87 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -467,7 +467,8 @@ services:
condition: service_healthy
image: ghcr.io/mailcow/acme:1.97
dns:
- - ${IPV4_NETWORK:-172.22.1}.254
+ - 192.168.100.252
+ #- ${IPV4_NETWORK:-172.22.1}.254
environment:
- LOG_LINES=${LOG_LINES:-9999}
- ADDITIONAL_SAN=${ADDITIONAL_SAN}
@@ -480,7 +481,8 @@ services:
- COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME:-mailcow-dockerized}
- DIRECTORY_URL=${DIRECTORY_URL:-}
- ENABLE_SSL_SNI=${ENABLE_SSL_SNI:-n}
- - SKIP_IP_CHECK=${SKIP_IP_CHECK:-n}
+ #- SKIP_IP_CHECK=${SKIP_IP_CHECK:-n}
+ - SKIP_IP_CHECK=y
- SKIP_HTTP_VERIFICATION=${SKIP_HTTP_VERIFICATION:-n}
- ONLY_MAILCOW_HOSTNAME=${ONLY_MAILCOW_HOSTNAME:-n}
- LE_STAGING=${LE_STAGING:-n}
Logs of iptables -L -vn:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
6101K 5989M MAILCOW all -- * * 0.0.0.0/0 0.0.0.0/0 /* mailcow */
6101K 5989M DOCKER-USER all -- * * 0.0.0.0/0 0.0.0.0/0
6101K 5989M DOCKER-FORWARD all -- * * 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- !br-mailcow br-mailcow 0.0.0.0/0 172.22.1.253 tcp dpt:587
0 0 ACCEPT tcp -- !br-mailcow br-mailcow 0.0.0.0/0 172.22.1.253 tcp dpt:465
0 0 ACCEPT tcp -- !br-mailcow br-mailcow 0.0.0.0/0 172.22.1.253 tcp dpt:25
0 0 ACCEPT tcp -- !br-mailcow br-mailcow 0.0.0.0/0 172.22.1.250 tcp dpt:12345
0 0 ACCEPT tcp -- !br-mailcow br-mailcow 0.0.0.0/0 172.22.1.250 tcp dpt:4190
0 0 ACCEPT tcp -- !br-mailcow br-mailcow 0.0.0.0/0 172.22.1.250 tcp dpt:995
168 9992 ACCEPT tcp -- !br-mailcow br-mailcow 0.0.0.0/0 172.22.1.250 tcp dpt:993
15 900 ACCEPT tcp -- !br-mailcow br-mailcow 0.0.0.0/0 172.22.1.250 tcp dpt:143
0 0 ACCEPT tcp -- !br-mailcow br-mailcow 0.0.0.0/0 172.22.1.250 tcp dpt:110
0 0 ACCEPT tcp -- !br-mailcow br-mailcow 0.0.0.0/0 172.22.1.249 tcp dpt:6379
0 0 ACCEPT tcp -- !br-mailcow br-mailcow 0.0.0.0/0 172.22.1.8 tcp dpt:3306
11504 731K ACCEPT tcp -- !br-mailcow br-mailcow 0.0.0.0/0 172.22.1.2 tcp dpt:443
29 1740 ACCEPT tcp -- !br-mailcow br-mailcow 0.0.0.0/0 172.22.1.2 tcp dpt:80
0 0 DROP all -- !br-mailcow br-mailcow 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- !docker0 docker0 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-BRIDGE (1 references)
pkts bytes target prot opt in out source destination
34818 2129K DOCKER all -- * br-mailcow 0.0.0.0/0 0.0.0.0/0
0 0 DOCKER all -- * docker0 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-CT (1 references)
pkts bytes target prot opt in out source destination
2747K 1441M ACCEPT all -- * br-mailcow 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
Chain DOCKER-FORWARD (1 references)
pkts bytes target prot opt in out source destination
6101K 5989M DOCKER-CT all -- * * 0.0.0.0/0 0.0.0.0/0
3355K 4547M DOCKER-INTERNAL all -- * * 0.0.0.0/0 0.0.0.0/0
3355K 4547M DOCKER-BRIDGE all -- * * 0.0.0.0/0 0.0.0.0/0
3320K 4545M ACCEPT all -- br-mailcow * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- docker0 * 0.0.0.0/0 0.0.0.0/0
Chain DOCKER-INTERNAL (1 references)
pkts bytes target prot opt in out source destination
Chain DOCKER-USER (1 references)
pkts bytes target prot opt in out source destination
Chain MAILCOW (1 references)
pkts bytes target prot opt in out source destination
0 0 DROP tcp -- !br-mailcow br-mailcow 0.0.0.0/0 0.0.0.0/0 /* mailcow isolation */
Logs of ip6tables -L -vn:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 MAILCOW all -- * * ::/0 ::/0 /* mailcow */
0 0 DOCKER-USER all -- * * ::/0 ::/0
0 0 DOCKER-FORWARD all -- * * ::/0 ::/0
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain DOCKER (0 references)
pkts bytes target prot opt in out source destination
Chain DOCKER-BRIDGE (1 references)
pkts bytes target prot opt in out source destination
Chain DOCKER-CT (1 references)
pkts bytes target prot opt in out source destination
Chain DOCKER-FORWARD (1 references)
pkts bytes target prot opt in out source destination
0 0 DOCKER-CT all -- * * ::/0 ::/0
0 0 DOCKER-INTERNAL all -- * * ::/0 ::/0
0 0 DOCKER-BRIDGE all -- * * ::/0 ::/0
Chain DOCKER-INTERNAL (1 references)
pkts bytes target prot opt in out source destination
Chain DOCKER-USER (1 references)
pkts bytes target prot opt in out source destination
Chain MAILCOW (1 references)
pkts bytes target prot opt in out source destination
Logs of iptables -L -vn -t nat:
Chain PREROUTING (policy ACCEPT 19M packets, 1301M bytes)
pkts bytes target prot opt in out source destination
204K 15M DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 71917 packets, 4872K bytes)
pkts bytes target prot opt in out source destination
0 0 DOCKER all -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT 447K packets, 28M bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0
5457K 408M MASQUERADE all -- * !br-mailcow 172.22.1.0/24 0.0.0.0/0
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
29 1740 DNAT tcp -- !br-mailcow * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.22.1.2:80
11504 731K DNAT tcp -- !br-mailcow * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 to:172.22.1.2:443
0 0 DNAT tcp -- !br-mailcow * 0.0.0.0/0 127.0.0.1 tcp dpt:13306 to:172.22.1.8:3306
0 0 DNAT tcp -- !br-mailcow * 0.0.0.0/0 127.0.0.1 tcp dpt:7654 to:172.22.1.249:6379
0 0 DNAT tcp -- !br-mailcow * 0.0.0.0/0 0.0.0.0/0 tcp dpt:110 to:172.22.1.250:110
15 900 DNAT tcp -- !br-mailcow * 0.0.0.0/0 0.0.0.0/0 tcp dpt:143 to:172.22.1.250:143
170 10112 DNAT tcp -- !br-mailcow * 0.0.0.0/0 0.0.0.0/0 tcp dpt:993 to:172.22.1.250:993
0 0 DNAT tcp -- !br-mailcow * 0.0.0.0/0 0.0.0.0/0 tcp dpt:995 to:172.22.1.250:995
0 0 DNAT tcp -- !br-mailcow * 0.0.0.0/0 0.0.0.0/0 tcp dpt:4190 to:172.22.1.250:4190
0 0 DNAT tcp -- !br-mailcow * 0.0.0.0/0 127.0.0.1 tcp dpt:19991 to:172.22.1.250:12345
0 0 DNAT tcp -- !br-mailcow * 0.0.0.0/0 0.0.0.0/0 tcp dpt:25 to:172.22.1.253:25
0 0 DNAT tcp -- !br-mailcow * 0.0.0.0/0 0.0.0.0/0 tcp dpt:465 to:172.22.1.253:465
0 0 DNAT tcp -- !br-mailcow * 0.0.0.0/0 0.0.0.0/0 tcp dpt:587 to:172.22.1.253:587
Logs of ip6tables -L -vn -t nat:
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DOCKER all -- * * ::/0 ::/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DOCKER all -- * * ::/0 !::1 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
DNS check:
Contribution guidelines
Checklist prior issue creation
Description
When Found certificate with issuer other than mailcow snake-oil CA and Let's Encrypt, skipping ACME client... ist set to connect to an internal CA the renewal fails with:
``Found certificate with issuer other than mailcow snake-oil CA and Let's Encrypt, skipping ACME client...
Workaround:
Fix:
Remove lines 110 to 117 and 130 from /srv/acme.sh or add condition to cover DIRECTORY_URL set.
Steps to reproduce:
Logs:
Which branch are you using?
master (stable)
Which architecture are you using?
x86_64
Operating System:
Debian 13
Server/VM specifications:
4 GB, 4 Cores
Is Apparmor, SELinux or similar active?
NO
Virtualization technology:
KVM
Docker version:
29.6.0
docker-compose version or docker compose version:
5.2.0
mailcow version:
2026-03a
Reverse proxy:
none
Logs of git diff:
Logs of iptables -L -vn:
Logs of ip6tables -L -vn:
Logs of iptables -L -vn -t nat:
Logs of ip6tables -L -vn -t nat:
DNS check: