From 8063b671cbb7edb8cdf29004c7d82a22c8e55b66 Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Tue, 12 Aug 2025 16:35:00 +0200 Subject: [PATCH 1/7] indev: dovecot 2.4 config migration --- data/Dockerfiles/dovecot/Dockerfile | 2 +- data/Dockerfiles/dovecot/docker-entrypoint.sh | 6 +- data/conf/dovecot/dovecot.conf | 230 ++++++++++-------- data/conf/dovecot/dovecot.folders.conf | 1 - 4 files changed, 141 insertions(+), 98 deletions(-) diff --git a/data/Dockerfiles/dovecot/Dockerfile b/data/Dockerfiles/dovecot/Dockerfile index f1152c8a1..109acaea2 100644 --- a/data/Dockerfiles/dovecot/Dockerfile +++ b/data/Dockerfiles/dovecot/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine:3.21 +FROM alpine:3.22 LABEL maintainer="The Infrastructure Company GmbH " diff --git a/data/Dockerfiles/dovecot/docker-entrypoint.sh b/data/Dockerfiles/dovecot/docker-entrypoint.sh index e58abbb6a..4e646fb8c 100755 --- a/data/Dockerfiles/dovecot/docker-entrypoint.sh +++ b/data/Dockerfiles/dovecot/docker-entrypoint.sh @@ -108,7 +108,11 @@ map { } EOF -echo -n ${ACL_ANYONE} > /etc/dovecot/acl_anyone +if [[ "${ACL_ANYONE}" == "allow" ]]; then + echo -n "yes" > /etc/dovecot/acl_anyone +else + echo -n "no" > /etc/dovecot/acl_anyone +fi if [[ "${SKIP_FTS}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then echo -e "\e[33mDetecting SKIP_FTS=y... not enabling Flatcurve (FTS) then...\e[0m" diff --git a/data/conf/dovecot/dovecot.conf b/data/conf/dovecot/dovecot.conf index 05d9264fa..48b70e21d 100644 --- a/data/conf/dovecot/dovecot.conf +++ b/data/conf/dovecot/dovecot.conf @@ -7,12 +7,17 @@ # driver = ldap #} +dovecot_config_version = 2.4.0 +dovecot_storage_version = 2.4.0 + +listen = *,[::] + auth_mechanisms = plain login #mail_debug = yes #auth_debug = yes #log_debug = category=fts-flatcurve # Activate Logging for Flatcurve FTS Searchings log_path = syslog -disable_plaintext_auth = yes +auth_allow_cleartext = yes # Uncomment on NFS share #mmap_disable = yes #mail_fsync = always @@ -20,30 +25,36 @@ disable_plaintext_auth = yes #mail_nfs_storage = yes login_log_format_elements = "user=<%u> method=%m rip=%r lip=%l mpid=%e %c %k" mail_home = /var/vmail/%d/%n -mail_location = maildir:~/ +mail_driver = maildir +mail_path = ~/ +mail_index_path = /var/vmail_index/${user} mail_plugins = Date: Thu, 14 Aug 2025 11:11:35 +0200 Subject: [PATCH 2/7] dovecot: migrated config to 2.4 + config splitting --- data/Dockerfiles/dovecot/docker-entrypoint.sh | 149 ++++--- data/conf/dovecot/auth/passwd-verify.lua | 14 +- data/conf/dovecot/conf.d/05-core.conf | 3 + data/conf/dovecot/conf.d/10-logging.conf | 14 + data/conf/dovecot/conf.d/10-mail.conf | 9 + data/conf/dovecot/conf.d/10-ssl.conf | 13 + data/conf/dovecot/conf.d/11-sql.conf | 3 + data/conf/dovecot/conf.d/12-mysql.conf | 8 + .../conf.d/12-storage-attachments.conf | 7 + data/conf/dovecot/conf.d/15-performance.conf | 10 + data/conf/dovecot/conf.d/20-auth.conf | 40 ++ data/conf/dovecot/conf.d/20-userdb.conf | 11 + data/conf/dovecot/conf.d/25-services.conf | 135 +++++++ data/conf/dovecot/conf.d/30-protocols.conf | 17 + data/conf/dovecot/conf.d/35-fts.conf | 45 +++ data/conf/dovecot/conf.d/40-acl.conf | 12 + data/conf/dovecot/conf.d/40-attributes.conf | 7 + data/conf/dovecot/conf.d/50-quota.conf | 25 ++ .../dovecot/conf.d/60-sieve-pipeline.conf | 78 ++++ data/conf/dovecot/conf.d/70-crypto.conf | 6 + data/conf/dovecot/conf.d/80-compress.conf | 3 + data/conf/dovecot/conf.d/90-dict.conf | 18 + data/conf/dovecot/conf.d/90-limits.conf | 7 + data/conf/dovecot/conf.d/99-includes.conf | 22 ++ data/conf/dovecot/conf.d/fts.conf | 37 -- data/conf/dovecot/dovecot.conf | 371 ++---------------- data/conf/dovecot/dovecot.folders.conf | 6 + 27 files changed, 620 insertions(+), 450 deletions(-) create mode 100644 data/conf/dovecot/conf.d/05-core.conf create mode 100644 data/conf/dovecot/conf.d/10-logging.conf create mode 100644 data/conf/dovecot/conf.d/10-mail.conf create mode 100644 data/conf/dovecot/conf.d/10-ssl.conf create mode 100644 data/conf/dovecot/conf.d/11-sql.conf create mode 100644 data/conf/dovecot/conf.d/12-mysql.conf create mode 100644 data/conf/dovecot/conf.d/12-storage-attachments.conf create mode 100644 data/conf/dovecot/conf.d/15-performance.conf create mode 100644 data/conf/dovecot/conf.d/20-auth.conf create mode 100644 data/conf/dovecot/conf.d/20-userdb.conf create mode 100644 data/conf/dovecot/conf.d/25-services.conf create mode 100644 data/conf/dovecot/conf.d/30-protocols.conf create mode 100644 data/conf/dovecot/conf.d/35-fts.conf create mode 100644 data/conf/dovecot/conf.d/40-acl.conf create mode 100644 data/conf/dovecot/conf.d/40-attributes.conf create mode 100644 data/conf/dovecot/conf.d/50-quota.conf create mode 100644 data/conf/dovecot/conf.d/60-sieve-pipeline.conf create mode 100644 data/conf/dovecot/conf.d/70-crypto.conf create mode 100644 data/conf/dovecot/conf.d/80-compress.conf create mode 100644 data/conf/dovecot/conf.d/90-dict.conf create mode 100644 data/conf/dovecot/conf.d/90-limits.conf create mode 100644 data/conf/dovecot/conf.d/99-includes.conf delete mode 100644 data/conf/dovecot/conf.d/fts.conf diff --git a/data/Dockerfiles/dovecot/docker-entrypoint.sh b/data/Dockerfiles/dovecot/docker-entrypoint.sh index 4e646fb8c..24b4600c4 100755 --- a/data/Dockerfiles/dovecot/docker-entrypoint.sh +++ b/data/Dockerfiles/dovecot/docker-entrypoint.sh @@ -44,66 +44,83 @@ if [[ "${MASTER}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then else QUOTA_TABLE=quota2replica fi + +cat < /etc/dovecot/conf.d/12-mysql.conf +# Autogenerated by mailcow - DO NOT TOUCH! +mysql /var/run/mysqld/mysqld.sock { + dbname=${DBNAME} + user=${DBUSER} + password=${DBPASS} + + ssl = no +} +EOF + + cat < /etc/dovecot/sql/dovecot-dict-sql-quota.conf # Autogenerated by mailcow -connect = "host=/var/run/mysqld/mysqld.sock dbname=${DBNAME} user=${DBUSER} password=${DBPASS}" -map { - pattern = priv/quota/storage - table = ${QUOTA_TABLE} +dict_map priv/quota/storage { + sql_table = ${QUOTA_TABLE} username_field = username - value_field = bytes + value_field bytes { + } } -map { - pattern = priv/quota/messages - table = ${QUOTA_TABLE} + +dict_map priv/quota/messages { + sql_table = ${QUOTA_TABLE} username_field = username - value_field = messages + value_field messages { + } } EOF # Create dict used for sieve pre and postfilters cat < /etc/dovecot/sql/dovecot-dict-sql-sieve_before.conf # Autogenerated by mailcow -connect = "host=/var/run/mysqld/mysqld.sock dbname=${DBNAME} user=${DBUSER} password=${DBPASS}" -map { - pattern = priv/sieve/name/\$script_name - table = sieve_before + +dict_map priv/sieve/name/\$script_name { + sql_table = sieve_before username_field = username - value_field = id - fields { - script_name = \$script_name + value_field id { + } + key_field script_name { + value = \$script_name } } -map { - pattern = priv/sieve/data/\$id - table = sieve_before + +dict_map priv/sieve/data/\$id { + sql_table = sieve_before username_field = username - value_field = script_data - fields { - id = \$id + key_field script_data { + value = \$script_data + } + value_field id { } } + + EOF cat < /etc/dovecot/sql/dovecot-dict-sql-sieve_after.conf # Autogenerated by mailcow -connect = "host=/var/run/mysqld/mysqld.sock dbname=${DBNAME} user=${DBUSER} password=${DBPASS}" -map { - pattern = priv/sieve/name/\$script_name - table = sieve_after + +dict_map priv/sieve/name/\$script_name { + sql_table = sieve_after username_field = username - value_field = id - fields { - script_name = \$script_name + value_field id { + } + key_field script_name { + value = \$script_name } } -map { - pattern = priv/sieve/data/\$id - table = sieve_after + +dict_map priv/sieve/data/\$id { + sql_table = sieve_after username_field = username - value_field = script_data - fields { - id = \$id + key_field script_name { + value = \$script_data + } + value_field id { } } EOF @@ -116,22 +133,20 @@ fi if [[ "${SKIP_FTS}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then echo -e "\e[33mDetecting SKIP_FTS=y... not enabling Flatcurve (FTS) then...\e[0m" -echo -n 'quota acl zlib mail_crypt mail_crypt_acl mail_log notify listescape replication lazy_expunge' > /etc/dovecot/mail_plugins -echo -n 'quota imap_quota imap_acl acl zlib imap_zlib imap_sieve mail_crypt mail_crypt_acl notify listescape replication mail_log' > /etc/dovecot/mail_plugins_imap -echo -n 'quota sieve acl zlib mail_crypt mail_crypt_acl notify listescape replication' > /etc/dovecot/mail_plugins_lmtp +echo -n 'quota quota_clone acl mail_crypt mail_crypt_acl mail_log mail_compress notify lazy_expunge' > /etc/dovecot/mail_plugins +echo -n 'quota quota_clone imap_quota imap_acl acl imap_sieve mail_crypt mail_crypt_acl mail_compress notify mail_log' > /etc/dovecot/mail_plugins_imap +echo -n 'quota quota_clone sieve acl mail_crypt mail_crypt_acl mail_compress notify' > /etc/dovecot/mail_plugins_lmtp else echo -e "\e[32mDetecting SKIP_FTS=n... enabling Flatcurve (FTS)\e[0m" -echo -n 'quota acl zlib mail_crypt mail_crypt_acl mail_log notify fts fts_flatcurve listescape replication lazy_expunge' > /etc/dovecot/mail_plugins -echo -n 'quota imap_quota imap_acl acl zlib imap_zlib imap_sieve mail_crypt mail_crypt_acl notify mail_log fts fts_flatcurve listescape replication' > /etc/dovecot/mail_plugins_imap -echo -n 'quota sieve acl zlib mail_crypt mail_crypt_acl fts fts_flatcurve notify listescape replication' > /etc/dovecot/mail_plugins_lmtp +echo -n 'quota quota_clone acl mail_crypt mail_crypt_acl mail_log mail_compress notify fts fts_flatcurve lazy_expunge' > /etc/dovecot/mail_plugins +echo -n 'quota quota_clone imap_quota imap_acl acl imap_sieve mail_crypt mail_crypt_acl mail_compress notify mail_log fts fts_flatcurve' > /etc/dovecot/mail_plugins_imap +echo -n 'quota quota_clone sieve acl mail_crypt mail_crypt_acl mail_compress fts fts_flatcurve notify' > /etc/dovecot/mail_plugins_lmtp fi chmod 644 /etc/dovecot/mail_plugins /etc/dovecot/mail_plugins_imap /etc/dovecot/mail_plugins_lmtp /templates/quarantine.tpl cat < /etc/dovecot/sql/dovecot-dict-sql-userdb.conf # Autogenerated by mailcow -driver = mysql -connect = "host=/var/run/mysqld/mysqld.sock dbname=${DBNAME} user=${DBUSER} password=${DBPASS}" -user_query = SELECT CONCAT(JSON_UNQUOTE(JSON_VALUE(attributes, '$.mailbox_format')), mailbox_path_prefix, '%d/%n/${MAILDIR_SUB}:VOLATILEDIR=/var/volatile/%u:INDEX=/var/vmail_index/%u') AS mail, '%s' AS protocol, 5000 AS uid, 5000 AS gid, concat('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%u' AND (active = '1' OR active = '2') +query = SELECT CONCAT(JSON_UNQUOTE(JSON_VALUE(attributes, '$.mailbox_format')), mailbox_path_prefix, '%{user | domain }}/%{user | username }/Maildir:VOLATILEDIR=/var/volatile/%{user}:INDEX=/var/vmail_index/%{user}') AS mail, '%{protocol}' AS protocol, 5000 AS uid, 5000 AS gid, concat('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%{user}' AND (active = '1' OR active = '2') iterate_query = SELECT username FROM mailbox WHERE active = '1' OR active = '2'; EOF @@ -162,8 +177,8 @@ for cert_dir in /etc/ssl/mail/*/ ; do domains=($(cat ${cert_dir}domains)) for domain in ${domains[@]}; do echo 'local_name '${domain}' {' >> /etc/dovecot/sni.conf; - echo ' ssl_cert = <'${cert_dir}'cert.pem' >> /etc/dovecot/sni.conf; - echo ' ssl_key = <'${cert_dir}'key.pem' >> /etc/dovecot/sni.conf; + echo ' ssl_server_cert_file = '${cert_dir}'cert.pem' >> /etc/dovecot/sni.conf; + echo ' ssl_server_key_file = '${cert_dir}'key.pem' >> /etc/dovecot/sni.conf; echo '}' >> /etc/dovecot/sni.conf; done done @@ -187,11 +202,13 @@ else fi cat < /etc/dovecot/shared_namespace.conf # Autogenerated by mailcow -namespace { +namespace shared { type = shared separator = / - prefix = Shared/%%u/ - location = maildir:%%h${MAILDIR_SUB_SHARED}:INDEX=~${MAILDIR_SUB_SHARED}/Shared/%%u + prefix = Shared/\$user/ + mail_driver = maildir + mail_path = %{owner_home}${MAILDIR_SUB_SHARED} + mail_index_private_path = ~${MAILDIR_SUB_SHARED}/Shared/%{owner_user} subscriptions = no list = children } @@ -201,7 +218,7 @@ EOF cat < /etc/dovecot/sogo_trusted_ip.conf # Autogenerated by mailcow remote ${IPV4_NETWORK}.248 { - disable_plaintext_auth = no + auth_allow_cleartext = yes } EOF @@ -210,9 +227,13 @@ RAND_PASS=$(cat /dev/urandom | tr -dc 'a-z0-9' | fold -w 32 | head -n 1) echo -n ${RAND_PASS} > /etc/phpfpm/sogo-sso.pass cat < /etc/dovecot/sogo-sso.conf # Autogenerated by mailcow -passdb { - driver = static - args = allow_nets=${IPV4_NETWORK}.248/32 password={plain}${RAND_PASS} +passdb static { + fields { + allow_real_nets=${IPV4_NETWORK}.248/32 + } + + password={plain}${RAND_PASS} + } EOF @@ -240,9 +261,9 @@ fi if [[ "${SKIP_FTS}" =~ ^([nN][oO]|[nN])+$ ]]; then echo -e "\e[94mConfiguring FTS Settings...\e[0m" echo -e "\e[94mSetting FTS Memory Limit (per process) to ${FTS_HEAP} MB\e[0m" - sed -i "s/vsz_limit\s*=\s*[0-9]*\s*MB*/vsz_limit=${FTS_HEAP} MB/" /etc/dovecot/conf.d/fts.conf + sed -i "s/vsz_limit\s*=\s*[0-9]*\s*MB*/vsz_limit=${FTS_HEAP} MB/" /etc/dovecot/conf.d/35-fts.conf echo -e "\e[94mSetting FTS Process Limit to ${FTS_PROCS}\e[0m" - sed -i "s/process_limit\s*=\s*[0-9]*/process_limit=${FTS_PROCS}/" /etc/dovecot/conf.d/fts.conf + sed -i "s/process_limit\s*=\s*[0-9]*/process_limit=${FTS_PROCS}/" /etc/dovecot/conf.d/35-fts.conf fi # 401 is user dovecot @@ -254,16 +275,16 @@ else chown 401 /mail_crypt/ecprivkey.pem /mail_crypt/ecpubkey.pem fi -# Fix OpenSSL 3.X TLS1.0, 1.1 support (https://community.mailcow.email/d/4062-hi-all/20) -if grep -qE 'ssl_min_protocol\s*=\s*(TLSv1|TLSv1\.1)\s*$' /etc/dovecot/dovecot.conf /etc/dovecot/extra.conf; then - sed -i '/\[openssl_init\]/a ssl_conf = ssl_configuration' /etc/ssl/openssl.cnf +# # Fix OpenSSL 3.X TLS1.0, 1.1 support (https://community.mailcow.email/d/4062-hi-all/20) +# if grep -qE 'ssl_min_protocol\s*=\s*(TLSv1|TLSv1\.1)\s*$' /etc/dovecot/dovecot.conf /etc/dovecot/extra.conf; then +# sed -i '/\[openssl_init\]/a ssl_conf = ssl_configuration' /etc/ssl/openssl.cnf - echo "[ssl_configuration]" >> /etc/ssl/openssl.cnf - echo "system_default = tls_system_default" >> /etc/ssl/openssl.cnf - echo "[tls_system_default]" >> /etc/ssl/openssl.cnf - echo "MinProtocol = TLSv1" >> /etc/ssl/openssl.cnf - echo "CipherString = DEFAULT@SECLEVEL=0" >> /etc/ssl/openssl.cnf -fi +# echo "[ssl_configuration]" >> /etc/ssl/openssl.cnf +# echo "system_default = tls_system_default" >> /etc/ssl/openssl.cnf +# echo "[tls_system_default]" >> /etc/ssl/openssl.cnf +# echo "MinProtocol = TLSv1" >> /etc/ssl/openssl.cnf +# echo "CipherString = DEFAULT@SECLEVEL=0" >> /etc/ssl/openssl.cnf +# fi # Compile sieve scripts sievec /var/vmail/sieve/global_sieve_before.sieve diff --git a/data/conf/dovecot/auth/passwd-verify.lua b/data/conf/dovecot/auth/passwd-verify.lua index ea847932d..3fe43b6b4 100644 --- a/data/conf/dovecot/auth/passwd-verify.lua +++ b/data/conf/dovecot/auth/passwd-verify.lua @@ -1,4 +1,5 @@ function auth_password_verify(request, password) + request.domain = request.auth_user:match("@(.+)") or nil if request.domain == nil then return dovecot.auth.PASSDB_RESULT_USER_UNKNOWN, "No such user" end @@ -9,10 +10,10 @@ function auth_password_verify(request, password) https.TIMEOUT = 30 local req = { - username = request.user, + username = request.auth_user, password = password, - real_rip = request.real_rip, - service = request.service + real_rip = request.remote_ip, + service = request.protocol } local req_json = json.encode(req) local res = {} @@ -33,7 +34,6 @@ function auth_password_verify(request, password) -- Returning PASSDB_RESULT_INTERNAL_FAILURE keeps the existing cache entry, -- even if the TTL has expired. Useful to avoid cache eviction during backend issues. if c ~= 200 and c ~= 401 then - dovecot.i_info("HTTP request failed with " .. c .. " for user " .. request.user) return dovecot.auth.PASSDB_RESULT_PASSWORD_MISMATCH, "Upstream error" end @@ -46,7 +46,7 @@ function auth_password_verify(request, password) end if response_json.success == true then - return dovecot.auth.PASSDB_RESULT_OK, "" + return dovecot.auth.PASSDB_RESULT_OK, { msg = "" } end return dovecot.auth.PASSDB_RESULT_PASSWORD_MISMATCH, "Failed to authenticate" @@ -55,3 +55,7 @@ end function auth_passdb_lookup(req) return dovecot.auth.PASSDB_RESULT_USER_UNKNOWN, "" end + +function auth_passdb_get_cache_key() + return "%{protocol}:%{user | username}\t:%{password}" +end \ No newline at end of file diff --git a/data/conf/dovecot/conf.d/05-core.conf b/data/conf/dovecot/conf.d/05-core.conf new file mode 100644 index 000000000..e934e9724 --- /dev/null +++ b/data/conf/dovecot/conf.d/05-core.conf @@ -0,0 +1,3 @@ +# /etc/dovecot/conf.d/05-core.conf +# Core, single-line settings that don't fit elsewhere. +recipient_delimiter = + \ No newline at end of file diff --git a/data/conf/dovecot/conf.d/10-logging.conf b/data/conf/dovecot/conf.d/10-logging.conf new file mode 100644 index 000000000..f3211ecb7 --- /dev/null +++ b/data/conf/dovecot/conf.d/10-logging.conf @@ -0,0 +1,14 @@ +# /etc/dovecot/conf.d/10-logging.conf +# Logging and debug. +#mail_debug = yes +#auth_debug = yes +log_debug = category=fts-flatcurve +#log_debug = category=auth +log_path = syslog +log_timestamp = "%Y-%m-%d %H:%M:%S " +login_log_format_elements = "user=<%{user}> method=%{mechanism} rip=%{remote_ip} lip=%{local_ip} mpid=%{mail_pid} %{secured} session=<%{session}>" + +# Mail event logging. +mail_log_events = delete undelete expunge copy mailbox_delete mailbox_rename +mail_log_fields = uid box msgid size +mail_log_cached_only = yes \ No newline at end of file diff --git a/data/conf/dovecot/conf.d/10-mail.conf b/data/conf/dovecot/conf.d/10-mail.conf new file mode 100644 index 000000000..4d658449c --- /dev/null +++ b/data/conf/dovecot/conf.d/10-mail.conf @@ -0,0 +1,9 @@ +# /etc/dovecot/conf.d/10-mail.conf +# Mail storage paths and core mail settings. +mail_home = /var/vmail/%{user | domain }/%{user | username } +mail_driver = maildir +mail_path = ~/Maildir +mail_index_path = /var/vmail_index/%{user} +mail_plugins = -!include_try /etc/dovecot/sni.conf -!include_try /etc/dovecot/sogo_trusted_ip.conf -!include_try /etc/dovecot/extra.conf -!include_try /etc/dovecot/shared_namespace.conf -!include_try /etc/dovecot/conf.d/fts.conf -# -default_client_limit = 10400 -default_vsz_limit = 1024 M +# Last: local overrides +!include_try /etc/dovecot/extra.conf \ No newline at end of file diff --git a/data/conf/dovecot/dovecot.folders.conf b/data/conf/dovecot/dovecot.folders.conf index 8de8daec6..4d73d14f3 100644 --- a/data/conf/dovecot/dovecot.folders.conf +++ b/data/conf/dovecot/dovecot.folders.conf @@ -1,9 +1,14 @@ namespace inbox { inbox = yes separator = / + mailbox storage/* { + quota_storage_extra = 100M + } mailbox "Trash" { auto = subscribe special_use = \Trash + quota_storage_percentage = 100 + fts_autoindex = no } mailbox "Deleted Messages" { special_use = \Trash @@ -194,6 +199,7 @@ namespace inbox { mailbox "Junk" { auto = subscribe special_use = \Junk + fts_autoindex = no } mailbox "Junk-E-Mail" { special_use = \Junk From 58a26dc966c957bbb8514d7554e980601f44105d Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Fri, 15 Aug 2025 10:56:46 +0200 Subject: [PATCH 3/7] dovecot: changes to config aligning to 2.4 --- data/conf/dovecot/conf.d/10-logging.conf | 3 +- data/conf/dovecot/conf.d/25-services.conf | 9 ++++++ .../dovecot/conf.d/60-sieve-pipeline.conf | 30 ++++++++++++++----- data/conf/dovecot/conf.d/90-dict.conf | 4 +-- 4 files changed, 34 insertions(+), 12 deletions(-) diff --git a/data/conf/dovecot/conf.d/10-logging.conf b/data/conf/dovecot/conf.d/10-logging.conf index f3211ecb7..a37af5494 100644 --- a/data/conf/dovecot/conf.d/10-logging.conf +++ b/data/conf/dovecot/conf.d/10-logging.conf @@ -2,8 +2,7 @@ # Logging and debug. #mail_debug = yes #auth_debug = yes -log_debug = category=fts-flatcurve -#log_debug = category=auth +#log_debug = category=fts-flatcurve log_path = syslog log_timestamp = "%Y-%m-%d %H:%M:%S " login_log_format_elements = "user=<%{user}> method=%{mechanism} rip=%{remote_ip} lip=%{local_ip} mpid=%{mail_pid} %{secured} session=<%{session}>" diff --git a/data/conf/dovecot/conf.d/25-services.conf b/data/conf/dovecot/conf.d/25-services.conf index 6d36b873e..c97c2645d 100644 --- a/data/conf/dovecot/conf.d/25-services.conf +++ b/data/conf/dovecot/conf.d/25-services.conf @@ -33,6 +33,15 @@ service config { } } +# anvil socket +service anvil { + unix_listener anvil { + user = vmail + group = vmail + mode = 0660 + } +} + # auth sockets and inet service auth { inet_listener auth-inet { diff --git a/data/conf/dovecot/conf.d/60-sieve-pipeline.conf b/data/conf/dovecot/conf.d/60-sieve-pipeline.conf index cdaf88209..ea18921a6 100644 --- a/data/conf/dovecot/conf.d/60-sieve-pipeline.conf +++ b/data/conf/dovecot/conf.d/60-sieve-pipeline.conf @@ -1,19 +1,15 @@ # /etc/dovecot/conf.d/60-sieve-pipeline.conf # Complete Sieve pipeline: personal/global scripts, plugins, limits, training. -# Personal scripts -sieve_script personal { - driver = file - path = ~/sieve - active_path = ~/.dovecot.sieve -} - # Global before/after (file and dict) sieve_script before { + type = before driver = file path = /var/vmail/sieve/global_sieve_before.sieve } + sieve_script before2 { + type = before driver = dict name = active dict proxy { @@ -21,11 +17,15 @@ sieve_script before2 { sieve_script_bin_path = /var/vmail/sieve_before_bindir } } + sieve_script after { + type = after driver = file path = /var/vmail/sieve/global_sieve_after.sieve } + sieve_script after2 { + type = after driver = dict name = active dict proxy { @@ -34,6 +34,14 @@ sieve_script after2 { } } +# Personal scripts +sieve_script personal { + type = personal + driver = file + path = ~/sieve + active_path = ~/.dovecot.sieve +} + # Plugins and behavior sieve_plugins = sieve_imapsieve sieve_extprograms sieve_vacation_send_from_recipient = yes @@ -75,4 +83,10 @@ sieve_vacation_min_period = 5s sieve_vacation_max_period = 365d sieve_vacation_default_period = 60s sieve_duplicate_default_period = 1m -sieve_duplicate_max_period = 7d \ No newline at end of file +sieve_duplicate_max_period = 7d + +# pipe sockets in /var/run/dovecot/sieve-pipe +sieve_pipe_socket_dir = sieve-pipe + +# execute sockets in /var/run/dovecot/sieve-execute +sieve_execute_socket_dir = sieve-execute \ No newline at end of file diff --git a/data/conf/dovecot/conf.d/90-dict.conf b/data/conf/dovecot/conf.d/90-dict.conf index 3aa994e17..e690bea78 100644 --- a/data/conf/dovecot/conf.d/90-dict.conf +++ b/data/conf/dovecot/conf.d/90-dict.conf @@ -1,12 +1,12 @@ # /etc/dovecot/conf.d/90-dict.conf # Dict declarations and SQL bindings. dict_server { - dict sieveafter { + dict sieve_after { driver = sql !include /etc/dovecot/sql/dovecot-dict-sql-sieve_after.conf } - dict sievebefore { + dict sieve_before { driver = sql !include /etc/dovecot/sql/dovecot-dict-sql-sieve_before.conf } From 05fbd549f8805bdae561c6027ecd320d8aaba7a2 Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Fri, 15 Aug 2025 10:57:42 +0200 Subject: [PATCH 4/7] dovecot: change dict declarations for before scripts --- data/Dockerfiles/dovecot/docker-entrypoint.sh | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/data/Dockerfiles/dovecot/docker-entrypoint.sh b/data/Dockerfiles/dovecot/docker-entrypoint.sh index 24b4600c4..9d6173baf 100755 --- a/data/Dockerfiles/dovecot/docker-entrypoint.sh +++ b/data/Dockerfiles/dovecot/docker-entrypoint.sh @@ -82,7 +82,10 @@ dict_map priv/sieve/name/\$script_name { sql_table = sieve_before username_field = username value_field id { + type = uuid } + + # The script name field in the table to query key_field script_name { value = \$script_name } @@ -91,14 +94,12 @@ dict_map priv/sieve/name/\$script_name { dict_map priv/sieve/data/\$id { sql_table = sieve_before username_field = username - key_field script_data { - value = \$script_data + value_field script_data { } - value_field id { + key_field id { + value = \$id } } - - EOF cat < /etc/dovecot/sql/dovecot-dict-sql-sieve_after.conf @@ -108,6 +109,7 @@ dict_map priv/sieve/name/\$script_name { sql_table = sieve_after username_field = username value_field id { + type = uuid } key_field script_name { value = \$script_name @@ -117,10 +119,10 @@ dict_map priv/sieve/name/\$script_name { dict_map priv/sieve/data/\$id { sql_table = sieve_after username_field = username - key_field script_name { - value = \$script_data + value_field script_data { } - value_field id { + key_field id { + value = \$id } } EOF From 8e93a48ac08ee3b948f2d02b6affc5c9492e5ab7 Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Tue, 19 Aug 2025 15:44:15 +0200 Subject: [PATCH 5/7] dovecot: rechanged id type from uuid to string --- data/Dockerfiles/dovecot/docker-entrypoint.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/data/Dockerfiles/dovecot/docker-entrypoint.sh b/data/Dockerfiles/dovecot/docker-entrypoint.sh index 9d6173baf..0c392d41e 100755 --- a/data/Dockerfiles/dovecot/docker-entrypoint.sh +++ b/data/Dockerfiles/dovecot/docker-entrypoint.sh @@ -82,7 +82,6 @@ dict_map priv/sieve/name/\$script_name { sql_table = sieve_before username_field = username value_field id { - type = uuid } # The script name field in the table to query @@ -109,7 +108,6 @@ dict_map priv/sieve/name/\$script_name { sql_table = sieve_after username_field = username value_field id { - type = uuid } key_field script_name { value = \$script_name From fb7bbc3fd8912ac8cce6d7f5d87bf4a267e84254 Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Tue, 26 Aug 2025 12:10:23 +0200 Subject: [PATCH 6/7] dovecot: fix smaller config changes --- data/conf/dovecot/conf.d/10-mail.conf | 1 + data/conf/dovecot/conf.d/60-sieve-pipeline.conf | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/data/conf/dovecot/conf.d/10-mail.conf b/data/conf/dovecot/conf.d/10-mail.conf index 4d658449c..c8f0c1758 100644 --- a/data/conf/dovecot/conf.d/10-mail.conf +++ b/data/conf/dovecot/conf.d/10-mail.conf @@ -6,4 +6,5 @@ mail_path = ~/Maildir mail_index_path = /var/vmail_index/%{user} mail_plugins = Date: Thu, 28 Aug 2025 12:46:53 +0200 Subject: [PATCH 7/7] declare better sieve script paths per user (for after and before) --- data/conf/dovecot/conf.d/60-sieve-pipeline.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/conf/dovecot/conf.d/60-sieve-pipeline.conf b/data/conf/dovecot/conf.d/60-sieve-pipeline.conf index c3f2231af..a37be5ddd 100644 --- a/data/conf/dovecot/conf.d/60-sieve-pipeline.conf +++ b/data/conf/dovecot/conf.d/60-sieve-pipeline.conf @@ -14,8 +14,8 @@ sieve_script before2 { name = active dict proxy { name = sieve_before - sieve_script_bin_path = /var/vmail/sieve_before_bindir } + bin_path = /var/vmail/sieve_before_bindir/%{user} } sieve_script after { @@ -30,8 +30,8 @@ sieve_script after2 { name = active dict proxy { name = sieve_after - sieve_script_bin_path = /var/vmail/sieve_after_bindir } + bin_path = /var/vmail/sieve_after_bindir/%{user} } # Personal scripts