diff --git a/.env b/.env index 9400869fa5..38da619644 120000 --- a/.env +++ b/.env @@ -1 +1,239 @@ -mailcow.conf \ No newline at end of file +# ------------------------------ +# mailcow web ui configuration +# ------------------------------ +# example.org is _not_ a valid hostname, use a fqdn here. +# Default admin user is "admin" +# Default password is "moohoo" + +MAILCOW_HOSTNAME=mx2.local.une.fi + +# Password hash algorithm +# Only certain password hash algorithm are supported. For a fully list of supported schemes, +# see https://mailcow.github.io/mailcow-dockerized-docs/models/model-passwd/ +MAILCOW_PASS_SCHEME=BLF-CRYPT + +# ------------------------------ +# SQL database configuration +# ------------------------------ + +DBNAME=mailcow +DBUSER=mailcow + +# Please use long, random alphanumeric strings (A-Za-z0-9) + +DBPASS=j10xYt3EhvleDutTy6xpqkQzRE2G +DBROOT=6XuW3InBpsJmqQXd4QPNf1pRmO0O + +# ------------------------------ +# HTTP/S Bindings +# ------------------------------ + +# You should use HTTPS, but in case of SSL offloaded reverse proxies: +# Might be important: This will also change the binding within the container. +# If you use a proxy within Docker, point it to the ports you set below. +# Do _not_ use IP:PORT in HTTP(S)_BIND or HTTP(S)_PORT +# IMPORTANT: Do not use port 8081, 9081 or 65510! +# Example: HTTP_BIND=1.2.3.4 +# For IPv4 and IPv6 leave it empty: HTTP_BIND= & HTTPS_PORT= +# For IPv6 see https://mailcow.github.io/mailcow-dockerized-docs/post_installation/firststeps-ip_bindings/ + +HTTP_PORT=80 +HTTP_BIND= + +HTTPS_PORT=443 +HTTPS_BIND= + +# ------------------------------ +# Other bindings +# ------------------------------ +# You should leave that alone +# Format: 11.22.33.44:25 or 12.34.56.78:465 etc. + +SMTP_PORT=25 +SMTPS_PORT=465 +SUBMISSION_PORT=587 +IMAP_PORT=143 +IMAPS_PORT=993 +POP_PORT=110 +POPS_PORT=995 +SIEVE_PORT=4190 +DOVEADM_PORT=19991 +SOLR_PORT=18983 +REDIS_PORT=7654 + +# Your timezone +# See https://en.wikipedia.org/wiki/List_of_tz_database_time_zones for a list of timezones +# Use the row named 'TZ database name' + pay attention for 'Notes' row + +TZ=America/Chicago + +# Fixed project name +# Please use lowercase letters only + +COMPOSE_PROJECT_NAME=mailcowdockerized + +# Set this to "allow" to enable the anyone pseudo user. Disabled by default. +# When enabled, ACL can be created, that apply to "All authenticated users" +# This should probably only be activated on mail hosts, that are used exclusivly by one organisation. +# Otherwise a user might share data with too many other users. +ACL_ANYONE=disallow + +# Garbage collector cleanup +# Deleted domains and mailboxes are moved to /var/vmail/_garbage/timestamp_sanitizedstring +# How long should objects remain in the garbage until they are being deleted? (value in minutes) +# Check interval is hourly + +MAILDIR_GC_TIME=7200 + +# Additional SAN for the certificate +# +# You can use wildcard records to create specific names for every domain you add to mailcow. +# Example: Add domains "example.com" and "example.net" to mailcow, change ADDITIONAL_SAN to a value like: +#ADDITIONAL_SAN=imap.*,smtp.* +# This will expand the certificate to "imap.example.com", "smtp.example.com", "imap.example.net", "smtp.example.net" +# plus every domain you add in the future. +# +# You can also just add static names... +#ADDITIONAL_SAN=srv1.example.net +# ...or combine wildcard and static names: +#ADDITIONAL_SAN=imap.*,srv1.example.com +# + +ADDITIONAL_SAN= + +# Additional server names for mailcow UI +# +# Specify alternative addresses for the mailcow UI to respond to +# This is useful when you set mail.* as ADDITIONAL_SAN and want to make sure mail.maildomain.com will always point to the mailcow UI. +# If the server name does not match a known site, Nginx decides by best-guess and may redirect users to the wrong web root. +# You can understand this as server_name directive in Nginx. +# Comma separated list without spaces! Example: ADDITIONAL_SERVER_NAMES=a.b.c,d.e.f + +ADDITIONAL_SERVER_NAMES= + +# Skip running ACME (acme-mailcow, Let's Encrypt certs) - y/n + +SKIP_LETS_ENCRYPT=n + +# Create seperate certificates for all domains - y/n +# this will allow adding more than 100 domains, but some email clients will not be able to connect with alternative hostnames +# see https://wiki.dovecot.org/SSL/SNIClientSupport +ENABLE_SSL_SNI=n + +# Skip IPv4 check in ACME container - y/n + +SKIP_IP_CHECK=n + +# Skip HTTP verification in ACME container - y/n + +SKIP_HTTP_VERIFICATION=n + +# Skip ClamAV (clamd-mailcow) anti-virus (Rspamd will auto-detect a missing ClamAV container) - y/n + +SKIP_CLAMD=n + +# Skip SOGo: Will disable SOGo integration and therefore webmail, DAV protocols and ActiveSync support (experimental, unsupported, not fully implemented) - y/n + +SKIP_SOGO=n + +# Skip Solr on low-memory systems or if you do not want to store a readable index of your mails in solr-vol-1. + +SKIP_SOLR=n + +# Solr heap size in MB, there is no recommendation, please see Solr docs. +# Solr is a prone to run OOM and should be monitored. Unmonitored Solr setups are not recommended. + +SOLR_HEAP=1024 + +# Allow admins to log into SOGo as email user (without any password) + +ALLOW_ADMIN_EMAIL_LOGIN=y + +# Enable watchdog (watchdog-mailcow) to restart unhealthy containers + +USE_WATCHDOG=y + +# Send watchdog notifications by mail (sent from watchdog@MAILCOW_HOSTNAME) +# CAUTION: +# 1. You should use external recipients +# 2. Mails are sent unsigned (no DKIM) +# 3. If you use DMARC, create a separate DMARC policy ("v=DMARC1; p=none;" in _dmarc.MAILCOW_HOSTNAME) +# Multiple rcpts allowed, NO quotation marks, NO spaces + +#WATCHDOG_NOTIFY_EMAIL=a@example.com,b@example.com,c@example.com +#WATCHDOG_NOTIFY_EMAIL= + +# Notify about banned IP (includes whois lookup) +WATCHDOG_NOTIFY_BAN=n + +# Subject for watchdog mails. Defaults to "Watchdog ALERT" followed by the error message. +#WATCHDOG_SUBJECT= + +# Checks if mailcow is an open relay. Requires a SAL. More checks will follow. +# https://www.servercow.de/mailcow?lang=en +# https://www.servercow.de/mailcow?lang=de +# No data is collected. Opt-in and anonymous. +# Will only work with unmodified mailcow setups. +WATCHDOG_EXTERNAL_CHECKS=n + +# Enable watchdog verbose logging +WATCHDOG_VERBOSE=n + +# Max log lines per service to keep in Redis logs + +LOG_LINES=9999 + +# Internal IPv4 /24 subnet, format n.n.n (expands to n.n.n.0/24) +# Use private IPv4 addresses only, see https://en.wikipedia.org/wiki/Private_network#Private_IPv4_addresses + +IPV4_NETWORK=10.26.26.0/24 + +# Internal IPv6 subnet in fc00::/7 +# Use private IPv6 addresses only, see https://en.wikipedia.org/wiki/Private_network#Private_IPv6_addresses + +IPV6_NETWORK=fd4d:6169:6c63:6f77::/64 + +# Use this IPv4 for outgoing connections (SNAT) + +#SNAT_TO_SOURCE= + +# Use this IPv6 for outgoing connections (SNAT) + +#SNAT6_TO_SOURCE= + +# Create or override an API key for the web UI +# You _must_ define API_ALLOW_FROM, which is a comma separated list of IPs +# An API key defined as API_KEY has read-write access +# An API key defined as API_KEY_READ_ONLY has read-only access +# Allowed chars for API_KEY and API_KEY_READ_ONLY: a-z, A-Z, 0-9, - +# You can define API_KEY and/or API_KEY_READ_ONLY + +#API_KEY= +#API_KEY_READ_ONLY= +#API_ALLOW_FROM=172.22.1.1,127.0.0.1,10.25.26.0/24 + +# mail_home is ~/Maildir +MAILDIR_SUB=Maildir + +# SOGo session timeout in minutes +SOGO_EXPIRE_SESSION=480 + +# DOVECOT_MASTER_USER and DOVECOT_MASTER_PASS must both be provided. No special chars. +# Empty by default to auto-generate master user and password on start. +# User expands to DOVECOT_MASTER_USER@mailcow.local +# LEAVE EMPTY IF UNSURE +DOVECOT_MASTER_USER= +# LEAVE EMPTY IF UNSURE +DOVECOT_MASTER_PASS= + +# Let's Encrypt registration contact information +# Optional: Leave empty for none +# This value is only used on first order! +# Setting it at a later point will require the following steps: +# https://mailcow.github.io/mailcow-dockerized-docs/troubleshooting/debug-reset_tls/ +ACME_CONTACT= + +# WebAuthn device manufacturer verification +# After setting WEBAUTHN_ONLY_TRUSTED_VENDORS=y only devices from trusted manufacturers are allowed +# root certificates can be placed for validation under mailcow-dockerized/data/web/inc/lib/WebAuthn/rootCertificates +WEBAUTHN_ONLY_TRUSTED_VENDORS=n diff --git a/data/assets/ssl-example/cert.pem b/data/assets/ssl-example/cert.pem index 96d16becdf..5f096f612d 100644 --- a/data/assets/ssl-example/cert.pem +++ b/data/assets/ssl-example/cert.pem @@ -1,19 +1,33 @@ -----BEGIN CERTIFICATE----- -MIIDBDCCAe6gAwIBAgIQeJMoL/3dxhxhT9EwuRTL/DALBgkqhkiG9w0BAQswEjEQ -MA4GA1UEChMHbWFpbGNvdzAeFw0xNjEyMTMxMDExMDBaFw0xOTExMjgxMDExMDBa -MC0xEDAOBgNVBAoTB21haWxjb3cxGTAXBgNVBAMTEG1haWwuZXhhbXBsZS5vcmcw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDRg0xT3At9DSb3H5OMp3K1 -MpXAgYyotSK6TS61fC0QEHy2fMXiws7Agcye6Ln7CG63Fe1eN2jkdlefy9xJivS8 -y5w0M8i168v5znzC8fnylL2iOiSYfK/B/oEqfU7YH4RcegO53oDDIUZmi4Frgnu7 -39VVOU1ZyHEVqGJ2H2aAIkoZRjGzumD9Ym4LWGidtKJzBgFt/qmhUeWXipM8w281 -XkQnJU79+x2ywnJSvEZ3r/ZVJC7kbjiVw+/k15k9Cxk6Ik8wmJ0X/+xWxoZomHQI -1LM0VKAS/iaU95dn2bplvL6jTiiyWAbrMjSKs4XbPt/fIbOicNkj6+CFy0MVfyyH -AgMBAAGjPzA9MA4GA1UdDwEB/wQEAwIAqDAdBgNVHSUEFjAUBggrBgEFBQcDAgYI -KwYBBQUHAwEwDAYDVR0TAQH/BAIwADALBgkqhkiG9w0BAQsDggEBAI/jBJa1P8nB -eHUN5muQmjBVDVOYyWAAEapOe2HYsBcpjaB2H8Iw3DQzJtz6peYeYSCmHRVqFLCm -VPrq36l9mPUotyPDPlQQAxCj9R2+WbGaJO+N/E1F8FQ94dr3jqwUyfjVPoqEjmIH -NFkvbA0RJOeBm9oYGdhM0wjOBV9c9MTHFG82nQ/zQeTuPb7GXuKIOXYCxoLNOZMw -UJ02Cqjv5ImrgOhcstAKX3Ip0urSvZUGvtPla4CGh+M6yDFJ08GzX6OiMIH207RW -jAbUXXERSUv/7hysdDjGo5HZjCeMzVu9KAxoZXqnmvkk8g2swKWtWBRcoeU1VGx0 -Bx4Q4KMjuYQ= +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 -----END CERTIFICATE----- diff --git a/data/assets/ssl-example/key.pem b/data/assets/ssl-example/key.pem index cedf35a0b1..058a9775c2 100644 --- a/data/assets/ssl-example/key.pem +++ b/data/assets/ssl-example/key.pem @@ -1,27 +1,52 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEA0YNMU9wLfQ0m9x+TjKdytTKVwIGMqLUiuk0utXwtEBB8tnzF -4sLOwIHMnui5+whutxXtXjdo5HZXn8vcSYr0vMucNDPItevL+c58wvH58pS9ojok -mHyvwf6BKn1O2B+EXHoDud6AwyFGZouBa4J7u9/VVTlNWchxFahidh9mgCJKGUYx -s7pg/WJuC1honbSicwYBbf6poVHll4qTPMNvNV5EJyVO/fsdssJyUrxGd6/2VSQu -5G44lcPv5NeZPQsZOiJPMJidF//sVsaGaJh0CNSzNFSgEv4mlPeXZ9m6Zby+o04o -slgG6zI0irOF2z7f3yGzonDZI+vghctDFX8shwIDAQABAoIBAQC9kiLnIgxXGyZt -pmmYdA6re1jatZ2zLSp+DcY8ul3/0hs195IKCyCOOSQPiR520Pt0t+duP46uYZIJ -aakp9gxaI5Vz+oMacH/AyaBDuDTj1Mf9WMSyIOfbDVCMRJOppGLcVh62+Gfjp2EO -+h2hTJBuvypFkbK2kVIZOaHVpbXWKw1oYuEcTftk9XfxxvfSMw1HQ12/P2CAcbaa -jPmVbisunv6kpXtewSBTcaLSYWJf1MYD5Hi8fzkD2FJSXYbfQd8RKvT2rj6FA7ux -CDMzbYhdnd7lc63OARCIjfCRNtDT1cZ3gR1CQHD98lWxmPQIZukv+w7s/bSrFgnQ -ROZ0ghBJAoGBAOmE/3d5FDmp0aJNxXynKcRGdpEEM4O40RIdqa2eR6Pa7aTRosao -z0qVgdFuJrqjlB3jgedxXEX1M0abCUzzM9Q5F7JLl+KsjwRwpkIOkPiyUncLp7LK -QbY3tvYBIdpjlF1USOMGRL4j11hqr4vQC/yPBF7jj81kCZDTbmZhp82jAoGBAOWu -ql5QFUOlmqkuWIAFkiLEZhOu+ptqkE+zG50CCGMJIX0dJ2PHXFyNGInomAeT0nbI -pbnK3x7KeEKiGrAqZFNCTHhApTwkrIj0L/RQbMDZ7u7j1AEUVNFEhIm62kg84FtG -xtfxVxredE+NQc/tyV3hXegdNZxegALirlcMKIvNAoGAWFwIxk48Ru1o8z72QQqH -lUsMRicOzwK5qV8r+xPvC6MlVL42F3F8rj4QFwzU/r4yp3SUjNyqC5aSRl8Xj9Re -gijwPHi6Cf09SHLPliMo29GtvnnchJxfbPF7+23GP3p6gy4HPk/65u9s5nnH3uFk -B7ad8sGsgg0eSXyXQ4okEn0CgYEAnogPuedGthlxBgMiPMMbmfm7hyyId4t3Ljuu -/JExnsHnpobf8EPjoVIWNOIhRWGnrCtUEEhR9tvDZCKljyDDfKBPTdU496lMmX8K -NnToi7gg7iy84T3aSVMktDgPgDrclMPmbZh8CeSvnVUfrtgu3Ci4+4Rlw5eKffNe -aGDQ/6UCgYAbUq9mRT2WOXIo+Dchi9VzDWgtfOw5VEyqkSpb7hPiIYx5jNaENnVK -cAi3iqbBgPJBuMlTrKmmaxdmssGOEZNJLuuXLDbCU+f5cpu5PQ4crC6UtRI5rlhp -8Yc+oiv3HWbSw3sVRpMFB6NP4DnvgFW3B2Wdfb/lNzPCKWqBsX7gWw== ------END RSA PRIVATE KEY----- +-----BEGIN PRIVATE KEY----- +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 +C27ivs9w2aPg1MpJzryTZlkU6UWH +-----END PRIVATE KEY----- diff --git a/data/web/inc/lib/vendor/yubico/u2flib-server/README.adoc b/data/web/inc/lib/vendor/yubico/u2flib-server/README.adoc index 100b93820a..0116a270c8 120000 --- a/data/web/inc/lib/vendor/yubico/u2flib-server/README.adoc +++ b/data/web/inc/lib/vendor/yubico/u2flib-server/README.adoc @@ -1 +1,34 @@ -README \ No newline at end of file +php-u2flib-server +----------------- + +image:https://travis-ci.org/Yubico/php-u2flib-server.svg?branch=master["Build Status", link="https://travis-ci.org/Yubico/php-u2flib-server"] +image:https://coveralls.io/repos/Yubico/php-u2flib-server/badge.svg?branch=master&service=github["Coverage", link="https://coveralls.io/github/Yubico/php-u2flib-server?branch=master"] +image:https://scrutinizer-ci.com/g/Yubico/php-u2flib-server/badges/quality-score.png?b=master["Scrutinizer Code Quality", link="https://scrutinizer-ci.com/g/Yubico/php-u2flib-server/?branch=master"] + +=== Introduction === + +Serverside U2F library for PHP. Provides functionality for registering +tokens and authentication with said tokens. + +To read more about U2F and how to use a U2F library, visit +link:http://developers.yubico.com/U2F[developers.yubico.com/U2F]. + +=== License === + +The project is licensed under a BSD license. See the file COPYING for +exact wording. For any copyright year range specified as YYYY-ZZZZ in +this package note that the range specifies every single year in that +closed interval. + +=== Dependencies === + +The only dependency is the openssl extension to PHP that has to be enabled. + +A composer.json is included in the distribution to make things simpler for +other project using composer. + +=== Tests === + +To run the test suite link:https://phpunit.de[PHPUnit] is required. To run it, type: + + $ phpunit diff --git a/deploy.sh b/deploy.sh new file mode 100644 index 0000000000..26350abf3e --- /dev/null +++ b/deploy.sh @@ -0,0 +1,3 @@ +#!/bin/sh +export $(cat .env) > /dev/null 2>&1; +docker stack deploy -c docker-compose.yml mailcow-dockerized diff --git a/docker-compose.yml b/docker-compose.yml index 5a32236ac3..c21c16dbf0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,18 +1,19 @@ -version: '2.1' +version: '3' services: unbound-mailcow: image: mailcow/unbound:1.15 environment: - TZ=${TZ} + deploy: + replicas: 1 volumes: - ./data/hooks/unbound:/hooks:Z - ./data/conf/unbound/unbound.conf:/etc/unbound/unbound.conf:ro,Z - restart: always tty: true networks: mailcow-network: - ipv4_address: ${IPV4_NETWORK:-172.22.1}.254 + ipv4_address: ${IPV4_NETWORK}.254 aliases: - unbound @@ -32,9 +33,10 @@ services: - MYSQL_USER=${DBUSER} - MYSQL_PASSWORD=${DBPASS} - MYSQL_INITDB_SKIP_TZINFO=1 - restart: always - ports: - - "${SQL_PORT:-127.0.0.1:13306}:3306" + deploy: + replicas: 1 + placement: + constraints: [node.role == manager] networks: mailcow-network: aliases: @@ -44,27 +46,29 @@ services: image: redis:6-alpine volumes: - redis-vol-1:/data/:Z - restart: always ports: - - "${REDIS_PORT:-127.0.0.1:7654}:6379" + - ${REDIS_PORT}:6379 + deploy: + replicas: 1 environment: - TZ=${TZ} sysctls: - net.core.somaxconn=4096 networks: mailcow-network: - ipv4_address: ${IPV4_NETWORK:-172.22.1}.249 + ipv4_address: ${IPV4_NETWORK}.249 aliases: - redis clamd-mailcow: image: mailcow/clamd:1.50 - restart: always dns: - - ${IPV4_NETWORK:-172.22.1}.254 + - ${IPV4_NETWORK}.254 environment: - TZ=${TZ} - - SKIP_CLAMD=${SKIP_CLAMD:-n} + - SKIP_CLAMD=${SKIP_CLAMD} + deploy: + replicas: 1 volumes: - ./data/conf/clamav/:/etc/clamav/:Z - clamd-db-vol-1:/var/lib/clamav:z @@ -78,12 +82,14 @@ services: stop_grace_period: 30s depends_on: - dovecot-mailcow + deploy: + replicas: 1 environment: - TZ=${TZ} - - IPV4_NETWORK=${IPV4_NETWORK:-172.22.1} - - IPV6_NETWORK=${IPV6_NETWORK:-fd4d:6169:6c63:6f77::/64} - - REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP:-} - - REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT:-} + - IPV4_NETWORK=${IPV4_NETWORK} + - IPV6_NETWORK=${IPV6_NETWORK} + - REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP} + - REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT} volumes: - ./data/hooks/rspamd:/hooks:Z - ./data/conf/rspamd/custom/:/etc/rspamd/custom:z @@ -94,10 +100,9 @@ services: - ./data/conf/rspamd/rspamd.conf.local:/etc/rspamd/rspamd.conf.local:Z - ./data/conf/rspamd/rspamd.conf.override:/etc/rspamd/rspamd.conf.override:Z - rspamd-vol-1:/var/lib/rspamd:z - restart: always hostname: rspamd dns: - - ${IPV4_NETWORK:-172.22.1}.254 + - ${IPV4_NETWORK}.254 networks: mailcow-network: aliases: @@ -108,6 +113,8 @@ services: command: "php-fpm -d date.timezone=${TZ} -d expose_php=0" depends_on: - redis-mailcow + deploy: + replicas: 1 volumes: - ./data/hooks/phpfpm:/hooks:Z - ./data/web:/web:z @@ -127,39 +134,38 @@ services: - ./data/assets/templates:/tpls:z - ./data/conf/nginx/:/etc/nginx/conf.d/:z dns: - - ${IPV4_NETWORK:-172.22.1}.254 + - ${IPV4_NETWORK}.254 environment: - - REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP:-} - - REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT:-} - - LOG_LINES=${LOG_LINES:-9999} + - REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP} + - REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT} + - LOG_LINES=${LOG_LINES} - TZ=${TZ} - DBNAME=${DBNAME} - DBUSER=${DBUSER} - DBPASS=${DBPASS} - MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME} - - MAILCOW_PASS_SCHEME=${MAILCOW_PASS_SCHEME:-BLF-CRYPT} - - IMAP_PORT=${IMAP_PORT:-143} - - IMAPS_PORT=${IMAPS_PORT:-993} - - POP_PORT=${POP_PORT:-110} - - POPS_PORT=${POPS_PORT:-995} - - SIEVE_PORT=${SIEVE_PORT:-4190} - - IPV4_NETWORK=${IPV4_NETWORK:-172.22.1} - - IPV6_NETWORK=${IPV6_NETWORK:-fd4d:6169:6c63:6f77::/64} - - SUBMISSION_PORT=${SUBMISSION_PORT:-587} - - SMTPS_PORT=${SMTPS_PORT:-465} - - SMTP_PORT=${SMTP_PORT:-25} - - API_KEY=${API_KEY:-invalid} - - API_KEY_READ_ONLY=${API_KEY_READ_ONLY:-invalid} - - API_ALLOW_FROM=${API_ALLOW_FROM:-invalid} - - COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME:-mailcow-dockerized} - - SKIP_SOLR=${SKIP_SOLR:-y} - - SKIP_CLAMD=${SKIP_CLAMD:-n} - - SKIP_SOGO=${SKIP_SOGO:-n} - - ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN:-n} - - MASTER=${MASTER:-y} - - DEV_MODE=${DEV_MODE:-n} - - WEBAUTHN_ONLY_TRUSTED_VENDORS=${WEBAUTHN_ONLY_TRUSTED_VENDORS:-n} - restart: always + - MAILCOW_PASS_SCHEME=${MAILCOW_PASS_SCHEME} + - IMAP_PORT=${IMAP_PORT} + - IMAPS_PORT=${IMAPS_PORT} + - POP_PORT=${POP_PORT} + - POPS_PORT=${POPS_PORT} + - SIEVE_PORT=${SIEVE_PORT} + - IPV4_NETWORK=${IPV4_NETWORK} + - IPV6_NETWORK=${IPV6_NETWORK} + - SUBMISSION_PORT=${SUBMISSION_PORT} + - SMTPS_PORT=${SMTPS_PORT} + - SMTP_PORT=${SMTP_PORT} + - API_KEY=${API_KEY} + - API_KEY_READ_ONLY=${API_KEY_READ_ONLY} + - API_ALLOW_FROM=${API_ALLOW_FROM} + - COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME} + - SKIP_SOLR=${SKIP_SOLR} + - SKIP_CLAMD=${SKIP_CLAMD} + - SKIP_SOGO=${SKIP_SOGO} + - ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN} + - MASTER=${MASTER} + - DEV_MODE=${DEV_MODE} + - WEBAUTHN_ONLY_TRUSTED_VENDORS=${WEBAUTHN_ONLY_TRUSTED_VENDORS} networks: mailcow-network: aliases: @@ -172,19 +178,21 @@ services: - DBUSER=${DBUSER} - DBPASS=${DBPASS} - TZ=${TZ} - - LOG_LINES=${LOG_LINES:-9999} + - LOG_LINES=${LOG_LINES} - MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME} - - MAILCOW_PASS_SCHEME=${MAILCOW_PASS_SCHEME:-BLF-CRYPT} - - ACL_ANYONE=${ACL_ANYONE:-disallow} - - ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN:-n} - - IPV4_NETWORK=${IPV4_NETWORK:-172.22.1} - - SOGO_EXPIRE_SESSION=${SOGO_EXPIRE_SESSION:-480} - - SKIP_SOGO=${SKIP_SOGO:-n} - - MASTER=${MASTER:-y} - - REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP:-} - - REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT:-} + - MAILCOW_PASS_SCHEME=${MAILCOW_PASS_SCHEME} + - ACL_ANYONE=${ACL_ANYONE} + - ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN} + - IPV4_NETWORK=${IPV4_NETWORK} + - SOGO_EXPIRE_SESSION=${SOGO_EXPIRE_SESSION} + - SKIP_SOGO=${SKIP_SOGO} + - MASTER=${MASTER} + - REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP} + - REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT} + deploy: + replicas: 1 dns: - - ${IPV4_NETWORK:-172.22.1}.254 + - ${IPV4_NETWORK}.254 volumes: - ./data/hooks/sogo:/hooks:Z - ./data/conf/sogo/:/etc/sogo/:z @@ -205,10 +213,9 @@ services: ofelia.job-exec.sogo_eautoreply.command: "/bin/bash -c \"[[ $${MASTER} == y ]] && /usr/local/bin/gosu sogo /usr/sbin/sogo-tool update-autoreply -p /etc/sogo/sieve.creds || exit 0\"" ofelia.job-exec.sogo_backup.schedule: "@every 24h" ofelia.job-exec.sogo_backup.command: "/bin/bash -c \"[[ $${MASTER} == y ]] && /usr/local/bin/gosu sogo /usr/sbin/sogo-tool backup /sogo_backup ALL || exit 0\"" - restart: always networks: mailcow-network: - ipv4_address: ${IPV4_NETWORK:-172.22.1}.248 + ipv4_address: ${IPV4_NETWORK}.248 aliases: - sogo @@ -216,8 +223,12 @@ services: image: mailcow/dovecot:1.161 depends_on: - mysql-mailcow + deploy: + replicas: 1 + placement: + constraints: [node.role == manager] dns: - - ${IPV4_NETWORK:-172.22.1}.254 + - ${IPV4_NETWORK}.254 cap_add: - NET_BIND_SERVICE volumes: @@ -234,33 +245,32 @@ services: - rspamd-vol-1:/var/lib/rspamd:z - mysql-socket-vol-1:/var/run/mysqld/:z environment: - - DOVECOT_MASTER_USER=${DOVECOT_MASTER_USER:-} - - DOVECOT_MASTER_PASS=${DOVECOT_MASTER_PASS:-} - - LOG_LINES=${LOG_LINES:-9999} + - DOVECOT_MASTER_USER=${DOVECOT_MASTER_USER} + - DOVECOT_MASTER_PASS=${DOVECOT_MASTER_PASS} + - LOG_LINES=${LOG_LINES} - DBNAME=${DBNAME} - DBUSER=${DBUSER} - DBPASS=${DBPASS} - TZ=${TZ} - MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME} - - MAILCOW_PASS_SCHEME=${MAILCOW_PASS_SCHEME:-BLF-CRYPT} - - IPV4_NETWORK=${IPV4_NETWORK:-172.22.1} - - ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN:-n} - - MAILDIR_GC_TIME=${MAILDIR_GC_TIME:-7200} - - ACL_ANYONE=${ACL_ANYONE:-disallow} - - SKIP_SOLR=${SKIP_SOLR:-y} - - MAILDIR_SUB=${MAILDIR_SUB:-} - - MASTER=${MASTER:-y} - - REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP:-} - - REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT:-} - - COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME:-mailcow-dockerized} + - MAILCOW_PASS_SCHEME=${MAILCOW_PASS_SCHEME} + - IPV4_NETWORK=${IPV4_NETWORK} + - ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN} + - MAILDIR_GC_TIME=${MAILDIR_GC_TIME} + - ACL_ANYONE=${ACL_ANYONE} + - SKIP_SOLR=${SKIP_SOLR} + - MAILDIR_SUB=${MAILDIR_SUB} + - MASTER=${MASTER} + - REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP} + - REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT} + - COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME} ports: - - "${DOVEADM_PORT:-127.0.0.1:19991}:12345" - - "${IMAP_PORT:-143}:143" - - "${IMAPS_PORT:-993}:993" - - "${POP_PORT:-110}:110" - - "${POPS_PORT:-995}:995" - - "${SIEVE_PORT:-4190}:4190" - restart: always + - ${DOVEADM_PORT}:12345 + - ${IMAP_PORT}:143 + - ${IMAPS_PORT}:993 + - ${POP_PORT}:110 + - ${POPS_PORT}:995 + - ${SIEVE_PORT}:4190 tty: true labels: ofelia.enabled: "true" @@ -288,7 +298,7 @@ services: hard: 40000 networks: mailcow-network: - ipv4_address: ${IPV4_NETWORK:-172.22.1}.250 + ipv4_address: ${IPV4_NETWORK}.250 aliases: - dovecot @@ -296,6 +306,8 @@ services: image: mailcow/postfix:1.66 depends_on: - mysql-mailcow + deploy: + replicas: 1 volumes: - ./data/hooks/postfix:/hooks:Z - ./data/conf/postfix:/opt/postfix/conf:z @@ -305,32 +317,32 @@ services: - rspamd-vol-1:/var/lib/rspamd:z - mysql-socket-vol-1:/var/run/mysqld/:z environment: - - LOG_LINES=${LOG_LINES:-9999} + - LOG_LINES=${LOG_LINES} - TZ=${TZ} - DBNAME=${DBNAME} - DBUSER=${DBUSER} - DBPASS=${DBPASS} - - REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP:-} - - REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT:-} + - REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP} + - REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT} - MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME} cap_add: - NET_BIND_SERVICE ports: - - "${SMTP_PORT:-25}:25" - - "${SMTPS_PORT:-465}:465" - - "${SUBMISSION_PORT:-587}:587" - restart: always + - "${SMTP_PORT}:25" + - "${SMTPS_PORT}:465" + - "${SUBMISSION_PORT}:587" dns: - - ${IPV4_NETWORK:-172.22.1}.254 + - ${IPV4_NETWORK}.254 networks: mailcow-network: - ipv4_address: ${IPV4_NETWORK:-172.22.1}.253 + ipv4_address: ${IPV4_NETWORK}.253 aliases: - postfix memcached-mailcow: image: memcached:alpine - restart: always + deploy: + replicas: 1 environment: - TZ=${TZ} networks: @@ -345,7 +357,7 @@ services: - redis-mailcow image: nginx:mainline-alpine dns: - - ${IPV4_NETWORK:-172.22.1}.254 + - ${IPV4_NETWORK}.254 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 && envsubst < /etc/nginx/conf.d/templates/sogo.template > /etc/nginx/conf.d/sogo.active && @@ -359,14 +371,12 @@ services: until ping rspamd -c1 > /dev/null; do sleep 1; done && exec nginx -g 'daemon off;'" environment: - - HTTPS_PORT=${HTTPS_PORT:-443} - - HTTP_PORT=${HTTP_PORT:-80} - MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME} - - IPV4_NETWORK=${IPV4_NETWORK:-172.22.1} + - IPV4_NETWORK=${IPV4_NETWORK} - TZ=${TZ} - - SKIP_SOGO=${SKIP_SOGO:-n} - - ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN:-n} - - ADDITIONAL_SERVER_NAMES=${ADDITIONAL_SERVER_NAMES:-} + - SKIP_SOGO=${SKIP_SOGO} + - ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN} + - ADDITIONAL_SERVER_NAMES=${ADDITIONAL_SERVER_NAMES} volumes: - ./data/web:/web:ro,z - ./data/conf/rspamd/dynmaps:/dynmaps:ro,z @@ -375,10 +385,14 @@ services: - ./data/conf/rspamd/meta_exporter:/meta_exporter:ro,z - sogo-web-vol-1:/usr/lib/GNUstep/SOGo/:z ports: - - "${HTTPS_BIND:-:}:${HTTPS_PORT:-443}:${HTTPS_PORT:-443}" - - "${HTTP_BIND:-:}:${HTTP_PORT:-80}:${HTTP_PORT:-80}" - restart: always + - 80:80 + - 443:443 + deploy: + replicas: 1 + placement: + constraints: [node.role == manager] networks: + portainer_agent_network: mailcow-network: aliases: - nginx @@ -388,7 +402,7 @@ services: - nginx-mailcow image: mailcow/acme:1.81 dns: - - ${IPV4_NETWORK:-172.22.1}.254 + - ${IPV4_NETWORK}.254 environment: - LOG_LINES=${LOG_LINES:-9999} - ACME_CONTACT=${ACME_CONTACT:-} @@ -415,7 +429,8 @@ services: - ./data/assets/ssl:/var/lib/acme/:z - ./data/assets/ssl-example:/var/lib/ssl-example/:ro,Z - mysql-socket-vol-1:/var/run/mysqld/:z - restart: always + deploy: + replicas: 1 networks: mailcow-network: aliases: @@ -430,34 +445,34 @@ services: - sogo-mailcow - php-fpm-mailcow - redis-mailcow - restart: always - privileged: true + deploy: + replicas: 1 environment: - TZ=${TZ} - - IPV4_NETWORK=${IPV4_NETWORK:-172.22.1} - - IPV6_NETWORK=${IPV6_NETWORK:-fd4d:6169:6c63:6f77::/64} + - IPV4_NETWORK=${IPV4_NETWORK} + - IPV6_NETWORK=${IPV6_NETWORK} - SNAT_TO_SOURCE=${SNAT_TO_SOURCE:-n} - SNAT6_TO_SOURCE=${SNAT6_TO_SOURCE:-n} - REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP:-} - REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT:-} - network_mode: "host" volumes: - /lib/modules:/lib/modules:ro watchdog-mailcow: image: mailcow/watchdog:1.96 dns: - - ${IPV4_NETWORK:-172.22.1}.254 + - ${IPV4_NETWORK}.254 tmpfs: - /tmp + deploy: + replicas: 1 volumes: - rspamd-vol-1:/var/lib/rspamd:z - mysql-socket-vol-1:/var/run/mysqld/:z - postfix-vol-1:/var/spool/postfix:z - ./data/assets/ssl:/etc/ssl/mail/:ro,z - restart: always environment: - - IPV6_NETWORK=${IPV6_NETWORK:-fd4d:6169:6c63:6f77::/64} + - IPV6_NETWORK=${IPV6_NETWORK} - LOG_LINES=${LOG_LINES:-9999} - TZ=${TZ} - DBNAME=${DBNAME} @@ -473,7 +488,7 @@ services: - WATCHDOG_VERBOSE=${WATCHDOG_VERBOSE:-n} - MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME} - COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME:-mailcow-dockerized} - - IPV4_NETWORK=${IPV4_NETWORK:-172.22.1} + - IPV4_NETWORK=${IPV4_NETWORK} - IP_BY_DOCKER_API=${IP_BY_DOCKER_API:-0} - CHECK_UNBOUND=${CHECK_UNBOUND:-1} - SKIP_CLAMD=${SKIP_CLAMD:-n} @@ -508,17 +523,15 @@ services: dockerapi-mailcow: image: mailcow/dockerapi:1.41 - security_opt: - - label=disable - restart: always - oom_kill_disable: true dns: - - ${IPV4_NETWORK:-172.22.1}.254 + - ${IPV4_NETWORK}.254 environment: - DBROOT=${DBROOT} - TZ=${TZ} volumes: - /var/run/docker.sock:/var/run/docker.sock:ro + deploy: + replicas: 1 networks: mailcow-network: aliases: @@ -526,11 +539,12 @@ services: solr-mailcow: image: mailcow/solr:1.8.1 - restart: always volumes: - solr-vol-1:/opt/solr/server/solr/dovecot-fts/data:Z ports: - - "${SOLR_PORT:-127.0.0.1:18983}:8983" + - ${SOLR_PORT}:8983 + deploy: + replicas: 1 environment: - TZ=${TZ} - SOLR_HEAP=${SOLR_HEAP:-1024} @@ -542,7 +556,6 @@ services: olefy-mailcow: image: mailcow/olefy:1.9 - restart: always environment: - TZ=${TZ} - OLEFY_BINDADDRESS=0.0.0.0 @@ -553,6 +566,8 @@ services: - OLEFY_LOGLVL=20 - OLEFY_MINLENGTH=500 - OLEFY_DEL_TMP=1 + deploy: + replicas: 1 networks: mailcow-network: aliases: @@ -560,7 +575,6 @@ services: ofelia-mailcow: image: mcuadros/ofelia:latest - restart: always command: daemon --docker environment: - TZ=${TZ} @@ -569,8 +583,8 @@ services: - dovecot-mailcow labels: ofelia.enabled: "true" - security_opt: - - label=disable + deploy: + replicas: 1 volumes: - /var/run/docker.sock:/var/run/docker.sock:ro networks: @@ -578,47 +592,38 @@ services: aliases: - ofelia - ipv6nat-mailcow: - depends_on: - - unbound-mailcow - - mysql-mailcow - - redis-mailcow - - clamd-mailcow - - rspamd-mailcow - - php-fpm-mailcow - - sogo-mailcow - - dovecot-mailcow - - postfix-mailcow - - memcached-mailcow - - nginx-mailcow - - acme-mailcow - - netfilter-mailcow - - watchdog-mailcow - - dockerapi-mailcow - - solr-mailcow - environment: - - TZ=${TZ} - image: robbertkl/ipv6nat - security_opt: - - label=disable - restart: always - privileged: true - network_mode: "host" - volumes: - - /var/run/docker.sock:/var/run/docker.sock:ro - - /lib/modules:/lib/modules:ro +# ipv6nat-mailcow: +# depends_on: +# - unbound-mailcow +# - mysql-mailcow +# - redis-mailcow +# - clamd-mailcow +# - rspamd-mailcow +# - php-fpm-mailcow +# - sogo-mailcow +# - dovecot-mailcow +# - postfix-mailcow +# - memcached-mailcow +# - nginx-mailcow +# - acme-mailcow +# - netfilter-mailcow +# - watchdog-mailcow +# - dockerapi-mailcow +# - solr-mailcow +# environment: +# - TZ=${TZ} +# image: robbertkl/ipv6nat +# deploy: +# replicas: 1 +# volumes: +# - /var/run/docker.sock:/var/run/docker.sock:ro +# - /lib/modules:/lib/modules:ro networks: + portainer_agent_network: + external: true mailcow-network: - driver: bridge - driver_opts: - com.docker.network.bridge.name: br-mailcow - enable_ipv6: true - ipam: - driver: default - config: - - subnet: ${IPV4_NETWORK:-172.22.1}.0/24 - - subnet: ${IPV6_NETWORK:-fd4d:6169:6c63:6f77::/64} + driver: overlay volumes: vmail-vol-1: diff --git a/docker-compose.yml.bak b/docker-compose.yml.bak new file mode 100644 index 0000000000..5a32236ac3 --- /dev/null +++ b/docker-compose.yml.bak @@ -0,0 +1,635 @@ +version: '2.1' +services: + + unbound-mailcow: + image: mailcow/unbound:1.15 + environment: + - TZ=${TZ} + volumes: + - ./data/hooks/unbound:/hooks:Z + - ./data/conf/unbound/unbound.conf:/etc/unbound/unbound.conf:ro,Z + restart: always + tty: true + networks: + mailcow-network: + ipv4_address: ${IPV4_NETWORK:-172.22.1}.254 + aliases: + - unbound + + mysql-mailcow: + image: mariadb:10.5 + depends_on: + - unbound-mailcow + stop_grace_period: 45s + volumes: + - mysql-vol-1:/var/lib/mysql/:Z + - mysql-socket-vol-1:/var/run/mysqld/:z + - ./data/conf/mysql/:/etc/mysql/conf.d/:ro,Z + environment: + - TZ=${TZ} + - MYSQL_ROOT_PASSWORD=${DBROOT} + - MYSQL_DATABASE=${DBNAME} + - MYSQL_USER=${DBUSER} + - MYSQL_PASSWORD=${DBPASS} + - MYSQL_INITDB_SKIP_TZINFO=1 + restart: always + ports: + - "${SQL_PORT:-127.0.0.1:13306}:3306" + networks: + mailcow-network: + aliases: + - mysql + + redis-mailcow: + image: redis:6-alpine + volumes: + - redis-vol-1:/data/:Z + restart: always + ports: + - "${REDIS_PORT:-127.0.0.1:7654}:6379" + environment: + - TZ=${TZ} + sysctls: + - net.core.somaxconn=4096 + networks: + mailcow-network: + ipv4_address: ${IPV4_NETWORK:-172.22.1}.249 + aliases: + - redis + + clamd-mailcow: + image: mailcow/clamd:1.50 + restart: always + dns: + - ${IPV4_NETWORK:-172.22.1}.254 + environment: + - TZ=${TZ} + - SKIP_CLAMD=${SKIP_CLAMD:-n} + volumes: + - ./data/conf/clamav/:/etc/clamav/:Z + - clamd-db-vol-1:/var/lib/clamav:z + networks: + mailcow-network: + aliases: + - clamd + + rspamd-mailcow: + image: mailcow/rspamd:1.90 + stop_grace_period: 30s + depends_on: + - dovecot-mailcow + environment: + - TZ=${TZ} + - IPV4_NETWORK=${IPV4_NETWORK:-172.22.1} + - IPV6_NETWORK=${IPV6_NETWORK:-fd4d:6169:6c63:6f77::/64} + - REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP:-} + - REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT:-} + volumes: + - ./data/hooks/rspamd:/hooks:Z + - ./data/conf/rspamd/custom/:/etc/rspamd/custom:z + - ./data/conf/rspamd/override.d/:/etc/rspamd/override.d:Z + - ./data/conf/rspamd/local.d/:/etc/rspamd/local.d:Z + - ./data/conf/rspamd/plugins.d/:/etc/rspamd/plugins.d:Z + - ./data/conf/rspamd/lua/:/etc/rspamd/lua/:ro,Z + - ./data/conf/rspamd/rspamd.conf.local:/etc/rspamd/rspamd.conf.local:Z + - ./data/conf/rspamd/rspamd.conf.override:/etc/rspamd/rspamd.conf.override:Z + - rspamd-vol-1:/var/lib/rspamd:z + restart: always + hostname: rspamd + dns: + - ${IPV4_NETWORK:-172.22.1}.254 + networks: + mailcow-network: + aliases: + - rspamd + + php-fpm-mailcow: + image: mailcow/phpfpm:1.78 + command: "php-fpm -d date.timezone=${TZ} -d expose_php=0" + depends_on: + - redis-mailcow + volumes: + - ./data/hooks/phpfpm:/hooks:Z + - ./data/web:/web:z + - ./data/conf/rspamd/dynmaps:/dynmaps:ro,z + - ./data/conf/rspamd/custom/:/rspamd_custom_maps:z + - rspamd-vol-1:/var/lib/rspamd:z + - mysql-socket-vol-1:/var/run/mysqld/:z + - ./data/conf/sogo/:/etc/sogo/:z + - ./data/conf/rspamd/meta_exporter:/meta_exporter:ro,z + - ./data/conf/phpfpm/sogo-sso/:/etc/sogo-sso/:z + - ./data/conf/phpfpm/php-fpm.d/pools.conf:/usr/local/etc/php-fpm.d/z-pools.conf:Z + - ./data/conf/phpfpm/php-conf.d/opcache-recommended.ini:/usr/local/etc/php/conf.d/opcache-recommended.ini:Z + - ./data/conf/phpfpm/php-conf.d/upload.ini:/usr/local/etc/php/conf.d/upload.ini:Z + - ./data/conf/phpfpm/php-conf.d/other.ini:/usr/local/etc/php/conf.d/zzz-other.ini:Z + - ./data/conf/dovecot/global_sieve_before:/global_sieve/before:z + - ./data/conf/dovecot/global_sieve_after:/global_sieve/after:z + - ./data/assets/templates:/tpls:z + - ./data/conf/nginx/:/etc/nginx/conf.d/:z + dns: + - ${IPV4_NETWORK:-172.22.1}.254 + environment: + - REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP:-} + - REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT:-} + - LOG_LINES=${LOG_LINES:-9999} + - TZ=${TZ} + - DBNAME=${DBNAME} + - DBUSER=${DBUSER} + - DBPASS=${DBPASS} + - MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME} + - MAILCOW_PASS_SCHEME=${MAILCOW_PASS_SCHEME:-BLF-CRYPT} + - IMAP_PORT=${IMAP_PORT:-143} + - IMAPS_PORT=${IMAPS_PORT:-993} + - POP_PORT=${POP_PORT:-110} + - POPS_PORT=${POPS_PORT:-995} + - SIEVE_PORT=${SIEVE_PORT:-4190} + - IPV4_NETWORK=${IPV4_NETWORK:-172.22.1} + - IPV6_NETWORK=${IPV6_NETWORK:-fd4d:6169:6c63:6f77::/64} + - SUBMISSION_PORT=${SUBMISSION_PORT:-587} + - SMTPS_PORT=${SMTPS_PORT:-465} + - SMTP_PORT=${SMTP_PORT:-25} + - API_KEY=${API_KEY:-invalid} + - API_KEY_READ_ONLY=${API_KEY_READ_ONLY:-invalid} + - API_ALLOW_FROM=${API_ALLOW_FROM:-invalid} + - COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME:-mailcow-dockerized} + - SKIP_SOLR=${SKIP_SOLR:-y} + - SKIP_CLAMD=${SKIP_CLAMD:-n} + - SKIP_SOGO=${SKIP_SOGO:-n} + - ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN:-n} + - MASTER=${MASTER:-y} + - DEV_MODE=${DEV_MODE:-n} + - WEBAUTHN_ONLY_TRUSTED_VENDORS=${WEBAUTHN_ONLY_TRUSTED_VENDORS:-n} + restart: always + networks: + mailcow-network: + aliases: + - phpfpm + + sogo-mailcow: + image: mailcow/sogo:1.107 + environment: + - DBNAME=${DBNAME} + - DBUSER=${DBUSER} + - DBPASS=${DBPASS} + - TZ=${TZ} + - LOG_LINES=${LOG_LINES:-9999} + - MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME} + - MAILCOW_PASS_SCHEME=${MAILCOW_PASS_SCHEME:-BLF-CRYPT} + - ACL_ANYONE=${ACL_ANYONE:-disallow} + - ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN:-n} + - IPV4_NETWORK=${IPV4_NETWORK:-172.22.1} + - SOGO_EXPIRE_SESSION=${SOGO_EXPIRE_SESSION:-480} + - SKIP_SOGO=${SKIP_SOGO:-n} + - MASTER=${MASTER:-y} + - REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP:-} + - REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT:-} + dns: + - ${IPV4_NETWORK:-172.22.1}.254 + volumes: + - ./data/hooks/sogo:/hooks:Z + - ./data/conf/sogo/:/etc/sogo/:z + - ./data/web/inc/init_db.inc.php:/init_db.inc.php:Z + - ./data/conf/sogo/custom-favicon.ico:/usr/lib/GNUstep/SOGo/WebServerResources/img/sogo.ico:z + - ./data/conf/sogo/custom-theme.js:/usr/lib/GNUstep/SOGo/WebServerResources/js/theme.js:z + - ./data/conf/sogo/custom-sogo.js:/usr/lib/GNUstep/SOGo/WebServerResources/js/custom-sogo.js:z + - mysql-socket-vol-1:/var/run/mysqld/:z + - sogo-web-vol-1:/sogo_web:z + - sogo-userdata-backup-vol-1:/sogo_backup:Z + labels: + ofelia.enabled: "true" + ofelia.job-exec.sogo_sessions.schedule: "@every 1m" + ofelia.job-exec.sogo_sessions.command: "/bin/bash -c \"[[ $${MASTER} == y ]] && /usr/local/bin/gosu sogo /usr/sbin/sogo-tool expire-sessions $${SOGO_EXPIRE_SESSION} || exit 0\"" + ofelia.job-exec.sogo_ealarms.schedule: "@every 1m" + ofelia.job-exec.sogo_ealarms.command: "/bin/bash -c \"[[ $${MASTER} == y ]] && /usr/local/bin/gosu sogo /usr/sbin/sogo-ealarms-notify -p /etc/sogo/sieve.creds || exit 0\"" + ofelia.job-exec.sogo_eautoreply.schedule: "@every 5m" + ofelia.job-exec.sogo_eautoreply.command: "/bin/bash -c \"[[ $${MASTER} == y ]] && /usr/local/bin/gosu sogo /usr/sbin/sogo-tool update-autoreply -p /etc/sogo/sieve.creds || exit 0\"" + ofelia.job-exec.sogo_backup.schedule: "@every 24h" + ofelia.job-exec.sogo_backup.command: "/bin/bash -c \"[[ $${MASTER} == y ]] && /usr/local/bin/gosu sogo /usr/sbin/sogo-tool backup /sogo_backup ALL || exit 0\"" + restart: always + networks: + mailcow-network: + ipv4_address: ${IPV4_NETWORK:-172.22.1}.248 + aliases: + - sogo + + dovecot-mailcow: + image: mailcow/dovecot:1.161 + depends_on: + - mysql-mailcow + dns: + - ${IPV4_NETWORK:-172.22.1}.254 + cap_add: + - NET_BIND_SERVICE + volumes: + - ./data/hooks/dovecot:/hooks:Z + - ./data/conf/dovecot:/etc/dovecot:z + - ./data/assets/ssl:/etc/ssl/mail/:ro,z + - ./data/conf/sogo/:/etc/sogo/:z + - ./data/conf/phpfpm/sogo-sso/:/etc/phpfpm/:z + - vmail-vol-1:/var/vmail:Z + - vmail-index-vol-1:/var/vmail_index:Z + - crypt-vol-1:/mail_crypt/:z + - ./data/conf/rspamd/custom/:/etc/rspamd/custom:z + - ./data/assets/templates:/templates:z + - rspamd-vol-1:/var/lib/rspamd:z + - mysql-socket-vol-1:/var/run/mysqld/:z + environment: + - DOVECOT_MASTER_USER=${DOVECOT_MASTER_USER:-} + - DOVECOT_MASTER_PASS=${DOVECOT_MASTER_PASS:-} + - LOG_LINES=${LOG_LINES:-9999} + - DBNAME=${DBNAME} + - DBUSER=${DBUSER} + - DBPASS=${DBPASS} + - TZ=${TZ} + - MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME} + - MAILCOW_PASS_SCHEME=${MAILCOW_PASS_SCHEME:-BLF-CRYPT} + - IPV4_NETWORK=${IPV4_NETWORK:-172.22.1} + - ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN:-n} + - MAILDIR_GC_TIME=${MAILDIR_GC_TIME:-7200} + - ACL_ANYONE=${ACL_ANYONE:-disallow} + - SKIP_SOLR=${SKIP_SOLR:-y} + - MAILDIR_SUB=${MAILDIR_SUB:-} + - MASTER=${MASTER:-y} + - REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP:-} + - REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT:-} + - COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME:-mailcow-dockerized} + ports: + - "${DOVEADM_PORT:-127.0.0.1:19991}:12345" + - "${IMAP_PORT:-143}:143" + - "${IMAPS_PORT:-993}:993" + - "${POP_PORT:-110}:110" + - "${POPS_PORT:-995}:995" + - "${SIEVE_PORT:-4190}:4190" + restart: always + tty: true + labels: + ofelia.enabled: "true" + ofelia.job-exec.dovecot_imapsync_runner.schedule: "@every 1m" + ofelia.job-exec.dovecot_imapsync_runner.no-overlap: "true" + ofelia.job-exec.dovecot_imapsync_runner.command: "/bin/bash -c \"[[ $${MASTER} == y ]] && /usr/local/bin/gosu nobody /usr/local/bin/imapsync_runner.pl || exit 0\"" + ofelia.job-exec.dovecot_trim_logs.schedule: "@every 1m" + ofelia.job-exec.dovecot_trim_logs.command: "/bin/bash -c \"[[ $${MASTER} == y ]] && /usr/local/bin/gosu vmail /usr/local/bin/trim_logs.sh || exit 0\"" + ofelia.job-exec.dovecot_quarantine.schedule: "@every 20m" + ofelia.job-exec.dovecot_quarantine.command: "/bin/bash -c \"[[ $${MASTER} == y ]] && /usr/local/bin/gosu vmail /usr/local/bin/quarantine_notify.py || exit 0\"" + ofelia.job-exec.dovecot_clean_q_aged.schedule: "@every 24h" + ofelia.job-exec.dovecot_clean_q_aged.command: "/bin/bash -c \"[[ $${MASTER} == y ]] && /usr/local/bin/gosu vmail /usr/local/bin/clean_q_aged.sh || exit 0\"" + ofelia.job-exec.dovecot_maildir_gc.schedule: "@every 30m" + ofelia.job-exec.dovecot_maildir_gc.command: "/bin/bash -c \"source /source_env.sh ; /usr/local/bin/gosu vmail /usr/local/bin/maildir_gc.sh\"" + ofelia.job-exec.dovecot_sarules.schedule: "@every 24h" + ofelia.job-exec.dovecot_sarules.command: "/bin/bash -c \"/usr/local/bin/sa-rules.sh\"" + ofelia.job-exec.dovecot_fts.schedule: "@every 24h" + ofelia.job-exec.dovecot_fts.command: "/usr/bin/curl http://solr:8983/solr/dovecot-fts/update?optimize=true" + ofelia.job-exec.dovecot_repl_health.schedule: "@every 5m" + ofelia.job-exec.dovecot_repl_health.command: "/bin/bash -c \"/usr/local/bin/gosu vmail /usr/local/bin/repl_health.sh\"" + ulimits: + nproc: 65535 + nofile: + soft: 20000 + hard: 40000 + networks: + mailcow-network: + ipv4_address: ${IPV4_NETWORK:-172.22.1}.250 + aliases: + - dovecot + + postfix-mailcow: + image: mailcow/postfix:1.66 + depends_on: + - mysql-mailcow + volumes: + - ./data/hooks/postfix:/hooks:Z + - ./data/conf/postfix:/opt/postfix/conf:z + - ./data/assets/ssl:/etc/ssl/mail/:ro,z + - postfix-vol-1:/var/spool/postfix:z + - crypt-vol-1:/var/lib/zeyple:z + - rspamd-vol-1:/var/lib/rspamd:z + - mysql-socket-vol-1:/var/run/mysqld/:z + environment: + - LOG_LINES=${LOG_LINES:-9999} + - TZ=${TZ} + - DBNAME=${DBNAME} + - DBUSER=${DBUSER} + - DBPASS=${DBPASS} + - REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP:-} + - REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT:-} + - MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME} + cap_add: + - NET_BIND_SERVICE + ports: + - "${SMTP_PORT:-25}:25" + - "${SMTPS_PORT:-465}:465" + - "${SUBMISSION_PORT:-587}:587" + restart: always + dns: + - ${IPV4_NETWORK:-172.22.1}.254 + networks: + mailcow-network: + ipv4_address: ${IPV4_NETWORK:-172.22.1}.253 + aliases: + - postfix + + memcached-mailcow: + image: memcached:alpine + restart: always + environment: + - TZ=${TZ} + networks: + mailcow-network: + aliases: + - memcached + + nginx-mailcow: + depends_on: + - sogo-mailcow + - php-fpm-mailcow + - redis-mailcow + image: nginx:mainline-alpine + dns: + - ${IPV4_NETWORK:-172.22.1}.254 + 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 && + envsubst < /etc/nginx/conf.d/templates/sogo.template > /etc/nginx/conf.d/sogo.active && + . /etc/nginx/conf.d/templates/server_name.template.sh > /etc/nginx/conf.d/server_name.active && + . /etc/nginx/conf.d/templates/sites.template.sh > /etc/nginx/conf.d/sites.active && + . /etc/nginx/conf.d/templates/sogo_eas.template.sh > /etc/nginx/conf.d/sogo_eas.active && + nginx -qt && + until ping phpfpm -c1 > /dev/null; do sleep 1; done && + until ping sogo -c1 > /dev/null; do sleep 1; done && + until ping redis -c1 > /dev/null; do sleep 1; done && + until ping rspamd -c1 > /dev/null; do sleep 1; done && + exec nginx -g 'daemon off;'" + environment: + - HTTPS_PORT=${HTTPS_PORT:-443} + - HTTP_PORT=${HTTP_PORT:-80} + - MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME} + - IPV4_NETWORK=${IPV4_NETWORK:-172.22.1} + - TZ=${TZ} + - SKIP_SOGO=${SKIP_SOGO:-n} + - ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN:-n} + - ADDITIONAL_SERVER_NAMES=${ADDITIONAL_SERVER_NAMES:-} + volumes: + - ./data/web:/web:ro,z + - ./data/conf/rspamd/dynmaps:/dynmaps:ro,z + - ./data/assets/ssl/:/etc/ssl/mail/:ro,z + - ./data/conf/nginx/:/etc/nginx/conf.d/:z + - ./data/conf/rspamd/meta_exporter:/meta_exporter:ro,z + - sogo-web-vol-1:/usr/lib/GNUstep/SOGo/:z + ports: + - "${HTTPS_BIND:-:}:${HTTPS_PORT:-443}:${HTTPS_PORT:-443}" + - "${HTTP_BIND:-:}:${HTTP_PORT:-80}:${HTTP_PORT:-80}" + restart: always + networks: + mailcow-network: + aliases: + - nginx + + acme-mailcow: + depends_on: + - nginx-mailcow + image: mailcow/acme:1.81 + dns: + - ${IPV4_NETWORK:-172.22.1}.254 + environment: + - LOG_LINES=${LOG_LINES:-9999} + - ACME_CONTACT=${ACME_CONTACT:-} + - ADDITIONAL_SAN=${ADDITIONAL_SAN} + - MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME} + - DBNAME=${DBNAME} + - DBUSER=${DBUSER} + - DBPASS=${DBPASS} + - SKIP_LETS_ENCRYPT=${SKIP_LETS_ENCRYPT:-n} + - 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_HTTP_VERIFICATION=${SKIP_HTTP_VERIFICATION:-n} + - ONLY_MAILCOW_HOSTNAME=${ONLY_MAILCOW_HOSTNAME:-n} + - LE_STAGING=${LE_STAGING:-n} + - TZ=${TZ} + - REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP:-} + - REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT:-} + - SNAT_TO_SOURCE=${SNAT_TO_SOURCE:-n} + - SNAT6_TO_SOURCE=${SNAT6_TO_SOURCE:-n} + volumes: + - ./data/web/.well-known/acme-challenge:/var/www/acme:z + - ./data/assets/ssl:/var/lib/acme/:z + - ./data/assets/ssl-example:/var/lib/ssl-example/:ro,Z + - mysql-socket-vol-1:/var/run/mysqld/:z + restart: always + networks: + mailcow-network: + aliases: + - acme + + netfilter-mailcow: + image: mailcow/netfilter:1.46 + stop_grace_period: 30s + depends_on: + - dovecot-mailcow + - postfix-mailcow + - sogo-mailcow + - php-fpm-mailcow + - redis-mailcow + restart: always + privileged: true + environment: + - TZ=${TZ} + - IPV4_NETWORK=${IPV4_NETWORK:-172.22.1} + - IPV6_NETWORK=${IPV6_NETWORK:-fd4d:6169:6c63:6f77::/64} + - SNAT_TO_SOURCE=${SNAT_TO_SOURCE:-n} + - SNAT6_TO_SOURCE=${SNAT6_TO_SOURCE:-n} + - REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP:-} + - REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT:-} + network_mode: "host" + volumes: + - /lib/modules:/lib/modules:ro + + watchdog-mailcow: + image: mailcow/watchdog:1.96 + dns: + - ${IPV4_NETWORK:-172.22.1}.254 + tmpfs: + - /tmp + volumes: + - rspamd-vol-1:/var/lib/rspamd:z + - mysql-socket-vol-1:/var/run/mysqld/:z + - postfix-vol-1:/var/spool/postfix:z + - ./data/assets/ssl:/etc/ssl/mail/:ro,z + restart: always + environment: + - IPV6_NETWORK=${IPV6_NETWORK:-fd4d:6169:6c63:6f77::/64} + - LOG_LINES=${LOG_LINES:-9999} + - TZ=${TZ} + - DBNAME=${DBNAME} + - DBUSER=${DBUSER} + - DBPASS=${DBPASS} + - DBROOT=${DBROOT} + - USE_WATCHDOG=${USE_WATCHDOG:-n} + - WATCHDOG_NOTIFY_EMAIL=${WATCHDOG_NOTIFY_EMAIL:-} + - WATCHDOG_NOTIFY_BAN=${WATCHDOG_NOTIFY_BAN:-y} + - WATCHDOG_SUBJECT=${WATCHDOG_SUBJECT:-Watchdog ALERT} + - WATCHDOG_EXTERNAL_CHECKS=${WATCHDOG_EXTERNAL_CHECKS:-n} + - WATCHDOG_MYSQL_REPLICATION_CHECKS=${WATCHDOG_MYSQL_REPLICATION_CHECKS:-n} + - WATCHDOG_VERBOSE=${WATCHDOG_VERBOSE:-n} + - MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME} + - COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME:-mailcow-dockerized} + - IPV4_NETWORK=${IPV4_NETWORK:-172.22.1} + - IP_BY_DOCKER_API=${IP_BY_DOCKER_API:-0} + - CHECK_UNBOUND=${CHECK_UNBOUND:-1} + - SKIP_CLAMD=${SKIP_CLAMD:-n} + - SKIP_LETS_ENCRYPT=${SKIP_LETS_ENCRYPT:-n} + - SKIP_SOGO=${SKIP_SOGO:-n} + - HTTPS_PORT=${HTTPS_PORT:-443} + - REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP:-} + - REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT:-} + - EXTERNAL_CHECKS_THRESHOLD=${EXTERNAL_CHECKS_THRESHOLD:-1} + - NGINX_THRESHOLD=${NGINX_THRESHOLD:-5} + - UNBOUND_THRESHOLD=${UNBOUND_THRESHOLD:-5} + - REDIS_THRESHOLD=${REDIS_THRESHOLD:-5} + - MYSQL_THRESHOLD=${MYSQL_THRESHOLD:-5} + - MYSQL_REPLICATION_THRESHOLD=${MYSQL_REPLICATION_THRESHOLD:-1} + - SOGO_THRESHOLD=${SOGO_THRESHOLD:-3} + - POSTFIX_THRESHOLD=${POSTFIX_THRESHOLD:-8} + - CLAMD_THRESHOLD=${CLAMD_THRESHOLD:-15} + - DOVECOT_THRESHOLD=${DOVECOT_THRESHOLD:-12} + - DOVECOT_REPL_THRESHOLD=${DOVECOT_REPL_THRESHOLD:-20} + - PHPFPM_THRESHOLD=${PHPFPM_THRESHOLD:-5} + - RATELIMIT_THRESHOLD=${RATELIMIT_THRESHOLD:-1} + - FAIL2BAN_THRESHOLD=${FAIL2BAN_THRESHOLD:-1} + - ACME_THRESHOLD=${ACME_THRESHOLD:-1} + - RSPAMD_THRESHOLD=${RSPAMD_THRESHOLD:-5} + - OLEFY_THRESHOLD=${OLEFY_THRESHOLD:-5} + - MAILQ_THRESHOLD=${MAILQ_THRESHOLD:-20} + - MAILQ_CRIT=${MAILQ_CRIT:-30} + networks: + mailcow-network: + aliases: + - watchdog + + dockerapi-mailcow: + image: mailcow/dockerapi:1.41 + security_opt: + - label=disable + restart: always + oom_kill_disable: true + dns: + - ${IPV4_NETWORK:-172.22.1}.254 + environment: + - DBROOT=${DBROOT} + - TZ=${TZ} + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + networks: + mailcow-network: + aliases: + - dockerapi + + solr-mailcow: + image: mailcow/solr:1.8.1 + restart: always + volumes: + - solr-vol-1:/opt/solr/server/solr/dovecot-fts/data:Z + ports: + - "${SOLR_PORT:-127.0.0.1:18983}:8983" + environment: + - TZ=${TZ} + - SOLR_HEAP=${SOLR_HEAP:-1024} + - SKIP_SOLR=${SKIP_SOLR:-y} + networks: + mailcow-network: + aliases: + - solr + + olefy-mailcow: + image: mailcow/olefy:1.9 + restart: always + environment: + - TZ=${TZ} + - OLEFY_BINDADDRESS=0.0.0.0 + - OLEFY_BINDPORT=10055 + - OLEFY_TMPDIR=/tmp + - OLEFY_PYTHON_PATH=/usr/bin/python3 + - OLEFY_OLEVBA_PATH=/usr/bin/olevba + - OLEFY_LOGLVL=20 + - OLEFY_MINLENGTH=500 + - OLEFY_DEL_TMP=1 + networks: + mailcow-network: + aliases: + - olefy + + ofelia-mailcow: + image: mcuadros/ofelia:latest + restart: always + command: daemon --docker + environment: + - TZ=${TZ} + depends_on: + - sogo-mailcow + - dovecot-mailcow + labels: + ofelia.enabled: "true" + security_opt: + - label=disable + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + networks: + mailcow-network: + aliases: + - ofelia + + ipv6nat-mailcow: + depends_on: + - unbound-mailcow + - mysql-mailcow + - redis-mailcow + - clamd-mailcow + - rspamd-mailcow + - php-fpm-mailcow + - sogo-mailcow + - dovecot-mailcow + - postfix-mailcow + - memcached-mailcow + - nginx-mailcow + - acme-mailcow + - netfilter-mailcow + - watchdog-mailcow + - dockerapi-mailcow + - solr-mailcow + environment: + - TZ=${TZ} + image: robbertkl/ipv6nat + security_opt: + - label=disable + restart: always + privileged: true + network_mode: "host" + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - /lib/modules:/lib/modules:ro + +networks: + mailcow-network: + driver: bridge + driver_opts: + com.docker.network.bridge.name: br-mailcow + enable_ipv6: true + ipam: + driver: default + config: + - subnet: ${IPV4_NETWORK:-172.22.1}.0/24 + - subnet: ${IPV6_NETWORK:-fd4d:6169:6c63:6f77::/64} + +volumes: + vmail-vol-1: + vmail-index-vol-1: + mysql-vol-1: + mysql-socket-vol-1: + redis-vol-1: + rspamd-vol-1: + solr-vol-1: + postfix-vol-1: + crypt-vol-1: + sogo-web-vol-1: + sogo-userdata-backup-vol-1: + clamd-db-vol-1: