This upgrades our images to Alpine 3.20, Django 4.2, Mailman 3.3.10, Postorius 1.3.13, Hyperkitty 1.3.12 and django-mailman3 1.3.15. Files are re-synced with upstream (either container or project) files, with versions and any alterations noted. Change-Id: I78d37c0635d38ecfc1d1143a69892fe8d8685214
		
			
				
	
	
		
			155 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#! /bin/bash
 | 
						|
set -e
 | 
						|
 | 
						|
 | 
						|
function wait_for_postgres () {
 | 
						|
	# Check if the postgres database is up and accepting connections before
 | 
						|
	# moving forward.
 | 
						|
	# TODO: Use python's psycopg2 module to do this in python instead of
 | 
						|
	# installing postgres-client in the image.
 | 
						|
	until psql -P pager=off $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.
 | 
						|
	readarray -d' ' -t ENDPOINT <<< $(python3 -c "from urllib.parse import urlparse; o = urlparse('$DATABASE_URL'); print('%s %s' % (o.hostname, o.port if o.port else '3306'));")
 | 
						|
	until mysqladmin ping --host ${ENDPOINT[0]} --port ${ENDPOINT[1]} --silent; do
 | 
						|
		>&2 echo "MySQL is unavailable - sleeping"
 | 
						|
		sleep 1
 | 
						|
	done
 | 
						|
	>&2 echo "MySQL is up - continuing"
 | 
						|
}
 | 
						|
 | 
						|
function check_or_create () {
 | 
						|
	# Check if the path exists, if not, create the directory.
 | 
						|
	if [[ ! -e dir ]]; then
 | 
						|
		echo "$1 does not exist, creating ..."
 | 
						|
		mkdir "$1"
 | 
						|
	fi
 | 
						|
}
 | 
						|
 | 
						|
# function postgres_ready(){
 | 
						|
# python << END
 | 
						|
# import sys
 | 
						|
# import psycopg2
 | 
						|
# try:
 | 
						|
#     conn = psycopg2.connect(dbname="$POSTGRES_DB", user="$POSTGRES_USER", password="$POSTGRES_PASSWORD", host="postgres")
 | 
						|
# except psycopg2.OperationalError:
 | 
						|
#     sys.exit(-1)
 | 
						|
# sys.exit(0)
 | 
						|
# END
 | 
						|
# }
 | 
						|
 | 
						|
# SMTP_HOST defaults to the gateway
 | 
						|
if [[ ! -v SMTP_HOST ]]; then
 | 
						|
	export SMTP_HOST=$(/sbin/ip route | awk '/default/ { print $3 }')
 | 
						|
fi
 | 
						|
 | 
						|
# Check if $SECRET_KEY is defined, if not, bail out.
 | 
						|
if [[ ! -v SECRET_KEY ]]; then
 | 
						|
	echo "SECRET_KEY is not defined. Aborting."
 | 
						|
	exit 1
 | 
						|
fi
 | 
						|
 | 
						|
# Check if $DATABASE_URL is defined, if not, use a standard sqlite database.
 | 
						|
#
 | 
						|
# If the $DATABASE_URL is defined and is postgres, check if it is available
 | 
						|
# yet. Do not start the container before the postgresql boots up.
 | 
						|
#
 | 
						|
# If the $DATABASE_URL is defined and is mysql, check if the database is
 | 
						|
# available before the container boots up.
 | 
						|
#
 | 
						|
# TODO: Check the database type and detect if it is up based on that. For now,
 | 
						|
# assume that postgres is being used if DATABASE_URL is defined.
 | 
						|
 | 
						|
if [[ ! -v DATABASE_URL ]]; then
 | 
						|
	echo "DATABASE_URL is not defined. Using sqlite database..."
 | 
						|
	export DATABASE_URL=sqlite:////opt/mail-web-data/mailmanweb.db
 | 
						|
	export DATABASE_TYPE='sqlite'
 | 
						|
fi
 | 
						|
 | 
						|
if [[ "$DATABASE_TYPE" = 'postgres' ]]
 | 
						|
then
 | 
						|
	wait_for_postgres
 | 
						|
elif [[ "$DATABASE_TYPE" = 'mysql' ]]
 | 
						|
then
 | 
						|
	wait_for_mysql
 | 
						|
fi
 | 
						|
 | 
						|
# Check if we are in the correct directory before running commands.
 | 
						|
