diff --git a/.github/ISSUE_TEMPLATE/Bug_report.yml b/.github/ISSUE_TEMPLATE/Bug_report.yml index 2fe7082c..3cfbbe0d 100644 --- a/.github/ISSUE_TEMPLATE/Bug_report.yml +++ b/.github/ISSUE_TEMPLATE/Bug_report.yml @@ -26,21 +26,21 @@ body: attributes: label: Description description: Please provide a brief description of the bug in 1-2 sentences. If applicable, add screenshots to help explain your problem. Very useful for bugs in mailcow UI. - render: text + render: plain text validations: required: true - type: textarea attributes: label: "Logs:" description: "Please take a look at the [official documentation](https://docs.mailcow.email/troubleshooting/debug-logs/) and post the last few lines of logs, when the error occurs. For example, docker container logs of affected containers. This will be automatically formatted into code, so no need for backticks." - render: text + render: plain text validations: required: true - type: textarea attributes: label: "Steps to reproduce:" description: "Please describe the steps to reproduce the bug. Screenshots can be added, if helpful." - render: text + render: plain text placeholder: |- 1. ... 2. ... @@ -117,41 +117,41 @@ body: attributes: label: "Logs of git diff:" description: "#### Output of `git diff origin/master`, any other changes to the code? If so, **please post them**:" - render: text + render: plain text validations: required: true - type: textarea attributes: label: "Logs of iptables -L -vn:" description: "#### Output of `iptables -L -vn`" - render: text + render: plain text validations: required: true - type: textarea attributes: label: "Logs of ip6tables -L -vn:" description: "#### Output of `ip6tables -L -vn`" - render: text + render: plain text validations: required: true - type: textarea attributes: label: "Logs of iptables -L -vn -t nat:" description: "#### Output of `iptables -L -vn -t nat`" - render: text + render: plain text validations: required: true - type: textarea attributes: label: "Logs of ip6tables -L -vn -t nat:" description: "#### Output of `ip6tables -L -vn -t nat`" - render: text + render: plain text validations: required: true - type: textarea attributes: label: "DNS check:" description: "#### Output of `docker exec -it $(docker ps -qf name=acme-mailcow) dig +short stackoverflow.com @172.22.1.254` (set the IP accordingly, if you changed the internal mailcow network)" - render: text + render: plain text validations: required: true diff --git a/.github/renovate.json b/.github/renovate.json new file mode 100644 index 00000000..37962b2a --- /dev/null +++ b/.github/renovate.json @@ -0,0 +1,13 @@ +{ + "enabled": true, + "timezone": "Europe/Berlin", + "dependencyDashboard": false, + "dependencyDashboardTitle": "Renovate Dashboard", + "commitBody": "Signed-off-by: milkmaker ", + "rebaseWhen": "auto", + "assignees": [ + "@magiccc" + ], + "baseBranches": ["staging"], + "enabledManagers": ["github-actions"] +} diff --git a/.github/workflows/image_builds.yml b/.github/workflows/image_builds.yml index fe660754..65678dff 100644 --- a/.github/workflows/image_builds.yml +++ b/.github/workflows/image_builds.yml @@ -33,13 +33,11 @@ jobs: run: | curl -sSL https://get.docker.com/ | CHANNEL=stable sudo sh sudo service docker start - sudo curl -L https://github.com/docker/compose/releases/download/v$(curl -Ls https://www.servercow.de/docker-compose/latest.php)/docker-compose-$(uname -s)-$(uname -m) > /usr/local/bin/docker-compose - sudo chmod +x /usr/local/bin/docker-compose - name: Prepair Image Builds run: | cp helper-scripts/docker-compose.override.yml.d/BUILD_FLAGS/docker-compose.override.yml docker-compose.override.yml - name: Build Docker Images run: | - docker-compose build ${image} + docker compose build ${image} env: image: ${{ matrix.images }} diff --git a/.github/workflows/tweet-trigger-publish-release.yml b/.github/workflows/tweet-trigger-publish-release.yml index daebfe53..86cf628d 100644 --- a/.github/workflows/tweet-trigger-publish-release.yml +++ b/.github/workflows/tweet-trigger-publish-release.yml @@ -17,4 +17,4 @@ jobs: consumer_secret: ${{ secrets.CONSUMER_SECRET }} access_token_key: ${{ secrets.ACCESS_TOKEN_KEY }} access_token_secret: ${{ secrets.ACCESS_TOKEN_SECRET }} - tweet_body: '$RELEASE_TAG is here! Checkout the GitHub Page for changelog regarding the $RELEASE_TAG Release: github.com/mailcow/mailcow-dockerized/releases/tag/$RELEASE_TAG' \ No newline at end of file + tweet_body: 'A new mailcow update has just been released! Checkout the GitHub Page for changelog and more informations: https://github.com/mailcow/mailcow-dockerized/releases/latest' diff --git a/README.md b/README.md index 313fa13b..b40a767c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@ # mailcow: dockerized - 🐮 + 🐋 = 💕 -## We stand with 🇺🇦 - [![Mailcow Integration Tests](https://github.com/mailcow/mailcow-dockerized/actions/workflows/integration_tests.yml/badge.svg?branch=master)](https://github.com/mailcow/mailcow-dockerized/actions/workflows/integration_tests.yml) [![Translation status](https://translate.mailcow.email/widgets/mailcow-dockerized/-/translation/svg-badge.svg)](https://translate.mailcow.email/engage/mailcow-dockerized/) [![Twitter URL](https://img.shields.io/twitter/url/https/twitter.com/mailcow_email.svg?style=social&label=Follow%20%40mailcow_email)](https://twitter.com/mailcow_email) @@ -36,3 +34,9 @@ Telegram desktop clients are available for [multiple platforms](https://desktop. **Important**: mailcow makes use of various open-source software. Please assure you agree with their license before using mailcow. Any part of mailcow itself is released under **GNU General Public License, Version 3**. + +mailcow is a registered word mark of The Infrastructure Company GmbH, Parkstr. 42, 47877 Willich, Germany. + +The project is managed and maintained by The Infrastructure Company GmbH. + +Originated from @andryyy (André) \ No newline at end of file diff --git a/data/Dockerfiles/acme/Dockerfile b/data/Dockerfiles/acme/Dockerfile index f5b7b56c..571c3d08 100644 --- a/data/Dockerfiles/acme/Dockerfile +++ b/data/Dockerfiles/acme/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine:3.16 +FROM alpine:3.17 LABEL maintainer "Andre Peters " diff --git a/data/Dockerfiles/clamd/Dockerfile b/data/Dockerfiles/clamd/Dockerfile index efbc6a4d..91716b84 100644 --- a/data/Dockerfiles/clamd/Dockerfile +++ b/data/Dockerfiles/clamd/Dockerfile @@ -1,4 +1,4 @@ -FROM clamav/clamav:0.105.1_base +FROM clamav/clamav:1.0_base LABEL maintainer "André Peters " diff --git a/data/Dockerfiles/netfilter/Dockerfile b/data/Dockerfiles/netfilter/Dockerfile index 621da149..bc707391 100644 --- a/data/Dockerfiles/netfilter/Dockerfile +++ b/data/Dockerfiles/netfilter/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine:3.16 +FROM alpine:3.17 LABEL maintainer "Andre Peters " ENV XTABLES_LIBDIR /usr/lib/xtables diff --git a/data/Dockerfiles/netfilter/server.py b/data/Dockerfiles/netfilter/server.py index 382a3f78..1ccc150e 100644 --- a/data/Dockerfiles/netfilter/server.py +++ b/data/Dockerfiles/netfilter/server.py @@ -97,9 +97,9 @@ def refreshF2bregex(): f2bregex[3] = 'warning: .*\[([0-9a-f\.:]+)\]: SASL .+ authentication failed: (?!.*Connection lost to authentication server).+' f2bregex[4] = 'warning: non-SMTP command from .*\[([0-9a-f\.:]+)]:.+' f2bregex[5] = 'NOQUEUE: reject: RCPT from \[([0-9a-f\.:]+)].+Protocol error.+' - f2bregex[6] = '-login: Disconnected \(auth failed, .+\): user=.*, method=.+, rip=([0-9a-f\.:]+),' - f2bregex[7] = '-login: Aborted login \(auth failed .+\): user=.+, rip=([0-9a-f\.:]+), lip.+' - f2bregex[8] = '-login: Aborted login \(tried to use disallowed .+\): user=.+, rip=([0-9a-f\.:]+), lip.+' + f2bregex[6] = '-login: Disconnected.+ \(auth failed, .+\): user=.*, method=.+, rip=([0-9a-f\.:]+),' + f2bregex[7] = '-login: Aborted login.+ \(auth failed .+\): user=.+, rip=([0-9a-f\.:]+), lip.+' + f2bregex[8] = '-login: Aborted login.+ \(tried to use disallowed .+\): user=.+, rip=([0-9a-f\.:]+), lip.+' f2bregex[9] = 'SOGo.+ Login from \'([0-9a-f\.:]+)\' for user .+ might not have worked' f2bregex[10] = '([0-9a-f\.:]+) \"GET \/SOGo\/.* HTTP.+\" 403 .+' r.set('F2B_REGEX', json.dumps(f2bregex, ensure_ascii=False)) diff --git a/data/Dockerfiles/olefy/Dockerfile b/data/Dockerfiles/olefy/Dockerfile index 889f84b4..10d63d02 100644 --- a/data/Dockerfiles/olefy/Dockerfile +++ b/data/Dockerfiles/olefy/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine:3.16 +FROM alpine:3.17 LABEL maintainer "Andre Peters " WORKDIR /app diff --git a/data/Dockerfiles/phpfpm/Dockerfile b/data/Dockerfiles/phpfpm/Dockerfile index 38c68f70..93acb33f 100644 --- a/data/Dockerfiles/phpfpm/Dockerfile +++ b/data/Dockerfiles/phpfpm/Dockerfile @@ -1,4 +1,4 @@ -FROM php:8.1-fpm-alpine3.16 +FROM php:8.1-fpm-alpine3.17 LABEL maintainer "Andre Peters " ENV APCU_PECL 5.1.22 diff --git a/data/Dockerfiles/unbound/Dockerfile b/data/Dockerfiles/unbound/Dockerfile index 0b1cefe9..d9756d04 100644 --- a/data/Dockerfiles/unbound/Dockerfile +++ b/data/Dockerfiles/unbound/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine:3.16 +FROM alpine:3.17 LABEL maintainer "Andre Peters " diff --git a/data/Dockerfiles/watchdog/Dockerfile b/data/Dockerfiles/watchdog/Dockerfile index 637c4680..654dea08 100644 --- a/data/Dockerfiles/watchdog/Dockerfile +++ b/data/Dockerfiles/watchdog/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine:3.16 +FROM alpine:3.17 LABEL maintainer "André Peters " # Installation diff --git a/data/conf/rspamd/custom/bulk_header.map b/data/conf/rspamd/custom/bulk_header.map index 39aa7fea..69a20af8 100644 --- a/data/conf/rspamd/custom/bulk_header.map +++ b/data/conf/rspamd/custom/bulk_header.map @@ -3,7 +3,6 @@ /.*episerver.*/i /.*supergewinne.*/i /List-Unsubscribe.*nbps\.eu/i -/X-Mailer: AWeber.*/i /.*regiofinder.*/i /.*EmailSocket.*/i /List-Unsubscribe:.*respread.*/i diff --git a/data/conf/rspamd/meta_exporter/pushover.php b/data/conf/rspamd/meta_exporter/pushover.php index 4c8092d1..10265d15 100644 --- a/data/conf/rspamd/meta_exporter/pushover.php +++ b/data/conf/rspamd/meta_exporter/pushover.php @@ -54,6 +54,7 @@ $rcpts = $headers['X-Rspamd-Rcpt']; $sender = $headers['X-Rspamd-From']; $ip = $headers['X-Rspamd-Ip']; $subject = $headers['X-Rspamd-Subject']; +$messageid= $json_body->message_id; $priority = 0; $symbols_array = json_decode($headers['X-Rspamd-Symbols'], true); @@ -245,13 +246,13 @@ foreach ($rcpt_final_mailboxes as $rcpt_final) { "token" => $api_data['token'], "user" => $api_data['key'], "title" => sprintf("%s", str_replace( - array('{SUBJECT}', '{SENDER}', '{SENDER_NAME}', '{SENDER_ADDRESS}', '{TO_NAME}', '{TO_ADDRESS}'), - array($subject, $sender, $sender_name, $sender_address, $to_name, $to_address), $title) + array('{SUBJECT}', '{SENDER}', '{SENDER_NAME}', '{SENDER_ADDRESS}', '{TO_NAME}', '{TO_ADDRESS}', '{MSG_ID}'), + array($subject, $sender, $sender_name, $sender_address, $to_name, $to_address, $messageid), $title) ), "priority" => $priority, "message" => sprintf("%s", str_replace( - array('{SUBJECT}', '{SENDER}', '{SENDER_NAME}', '{SENDER_ADDRESS}', '{TO_NAME}', '{TO_ADDRESS}', '\n'), - array($subject, $sender, $sender_name, $sender_address, $to_name, $to_address, PHP_EOL), $text) + array('{SUBJECT}', '{SENDER}', '{SENDER_NAME}', '{SENDER_ADDRESS}', '{TO_NAME}', '{TO_ADDRESS}', '{MSG_ID}', '\n'), + array($subject, $sender, $sender_name, $sender_address, $to_name, $to_address, $messageid, PHP_EOL), $text) ), "sound" => $attributes['sound'] ?? "pushover" ); diff --git a/data/web/_status.502.html b/data/web/_status.502.html index efbc0e8b..35a66ba9 100644 --- a/data/web/_status.502.html +++ b/data/web/_status.502.html @@ -13,12 +13,12 @@ Please check the logs or contact support if the error persists.

