#! /bin/bash # Note(decentral1se): This is a copy/pasta of the upstream entrypoint # See https://github.com/maxking/docker-mailman/issues/86 # See https://git.autonomic.zone/coop-cloud/mailman3/issues/3 set -e file_env() { local var="$1" local fileVar="${var}_FILE" local def="${2:-}" if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then echo >&2 "error: both $var and $fileVar are set (but are exclusive)" exit 1 fi local val="$def" if [ "${!var:-}" ]; then val="${!var}" elif [ "${!fileVar:-}" ]; then val="$(< "${!fileVar}")" fi export "$var"="$val" unset "$fileVar" } # Load secrets and expose env vars file_env "DATABASE_PASSWORD" file_env "HYPERKITTY_API_KEY" file_env "MAILMAN_REST_PASSWORD" export DATABASE_URL="postgres://${DATABASE_USER}:${DATABASE_PASSWORD}@${DATABASE_HOST}/${DATABASE_NAME}" # Diabolical hack to remove duplicate hostnames due to Docker shared networks # See https://git.autonomic.zone/coop-cloud/mailu/src/branch/main/compose.yml for more sed "/192.168/d" /etc/hosts > /etc/hosts-single-hostname cat /etc/hosts-single-hostname > /etc/hosts # --- upstream entrypoint below --- function wait_for_postgres () { # Check if the postgres database is up and accepting connections before # moving forward. # TODO: Use python3's psycopg2 module to do this in python3 instead of # installing postgres-client in the image. until psql $DATABASE_URL -c '\l'; do >&2 echo "Postgres is unavailable - sleeping" sleep 1 done >&2 echo "Postgres is up - continuing" } function wait_for_mysql () { # Check if MySQL is up and accepting connections. HOSTNAME=$(python3 -c "from urllib.parse import urlparse; o = urlparse('$DATABASE_URL'); print(o.hostname);") until mysqladmin ping --host "$HOSTNAME" --silent; do >&2 echo "MySQL is unavailable - sleeping" sleep 1 done >&2 echo "MySQL is up - continuing" } # Empty the config file. echo "# This file is autogenerated at container startup." > /etc/mailman.cfg # Check if $MM_HOSTNAME is set, if not, set it to the value returned by # `hostname -i` command to set it to whatever IP address is assigned to the # container. if [[ ! -v MM_HOSTNAME ]]; then export MM_HOSTNAME=`hostname -i` fi # SMTP_HOST defaults to the gateway if [[ ! -v SMTP_HOST ]]; then export SMTP_HOST=$(/sbin/ip route | awk '/default/ { print $3 }') echo "SMPT_HOST not specified, using the gateway ($SMTP_HOST) as default" fi if [[ ! -v SMTP_PORT ]]; then export SMTP_PORT=25 fi # Check if REST port, username, and password are set, if not, set them # to default values. if [[ ! -v MAILMAN_REST_PORT ]]; then export MAILMAN_REST_PORT='8001' fi if [[ ! -v MAILMAN_REST_USER ]]; then export MAILMAN_REST_USER='restadmin' fi if [[ ! -v MAILMAN_REST_PASSWORD ]]; then export MAILMAN_REST_PASSWORD='restpass' fi function setup_database () { if [[ ! -v DATABASE_URL ]] then echo "Environment variable DATABASE_URL should be defined..." exit 1 fi # Translate mysql:// urls to mysql+mysql:// backend: if [[ "$DATABASE_URL" == mysql://* ]]; then DATABASE_URL="mysql+pymysql://${DATABASE_URL:8}" echo "Database URL was automatically rewritten to: $DATABASE_URL" fi # If DATABASE_CLASS is not set, guess it for common databases: if [ -z "$DATABASE_CLASS" ]; then if [[ ("$DATABASE_URL" == mysql:*) || ("$DATABASE_URL" == mysql+*) ]]; then DATABASE_CLASS=mailman.database.mysql.MySQLDatabase fi if [[ ("$DATABASE_URL" == postgres:*) || ("$DATABASE_URL" == postgres+*) ]]; then DATABASE_CLASS=mailman.database.postgresql.PostgreSQLDatabase fi fi cat >> /etc/mailman.cfg <> /etc/mailman.cfg << EOF [runner.retry] sleep_time: 10s [webservice] hostname: $MM_HOSTNAME port: $MAILMAN_REST_PORT admin_user: $MAILMAN_REST_USER admin_pass: $MAILMAN_REST_PASSWORD configuration: /etc/gunicorn.cfg EOF # Generate a basic gunicorn.cfg. SITE_DIR=$(python3 -c 'import site; print(site.getsitepackages()[0])') cp "${SITE_DIR}/mailman/config/gunicorn.cfg" /etc/gunicorn.cfg # Generate a basic configuration to use exim cat > /tmp/exim-mailman.cfg < /etc/postfix-mailman.cfg << EOF [postfix] transport_file_type: regex # While in regex mode, postmap_command is never used, a placeholder # is added here so that it doesn't break anything. postmap_command: true EOF # Generate a basic configuration to use postfix. cat > /tmp/postfix-mailman.cfg <> /etc/mailman.cfg elif [ "$MTA" == "postfix" ] then echo "Using Postfix configuration" cat /tmp/postfix-mailman.cfg >> /etc/mailman.cfg else echo "No MTA environment variable found, defaulting to Exim" cat /tmp/exim-mailman.cfg >> /etc/mailman.cfg fi rm -f /tmp/{postfix,exim}-mailman.cfg if [[ -e /opt/mailman/mailman-extra.cfg ]] then echo "Found configuration file at /opt/mailman/mailman-extra.cfg" cat /opt/mailman/mailman-extra.cfg >> /etc/mailman.cfg fi if [[ -e /opt/mailman/gunicorn-extra.cfg ]] then echo "Found [webserver] configuration file at /opt/mailman/gunicorn-extra.cfg" cat /opt/mailman/gunicorn-extra.cfg > /etc/gunicorn.cfg fi if [[ -v HYPERKITTY_API_KEY ]]; then echo "HYPERKITTY_API_KEY found, setting up HyperKitty archiver..." cat >> /etc/mailman.cfg << EOF [archiver.hyperkitty] class: mailman_hyperkitty.Archiver enable: yes configuration: /etc/mailman-hyperkitty.cfg EOF if [[ ! -v HYPERKITTY_URL ]]; then echo "HYPERKITTY_URL not set, using the default value of http://mailman-web:8000/hyperkitty" export HYPERKITTY_URL="http://mailman-web:8000/hyperkitty/" fi # Generate a basic mailman-hyperkitty.cfg. cat > /etc/mailman-hyperkitty.cfg <