2018-04-04 16:18:17 +01:00
#!/bin/sh
2022-03-21 11:19:33 +00:00
# Fixup the passwd file, in case we're on OpenShift
2022-08-11 09:30:36 +01:00
if ! whoami > /dev/null 2>& 1; then
if [ " $( id -u) " -ne 5050 ] ; then
2022-03-21 11:19:33 +00:00
if [ -w /etc/passwd ] ; then
echo " ${ USER_NAME :- pgadminr } :x: $( id -u) :0: ${ USER_NAME :- pgadminr } user: ${ HOME } :/sbin/nologin" >> /etc/passwd
fi
fi
fi
2019-12-09 11:09:46 +05:30
# Populate config_distro.py. This has some default config, as well as anything
2019-08-22 15:24:04 +01:00
# provided by the user through the PGADMIN_CONFIG_* environment variables.
2019-12-09 11:09:46 +05:30
# Only update the file on first launch. The empty file is created during the
# container build so it can have the required ownership.
2022-08-11 09:30:36 +01:00
if [ " $( wc -m /pgadmin4/config_distro.py | awk '{ print $1 }' ) " = "0" ] ; then
2019-08-22 15:24:04 +01:00
cat << EOF > /pgadmin4/config_distro.py
2021-02-01 17:26:39 +00:00
CA_FILE = '/etc/ssl/certs/ca-certificates.crt'
2021-02-02 13:45:49 +00:00
LOG_FILE = '/dev/null'
2019-08-22 15:24:04 +01:00
HELP_PATH = '../../docs'
DEFAULT_BINARY_PATHS = {
2023-09-26 13:45:08 +05:30
'pg': '/usr/local/pgsql-16',
'pg-16': '/usr/local/pgsql-16',
2022-10-17 10:02:45 +01:00
'pg-15': '/usr/local/pgsql-15',
2021-10-04 16:12:45 +05:30
'pg-14': '/usr/local/pgsql-14',
2021-06-15 14:19:31 +01:00
'pg-13': '/usr/local/pgsql-13',
2023-09-26 13:45:08 +05:30
'pg-12': '/usr/local/pgsql-12'
2019-08-22 15:24:04 +01:00
}
EOF
# This is a bit kludgy, but necessary as the container uses BusyBox/ash as
# it's shell and not bash which would allow a much cleaner implementation
2023-09-04 09:36:15 +02:00
for var in $( env | grep "^PGADMIN_CONFIG_" | cut -d "=" -f 1) ; do
2022-08-11 09:30:36 +01:00
# shellcheck disable=SC2086
# shellcheck disable=SC2046
2019-08-22 15:24:04 +01:00
echo ${ var #PGADMIN_CONFIG_ } = $( eval "echo \$ $var " ) >> /pgadmin4/config_distro.py
done
fi
2018-04-04 16:18:17 +01:00
if [ ! -f /var/lib/pgadmin/pgadmin4.db ] ; then
2022-08-11 09:30:36 +01:00
if [ -z " ${ PGADMIN_DEFAULT_EMAIL } " ] || { [ -z " ${ PGADMIN_DEFAULT_PASSWORD } " ] && [ -z " ${ PGADMIN_DEFAULT_PASSWORD_FILE } " ] ; } ; then
2022-06-15 11:07:56 +05:30
echo 'You need to define the PGADMIN_DEFAULT_EMAIL and PGADMIN_DEFAULT_PASSWORD or PGADMIN_DEFAULT_PASSWORD_FILE environment variables.'
2021-02-26 16:57:03 +00:00
exit 1
fi
2024-07-18 11:05:37 +05:30
# Validate PGADMIN_DEFAULT_EMAIL
CHECK_EMAIL_DELIVERABILITY = "False"
if [ -n " ${ PGADMIN_CONFIG_CHECK_EMAIL_DELIVERABILITY } " ] ; then
CHECK_EMAIL_DELIVERABILITY = ${ PGADMIN_CONFIG_CHECK_EMAIL_DELIVERABILITY }
fi
is_valid_email = $( cd /pgadmin4/pgadmin/utils && /venv/bin/python3 -c "from validation_utils import validate_email; val = validate_email(' ${ PGADMIN_DEFAULT_EMAIL } ', ${ CHECK_EMAIL_DELIVERABILITY } ); print(val)" )
if echo " ${ is_valid_email } " | grep "False" > /dev/null; then
2021-02-26 16:57:03 +00:00
echo "' ${ PGADMIN_DEFAULT_EMAIL } ' does not appear to be a valid email address. Please reset the PGADMIN_DEFAULT_EMAIL environment variable and try again."
2018-04-04 16:18:17 +01:00
exit 1
fi
2024-07-18 11:05:37 +05:30
# Switch back to root directory for further process
cd /pgadmin4
2018-04-04 16:18:17 +01:00
2022-06-15 11:07:56 +05:30
# Read secret contents
if [ -n " ${ PGADMIN_DEFAULT_PASSWORD_FILE } " ] ; then
2022-08-11 09:30:36 +01:00
PGADMIN_DEFAULT_PASSWORD = $( cat " ${ PGADMIN_DEFAULT_PASSWORD_FILE } " )
export PGADMIN_DEFAULT_PASSWORD
2022-06-15 11:07:56 +05:30
fi
2018-04-04 16:18:17 +01:00
# Set the default username and password in a
# backwards compatible way
2022-08-11 09:30:36 +01:00
export PGADMIN_SETUP_EMAIL = " ${ PGADMIN_DEFAULT_EMAIL } "
export PGADMIN_SETUP_PASSWORD = " ${ PGADMIN_DEFAULT_PASSWORD } "
2018-04-04 16:18:17 +01:00
# Initialize DB before starting Gunicorn
# Importing pgadmin4 (from this script) is enough
2021-02-09 13:12:19 +00:00
/venv/bin/python3 run_pgadmin.py
2018-12-05 17:16:46 +00:00
2022-08-11 09:30:36 +01:00
export PGADMIN_SERVER_JSON_FILE = " ${ PGADMIN_SERVER_JSON_FILE :- /pgadmin4/servers.json } "
2024-02-27 12:11:59 +05:30
export PGADMIN_PREFERENCES_JSON_FILE = " ${ PGADMIN_PREFERENCES_JSON_FILE :- /pgadmin4/preferences.json } "
2022-08-11 09:30:36 +01:00
2018-12-05 17:16:46 +00:00
# Pre-load any required servers
2019-06-27 10:56:37 -04:00
if [ -f " ${ PGADMIN_SERVER_JSON_FILE } " ] ; then
2019-12-17 13:15:04 +05:30
# When running in Desktop mode, no user is created
# so we have to import servers anonymously
if [ " ${ PGADMIN_CONFIG_SERVER_MODE } " = "False" ] ; then
2023-12-21 12:07:26 +05:30
/venv/bin/python3 /pgadmin4/setup.py load-servers " ${ PGADMIN_SERVER_JSON_FILE } "
2019-12-17 13:15:04 +05:30
else
2023-12-21 12:07:26 +05:30
/venv/bin/python3 /pgadmin4/setup.py load-servers " ${ PGADMIN_SERVER_JSON_FILE } " --user " ${ PGADMIN_DEFAULT_EMAIL } "
2019-12-17 13:15:04 +05:30
fi
2018-12-05 17:16:46 +00:00
fi
2024-02-15 14:58:31 +05:30
if [ -f " ${ PGADMIN_PREFERENCES_JSON_FILE } " ] ; then
# When running in Desktop mode, no user is created
# so we have to import servers anonymously
if [ " ${ PGADMIN_CONFIG_SERVER_MODE } " = "False" ] ; then
DESKTOP_USER = $( cd /pgadmin4 && /venv/bin/python3 -c 'import config; print(config.DESKTOP_USER)' )
/venv/bin/python3 /pgadmin4/setup.py set-prefs " ${ DESKTOP_USER } " --input-file " ${ PGADMIN_PREFERENCES_JSON_FILE } "
else
/venv/bin/python3 /pgadmin4/setup.py set-prefs " ${ PGADMIN_DEFAULT_EMAIL } " --input-file " ${ PGADMIN_PREFERENCES_JSON_FILE } "
fi
fi
2018-04-04 16:18:17 +01:00
fi
2018-12-05 14:44:23 +00:00
# Start Postfix to handle password resets etc.
2022-08-11 09:30:36 +01:00
if [ -z " ${ PGADMIN_DISABLE_POSTFIX } " ] ; then
2021-01-20 11:50:05 +00:00
sudo /usr/sbin/postfix start
fi
2018-12-05 14:44:23 +00:00
2019-03-01 11:55:17 +00:00
# Get the session timeout from the pgAdmin config. We'll use this (in seconds)
# to define the Gunicorn worker timeout
2021-02-09 13:12:19 +00:00
TIMEOUT = $( cd /pgadmin4 && /venv/bin/python3 -c 'import config; print(config.SESSION_EXPIRATION_TIME * 60 * 60 * 24)' )
2019-03-01 11:55:17 +00:00
2018-04-04 16:18:17 +01:00
# NOTE: currently pgadmin can run only with 1 worker due to sessions implementation
# Using --threads to have multi-threaded single-process worker
2024-03-26 13:52:29 +01:00
if [ -n " ${ PGADMIN_ENABLE_SOCK } " ] ; then
BIND_ADDRESS = "unix:/run/pgadmin/pgadmin.sock"
else
if [ -n " ${ PGADMIN_ENABLE_TLS } " ] ; then
BIND_ADDRESS = " ${ PGADMIN_LISTEN_ADDRESS :- [::] } : ${ PGADMIN_LISTEN_PORT :- 443 } "
else
BIND_ADDRESS = " ${ PGADMIN_LISTEN_ADDRESS :- [::] } : ${ PGADMIN_LISTEN_PORT :- 80 } "
fi
fi
2022-08-11 09:30:36 +01:00
if [ -n " ${ PGADMIN_ENABLE_TLS } " ] ; then
2024-03-26 13:52:29 +01:00
exec /venv/bin/gunicorn --limit-request-line " ${ GUNICORN_LIMIT_REQUEST_LINE :- 8190 } " --timeout " ${ TIMEOUT } " --bind " ${ BIND_ADDRESS } " -w 1 --threads " ${ GUNICORN_THREADS :- 25 } " --access-logfile " ${ GUNICORN_ACCESS_LOGFILE :- - } " --keyfile /certs/server.key --certfile /certs/server.cert -c gunicorn_config.py run_pgadmin:app
2018-04-04 16:18:17 +01:00
else
2024-03-26 13:52:29 +01:00
exec /venv/bin/gunicorn --limit-request-line " ${ GUNICORN_LIMIT_REQUEST_LINE :- 8190 } " --timeout " ${ TIMEOUT } " --bind " ${ BIND_ADDRESS } " -w 1 --threads " ${ GUNICORN_THREADS :- 25 } " --access-logfile " ${ GUNICORN_ACCESS_LOGFILE :- - } " -c gunicorn_config.py run_pgadmin:app
2018-04-04 16:18:17 +01:00
fi