Quick debugging

Check Nginx and PHP logs:

-
docker-compose logs --tail=200 php-fpm-mailcow nginx-mailcow
+
docker compose logs --tail=200 php-fpm-mailcow nginx-mailcow

Make sure your SQL credentials in mailcow.conf (a link to .env) do fit your initialized SQL volume. If you see an access denied, you might have the wrong mailcow.conf:

-
source mailcow.conf ; docker-compose exec mysql-mailcow mysql -u${DBUSER} -p${DBPASS} ${DBNAME}
+
source mailcow.conf ; docker compose exec mysql-mailcow mysql -u${DBUSER} -p${DBPASS} ${DBNAME}

In case of a previous failed installation, create a backup of your existing data, followed by removing all volumes and starting over (NEVER do this with a production system, it will remove ALL data):

BACKUP_LOCATION=/tmp/ ./helper-scripts/backup_and_restore.sh backup all
-
docker-compose down --volumes ; docker-compose up -d
+
docker compose down --volumes ; docker compose up -d

Make sure your timezone is correct. Use "America/New_York" for example, do not use spaces. Check here for a list.


Click to learn more about getting support. diff --git a/data/web/templates/edit/mailbox.twig b/data/web/templates/edit/mailbox.twig index 73f75ab5..ce01a659 100644 --- a/data/web/templates/edit/mailbox.twig +++ b/data/web/templates/edit/mailbox.twig @@ -274,7 +274,7 @@