if [[ ! $(pwd) == '/opt/mailman-web' ]]; then
 | 
						|
	echo "Running in the wrong directory...switching to /opt/mailman-web"
 | 
						|
	cd /opt/mailman-web
 | 
						|
fi
 | 
						|
 | 
						|
# Check if the logs directory is setup.
 | 
						|
if [[ ! -e /opt/mailman-web-data/logs/mailmanweb.log ]]; then
 | 
						|
	echo "Creating log file for mailman web"
 | 
						|
	mkdir -p /opt/mailman-web-data/logs/
 | 
						|
	touch /opt/mailman-web-data/logs/mailmanweb.log
 | 
						|
fi
 | 
						|
 | 
						|
if [[ ! -e /opt/mailman-web-data/logs/uwsgi.log ]]; then
 | 
						|
	echo "Creating log file for uwsgi.."
 | 
						|
	touch /opt/mailman-web-data/logs/uwsgi.log
 | 
						|
fi
 | 
						|
 | 
						|
# Check if the settings_local.py file exists, if yes, copy it too.
 | 
						|
if [[ -e /opt/mailman-web-data/settings_local.py ]]; then
 | 
						|
	echo "Copying settings_local.py ..."
 | 
						|
	cp /opt/mailman-web-data/settings_local.py /opt/mailman-web/settings_local.py
 | 
						|
	chown mailman:mailman /opt/mailman-web/settings_local.py
 | 
						|
else
 | 
						|
	echo "settings_local.py not found, it is highly recommended that you provide one"
 | 
						|
	echo "Using default configuration to run."
 | 
						|
fi
 | 
						|
 | 
						|
# Collect static for the django installation.
 | 
						|
python3 manage.py collectstatic --noinput --clear --verbosity 0
 | 
						|
 | 
						|
 | 
						|
# Compile all the installed po files to mo.
 | 
						|
SITE_DIR=$(python3 -c 'import site; print(site.getsitepackages()[0])')
 | 
						|
echo "Compiling locale files in $SITE_DIR"
 | 
						|
cd $SITE_DIR && /opt/mailman-web/manage.py compilemessages &&  cd -
 | 
						|
 | 
						|
# Compress static files.
 | 
						|
python3 /opt/mailman-web/manage.py compress --force
 | 
						|
 | 
						|
 | 
						|
# Migrate all the data to the database if this is a new installation, otherwise
 | 
						|
# this command will upgrade the database.
 | 
						|
python3 /opt/mailman-web/manage.py migrate
 | 
						|
 | 
						|
# If MAILMAN_ADMIN_USER and MAILMAN_ADMIN_EMAIL is defined create a new
 | 
						|
# superuser for Django. There is no password setup so it can't login yet unless
 | 
						|
# the password is reset.
 | 
						|
if [[ -v MAILMAN_ADMIN_USER ]] && [[ -v MAILMAN_ADMIN_EMAIL ]];
 | 
						|
then
 | 
						|
	echo "Creating admin user $MAILMAN_ADMIN_USER ..."
 | 
						|
	python3 /opt/mailman-web/manage.py createsuperuser --noinput --username "$MAILMAN_ADMIN_USER"\
 | 
						|
		   --email "$MAILMAN_ADMIN_EMAIL" 2> /dev/null || \
 | 
						|
		echo "Superuser $MAILMAN_ADMIN_USER already exists"
 | 
						|
fi
 | 
						|
 | 
						|
# If SERVE_FROM_DOMAIN is defined then rename the default `example.com`
 | 
						|
# domain to the defined domain.
 | 
						|
if [[ -v SERVE_FROM_DOMAIN ]];
 | 
						|
then
 | 
						|
	echo "Setting $SERVE_FROM_DOMAIN as the default domain ..."
 | 
						|
	python3 /opt/mailman-web/manage.py shell -c \
 | 
						|
	"from django.contrib.sites.models import Site; Site.objects.filter(domain='example.com').update(domain='$SERVE_FROM_DOMAIN', name='$SERVE_FROM_DOMAIN')"
 | 
						|
fi
 | 
						|
 | 
						|
# Create a mailman user with the specific UID and GID and do not create home
 | 
						|
# directory for it. Also chown the logs directory to write the files.
 | 
						|
chown mailman:mailman /opt/mailman-web-data -R
 | 
						|
 | 
						|
[[ -v DISKCACHE_PATH ]] && chown mailman:mailman "${DISKCACHE_PATH}" -R
 | 
						|
 | 
						|
exec $@
 |