Favicon of mailcow

mailcow

Deploy a complete, containerized email server suite. Manage domains, secure communications with built-in encryption, and integrate external authentication.

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:

  • Robust Security: Protect your users with built-in Netfilter integration, MTA-STS support, and automatic HTTPS redirection.
  • Advanced Authentication: Connect external authentication sources and manage application-specific passwords securely.
  • Modern Webmail: Access emails through a fully featured web interface with URL encryption and customizable settings.
  • Simplified Administration: Manage domains, monitor system health, and apply updates easily.

Directory Structure

mailcow
mailcow-dockerized
data
assets
ssl
conf
clamav
dovecot
mysql
nginx
postfix
rspamd
sogo
unbound
dkim
mysql
postfix_spool
redis
vmail
web
.env
docker-compose.yml

docker-compose.yml

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/24

.env

MAILCOW_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=4190
Categories:

Share:

Ad
Favicon

 

  
 

Similar to mailcow

Favicon

 

  
  
Favicon

 

  
  
Favicon