{{ lang.user.pushover_info|format(mailbox)|raw }}

-

{{ lang.edit.pushover_vars|raw }}: {SUBJECT}, {SENDER}, {SENDER_ADDRESS}, {SENDER_NAME}, {TO_NAME}, {TO_ADDRESS}

+

{{ lang.edit.pushover_vars|raw }}: {SUBJECT}, {SENDER}, {SENDER_ADDRESS}, {SENDER_NAME}, {TO_NAME}, {TO_ADDRESS}, {MSG_ID}

diff --git a/data/web/templates/user/Pushover.twig b/data/web/templates/user/Pushover.twig index cf40c888..d3304dbe 100644 --- a/data/web/templates/user/Pushover.twig +++ b/data/web/templates/user/Pushover.twig @@ -17,7 +17,7 @@

{{ lang.user.pushover_info|format(mailcow_cc_username)|raw }}

-

{{ lang.edit.pushover_vars|raw }}: {SUBJECT}, {SENDER}, {SENDER_ADDRESS}, {SENDER_NAME}, {TO_NAME}, {TO_ADDRESS}

+

{{ lang.edit.pushover_vars|raw }}: {SUBJECT}, {SENDER}, {SENDER_ADDRESS}, {SENDER_NAME}, {TO_NAME}, {TO_ADDRESS}, {MSG_ID}

