diff --git a/.gitignore b/.gitignore index 69ed15fe..7d1c7c3e 100644 --- a/.gitignore +++ b/.gitignore @@ -59,6 +59,7 @@ data/web/inc/vars.local.inc.php data/web/inc/app_info.inc.php data/web/nextcloud*/ data/web/rc*/ +docker-compose.yml**.bak docker-compose.override.yml !helper-scripts/docker-compose.override.yml.d/**/docker-compose.override.yml mailcow.conf diff --git a/generate_config.sh b/generate_config.sh index 6b3ad711..702c2540 100755 --- a/generate_config.sh +++ b/generate_config.sh @@ -21,38 +21,61 @@ if grep --help 2>&1 | head -n 1 | grep -q -i "busybox"; then echo "BusyBox grep if cp --help 2>&1 | head -n 1 | grep -q -i "busybox"; then echo "BusyBox cp detected, please install coreutils, \"apk add --no-cache --upgrade coreutils\""; exit 1; fi if sed --help 2>&1 | head -n 1 | grep -q -i "busybox"; then echo "BusyBox sed detected, please install gnu sed, \"apk add --no-cache --upgrade sed\""; exit 1; fi -for bin in openssl curl docker git awk sha1sum; do +# Check which container engine is available. +# Check for podman first, because the 'podman-docker' package might be installed providing a dummy 'docker' command. +if command -v podman > /dev/null 2>&1; then + CONTAINER_ENGINE="podman" + echo -e "\e[32mFound Podman container engine.\e[0m" + + if [[ -n "${DOCKER_HOST}" ]] && [[ "${DOCKER_HOST}" == "unix://"* ]]; then + CONTAINER_SOCKET="${DOCKER_HOST/"unix://"/}" + else + CONTAINER_SOCKET="/run/user/${UID}/podman/podman.sock" + fi +elif command -v docker > /dev/null 2>&1; then + CONTAINER_ENGINE="docker" + echo -e "\e[32mFound Docker container engine.\e[0m" + + CONTAINER_SOCKET="/var/run/docker.sock" +else + echo "Cannot find container engine (Docker or Podman), exiting..." + exit 1 +fi + +for bin in openssl curl git awk sha1sum; do if [[ -z $(which ${bin}) ]]; then echo "Cannot find ${bin}, exiting..."; exit 1; fi done -if command -v docker compose > /dev/null 2>&1; then +MAILCOW_DOCKER_COMPOSE=${MAILCOW_DOCKER_COMPOSE:-"docker-compose"} + +if [[ "${CONTAINER_ENGINE}" == "docker" ]] && command -v docker compose > /dev/null 2>&1; then version=$(docker compose version --short) if [[ $version =~ ^2\.([0-9]+)\.([0-9]+) ]]; then COMPOSE_VERSION=native echo -e "\e[31mFound Docker Compose Plugin (native).\e[0m" echo -e "\e[31mSetting the DOCKER_COMPOSE_VERSION Variable to native\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" else - echo -e "\e[31mCannot find Docker Compose with a Version Higher than 2.X.X.\e[0m" + echo -e "\e[31mCannot find Docker Compose with a Version Higher than 2.X.X.\e[0m" echo -e "\e[31mPlease update/install manually regarding to this doc site: https://mailcow.github.io/mailcow-dockerized-docs/i_u_m/i_u_m_install/\e[0m" exit 1 fi -elif command -v docker-compose > /dev/null 2>&1; then - version=$(docker-compose version --short) +elif command -v $MAILCOW_DOCKER_COMPOSE > /dev/null 2>&1; then + version=$($MAILCOW_DOCKER_COMPOSE version --short) if [[ $version =~ ^2\.([0-9]+)\.([0-9]+) ]]; then COMPOSE_VERSION=standalone echo -e "\e[31mFound Docker Compose Standalone.\e[0m" echo -e "\e[31mSetting the DOCKER_COMPOSE_VERSION Variable to standalone\e[0m" sleep 2 - echo -e "\e[33mNotice: For an automatic update of docker-compose please use the update_compose.sh scripts located at the helper-scripts folder.\e[0m" + echo -e "\e[33mNotice: For an automatic update of ${MAILCOW_DOCKER_COMPOSE} please use the update_compose.sh scripts located at the helper-scripts folder.\e[0m" else - echo -e "\e[31mCannot find Docker Compose with a Version Higher than 2.X.X.\e[0m" + echo -e "\e[31mCannot find Docker Compose with a Version Higher than 2.X.X.\e[0m" echo -e "\e[31mPlease update/install manually regarding to this doc site: https://mailcow.github.io/mailcow-dockerized-docs/i_u_m/i_u_m_install/\e[0m" exit 1 fi else - echo -e "\e[31mCannot find Docker Compose.\e[0m" + echo -e "\e[31mCannot find Docker Compose.\e[0m" echo -e "\e[31mPlease install it manually regarding to this doc site: https://mailcow.github.io/mailcow-dockerized-docs/i_u_m/i_u_m_install/\e[0m" exit 1 fi @@ -172,7 +195,7 @@ else echo -e "\033[31mCould not determine branch input..." echo -e "\033[31mExiting." exit 1 -fi +fi if [ ! -z "${MAILCOW_BRANCH}" ]; then git_branch=${MAILCOW_BRANCH} @@ -180,6 +203,17 @@ fi [ ! -f ./data/conf/rspamd/override.d/worker-controller-password.inc ] && echo '# Placeholder' > ./data/conf/rspamd/override.d/worker-controller-password.inc +if [[ "${CONTAINER_ENGINE}" == "podman" ]]; then + MAILCOW_HTTP_BIND="127.0.0.1" + MAILCOW_HTTPS_BIND="127.0.0.1" + + # Patch the docker-compose.yml for usage with Podman + bash ./patch-docker-compose-for-podman.sh +else + MAILCOW_HTTP_BIND="" + MAILCOW_HTTPS_BIND="" +fi + cat << EOF > mailcow.conf # ------------------------------ # mailcow web ui configuration @@ -195,6 +229,9 @@ MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME} # see https://mailcow.github.io/mailcow-dockerized-docs/models/model-passwd/ MAILCOW_PASS_SCHEME=BLF-CRYPT +# The directory used to store the data of the used containers +MAILCOW_STORAGE_DIR= + # ------------------------------ # SQL database configuration # ------------------------------ @@ -221,10 +258,42 @@ DBROOT=$(LC_ALL=C /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 && +@@ -412,8 +412,8 @@ + depends_on: + - nginx-mailcow + image: mailcow/acme:1.83 +- dns: +- - ${IPV4_NETWORK:-172.22.1}.254 ++# dns: ++# - ${IPV4_NETWORK:-172.22.1}.254 + environment: + - LOG_LINES=${LOG_LINES:-9999} + - ACME_CONTACT=${ACME_CONTACT:-} +@@ -475,8 +475,8 @@ + + watchdog-mailcow: + image: mailcow/watchdog:1.97 +- dns: +- - ${IPV4_NETWORK:-172.22.1}.254 ++# dns: ++# - ${IPV4_NETWORK:-172.22.1}.254 + tmpfs: + - /tmp + volumes: +@@ -542,9 +542,9 @@ + security_opt: + - label=disable + restart: always +- oom_kill_disable: true +- dns: +- - ${IPV4_NETWORK:-172.22.1}.254 ++# oom_kill_disable: true ++# dns: ++# - ${IPV4_NETWORK:-172.22.1}.254 + environment: + - DBROOT=${DBROOT} + - TZ=${TZ} diff --git a/patch-docker-compose-for-podman.sh b/patch-docker-compose-for-podman.sh new file mode 100755 index 00000000..70236a2e --- /dev/null +++ b/patch-docker-compose-for-podman.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +# +# This script patches the docker-compose.yml for usage with podman. +# This is necessary because not all options (e.g. DNS) can be overwritten by docker-compose, see +# https://github.com/docker/compose/issues/3729 + +set -e + +PATCH_FILE="patch-docker-compose-for-podman.patch" +TIMESTAMP="$(date +'%Y%m%d%H%M')" + +# Create a backup (in case custom changes are made) +cp docker-compose.yml docker-compose.yml.${TIMESTAMP}.bak + +# Detect whether the patch has been applied by trying to reverse the patch in a dry-run scenario +if ! patch -R -s -f --dry-run docker-compose.yml < ${PATCH_FILE} > /dev/null 2>&1; then + patch docker-compose.yml < ${PATCH_FILE} +else + echo "Patch file already applied or custom changes prevent applying the patch" +fi