{ "module": "mailu", "version": "1", "capabilities": [ "container-runtime" ], "requires": [ "postgres-database", "route", "secret" ], "contributes": { "postgres-database": { "name": "mailu" }, "route": { "label": "mail", "port": 7080 } }, "binds": { "postgres-database": "/var/lib/mailu/database.json", "route": "/var/lib/mailu/route.json" }, "secrets": { "postgres-database": "/var/lib/mailu/database.secret", "secret": { "secret-key": "/var/lib/mailu/secret-key.secret", "admin": "/var/lib/mailu/admin.secret", "api-token": "/var/lib/mailu/api-token.secret" } }, "emits": [ "module.mailu.user.created", "module.mailu.user.deleted", "module.mailu.alias.created", "module.mailu.alias.deleted" ], "listens": [ { "port": 25, "protocol": "tcp", "from": "anywhere", "why": "mail from other mail servers", "fixed": true }, { "port": 465, "protocol": "tcp", "from": "anywhere", "why": "submission over TLS", "fixed": true }, { "port": 587, "protocol": "tcp", "from": "anywhere", "why": "submission", "fixed": true }, { "port": 993, "protocol": "tcp", "from": "anywhere", "why": "IMAP over TLS", "fixed": true }, { "port": 7080, "protocol": "tcp", "from": "mesh", "why": "the web interface (admin, webmail, admin API), behind the route proxy" } ], "own-secrets": { "broker": "/var/lib/mesh/mailu/broker" }, "resources": [ { "id": "mesh-state", "type": "directory", "path": "/var/lib/mesh/mailu", "mode": "0700" }, { "id": "state", "type": "directory", "path": "/var/lib/mailu", "mode": "0700" }, { "id": "config-env", "type": "file", "path": "/var/lib/mailu/mailu.env", "mode": "0644", "content": "DOMAIN=novox.be\nHOSTNAMES=mail.novox.be\nPOSTMASTER=admin\nSITENAME=Novox\nWEBSITE=https://novox.be\nTLS_FLAVOR=cert\nSUBNET=192.168.203.0/24\nCOMPOSE_PROJECT_NAME=mailu\nHOST_ADMIN=mailu-admin\nHOST_ANTISPAM=mailu-antispam:11332\nHOST_IMAP=mailu-imap\nHOST_SMTP=mailu-smtp\nHOST_WEBMAIL=mailu-webmail\nHOST_WEBDAV=mailu-webdav:5232\nHOST_REDIS=mailu-redis\nHOST_FRONT=mailu-front\nREDIS_ADDRESS=mailu-redis\nANTIVIRUS=clamav\nWEBMAIL=roundcube\nWEBDAV=radicale\nFETCHMAIL_ENABLED=True\nFETCHMAIL_DELAY=600\nADMIN=true\nWEB_ADMIN=/admin\nWEB_WEBMAIL=/webmail\nWEBROOT_REDIRECT=/webmail\nWEBMAIL_ADDRESS=webmail\nAPI=true\nWEB_API=/api\nAUTH_RATELIMIT_IP=6000/hour\nAUTH_RATELIMIT_USER=1000/day\nCREDENTIAL_ROUNDS=12\nPASSWORD_SCHEME=PBKDF2\nDISABLE_STATISTICS=True\nMESSAGE_SIZE_LIMIT=50000000\nMESSAGE_RATELIMIT=200/day\nRECIPIENT_DELIMITER=+\nPOSTFIX_MYNETWORKS=127.0.0.0/8 [::1]/128\nRELAYNETS=\nRELAYHOST=\nREJECT_UNLISTED_RECIPIENT=\nDB_FLAVOR=postgresql\nINITIAL_ADMIN_ACCOUNT=admin\nINITIAL_ADMIN_DOMAIN=novox.be\nINITIAL_ADMIN_MODE=ifmissing\nSMTP_PORT=25\nSMTPS_PORT=465\nSUBMISSION_PORT=587\nPOP3_PORT=110\nPOP3S_PORT=995\nIMAP_PORT=143\nIMAPS_PORT=993\nHTTP_PORT=7080\nHTTPS_PORT=7443\nAUTOMX_PORT=4243\nAMX_SMTP_ADDRESS=mail.novox.be\nAMX_SMTP_PORT=587\nAMX_IMAP_ADDRESS=mail.novox.be\nAMX_IMAP_PORT=143\nAMX_MAIL_DOMAINS=novox.be\nDMARC_RUA=admin\nDMARC_RUF=admin\nLETSENCRYPT_SHORTCHAIN=True\nTZ=Etc/UTC\nLOG_LEVEL=INFO\nWELCOME=false\nREAL_IP_HEADER=X-Real-IP\nREAL_IP_FROM=\nCOMPRESSION=\nCOMPRESS_LEVEL=\nCOMPRESSION_LEVEL=\nBIND_ADDRESS4=127.0.0.1\nBIND_ADDRESS6=::1\nMAILU_VERSION=1.9\nDOCKER_ORG=mailu\nDOCKER_PREFIX=\n" }, { "id": "secret-env", "type": "file", "path": "/var/lib/mailu/secret.env", "mode": "0600", "content": "SECRET_KEY=${secret:secret-key}\n" }, { "id": "database-env", "type": "file", "path": "/var/lib/mailu/database.env", "mode": "0600", "content": "DB_FLAVOR=postgresql\nDB_HOST=${bound:postgres-database:at}:${bound:postgres-database:port}\nDB_USER=${bound:postgres-database:as}\nDB_NAME=${bound:postgres-database:as}\nDB_PW=${secret:postgres-database}\n" }, { "id": "admin-env", "type": "file", "path": "/var/lib/mailu/admin.env", "mode": "0600", "content": "INITIAL_ADMIN_PW=${secret:admin}\nAPI_TOKEN=${secret:api-token}\n" }, { "id": "data-certs", "type": "directory", "path": "/services/mailu/data/certs", "mode": "0700" }, { "id": "data-data", "type": "directory", "path": "/services/mailu/data/data", "mode": "0700" }, { "id": "data-dkim", "type": "directory", "path": "/services/mailu/data/dkim", "mode": "0700" }, { "id": "data-mail", "type": "directory", "path": "/services/mailu/data/mail", "mode": "0700" }, { "id": "data-mailqueue", "type": "directory", "path": "/services/mailu/data/mailqueue", "mode": "0700" }, { "id": "data-filter", "type": "directory", "path": "/services/mailu/data/filter", "mode": "0700" }, { "id": "data-redis", "type": "directory", "path": "/services/mailu/data/redis", "mode": "0700" }, { "id": "data-webmail", "type": "directory", "path": "/services/mailu/data/webmail", "mode": "0700" }, { "id": "data-dav", "type": "directory", "path": "/services/mailu/data/dav", "mode": "0700" }, { "id": "data-fetchmail", "type": "directory", "path": "/services/mailu/data/data/fetchmail", "mode": "0700" }, { "id": "data-overrides-nginx", "type": "directory", "path": "/services/mailu/data/overrides/nginx", "mode": "0700" }, { "id": "data-overrides-dovecot", "type": "directory", "path": "/services/mailu/data/overrides/dovecot", "mode": "0700" }, { "id": "data-overrides-postfix", "type": "directory", "path": "/services/mailu/data/overrides/postfix", "mode": "0700" }, { "id": "data-overrides-rspamd", "type": "directory", "path": "/services/mailu/data/overrides/rspamd", "mode": "0700" }, { "id": "data-overrides-roundcube", "type": "directory", "path": "/services/mailu/data/overrides/roundcube", "mode": "0700" }, { "id": "net", "type": "network", "name": "mailu" }, { "id": "resolver", "type": "container", "name": "mailu-resolver", "image": "ghcr.io/mailu/unbound@sha256:142aaad82ad1b0d5b59a5f1303778dba61a3e0a540f5d969c48862bcc99f6f5d", "network": "mailu", "env-file": [ "/var/lib/mailu/mailu.env", "/var/lib/mailu/secret.env" ], "secrets-in-environment": "mailu-admin honours SECRET_KEY_FILE, DB_PW_FILE and API_TOKEN_FILE (configuration.py) but INITIAL_ADMIN_PW is env-only (start.py); the remaining containers' need for SECRET_KEY is unverified" }, { "id": "redis", "type": "container", "name": "mailu-redis", "image": "redis@sha256:1db42ccef14898aa29bae778452d567534b59c107129cbc1163fb552de184d3c", "network": "mailu", "volumes": [ "/services/mailu/data/redis:/data" ] }, { "id": "admin", "type": "container", "name": "mailu-admin", "image": "ghcr.io/mailu/admin@sha256:dcac20e9cbdad560faef9653b1b5ac0d9266f4098dc00f0e7f0d35f4e70ed8f1", "network": "mailu", "env-file": [ "/var/lib/mailu/mailu.env", "/var/lib/mailu/secret.env", "/var/lib/mailu/database.env", "/var/lib/mailu/admin.env" ], "volumes": [ "/services/mailu/data/data:/data", "/services/mailu/data/dkim:/dkim" ], "secrets-in-environment": "mailu-admin honours SECRET_KEY_FILE, DB_PW_FILE and API_TOKEN_FILE (configuration.py) but INITIAL_ADMIN_PW is env-only (start.py); the remaining containers' need for SECRET_KEY is unverified" }, { "id": "imap", "type": "container", "name": "mailu-imap", "image": "ghcr.io/mailu/dovecot@sha256:46d18ba51032be8ebd6841aa49c1ef8762c729038c5fd86a081b5b884d478af9", "network": "mailu", "env-file": [ "/var/lib/mailu/mailu.env" ], "volumes": [ "/services/mailu/data/mail:/mail", "/services/mailu/data/overrides/dovecot:/overrides:ro" ] }, { "id": "smtp", "type": "container", "name": "mailu-smtp", "image": "ghcr.io/mailu/postfix@sha256:bbf882880f68849511710b35237a933f3fe80c4b28bf48ff20205dbd1f1433d7", "network": "mailu", "env-file": [ "/var/lib/mailu/mailu.env" ], "volumes": [ "/services/mailu/data/mailqueue:/queue", "/services/mailu/data/overrides/postfix:/overrides:ro" ] }, { "id": "antispam", "type": "container", "name": "mailu-antispam", "image": "ghcr.io/mailu/rspamd@sha256:e87ab93dd252cc69499caa5317dd10d445fd4291a7ecf6bca09793c7d475a0c8", "network": "mailu", "env-file": [ "/var/lib/mailu/mailu.env" ], "volumes": [ "/services/mailu/data/filter:/var/lib/rspamd", "/services/mailu/data/overrides/rspamd:/etc/rspamd/override.d:ro" ] }, { "id": "antivirus", "type": "container", "name": "mailu-antivirus", "image": "ghcr.io/mailu/clamav@sha256:01d30483e4a8a20a54566addb1f9b00ebb51e8a103f9226602379c412cf5fb62", "network": "mailu", "env-file": [ "/var/lib/mailu/mailu.env", "/var/lib/mailu/secret.env" ], "volumes": [ "/services/mailu/data/filter:/data" ], "secrets-in-environment": "mailu-admin honours SECRET_KEY_FILE, DB_PW_FILE and API_TOKEN_FILE (configuration.py) but INITIAL_ADMIN_PW is env-only (start.py); the remaining containers' need for SECRET_KEY is unverified" }, { "id": "webmail", "type": "container", "name": "mailu-webmail", "image": "ghcr.io/mailu/roundcube@sha256:19ccc9c21b2420dabb893ffa707ef90785c785e53dcb6bb9f98da01598412c43", "network": "mailu", "env-file": [ "/var/lib/mailu/mailu.env", "/var/lib/mailu/secret.env" ], "volumes": [ "/services/mailu/data/webmail:/data", "/services/mailu/data/overrides/roundcube:/overrides:ro" ], "secrets-in-environment": "mailu-admin honours SECRET_KEY_FILE, DB_PW_FILE and API_TOKEN_FILE (configuration.py) but INITIAL_ADMIN_PW is env-only (start.py); the remaining containers' need for SECRET_KEY is unverified" }, { "id": "webdav", "type": "container", "name": "mailu-webdav", "image": "ghcr.io/mailu/radicale@sha256:e13cbad3791c0a6841b5d387e57e49a117808dcef87b8c9969f671ae9c3b67c0", "network": "mailu", "env-file": [ "/var/lib/mailu/mailu.env", "/var/lib/mailu/secret.env" ], "volumes": [ "/services/mailu/data/dav:/data" ], "secrets-in-environment": "mailu-admin honours SECRET_KEY_FILE, DB_PW_FILE and API_TOKEN_FILE (configuration.py) but INITIAL_ADMIN_PW is env-only (start.py); the remaining containers' need for SECRET_KEY is unverified" }, { "id": "fetchmail", "type": "container", "name": "mailu-fetchmail", "image": "ghcr.io/mailu/fetchmail@sha256:7dcd1392882925d612ab2d0230d437f0c660989d572283c48b0d0f2d491adce7", "network": "mailu", "env-file": [ "/var/lib/mailu/mailu.env", "/var/lib/mailu/secret.env" ], "volumes": [ "/services/mailu/data/data/fetchmail:/data" ], "secrets-in-environment": "mailu-admin honours SECRET_KEY_FILE, DB_PW_FILE and API_TOKEN_FILE (configuration.py) but INITIAL_ADMIN_PW is env-only (start.py); the remaining containers' need for SECRET_KEY is unverified" }, { "id": "front", "type": "container", "name": "mailu-front", "image": "ghcr.io/mailu/nginx@sha256:09f28ab6d36367fcacc7994f7021f132ac845bdc05f04bf80906102d11aaa057", "network": "mailu", "env-file": [ "/var/lib/mailu/mailu.env" ], "ports": [ "25", "465", "587", "993", "80" ], "volumes": [ "/services/mailu/data/certs:/certs", "/services/mailu/data/overrides/nginx:/overrides:ro" ] }, { "id": "runtime-config", "type": "file", "path": "/var/lib/mesh/mailu/config.json", "mode": "0600", "content": "{}\n", "merge": "json" }, { "id": "runtime", "type": "container", "name": "mesh-mailu", "network": "mailu", "volumes": [ "/var/lib/mesh/mailu/broker:/run/secrets/broker:ro", "/var/lib/mailu/api-token.secret:/run/secrets/api-token:ro", "/var/lib/mesh/mailu/config.json:/run/config/config.json:ro", "/var/run/docker.sock:/var/run/docker.sock" ], "env": { "MESH_BROKER_FILE": "/run/secrets/broker", "MESH_MAILU_URL": "http://mailu-admin/api/v1", "MESH_MAILU_API_KEY_FILE": "/run/secrets/api-token", "MESH_MAILU_IMAP_CONTAINER": "mailu-imap", "MESH_MAILU_CONFIG_FILE": "/run/config/config.json" }, "restart-on": [ "runtime-config" ], "artifact": "runtime" } ], "build": { "on": [ { "arg": "BUILD_BASE", "module": "mesh-tools", "artifact": "build" }, { "arg": "RUNTIME_BASE", "module": "mesh-tools", "artifact": "runtime" } ], "artifacts": [ { "name": "runtime", "kind": "image", "from": "Dockerfile" } ] } }