diff --git a/docker-compose.yml b/docker-compose.yml index 698e8ee2..b940b336 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ version: '2.1' services: unbound-mailcow: - image: mailcow/unbound:1.16 + image: mailcow/unbound:1.17 environment: - TZ=${TZ} volumes: @@ -58,7 +58,7 @@ services: - redis clamd-mailcow: - image: mailcow/clamd:1.54 + image: mailcow/clamd:1.60 restart: always depends_on: - unbound-mailcow @@ -106,7 +106,7 @@ services: - rspamd php-fpm-mailcow: - image: mailcow/phpfpm:1.80 + image: mailcow/phpfpm:1.81 command: "php-fpm -d date.timezone=${TZ} -d expose_php=0" depends_on: - redis-mailcow @@ -169,7 +169,7 @@ services: - phpfpm sogo-mailcow: - image: mailcow/sogo:1.112 + image: mailcow/sogo:1.113 environment: - DBNAME=${DBNAME} - DBUSER=${DBUSER} @@ -389,7 +389,7 @@ services: acme-mailcow: depends_on: - nginx-mailcow - image: mailcow/acme:1.82 + image: mailcow/acme:1.83 dns: - ${IPV4_NETWORK:-172.22.1}.254 environment: @@ -425,7 +425,7 @@ services: - acme netfilter-mailcow: - image: mailcow/netfilter:1.49 + image: mailcow/netfilter:1.50 stop_grace_period: 30s depends_on: - dovecot-mailcow @@ -448,7 +448,7 @@ services: - /lib/modules:/lib/modules:ro watchdog-mailcow: - image: mailcow/watchdog:1.96 + image: mailcow/watchdog:1.97 dns: - ${IPV4_NETWORK:-172.22.1}.254 tmpfs: @@ -546,7 +546,7 @@ services: - solr olefy-mailcow: - image: mailcow/olefy:1.10 + image: mailcow/olefy:1.11 restart: always environment: - TZ=${TZ} diff --git a/helper-scripts/nextcloud.sh b/helper-scripts/nextcloud.sh index 94bc997a..16311fc2 100755 --- a/helper-scripts/nextcloud.sh +++ b/helper-scripts/nextcloud.sh @@ -1,4 +1,5 @@ #!/usr/bin/env bash +NEXTCLOUD_VER="25" for bin in curl dirmngr; do if [[ -z $(which ${bin}) ]]; then echo "Cannot find ${bin}, exiting..."; exit 1; fi @@ -40,7 +41,7 @@ if [[ ${NC_PURGE} == "y" ]]; then fi docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} -e \ - "$(docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} -e "SELECT IFNULL(GROUP_CONCAT('DROP TABLE ', TABLE_SCHEMA, '.', TABLE_NAME SEPARATOR ';'),'SELECT NULL;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'nc_%' AND TABLE_SCHEMA = '${DBNAME}';" -BN)" + "$(docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} -e "SELECT IFNULL(GROUP_CONCAT('DROP TABLE ', TABLE_SCHEMA, '.', TABLE_NAME SEPARATOR ';'),'SELECT NULL;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'oc_%' AND TABLE_SCHEMA = '${DBNAME}';" -BN)" docker exec -it $(docker ps -f name=redis-mailcow -q) /bin/sh -c ' cat <&1) && $(pip list --local 2>&1 | grep -v DEPRECATION | grep -c docker-compose) == 1 || $(command -v pip3 2>&1) && $(pip3 list --local 2>&1 | grep -v DEPRECATION | grep -c docker-compose) == 1 ]]; then echo -e "\e[33mFound a docker-compose Version installed with pip!\e[0m" - echo -e "\e[31mPlease uninstall the pip Version of docker-compose since it doesn´t support Versions higher than 1.29.2.\e[0m" + echo -e "\e[31mPlease uninstall the pip Version of docker-compose since it doesn't support Versions higher than 1.29.2.\e[0m" sleep 2 echo -e "\e[33mExiting...\e[0m" exit 1 #prevent breaking a working docker-compose installed with pip - elif [[ $(curl -sL -w "%{http_code}" https://www.servercow.de/docker-compose/latest.php?vers=${DC_DL_SUFFIX} -o /dev/null) == "200" ]]; then - LATEST_COMPOSE=$(curl -#L https://www.servercow.de/docker-compose/latest.php) + elif [[ $(curl -sL -w "%{http_code}" https://github.com/docker/compose/releases/latest -o /dev/null) == "200" ]]; then + LATEST_COMPOSE=$(curl -Ls -w %{url_effective} -o /dev/null https://github.com/docker/compose/releases/latest) # redirect to latest release + LATEST_COMPOSE=${LATEST_COMPOSE##*/} #get the latest version from the redirect, inlcuding the "v" prefix + if [ $DC_DL_SUFFIX]; then + LATEST_COMPOSE=1.27.4 # force 1.27.4 for legacy systems, tag is not prefixed by "v" COMPOSE_VERSION=$(docker-compose version --short) if [[ "$LATEST_COMPOSE" != "$COMPOSE_VERSION" ]]; then COMPOSE_PATH=$(command -v docker-compose) if [[ -w ${COMPOSE_PATH} ]]; then - curl -#L https://github.com/docker/compose/releases/download/v${LATEST_COMPOSE}/docker-compose-$(uname -s)-$(uname -m) > $COMPOSE_PATH + curl -#L https://github.com/docker/compose/releases/download/${LATEST_COMPOSE}/docker-compose-$(uname -s)-$(uname -m) > $COMPOSE_PATH chmod +x $COMPOSE_PATH echo -e "\e[32mYour Docker Compose (standalone) has been updated to: $LATEST_COMPOSE\e[0m" exit 0 @@ -61,10 +65,10 @@ echo -e "\e[32mTrying to determine GLIBC version...\e[0m" elif [ "${DOCKER_COMPOSE_VERSION}" == "native" ]; then echo -e "\e[31mYou are using the native Docker Compose Plugin. This Script is for the standalone Docker Compose Version only.\e[0m" sleep 2 - echo -e "\e[33mNotice: You´ll have to update this Compose Version via your Package Manager manually!\e[0m" + echo -e "\e[33mNotice: You'll have to update this Compose Version via your Package Manager manually!\e[0m" exit 1 else echo -e "\e[31mCan not read DOCKER_COMPOSE_VERSION variable from mailcow.conf! Is your mailcow up to date? Exiting...\e[0m" exit 1 -fi \ No newline at end of file +fi diff --git a/update.sh b/update.sh index 3eca2ea6..34d17354 100755 --- a/update.sh +++ b/update.sh @@ -5,7 +5,7 @@ check_online_status() { CHECK_ONLINE_DOMAINS=('https://github.com' 'https://hub.docker.com') for domain in "${CHECK_ONLINE_DOMAINS[@]}"; do - if timeout 3 curl --head --silent --output /dev/null ${domain}; then + if timeout 6 curl --head --silent --output /dev/null ${domain}; then return 0 fi done