2018-03-21 20:53:39 +00:00
#!/usr/bin/env bash
2020-10-09 06:09:56 +00:00
POSTGRES_MAJOR_VERSION = $( cat /tmp/pg_version.txt)
2021-01-05 17:09:48 +00:00
POSTGIS_MAJOR = $( cat /tmp/pg_major_version.txt)
2021-01-02 21:34:42 +00:00
POSTGIS_MINOR_RELEASE = $( cat /tmp/pg_minor_version.txt)
2020-10-09 06:09:56 +00:00
DEFAULT_DATADIR = " /var/lib/postgresql/ ${ POSTGRES_MAJOR_VERSION } /main "
2021-08-19 13:55:32 +00:00
# Commented for documentation. You can specify the location of
# pg_wal directory/volume using the following environment variable:
# POSTGRES_INITDB_WALDIR (default value is unset)
2022-04-29 14:05:31 +00:00
DEFAULT_SCRIPTS_LOCKFILE_DIR = "/docker-entrypoint.initdb.d"
DEFAULT_CONF_LOCKFILE_DIR = "/settings"
DEFAULT_EXTRA_CONF_DIR = "/settings"
2020-10-09 06:09:56 +00:00
ROOT_CONF = " /etc/postgresql/ ${ POSTGRES_MAJOR_VERSION } /main "
2019-10-22 09:31:59 +00:00
PG_ENV = " $ROOT_CONF /environment "
2018-03-21 20:53:39 +00:00
CONF = " $ROOT_CONF /postgresql.conf "
2022-04-29 14:05:31 +00:00
DEFAULT_WAL_ARCHIVE = "/opt/archivedir"
2018-03-21 20:53:39 +00:00
RECOVERY_CONF = " $ROOT_CONF /recovery.conf "
2020-10-09 06:09:56 +00:00
POSTGRES = " /usr/lib/postgresql/ ${ POSTGRES_MAJOR_VERSION } /bin/postgres "
INITDB = " /usr/lib/postgresql/ ${ POSTGRES_MAJOR_VERSION } /bin/initdb "
2021-01-05 17:09:48 +00:00
SQLDIR = " /usr/share/postgresql/ ${ POSTGRES_MAJOR_VERSION } /contrib/postgis- ${ POSTGIS_MAJOR } . ${ POSTGIS_MINOR_RELEASE } / "
2023-07-01 07:47:21 +00:00
EXTDIR = " /usr/share/postgresql/ ${ POSTGRES_MAJOR_VERSION } /extension/ "
2018-03-21 20:53:39 +00:00
SETVARS = "POSTGIS_ENABLE_OUTDB_RASTERS=1 POSTGIS_GDAL_ENABLED_DRIVERS=ENABLE_ALL"
LOCALONLY = "-c listen_addresses='127.0.0.1'"
2023-09-04 19:56:45 +00:00
PG_BASEBACKUP = " /usr/lib/postgresql/ ${ POSTGRES_MAJOR_VERSION } /bin/pg_basebackup "
2022-04-29 13:52:14 +00:00
NODE_PROMOTION = " /usr/lib/postgresql/ ${ POSTGRES_MAJOR_VERSION } /bin/pg_ctl "
2023-09-04 19:56:45 +00:00
DATA_DIR_CONTROL = " /usr/lib/postgresql/ ${ POSTGRES_MAJOR_VERSION } /bin/pg_controldata "
2018-03-21 20:53:39 +00:00
PGSTAT_TMP = "/var/run/postgresql/"
2020-10-09 06:09:56 +00:00
PG_PID = " /var/run/postgresql/ ${ POSTGRES_MAJOR_VERSION } -main.pid "
2018-03-21 20:53:39 +00:00
2019-09-06 11:47:42 +00:00
2021-06-10 16:27:48 +00:00
2020-01-23 13:07:23 +00:00
# Read data from secrets into env variables.
# usage: file_env VAR [DEFAULT]
# ie: file_env 'XYZ_DB_PASSWORD' 'example'
# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of
# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature)
2023-09-04 19:56:45 +00:00
function file_env( ) {
2020-01-23 13:07:23 +00:00
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 "
}
2020-04-08 08:15:45 +00:00
function boolean( ) {
case $1 in
[ Tt] [ Rr] [ Uu] [ Ee] | [ Yy] [ Ee] [ Ss] )
echo 'TRUE'
; ;
*)
echo 'FALSE'
; ;
esac
}
2020-01-23 13:07:23 +00:00
file_env 'POSTGRES_PASS'
file_env 'POSTGRES_USER'
2023-09-04 19:56:45 +00:00
2020-01-23 13:07:23 +00:00
2020-10-01 15:55:53 +00:00
function create_dir( ) {
DATA_PATH = $1
if [ [ ! -d ${ DATA_PATH } ] ] ;
then
2023-08-20 21:27:11 +00:00
echo "Creating" " ${ DATA_PATH } " "directory"
mkdir -p " ${ DATA_PATH } "
2020-10-01 15:55:53 +00:00
fi
}
2021-06-06 15:36:15 +00:00
2022-04-27 06:30:16 +00:00
function generate_random_string( ) {
STRING_LENGTH = $1
2022-12-20 15:43:58 +00:00
random_pass_string = $( cat /dev/urandom | tr -dc '[:alnum:]' | head -c " ${ STRING_LENGTH } " )
2022-04-27 06:30:16 +00:00
if [ [ ! -f /scripts/.pass_${ STRING_LENGTH } .txt ] ] ; then
2023-08-20 21:27:11 +00:00
echo " ${ random_pass_string } " > /scripts/.pass_" ${ STRING_LENGTH } " .txt
2022-04-27 06:30:16 +00:00
fi
2023-08-20 21:27:11 +00:00
RAND = $( cat /scripts/.pass_" ${ STRING_LENGTH } " .txt)
export RAND
2022-04-27 06:30:16 +00:00
}
2021-06-06 15:36:15 +00:00
2018-03-21 20:53:39 +00:00
# Make sure we have a user set up
if [ -z " ${ POSTGRES_USER } " ] ; then
POSTGRES_USER = docker
fi
2021-06-06 15:36:15 +00:00
2022-04-27 06:30:16 +00:00
if [ -z " ${ POSTGRES_PASS } " ] ; then
generate_random_string 20
POSTGRES_PASS = ${ RAND }
fi
2018-03-21 20:53:39 +00:00
if [ -z " ${ POSTGRES_DBNAME } " ] ; then
POSTGRES_DBNAME = gis
fi
2020-04-28 15:01:39 +00:00
# If datadir is not defined, then use this
if [ -z " ${ DATADIR } " ] ; then
DATADIR = ${ DEFAULT_DATADIR }
2020-04-08 08:15:45 +00:00
fi
2021-06-06 15:36:15 +00:00
2020-04-08 08:15:45 +00:00
# RECREATE_DATADIR flag default value
# Always assume that we don't want to recreate datadir if not explicitly defined
# For issue: https://github.com/kartoza/docker-postgis/issues/226
if [ -z " ${ RECREATE_DATADIR } " ] ; then
RECREATE_DATADIR = FALSE
else
RECREATE_DATADIR = $( boolean ${ RECREATE_DATADIR } )
fi
2021-05-17 19:50:50 +00:00
if [ -z " ${ SSL_DIR } " ] ; then
SSL_DIR = "/ssl_certificates"
fi
2022-04-29 14:05:31 +00:00
if [ -z " ${ WAL_ARCHIVE } " ] ; then
WAL_ARCHIVE = ${ DEFAULT_WAL_ARCHIVE }
fi
if [ -z " ${ SCRIPTS_LOCKFILE_DIR } " ] ; then
SCRIPTS_LOCKFILE_DIR = ${ DEFAULT_SCRIPTS_LOCKFILE_DIR }
fi
if [ -z " ${ CONF_LOCKFILE_DIR } " ] ; then
CONF_LOCKFILE_DIR = ${ DEFAULT_CONF_LOCKFILE_DIR }
fi
if [ -z " ${ EXTRA_CONF_DIR } " ] ; then
EXTRA_CONF_DIR = ${ DEFAULT_EXTRA_CONF_DIR }
fi
2018-03-21 20:53:39 +00:00
# Enable hstore and topology by default
if [ -z " ${ HSTORE } " ] ; then
HSTORE = true
fi
if [ -z " ${ TOPOLOGY } " ] ; then
TOPOLOGY = true
fi
# Replication settings
2020-10-01 15:55:53 +00:00
if [ -z " ${ REPLICATION } " ] ; then
2020-10-09 06:09:56 +00:00
REPLICATION = false
2020-10-01 15:55:53 +00:00
fi
2018-03-21 20:53:39 +00:00
if [ -z " ${ REPLICATE_PORT } " ] ; then
REPLICATE_PORT = 5432
fi
if [ -z " ${ DESTROY_DATABASE_ON_RESTART } " ] ; then
DESTROY_DATABASE_ON_RESTART = true
fi
if [ -z " ${ PG_MAX_WAL_SENDERS } " ] ; then
2019-02-20 10:28:14 +00:00
PG_MAX_WAL_SENDERS = 10
2018-03-21 20:53:39 +00:00
fi
2020-10-09 06:09:56 +00:00
if [ -z " ${ PG_WAL_KEEP_SIZE } " ] ; then
PG_WAL_KEEP_SIZE = 20
2018-03-21 20:53:39 +00:00
fi
2020-10-01 15:55:53 +00:00
#Logical replication settings
if [ -z " ${ MAX_LOGICAL_REPLICATION_WORKERS } " ] ; then
MAX_LOGICAL_REPLICATION_WORKERS = 4
fi
if [ -z " ${ MAX_SYNC_WORKERS_PER_SUBSCRIPTION } " ] ; then
MAX_SYNC_WORKERS_PER_SUBSCRIPTION = 2
fi
2019-01-25 12:57:23 +00:00
if [ -z " ${ IP_LIST } " ] ; then
IP_LIST = '*'
fi
2018-03-21 20:53:39 +00:00
2019-08-23 13:43:58 +00:00
if [ -z " ${ MAINTAINANCE_WORKERS } " ] ; then
MAINTAINANCE_WORKERS = 2
fi
2020-02-12 09:34:49 +00:00
if [ -z " ${ ARCHIVE_MODE } " ] ; then
# https://www.postgresql.org/docs/12/runtime-config-wal.html
ARCHIVE_MODE = off
fi
2022-05-09 18:43:27 +00:00
if [ -z " ${ ARCHIVE_COMPRESSION } " ] ; then
ARCHIVE_COMPRESSION = gzip
fi
if [ -z " ${ ARCHIVE_DECOMPRESSION } " ] ; then
ARCHIVE_DECOMPRESSION = gunzip
fi
2020-02-12 09:34:49 +00:00
if [ -z " ${ ARCHIVE_COMMAND } " ] ; then
2022-05-09 18:43:27 +00:00
# https://www.postgresql.org/docs/14/continuous-archiving.html#BACKUP-ARCHIVING-
if [ [ ${ ARCHIVE_COMPRESSION } = = 'gzip' ] ] ; then
ARCHIVE_COMMAND = " test ! -f ${ WAL_ARCHIVE } /%f && gzip %p > ${ WAL_ARCHIVE } /%f.gz "
else
ARCHIVE_COMMAND = " test ! -f ${ WAL_ARCHIVE } /%f && cp %p ${ WAL_ARCHIVE } /%f "
fi
2020-02-12 09:34:49 +00:00
fi
if [ -z " ${ RESTORE_COMMAND } " ] ; then
2022-05-09 18:43:27 +00:00
# https://www.postgresql.org/docs/14/runtime-config-wal.html
if [ [ " ${ ARCHIVE_DECOMPRESSION } " = = 'gunzip' ] ] ; then
RESTORE_COMMAND = " gunzip < ${ WAL_ARCHIVE } /%f.gz > %p "
else
RESTORE_COMMAND = " cp ${ WAL_ARCHIVE } /%f \"%p\" "
fi
2020-02-12 09:34:49 +00:00
fi
if [ -z " ${ ARCHIVE_CLEANUP_COMMAND } " ] ; then
# https://www.postgresql.org/docs/12/runtime-config-wal.html
2023-09-04 19:56:45 +00:00
ARCHIVE_CLEANUP_COMMAND = " /usr/lib/postgresql/ ${ POSTGRES_MAJOR_VERSION } /bin/pg_archivecleanup ${ WAL_ARCHIVE } %r "
2020-02-12 09:34:49 +00:00
fi
if [ -z " ${ WAL_LEVEL } " ] ; then
# https://www.postgresql.org/docs/12/runtime-config-wal.html
WAL_LEVEL = replica
fi
2019-08-23 13:43:58 +00:00
if [ -z " ${ WAL_SIZE } " ] ; then
2019-09-06 11:47:42 +00:00
WAL_SIZE = 4GB
fi
if [ -z " ${ MIN_WAL_SIZE } " ] ; then
2020-10-09 06:09:56 +00:00
MIN_WAL_SIZE = 1024MB
2019-08-23 13:43:58 +00:00
fi
2019-09-06 11:47:42 +00:00
if [ -z " ${ WAL_SEGSIZE } " ] ; then
2020-10-09 06:09:56 +00:00
WAL_SEGSIZE = 32
fi
if [ -z " ${ SHARED_BUFFERS } " ] ; then
SHARED_BUFFERS = 256MB
fi
if [ -z " ${ WORK_MEM } " ] ; then
WORK_MEM = 16MB
fi
if [ -z " ${ WAL_BUFFERS } " ] ; then
WAL_BUFFERS = 1MB
2019-09-06 11:47:42 +00:00
fi
2019-08-23 13:43:58 +00:00
if [ -z " ${ CHECK_POINT_TIMEOUT } " ] ; then
CHECK_POINT_TIMEOUT = 30min
fi
if [ -z " ${ MAX_WORKERS } " ] ; then
MAX_WORKERS = 4
fi
2019-09-06 11:47:42 +00:00
if [ -z " ${ MAINTAINANCE_WORK_MEM } " ] ; then
MAINTAINANCE_WORK_MEM = 128MB
2019-08-23 13:43:58 +00:00
fi
2019-06-13 15:39:40 +00:00
if [ -z " ${ SSL_CERT_FILE } " ] ; then
SSL_CERT_FILE = '/etc/ssl/certs/ssl-cert-snakeoil.pem'
fi
if [ -z " ${ SSL_KEY_FILE } " ] ; then
SSL_KEY_FILE = '/etc/ssl/private/ssl-cert-snakeoil.key'
fi
2022-05-09 16:12:01 +00:00
# SSL mode
function postgres_ssl_setup( ) {
if [ -z " ${ PGSSLMODE } " ] ; then
PGSSLMODE = require
fi
if [ [ ${ PGSSLMODE } = = 'verify-ca' || ${ PGSSLMODE } = = 'verify-full' ] ] ; then
export PARAMS = " sslmode= ${ PGSSLMODE } &sslcert= ${ SSL_CERT_FILE } &sslkey= ${ SSL_KEY_FILE } &sslrootcert= ${ SSL_CA_FILE } "
elif [ [ ${ PGSSLMODE } = = 'disable' || ${ PGSSLMODE } = = 'allow' || ${ PGSSLMODE } = = 'prefer' || ${ PGSSLMODE } = = 'require' ] ] ; then
export PARAMS = " sslmode= ${ PGSSLMODE } "
fi
}
2019-02-20 10:28:14 +00:00
if [ -z " ${ POSTGRES_MULTIPLE_EXTENSIONS } " ] ; then
2022-02-11 10:03:44 +00:00
if [ [ $( dpkg -l | grep "timescaledb" ) > /dev/null ] ] ; then
POSTGRES_MULTIPLE_EXTENSIONS = 'postgis,hstore,postgis_topology,postgis_raster,pgrouting,timescaledb'
else
POSTGRES_MULTIPLE_EXTENSIONS = 'postgis,hstore,postgis_topology,postgis_raster,pgrouting'
fi
2019-02-20 10:28:14 +00:00
fi
2019-09-06 11:47:42 +00:00
2020-01-29 05:59:54 +00:00
2019-10-22 09:31:59 +00:00
if [ -z " ${ ALLOW_IP_RANGE } " ] ; then
ALLOW_IP_RANGE = '0.0.0.0/0'
fi
2019-09-06 11:47:42 +00:00
if [ -z " ${ DEFAULT_ENCODING } " ] ; then
DEFAULT_ENCODING = "UTF8"
fi
2020-02-15 16:37:37 +00:00
if [ -z " ${ PGCLIENTENCODING } " ] ; then
PGCLIENTENCODING = "UTF8"
fi
2019-09-06 11:47:42 +00:00
if [ -z " ${ DEFAULT_COLLATION } " ] ; then
DEFAULT_COLLATION = "en_US.UTF-8"
fi
if [ -z " ${ DEFAULT_CTYPE } " ] ; then
DEFAULT_CTYPE = "en_US.UTF-8"
fi
2019-11-25 12:47:29 +00:00
if [ -z " ${ TARGET_TIMELINE } " ] ; then
TARGET_TIMELINE = 'latest'
fi
if [ -z " ${ TARGET_ACTION } " ] ; then
TARGET_ACTION = 'promote'
fi
if [ -z " ${ REPLICATION_USER } " ] ; then
REPLICATION_USER = replicator
fi
2022-04-27 06:30:16 +00:00
if [ -z " ${ REPLICATION_PASS } " ] ; then
generate_random_string 22
REPLICATION_PASS = ${ RAND }
fi
2019-10-25 12:43:15 +00:00
2021-03-01 13:00:39 +00:00
if [ -z " $IGNORE_INIT_HOOK_LOCKFILE " ] ; then
IGNORE_INIT_HOOK_LOCKFILE = false
fi
2019-10-25 12:43:15 +00:00
if [ -z " $EXTRA_CONF " ] ; then
EXTRA_CONF = ""
fi
2023-08-20 21:27:11 +00:00
if [ -z " $ACTIVATE_CRON " ] ; then
ACTIVATE_CRON = TRUE
fi
2020-04-14 17:00:36 +00:00
if [ -z " ${ SHARED_PRELOAD_LIBRARIES } " ] ; then
2022-02-11 10:03:44 +00:00
if [ [ $( dpkg -l | grep "timescaledb" ) > /dev/null ] ] ; then
2023-08-20 21:27:11 +00:00
if [ [ ${ ACTIVATE_CRON } = ~ [ Tt] [ Rr] [ Uu] [ Ee] ] ] ; then
SHARED_PRELOAD_LIBRARIES = 'pg_cron,timescaledb'
else
SHARED_PRELOAD_LIBRARIES = 'timescaledb'
fi
2022-12-06 17:05:26 +00:00
else
2023-08-20 21:27:11 +00:00
if [ [ ${ ACTIVATE_CRON } = ~ [ Tt] [ Rr] [ Uu] [ Ee] ] ] ; then
SHARED_PRELOAD_LIBRARIES = 'pg_cron'
fi
2022-02-11 10:03:44 +00:00
fi
2020-04-14 17:00:36 +00:00
fi
2020-05-01 05:33:49 +00:00
if [ -z " $PASSWORD_AUTHENTICATION " ] ; then
2020-10-09 06:09:56 +00:00
PASSWORD_AUTHENTICATION = "scram-sha-256"
2020-05-01 05:33:49 +00:00
fi
2021-03-01 06:42:38 +00:00
if [ -z " ${ ALL_DATABASES } " ] ; then
ALL_DATABASES = FALSE
fi
2021-05-04 11:10:19 +00:00
if [ -z " ${ FORCE_SSL } " ] ; then
FORCE_SSL = FALSE
fi
2021-12-03 17:08:00 +00:00
if [ -z " ${ ACCEPT_TIMESCALE_TUNING } " ] ; then
ACCEPT_TIMESCALE_TUNING = FALSE
fi
if [ -z " ${ TIMESCALE_TUNING_PARAMS } " ] ; then
TIMESCALE_TUNING_PARAMS =
fi
2023-03-25 09:13:07 +00:00
if [ -z " ${ TIMESCALE_TUNING_CONFIG } " ] ; then
TIMESCALE_TUNING_CONFIG = time_scale_tuning.conf
fi
2023-02-01 04:42:32 +00:00
if [ -z " ${ RUN_AS_ROOT } " ] ; then
RUN_AS_ROOT = true
fi
2018-03-21 20:53:39 +00:00
# Compatibility with official postgres variable
# Official postgres variable gets priority
2020-04-08 08:15:45 +00:00
if [ -n " ${ POSTGRES_PASSWORD } " ] ; then
2018-03-21 20:53:39 +00:00
POSTGRES_PASS = ${ POSTGRES_PASSWORD }
fi
2020-04-08 08:15:45 +00:00
if [ -n " ${ PGDATA } " ] ; then
2018-03-21 20:53:39 +00:00
DATADIR = ${ PGDATA }
fi
2020-04-08 08:15:45 +00:00
if [ -n " ${ POSTGRES_DB } " ] ; then
2018-03-21 20:53:39 +00:00
POSTGRES_DBNAME = ${ POSTGRES_DB }
fi
2019-12-19 21:18:10 +00:00
2020-04-08 08:15:45 +00:00
if [ -n " ${ POSTGRES_INITDB_ARGS } " ] ; then
INITDB_EXTRA_ARGS = ${ POSTGRES_INITDB_ARGS }
fi
2023-08-31 15:37:28 +00:00
IFS = ','
read -a dbarr <<< " $POSTGRES_DBNAME "
SINGLE_DB = ${ dbarr [0] }
export ${ SINGLE_DB }
2020-04-08 08:15:45 +00:00
2020-06-14 16:22:13 +00:00
if [ -z " ${ TIMEZONE } " ] ; then
TIMEZONE = 'Etc/UTC'
fi
2020-04-08 08:15:45 +00:00
2023-09-04 19:56:45 +00:00
if [ -z " ${ KERNEL_SHMMAX } " ] ; then
KERNEL_SHMMAX = 543252480
fi
if [ -z " ${ KERNEL_SHMALL } " ] ; then
KERNEL_SHMALL = 2097152
fi
if [ -z " ${ PROMOTE_MASTER } " ] ; then
PROMOTE_MASTER = FALSE
fi
2019-12-19 21:18:10 +00:00
# usable function definitions
2020-04-08 08:15:45 +00:00
function kill_postgres {
2023-08-20 21:27:11 +00:00
PID = $( cat " ${ PG_PID } " )
kill -TERM " ${ PID } "
2020-04-08 08:15:45 +00:00
# Wait for background postgres main process to exit
# wait until PID file gets deleted
2023-08-20 21:27:11 +00:00
while ls -A " ${ PG_PID } " 2> /dev/null; do
2020-04-08 08:15:45 +00:00
sleep 1
done
return 0
}
2019-12-19 21:18:10 +00:00
function restart_postgres {
2020-04-08 08:15:45 +00:00
kill_postgres
# Brought postgres back up again
2022-04-27 06:30:16 +00:00
source /scripts/env-data.sh
2020-04-08 08:15:45 +00:00
su - postgres -c " $SETVARS $POSTGRES -D $DATADIR -c config_file= $CONF & "
# wait for postgres to come up
until su - postgres -c "pg_isready" ; do
sleep 1
done
echo "postgres ready"
return 0
}
# Running extended script or sql if provided.
# Useful for people who extends the image.
2021-12-03 16:09:56 +00:00
2020-04-08 08:15:45 +00:00
function entry_point_script {
2022-04-29 14:05:31 +00:00
SETUP_LOCKFILE = " ${ SCRIPTS_LOCKFILE_DIR } /.entry_point.lock "
2023-08-31 15:37:28 +00:00
IFS = ','
read -a dbarr <<< " $POSTGRES_DBNAME "
2020-04-08 08:15:45 +00:00
# If lockfile doesn't exists, proceed.
2022-12-02 11:44:07 +00:00
if [ [ ! -f " ${ SETUP_LOCKFILE } " ] ] || [ [ " ${ IGNORE_INIT_HOOK_LOCKFILE } " = ~ [ Tt] [ Rr] [ Uu] [ Ee] ] ] ; then
2020-04-08 08:15:45 +00:00
if find "/docker-entrypoint-initdb.d" -mindepth 1 -print -quit 2>/dev/null | grep -q .; then
for f in /docker-entrypoint-initdb.d/*; do
export PGPASSWORD = ${ POSTGRES_PASS }
case " $f " in
2021-12-03 16:09:56 +00:00
*.sql) echo " $0 : running $f " ;
if [ [ " ${ ALL_DATABASES } " = ~ [ Ff] [ Aa] [ Ll] [ Ss] [ Ee] ] ] ; then
2023-08-20 21:27:11 +00:00
psql " ${ SINGLE_DB } " -U ${ POSTGRES_USER } -p 5432 -h localhost -f " ${ f } " || true
2021-12-03 16:09:56 +00:00
else
2023-08-31 15:37:28 +00:00
for db in " ${ dbarr [@] } " ; do
2023-08-20 21:27:11 +00:00
psql " ${ db } " -U ${ POSTGRES_USER } -p 5432 -h localhost -f " ${ f } " || true
2021-12-03 16:09:56 +00:00
done
fi ; ;
*.sql.gz) echo " $0 : running $f " ;
if [ [ " ${ ALL_DATABASES } " = ~ [ Ff] [ Aa] [ Ll] [ Ss] [ Ee] ] ] ; then
2023-08-20 21:27:11 +00:00
gunzip < " $f " | psql " ${ SINGLE_DB } " -U ${ POSTGRES_USER } -p 5432 -h localhost || true
2021-12-03 16:09:56 +00:00
else
2023-08-31 15:37:28 +00:00
for db in " ${ dbarr [@] } " ; do
2023-08-20 21:27:11 +00:00
gunzip < " $f " | psql " ${ db } " -U ${ POSTGRES_USER } -p 5432 -h localhost || true
2021-12-03 16:09:56 +00:00
done
fi ; ;
2023-08-20 21:27:11 +00:00
*.sh) echo " $0 : running $f " ; . " $f " || true; ;
2021-12-03 16:09:56 +00:00
*) echo " $0 : ignoring $f " ; ;
esac
echo
2020-04-08 08:15:45 +00:00
done
# Put lock file to make sure entry point scripts were run
touch ${ SETUP_LOCKFILE }
fi
fi
return 0
2019-12-19 21:18:10 +00:00
}
2021-01-02 21:34:42 +00:00
function configure_replication_permissions {
2023-02-01 04:42:32 +00:00
if [ [ ${ RUN_AS_ROOT } = ~ [ Ff] [ Aa] [ Ll] [ Ss] [ Ee] ] ] ; then
echo -e "[Entrypoint] \e[1;31m Setup data permissions for replication as a normal user \033[0m"
chown -R " ${ USER_NAME } " :" ${ DB_GROUP_NAME } " $( getent passwd postgres | cut -d: -f6)
echo " ${ REPLICATE_FROM } : ${ REPLICATE_PORT } :*: ${ REPLICATION_USER } : ${ REPLICATION_PASS } " > /home/" ${ USER_NAME } " /.pgpass
chmod 600 /home/" ${ USER_NAME } " /.pgpass
chown -R " ${ USER_NAME } " :" ${ DB_GROUP_NAME } " /home/" ${ USER_NAME } " /.pgpass
non_root_permission " ${ USER_NAME } " " ${ DB_GROUP_NAME } "
else
2023-08-20 21:27:11 +00:00
chown -R postgres:postgres " ${ DATADIR } " ${ WAL_ARCHIVE }
chmod -R 750 " ${ DATADIR } " ${ WAL_ARCHIVE }
2023-02-01 04:42:32 +00:00
echo -e "[Entrypoint] \e[1;31m Setup data permissions for replication as root user \033[0m"
chown -R postgres:postgres $( getent passwd postgres | cut -d: -f6)
su - postgres -c " echo \" ${ REPLICATE_FROM } : ${ REPLICATE_PORT } :*: ${ REPLICATION_USER } : ${ REPLICATION_PASS } \" > ~/.pgpass "
su - postgres -c "chmod 0600 ~/.pgpass"
fi
2021-01-02 21:34:42 +00:00
}
function streaming_replication {
2023-08-31 15:37:28 +00:00
until START_COMMAND " ${ PG_BASEBACKUP } -X stream -h ${ REPLICATE_FROM } -p ${ REPLICATE_PORT } -D ${ DATADIR } -U ${ REPLICATION_USER } -R -vP -w --label=gis_pg_custer "
2023-02-01 04:42:32 +00:00
do
echo -e "[Entrypoint] \e[1;31m Waiting for master to connect... \033[0m"
sleep 1s
2023-08-20 21:27:11 +00:00
if [ [ " $( ls -A " ${ DATADIR } " ) " ] ] ; then
2023-02-01 04:42:32 +00:00
echo -e "[Entrypoint] \e[1;31m Need empty folder. Cleaning directory... \033[0m"
2023-08-20 21:27:11 +00:00
rm -rf " ${ DATADIR : ? } / " *
2023-02-01 04:42:32 +00:00
fi
done
2021-01-02 21:34:42 +00:00
}
2021-06-06 15:36:15 +00:00
2022-10-26 05:39:14 +00:00
function over_write_conf( ) {
if [ [ -f ${ ROOT_CONF } /postgis.conf ] ] ; then
sed -i '/postgis.conf/d' " ${ ROOT_CONF } " /postgresql.conf
cat " ${ ROOT_CONF } " /postgis.conf >> " ${ ROOT_CONF } " /postgresql.conf
fi
if [ [ -f ${ ROOT_CONF } /logical_replication.conf ] ] ; then
sed -i '/logical_replication.conf/d' " ${ ROOT_CONF } " /postgresql.conf
cat " ${ ROOT_CONF } " /logical_replication.conf >> " ${ ROOT_CONF } " /postgresql.conf
fi
if [ [ -f ${ ROOT_CONF } /streaming_replication.conf ] ] ; then
sed -i '/streaming_replication.conf/d' " ${ ROOT_CONF } " /postgresql.conf
cat " ${ ROOT_CONF } " /streaming_replication.conf >> " ${ ROOT_CONF } " /postgresql.conf
fi
if [ [ -f ${ ROOT_CONF } /extra.conf ] ] ; then
sed -i '/extra.conf/d' " ${ ROOT_CONF } " /postgresql.conf
cat " ${ ROOT_CONF } " /extra.conf >> " ${ ROOT_CONF } " /postgresql.conf
fi
2023-03-25 09:13:07 +00:00
2022-10-26 05:39:14 +00:00
}
2021-06-10 16:27:48 +00:00
2023-08-19 18:22:21 +00:00
2022-12-23 13:50:45 +00:00
function extension_install( ) {
DATABASE = $1
2023-08-20 21:27:11 +00:00
DB_EXTENSION = $2
2022-12-23 13:50:45 +00:00
IFS = ':'
2023-08-20 21:27:11 +00:00
read -a strarr <<< " ${ DB_EXTENSION } "
2022-12-23 13:50:45 +00:00
EXTENSION_NAME = ${ strarr [0] }
EXTENSION_VERSION = ${ strarr [1] }
if [ [ -z ${ EXTENSION_VERSION } ] ] ; then
if [ [ ${ EXTENSION_NAME } != 'pg_cron' ] ] ; then
echo -e " \e[32m [Entrypoint] Enabling extension \e[1;31m ${ EXTENSION_NAME } \e[32m in the database : \e[1;31m ${ DATABASE } \033[0m "
2023-08-20 21:27:11 +00:00
psql " ${ DATABASE } " -U ${ POSTGRES_USER } -p 5432 -h localhost -c " CREATE EXTENSION IF NOT EXISTS \" ${ EXTENSION_NAME } \" cascade; "
2022-12-23 13:50:45 +00:00
fi
else
if [ [ ${ EXTENSION_NAME } != 'pg_cron' ] ] ; then
2023-07-01 07:47:21 +00:00
pattern = " ${ EXTENSION_NAME } -- "
last_numbers = ( )
2023-08-20 21:27:11 +00:00
for file in " $EXTDIR " /" ${ pattern } " *; do
2023-07-01 07:47:21 +00:00
filename = $( basename " $file " .sql)
if [ [ " $filename " = = *"--" * ] ] ; then
last_number = $( echo " $filename " | awk -F '--' '{print $NF}' )
if [ [ ! " ${ last_numbers [@] } " = ~ " $last_number " ] ] ; then
last_numbers += ( " $last_number " )
fi
fi
done
if [ [ " ${ last_numbers [@] } " = ~ " $EXTENSION_VERSION " ] ] ; then
echo -e " \e[32m [Entrypoint] Installing extension \e[1;31m ${ EXTENSION_NAME } \e[32m with version \e[1;31m ${ EXTENSION_VERSION } \e[32m in the database : \e[1;31m ${ DATABASE } \033[0m "
2023-08-20 21:27:11 +00:00
psql " ${ DATABASE } " -U ${ POSTGRES_USER } -p 5432 -h localhost -c " CREATE EXTENSION IF NOT EXISTS \" ${ EXTENSION_NAME } \" WITH VERSION ' ${ EXTENSION_VERSION } ' cascade; "
2023-07-01 07:47:21 +00:00
else
echo -e " \e[32m [Entrypoint] Extension \e[1;31m ${ EXTENSION_NAME } \e[32m with version \e[1;31m ${ EXTENSION_VERSION } \e[32m is not available for install, available versions to install are \e[1;31m " ${ last_numbers [@] } " \033[0m"
fi
2022-12-23 13:50:45 +00:00
fi
fi
2023-02-01 04:42:32 +00:00
}
2023-08-19 18:22:21 +00:00
2023-02-01 04:42:32 +00:00
function directory_checker( ) {
DATA_PATH = $1
2023-08-20 21:27:11 +00:00
if [ -d " $DATA_PATH " ] ; then
DB_USER_PERM = $( stat -c '%U' " ${ DATA_PATH } " )
DB_GRP_PERM = $( stat -c '%G' " ${ DATA_PATH } " )
2023-04-22 04:34:37 +00:00
if [ [ ${ DB_USER_PERM } != " ${ USER } " ] ] && [ [ ${ DB_GRP_PERM } != " ${ GROUP } " ] ] ; then
2023-08-20 21:27:11 +00:00
chown -R " ${ USER } " :" ${ GROUP } " " ${ DATA_PATH } "
2023-04-22 04:34:37 +00:00
fi
2023-02-01 04:42:32 +00:00
fi
}
function non_root_permission( ) {
USER = " $1 "
GROUP = " $2 "
path_envs = ( " ${ DATADIR } " " ${ WAL_ARCHIVE } " " ${ SCRIPTS_LOCKFILE_DIR } " " ${ CONF_LOCKFILE_DIR } " " ${ EXTRA_CONF_DIR } " " ${ SSL_DIR } " " ${ POSTGRES_INITDB_WALDIR } " )
for dir_names in " ${ path_envs [@] } " ; do
if [ ! -z " ${ dir_names } " ] ; then
directory_checker " ${ dir_names } "
fi
done
2023-09-04 19:56:45 +00:00
services = ( "/usr/lib/postgresql/" "/etc/" "/var/log/postgresql" "/var/run/!(secrets)" "/var/lib/" "/usr/bin" "/tmp" "/scripts" )
2023-02-01 04:42:32 +00:00
for paths in " ${ services [@] } " ; do
2023-08-20 21:27:11 +00:00
directory_checker " ${ paths } "
2023-02-01 04:42:32 +00:00
done
2023-08-20 21:27:11 +00:00
chmod -R 750 " ${ DATADIR } " ${ WAL_ARCHIVE }
2023-02-01 04:42:32 +00:00
}
2023-08-19 18:22:21 +00:00
function role_check( ) {
ROLE_NAME = $1
echo " Creating user $1 "
RESULT = $( su - postgres -c " psql postgres -t -c \"SELECT 1 FROM pg_roles WHERE rolname = ' $ROLE_NAME '\" " )
COMMAND = "ALTER"
if [ -z " $RESULT " ] ; then
export COMMAND = "CREATE"
fi
}
2023-09-04 19:56:45 +00:00