diff --git a/docker-compose.yml b/docker-compose.yml
index 27eacedb6..a491148e1 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -65,7 +65,7 @@ services:
- redis
clamd-mailcow:
- image: ghcr.io/mailcow/clamd:1.70
+ image: ghcr.io/mailcow/clamd:1.71
restart: always
depends_on:
unbound-mailcow:
@@ -117,7 +117,7 @@ services:
- rspamd
php-fpm-mailcow:
- image: ghcr.io/mailcow/phpfpm:nightly-29072025
+ image: ghcr.io/mailcow/phpfpm:nightly-11092025
command: "php-fpm -d date.timezone=${TZ} -d expose_php=0"
depends_on:
- redis-mailcow
@@ -251,7 +251,7 @@ services:
- sogo
dovecot-mailcow:
- image: ghcr.io/mailcow/dovecot:nightly-28082025
+ image: ghcr.io/mailcow/dovecot:nightly-11092025
depends_on:
- mysql-mailcow
- netfilter-mailcow
@@ -418,7 +418,7 @@ services:
- php-fpm-mailcow
- sogo-mailcow
- rspamd-mailcow
- image: ghcr.io/mailcow/nginx:nightly-05082025
+ image: ghcr.io/mailcow/nginx:nightly-11092025
dns:
- ${IPV4_NETWORK:-172.22.1}.254
environment:
@@ -465,7 +465,7 @@ services:
condition: service_started
unbound-mailcow:
condition: service_healthy
- image: ghcr.io/mailcow/acme:nightly-28082025
+ image: ghcr.io/mailcow/acme:nightly-11092025
dns:
- ${IPV4_NETWORK:-172.22.1}.254
environment:
@@ -522,7 +522,7 @@ services:
- /lib/modules:/lib/modules:ro
watchdog-mailcow:
- image: ghcr.io/mailcow/watchdog:nightly-29072025
+ image: ghcr.io/mailcow/watchdog:nightly-11092025
dns:
- ${IPV4_NETWORK:-172.22.1}.254
tmpfs:
@@ -578,6 +578,7 @@ services:
- MYSQL_REPLICATION_THRESHOLD=${MYSQL_REPLICATION_THRESHOLD:-1}
- SOGO_THRESHOLD=${SOGO_THRESHOLD:-3}
- POSTFIX_THRESHOLD=${POSTFIX_THRESHOLD:-8}
+ - POSTFIX_TLSPOL_THRESHOLD=${POSTFIX_TLSPOL_THRESHOLD:-8}
- CLAMD_THRESHOLD=${CLAMD_THRESHOLD:-15}
- DOVECOT_THRESHOLD=${DOVECOT_THRESHOLD:-12}
- DOVECOT_REPL_THRESHOLD=${DOVECOT_REPL_THRESHOLD:-20}
@@ -589,6 +590,7 @@ services:
- OLEFY_THRESHOLD=${OLEFY_THRESHOLD:-5}
- MAILQ_THRESHOLD=${MAILQ_THRESHOLD:-20}
- MAILQ_CRIT=${MAILQ_CRIT:-30}
+ - DEV_MODE=${DEV_MODE:-n}
networks:
mailcow-network:
aliases:
diff --git a/generate_config.sh b/generate_config.sh
index 9610bf18d..2dba91d51 100755
--- a/generate_config.sh
+++ b/generate_config.sh
@@ -1,5 +1,26 @@
#!/usr/bin/env bash
+# Ensure the script is run from the directory that contains a link of .env
+# Resolve the directory this script lives in for consistent behavior when invoked from elsewhere
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" >/dev/null 2>&1 && pwd)"
+
+# Ensure script is executed in the mailcow installation directory by checking for a .env symlink that points to mailcow.conf
+if [ ! -L "${PWD}/.env" ]; then
+ echo -e "\e[33mPlease run this script from the mailcow installation directory.\e[0m"
+ echo -e " \e[36mcd /path/to/mailcow && ./generate_config.sh\e[0m"
+ exit 1
+fi
+
+# Verify the .env symlink points to a mailcow.conf file
+env_target="$(readlink -f "${PWD}/.env" 2>/dev/null || true)"
+if [ -z "$env_target" ] || [ "$(basename "$env_target")" != "mailcow.conf" ]; then
+ echo -e "\e[31mThe found .env symlink does not point to a mailcow.conf file.\e[0m"
+ echo -e "\e[33mPlease create a symbolic link .env -> mailcow.conf inside the mailcow directory and run this script there.\e[0m"
+ echo -e "\e[33mNote: 'ln -s mailcow.conf .env' will create the symlink even if mailcow.conf does not yet exist.\e[0m"
+ echo -e " \e[36mcd /path/to/mailcow && ln -s mailcow.conf .env && ./generate_config.sh\e[0m"
+ exit 1
+fi
+
# Load mailcow Generic Scripts
source _modules/scripts/core.sh
source _modules/scripts/ipv6_controller.sh
diff --git a/helper-scripts/_cold-standby.sh b/helper-scripts/_cold-standby.sh
index bfda3ba94..f02436a95 100755
--- a/helper-scripts/_cold-standby.sh
+++ b/helper-scripts/_cold-standby.sh
@@ -293,7 +293,7 @@ if ! ssh -o StrictHostKeyChecking=no \
-i "${REMOTE_SSH_KEY}" \
${REMOTE_SSH_HOST} \
-p ${REMOTE_SSH_PORT} \
- ${SCRIPT_DIR}/../update.sh -f --gc ; then
+ "cd \"${SCRIPT_DIR}/../\" && ./update.sh -f --gc" ; then
>&2 echo -e "\e[31m[ERR]\e[0m - Could not cleanup old images on remote"
fi
diff --git a/helper-scripts/docker-compose.override.yml.d/PROMETHEUS_EXPORTER/docker-compose.override.yml b/helper-scripts/docker-compose.override.yml.d/PROMETHEUS_EXPORTER/docker-compose.override.yml
new file mode 100644
index 000000000..6fd4e8e08
--- /dev/null
+++ b/helper-scripts/docker-compose.override.yml.d/PROMETHEUS_EXPORTER/docker-compose.override.yml
@@ -0,0 +1,18 @@
+services:
+ prometheus-exporter-mailcow:
+ image: ghcr.io/mailcow/prometheus-exporter:2
+ ports:
+ - "9099:9099"
+ restart: always
+ environment:
+ MAILCOW_EXPORTER_HOST: "" # Replace with your Mailcow hostname
+ MAILCOW_EXPORTER_API_KEY: "" # Replace with your API key
+ MAILCOW_EXPORTER_TOKEN: "" # Replace with your secure key
+ # MAILCOW_EXPORTER_TOKEN_DISABLE: "true" # Uncomment only if it is safe to disable token authentication (e.g., internal network only)
+ dns:
+ - ${IPV4_NETWORK:-172.22.1}.254
+ networks:
+ mailcow-network:
+ ipv4_address: ${IPV4_NETWORK:-172.22.1}.209
+ aliases:
+ - prometheus-exporter
diff --git a/helper-scripts/update_postscreen_whitelist.sh b/helper-scripts/update_postscreen_whitelist.sh
index 04335bda5..dda64b263 100644
--- a/helper-scripts/update_postscreen_whitelist.sh
+++ b/helper-scripts/update_postscreen_whitelist.sh
@@ -6,9 +6,10 @@ SPFTOOLS_DIR=${WORKING_DIR}/spf-tools
POSTWHITE_DIR=${WORKING_DIR}/postwhite
POSTWHITE_CONF=${POSTWHITE_DIR}/postwhite.conf
-CUSTOM_HOSTS='"web.de gmx.net mail.de freenet.de arcor.de unity-mail.de"'
+CUSTOM_HOSTS='"web.de gmx.net mail.de freenet.de arcor.de unity-mail.de protonmail.ch ionos.com strato.com t-online.de"'
STATIC_HOSTS=(
- "194.25.134.0/24 permit # t-online.de"
+ "49.12.4.251 permit # checks.mailcow.email"
+ "2a01:4f8:c17:7906::10 permit # checks.mailcow.email"
)
mkdir ${SCRIPT_DIR}/postwhite_tmp
diff --git a/update.sh b/update.sh
index 89dec3e66..4ec0e7e40 100755
--- a/update.sh
+++ b/update.sh
@@ -3,6 +3,20 @@
############## Begin Function Section ##############
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+MAILCOW_CONF="${SCRIPT_DIR}/mailcow.conf"
+
+# Ensure the script is run from the directory that contains mailcow.conf
+if [ ! -f "${PWD}/mailcow.conf" ]; then
+ if [ -f "${SCRIPT_DIR}/mailcow.conf" ]; then
+ echo -e "\e[33mPlease run this script directly from the mailcow installation directory:\e[0m"
+ echo -e " \e[36mcd ${SCRIPT_DIR} && ./update.sh\e[0m"
+ exit 1
+ else
+ echo -e "\e[31mmailcow.conf not found in current directory or script directory (\e[36m${SCRIPT_DIR}\e[31m).\e[0m"
+ echo -e "\e[33mRun this script directly from your mailcow installation directory.\e[0m"
+ exit 1
+ fi
+fi
BRANCH="$(cd "${SCRIPT_DIR}" && git rev-parse --abbrev-ref HEAD)"
MODULE_DIR="${SCRIPT_DIR}/_modules"
@@ -27,8 +41,6 @@ if [ "$(id -u)" -ne "0" ]; then
exit 1
fi
-SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
-
# Run pre-update-hook
if [ -f "${SCRIPT_DIR}/pre_update_hook.sh" ]; then
bash "${SCRIPT_DIR}/pre_update_hook.sh"