kopia lustrzana https://github.com/kartoza/docker-postgis
add multiple super users
rodzic
f124d2349c
commit
3b5b0090d0
|
@ -376,6 +376,21 @@ list=(`echo ${POSTGRES_DBNAME} | tr ',' ' '`)
|
|||
arr=(${list})
|
||||
SINGLE_DB=${arr[0]}
|
||||
|
||||
pass_list=(`echo ${POSTGRES_PASS} | tr ',' ' '`)
|
||||
pass_arr=(${pass_list})
|
||||
SINGLE_PASS=${pass_arr[0]}
|
||||
|
||||
user_list=(`echo ${POSTGRES_USER} | tr ',' ' '`)
|
||||
arr_val=(${user_list})
|
||||
SINGLE_USER=${arr_val[0]}
|
||||
|
||||
function env_array() {
|
||||
ENV_NAME=$1
|
||||
IFS=','
|
||||
read -a strarr <<< "$ENV_NAME"
|
||||
|
||||
}
|
||||
|
||||
if [ -z "${TIMEZONE}" ]; then
|
||||
TIMEZONE='Etc/UTC'
|
||||
fi
|
||||
|
@ -421,22 +436,24 @@ function entry_point_script {
|
|||
if [[ ! -f "${SETUP_LOCKFILE}" ]] || [[ "${IGNORE_INIT_HOOK_LOCKFILE}" =~ [Tt][Rr][Uu][Ee] ]]; then
|
||||
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}
|
||||
export PGPASSWORD=${SINGLE_PASS}
|
||||
case "$f" in
|
||||
*.sql) echo "$0: running $f";
|
||||
if [[ "${ALL_DATABASES}" =~ [Ff][Aa][Ll][Ss][Ee] ]]; then
|
||||
psql ${SINGLE_DB} -U ${POSTGRES_USER} -p 5432 -h localhost -f ${f} || true
|
||||
psql ${SINGLE_DB} -U ${SINGLE_USER} -p 5432 -h localhost -f ${f} || true
|
||||
else
|
||||
for db in $(echo ${POSTGRES_DBNAME} | tr ',' ' '); do
|
||||
psql ${db} -U ${POSTGRES_USER} -p 5432 -h localhost -f ${f} || true
|
||||
env_array ${POSTGRES_DBNAME}
|
||||
for db in "${strarr[@]}";do
|
||||
psql ${db} -U ${SINGLE_USER} -p 5432 -h localhost -f ${f} || true
|
||||
done
|
||||
fi;;
|
||||
*.sql.gz) echo "$0: running $f";
|
||||
if [[ "${ALL_DATABASES}" =~ [Ff][Aa][Ll][Ss][Ee] ]]; then
|
||||
gunzip < "$f" | psql ${SINGLE_DB} -U ${POSTGRES_USER} -p 5432 -h localhost || true
|
||||
gunzip < "$f" | psql ${SINGLE_DB} -U ${SINGLE_USER} -p 5432 -h localhost || true
|
||||
else
|
||||
for db in $(echo ${POSTGRES_DBNAME} | tr ',' ' '); do
|
||||
gunzip < "$f" | psql ${db} -U ${POSTGRES_USER} -p 5432 -h localhost || true
|
||||
env_array ${POSTGRES_DBNAME}
|
||||
for db in "${strarr[@]}";do
|
||||
gunzip < "$f" | psql ${db} -U ${SINGLE_USER} -p 5432 -h localhost || true
|
||||
done
|
||||
fi;;
|
||||
*.sh) echo "$0: running $f"; . $f || true;;
|
||||
|
@ -494,22 +511,25 @@ function over_write_conf() {
|
|||
|
||||
}
|
||||
|
||||
|
||||
|
||||
function extension_install() {
|
||||
DATABASE=$1
|
||||
DB_EXTENSION=$2
|
||||
IFS=':'
|
||||
read -a strarr <<< "$ext"
|
||||
read -a strarr <<< "${DB_EXTENSION}"
|
||||
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"
|
||||
psql ${DATABASE} -U ${POSTGRES_USER} -p 5432 -h localhost -c "CREATE EXTENSION IF NOT EXISTS \"${EXTENSION_NAME}\" cascade;"
|
||||
psql ${DATABASE} -U ${SINGLE_USER} -p 5432 -h localhost -c "CREATE EXTENSION IF NOT EXISTS \"${EXTENSION_NAME}\" cascade;"
|
||||
fi
|
||||
else
|
||||
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"
|
||||
if [[ ${EXTENSION_NAME} != 'pg_cron' ]]; then
|
||||
psql ${DATABASE} -U ${POSTGRES_USER} -p 5432 -h localhost -c "CREATE EXTENSION IF NOT EXISTS \"${EXTENSION_NAME}\" WITH VERSION '${EXTENSION_VERSION}' cascade;"
|
||||
psql ${DATABASE} -U ${SINGLE_USER} -p 5432 -h localhost -c "CREATE EXTENSION IF NOT EXISTS \"${EXTENSION_NAME}\" WITH VERSION '${EXTENSION_VERSION}' cascade;"
|
||||
fi
|
||||
fi
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,7 +40,7 @@ if [[ -z "$(ls -A ${DATADIR} 2> /dev/null)" || "${RECREATE_DATADIR}" =~ [Tt][Rr]
|
|||
create_dir "${DATADIR}"
|
||||
rm -rf ${DATADIR}/*
|
||||
chown -R postgres:postgres "${DATADIR}"
|
||||
command="$INITDB -U postgres --pwfile=<(echo "$POSTGRES_PASS") -E ${DEFAULT_ENCODING} --lc-collate=${DEFAULT_COLLATION} --lc-ctype=${DEFAULT_CTYPE} --wal-segsize=${WAL_SEGSIZE} --auth=${PASSWORD_AUTHENTICATION} -D ${DATADIR} ${INITDB_WALDIR_FLAG} ${INITDB_EXTRA_ARGS}"
|
||||
command="$INITDB -U postgres --pwfile=<(echo "$SINGLE_PASS") -E ${DEFAULT_ENCODING} --lc-collate=${DEFAULT_COLLATION} --lc-ctype=${DEFAULT_CTYPE} --wal-segsize=${WAL_SEGSIZE} --auth=${PASSWORD_AUTHENTICATION} -D ${DATADIR} ${INITDB_WALDIR_FLAG} ${INITDB_EXTRA_ARGS}"
|
||||
echo -e "\e[32m [Entrypoint] Initializing Cluster with the following commands Postgres Database at \e[1;31m $command \033[0m"
|
||||
su - postgres -c "$command"
|
||||
else
|
||||
|
@ -90,33 +90,35 @@ echo "postgres ready"
|
|||
# Setup user
|
||||
source /scripts/setup-user.sh
|
||||
|
||||
export PGPASSWORD=${POSTGRES_PASS}
|
||||
export PGPASSWORD=${SINGLE_PASS}
|
||||
|
||||
# Create a default db called 'gis' or $POSTGRES_DBNAME that you can use to get up and running quickly
|
||||
# It will be owned by the docker db user
|
||||
# Since we now pass a comma separated list in database creation we need to search for all databases as a test
|
||||
for db in $(echo ${POSTGRES_DBNAME} | tr ',' ' '); do
|
||||
IFS=','
|
||||
read -a dbarr <<< "$POSTGRES_DBNAME"
|
||||
for db in "${dbarr[@]}";do
|
||||
RESULT=`su - postgres -c "psql -t -c \"SELECT count(1) from pg_database where datname='${db}';\""`
|
||||
if [[ ${RESULT} -eq 0 ]]; then
|
||||
echo -e "\e[32m [Entrypoint] Create database \e[1;31m ${db} \033[0m"
|
||||
DB_CREATE=$(createdb -h localhost -p 5432 -U ${POSTGRES_USER} ${db})
|
||||
DB_CREATE=$(createdb -h localhost -p 5432 -U ${SINGLE_USER} ${db})
|
||||
eval ${DB_CREATE}
|
||||
psql ${SINGLE_DB} -U ${POSTGRES_USER} -p 5432 -h localhost -c 'CREATE EXTENSION IF NOT EXISTS pg_cron cascade;'
|
||||
psql ${SINGLE_DB} -U ${SINGLE_USER} -p 5432 -h localhost -c 'CREATE EXTENSION IF NOT EXISTS pg_cron cascade;'
|
||||
# Loop through extensions
|
||||
IFS=','
|
||||
read -a strarr <<< "$POSTGRES_MULTIPLE_EXTENSIONS"
|
||||
for ext in "${strarr[@]}";do
|
||||
extension_install ${db}
|
||||
extension_install ${db} ${ext}
|
||||
# enable extensions in template1 if env variable set to true
|
||||
if [[ "$(boolean ${POSTGRES_TEMPLATE_EXTENSIONS})" =~ [Tt][Rr][Uu][Ee] ]] ; then
|
||||
extension_install template1
|
||||
fi
|
||||
done
|
||||
echo -e "\e[32m [Entrypoint] loading legacy sql in database \e[1;31m ${db} \033[0m"
|
||||
psql ${db} -U ${POSTGRES_USER} -p 5432 -h localhost -f ${SQLDIR}/legacy_minimal.sql || true
|
||||
psql ${db} -U ${POSTGRES_USER} -p 5432 -h localhost -f ${SQLDIR}/legacy_gist.sql || true
|
||||
psql ${db} -U ${SINGLE_USER} -p 5432 -h localhost -f ${SQLDIR}/legacy_minimal.sql || true
|
||||
psql ${db} -U ${SINGLE_USER} -p 5432 -h localhost -f ${SQLDIR}/legacy_gist.sql || true
|
||||
if [[ "$WAL_LEVEL" =~ [Ll][Oo][Gg][Ii][Cc][Aa][Ll] ]];then
|
||||
psql ${db} -U ${POSTGRES_USER} -p 5432 -h localhost -c "CREATE PUBLICATION logical_replication;"
|
||||
psql ${db} -U ${SINGLE_USER} -p 5432 -h localhost -c "CREATE PUBLICATION logical_replication;"
|
||||
fi
|
||||
|
||||
else
|
||||
|
@ -128,15 +130,20 @@ done
|
|||
|
||||
|
||||
# Create schemas in the DB
|
||||
for db in $(echo ${POSTGRES_DBNAME} | tr ',' ' '); do
|
||||
for schema in $(echo ${SCHEMA_NAME} | tr ',' ' '); do
|
||||
SCHEMA_RESULT=$(psql -t ${db} -U ${POSTGRES_USER} -p 5432 -h localhost -c "select count(1) from information_schema.schemata where schema_name = '${schemas}' and catalog_name = '${db}';")
|
||||
|
||||
IFS=','
|
||||
read -a dbarr <<< "$POSTGRES_DBNAME"
|
||||
for db in "${dbarr[@]}";do
|
||||
IFS=','
|
||||
read -a schemaarr <<< "$SCHEMA_NAME"
|
||||
for schema in "${schemaarr[@]}";do
|
||||
SCHEMA_RESULT=$(psql -t ${db} -U ${SINGLE_USER} -p 5432 -h localhost -c "select count(1) from information_schema.schemata where schema_name = '${schema}' and catalog_name = '${db}';")
|
||||
if [[ ${SCHEMA_RESULT} -eq 0 ]] && [[ "${ALL_DATABASES}" =~ [Ff][Aa][Ll][Ss][Ee] ]]; then
|
||||
echo -e "\e[32m [Entrypoint] Creating schema \e[1;31m ${schema} \e[32m in database \e[1;31m ${SINGLE_DB} \033[0m"
|
||||
psql ${SINGLE_DB} -U ${POSTGRES_USER} -p 5432 -h localhost -c " CREATE SCHEMA IF NOT EXISTS ${schema};"
|
||||
psql ${SINGLE_DB} -U ${SINGLE_USER} -p 5432 -h localhost -c " CREATE SCHEMA IF NOT EXISTS ${schema};"
|
||||
elif [[ ${SCHEMA_RESULT} -eq 0 ]] && [[ "${ALL_DATABASES}" =~ [Tt][Rr][Uu][Ee] ]]; then
|
||||
echo -e "\e[32m [Entrypoint] Creating schema \e[1;31m ${schema} \e[32m in database \e[1;31m ${db} \033[0m"
|
||||
psql ${db} -U ${POSTGRES_USER} -p 5432 -h localhost -c " CREATE SCHEMA IF NOT EXISTS ${schema};"
|
||||
psql ${db} -U ${SINGLE_USER} -p 5432 -h localhost -c " CREATE SCHEMA IF NOT EXISTS ${schema};"
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
|
|
@ -16,13 +16,33 @@ source /scripts/env-data.sh
|
|||
# Slave database will just mirror from master users
|
||||
|
||||
# Check user already exists
|
||||
echo "Creating superuser $POSTGRES_USER"
|
||||
RESULT=`su - postgres -c "psql postgres -t -c \"SELECT 1 FROM pg_roles WHERE rolname = '$POSTGRES_USER'\""`
|
||||
COMMAND="ALTER"
|
||||
if [ -z "$RESULT" ]; then
|
||||
COMMAND="CREATE"
|
||||
|
||||
# TODO - Fragile check if a password already contains a comma
|
||||
SUPER_USERS=$(echo "$POSTGRES_USER" | awk -F "," '{print NF-1}')
|
||||
SUPER_USERS_PASSWORD=$(echo "$POSTGRES_PASS" | awk -F "," '{print NF-1}')
|
||||
|
||||
|
||||
|
||||
# check if the number of super users match the number of passwords defined
|
||||
if [[ ${SUPER_USERS} != ${SUPER_USERS_PASSWORD} ]];then
|
||||
echo -e "\e[1;31m Number of passwords and users should match \033[0m"
|
||||
exit 1
|
||||
else
|
||||
env_array ${POSTGRES_USER}
|
||||
for db_user in "${strarr[@]}"; do
|
||||
env_array ${POSTGRES_PASS}
|
||||
for db_pass in "${strarr[@]}"; do
|
||||
echo -e "\e[32m [Entrypoint] creating superuser \e[1;31m ${db_user} \033[0m"
|
||||
RESULT=`su - postgres -c "psql postgres -t -c \"SELECT 1 FROM pg_roles WHERE rolname = '$db_user'\""`
|
||||
COMMAND="ALTER"
|
||||
if [ -z "$RESULT" ]; then
|
||||
COMMAND="CREATE"
|
||||
fi
|
||||
su - postgres -c "psql postgres -c \"$COMMAND USER $db_user WITH SUPERUSER ENCRYPTED PASSWORD '$db_pass';\""
|
||||
done
|
||||
done
|
||||
fi
|
||||
su - postgres -c "psql postgres -c \"$COMMAND USER $POSTGRES_USER WITH SUPERUSER ENCRYPTED PASSWORD '$POSTGRES_PASS';\""
|
||||
|
||||
|
||||
|
||||
echo "Creating replication user $REPLICATION_USER"
|
||||
|
@ -32,4 +52,4 @@ if [ -z "$RESULT_REPLICATION" ]; then
|
|||
COMMANDS="CREATE"
|
||||
fi
|
||||
su - postgres -c "psql postgres -c \"$COMMANDS USER $REPLICATION_USER WITH REPLICATION ENCRYPTED PASSWORD '$REPLICATION_PASS';\""
|
||||
su - postgres -c "psql postgres -c \"GRANT pg_read_all_data TO $REPLICATION_USER;\""
|
||||
#su - postgres -c "psql postgres -c \"GRANT pg_read_all_data TO $REPLICATION_USER;\""
|
||||
|
|
Ładowanie…
Reference in New Issue