Take full control of your communication infrastructure by deploying a comprehensive, containerized email server suite. This solution provides everything needed to run a modern mail server securely and efficiently. Built on modern container technology, it simplifies installation and maintenance while offering advanced features for administrators and end-users alike. Enjoy seamless integration with powerful open-source components for spam filtering, database management, and webmail access.
Key benefits and features include:
services:
unbound-mailcow:
image: mailcow/unbound:1.23
environment:
- TZ=${TZ}
volumes:
- ./data/conf/unbound/unbound.conf:/etc/unbound/unbound.conf:ro
restart: always
networks:
mailcow-network:
ipv4_address: 172.22.1.254
mysql-mailcow:
image: mariadb:10.5
command: --max-allowed-packet=64M --skip-name-resolve --innodb-read-only-compressed=OFF --innodb-page-compression=ON --innodb-page-compression-level=1
volumes:
- ./data/mysql:/var/lib/mysql
- ./data/conf/mysql/:/etc/mysql/conf.d/:ro
environment:
- TZ=${TZ}
- MYSQL_DATABASE=${DBNAME}
- MYSQL_USER=${DBUSER}
- MYSQL_PASSWORD=${DBPASS}
- MYSQL_ROOT_PASSWORD=${DBROOT}
restart: always
networks:
mailcow-network:
ipv4_address: 172.22.1.250
redis-mailcow:
image: redis:6-alpine
volumes:
- ./data/redis:/data
restart: always
environment:
- TZ=${TZ}
networks:
mailcow-network:
ipv4_address: 172.22.1.249
clamd-mailcow:
image: mailcow/clamd:1.63
restart: always
environment:
- TZ=${TZ}
- SKIP_CLAMD=${SKIP_CLAMD:-n}
volumes:
- ./data/conf/clamav:/etc/clamav:ro
networks:
mailcow-network:
ipv4_address: 172.22.1.253
php-fpm-mailcow:
image: mailcow/phpfpm:1.88
command: "php-fpm -d date.timezone=${TZ} -d expose_php=0"
depends_on:
- redis-mailcow
- mysql-mailcow
volumes:
- ./data/web:/web:rw
- ./data/conf/rspamd/dynmaps:/dynmaps:ro
- ./data/conf/rspamd/custom/:/rspamd_custom_maps:ro
- ./data/dkim:/data/dkim
environment:
- DBNAME=${DBNAME}
- DBUSER=${DBUSER}
- DBPASS=${DBPASS}
- MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME}
- IMAP_PORT=143
- IMAPS_PORT=993
- POP_PORT=110
- POPS_PORT=995
- SIEVE_PORT=4190
- SUBMISSION_PORT=587
- SMTPS_PORT=465
- SMTP_PORT=25
- TZ=${TZ}
- ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN:-n}
restart: always
networks:
mailcow-network:
ipv4_address: 172.22.1.10
sogo-mailcow:
image: mailcow/sogo:1.122
environment:
- DBNAME=${DBNAME}
- DBUSER=${DBUSER}
- DBPASS=${DBPASS}
- TZ=${TZ}
- MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME}
- ACL_ANYONE=${ACL_ANYONE:-allow}
volumes:
- ./data/conf/sogo/:/etc/sogo/
- ./data/web/inc/init_db.inc.php:/init_db.inc.php:ro
restart: always
networks:
mailcow-network:
ipv4_address: 172.22.1.248
dovecot-mailcow:
image: mailcow/dovecot:1.23
depends_on:
- mysql-mailcow
volumes:
- ./data/conf/dovecot:/etc/dovecot:rw
- ./data/assets/ssl:/etc/ssl/mailcow:ro
- ./data/vmail:/var/vmail
- ./data/conf/rspamd/custom/:/etc/rspamd/custom:ro
- ./data/conf/rspamd/override.d/:/etc/rspamd/override.d:ro
environment:
- DBNAME=${DBNAME}
- DBUSER=${DBUSER}
- DBPASS=${DBPASS}
- TZ=${TZ}
- MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME}
ports:
- "${DOVECOT_IMAP_PORT:-143}:143"
- "${DOVECOT_IMAPS_PORT:-993}:993"
- "${DOVECOT_POP_PORT:-110}:110"
- "${DOVECOT_POPS_PORT:-995}:995"
- "${DOVECOT_SIEVE_PORT:-4190}:4190"
restart: always
networks:
mailcow-network:
ipv4_address: 172.22.1.252
postfix-mailcow:
image: mailcow/postfix:1.74
depends_on:
- mysql-mailcow
volumes:
- ./data/conf/postfix:/opt/postfix/conf:rw
- ./data/assets/ssl:/etc/ssl/mailcow:ro
- ./data/postfix_spool:/var/spool/postfix
- ./data/conf/rspamd/custom/:/etc/rspamd/custom:ro
- ./data/conf/rspamd/override.d/:/etc/rspamd/override.d:ro
environment:
- DBNAME=${DBNAME}
- DBUSER=${DBUSER}
- DBPASS=${DBPASS}
- TZ=${TZ}
- MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME}
ports:
- "${SMTP_PORT:-25}:25"
- "${SMTPS_PORT:-465}:465"
- "${SUBMISSION_PORT:-587}:587"
restart: always
networks:
mailcow-network:
ipv4_address: 172.22.1.251
nginx-mailcow:
image: nginx:stable-alpine
depends_on:
- sogo-mailcow
- php-fpm-mailcow
command: /bin/sh -c "envsubst < /etc/nginx/conf.d/templates/listen_plain.template > /etc/nginx/conf.d/listen_plain.active && envsubst < /etc/nginx/conf.d/templates/listen_ssl.template > /etc/nginx/conf.d/listen_ssl.active && nginx -g 'daemon off;'"
environment:
- HTTPS_PORT=${HTTPS_PORT:-443}
- HTTP_PORT=${HTTP_PORT:-80}
- MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME}
- TZ=${TZ}
volumes:
- ./data/web:/web:ro
- ./data/conf/nginx/:/etc/nginx/conf.d/:rw
- ./data/assets/ssl:/etc/ssl/mailcow:ro
ports:
- "${HTTP_BIND:-0.0.0.0}:${HTTP_PORT:-80}:80"
- "${HTTPS_BIND:-0.0.0.0}:${HTTPS_PORT:-443}:443"
restart: always
networks:
mailcow-network:
acme-mailcow:
image: mailcow/acme:1.86
depends_on:
- nginx-mailcow
environment:
- MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME}
- ADDITIONAL_SAN=${ADDITIONAL_SAN}
- TZ=${TZ}
volumes:
- ./data/web/.well-known/acme-challenge:/var/www/acme:rw
- ./data/assets/ssl:/var/lib/acme:rw
restart: always
networks:
mailcow-network:
netfilter-mailcow:
image: mailcow/netfilter:1.53
volumes:
- /lib/modules:/lib/modules:ro
environment:
- TZ=${TZ}
restart: always
privileged: true
networks:
mailcow-network:
watchdog-mailcow:
image: mailcow/watchdog:1.98
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/assets/ssl:/etc/ssl/mailcow:ro
environment:
- TZ=${TZ}
- USE_WATCHDOG=${USE_WATCHDOG:-y}
restart: always
networks:
mailcow-network:
ipv4_address: 172.22.1.240
networks:
mailcow-network:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.22.1.0/24MAILCOW_HOSTNAME=mail.example.com
# Database
DBNAME=mailcow
DBUSER=mailcow
DBPASS=your_secure_db_password
DBROOT=your_secure_root_password
# Web Server
HTTP_PORT=80
HTTPS_PORT=443
HTTP_BIND=0.0.0.0
HTTPS_BIND=0.0.0.0
# Timezone
TZ=Europe/Berlin
# Additional Settings
ADDITIONAL_SAN=
SKIP_CLAMD=n
ALLOW_ADMIN_EMAIL_LOGIN=n
ACL_ANYONE=allow
USE_WATCHDOG=y
# Ports (Optional Overrides)
SMTP_PORT=25
SMTPS_PORT=465
SUBMISSION_PORT=587
DOVECOT_IMAP_PORT=143
DOVECOT_IMAPS_PORT=993
DOVECOT_POP_PORT=110
DOVECOT_POPS_PORT=995
DOVECOT_SIEVE_PORT=4190Auto-fetched about 23 hours ago
Auto-fetched about 23 hours ago