diff --git a/README.md b/README.md index a67a2c01..58fd8d31 100644 --- a/README.md +++ b/README.md @@ -730,7 +730,7 @@ Slave settings: - **DESTROY_DATABASE_ON_RESTART**: Default is `True`. Set to 'False' to prevent this behavior. A replicant will always destroy its current database on restart, because it will try to sync again from `master` and avoid inconsistencies. -- **PROMOTE_MASTER**: Default none. If set to any value then the current replicant +- **PROMOTE_MASTER**: Default false. If set to `true` then the current replicant will be promoted to master. In some cases when the `master` container has failed, we might want to use our `replicant` as `master` for a while. However, the promoted replicant will break consistencies and is not able to revert to replicant anymore, unless it is destroyed and diff --git a/commit-and-deploy.sh b/commit-and-deploy.sh deleted file mode 100755 index 4fa5766e..00000000 --- a/commit-and-deploy.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash -# Commit and redeploy the user map container -# -if [ $# -ne 1 ]; then - echo "Commit and then redeploy the user_map container." - echo "Usage:" - echo "$0 " - echo "e.g.:" - echo "$0 1.6" - echo "Will commit the current state of the container as version 1.6" - echo "and then redeploy it." - exit 1 -fi -VERSION=$1 -HOST_DATA_DIR=/var/docker-data/postgres-data -PGUSER=qgis -PGPASS=qgis - -IDFILE=/home/timlinux/postgis-current-container.id -ID=`cat $IDFILE` -docker commit $ID qgis/postgis:$VERSION -run='{"Cmd": ["/start.sh"], "PortSpecs": ["5432"], "Hostname": "postgis"}' -author="Tim Sutton " -docker kill $ID -docker rm $ID -rm $IDFILE -if [ ! -d $HOST_DATA_DIR ] -then - mkdir $HOST_DATA_DIR -fi -CMD="docker run -cidfile="$IDFILE" -name="postgis" -e POSTGRES_USER=$PGUSER -e POSTGRES_PASS=$PGPASS -d -v $HOST_DATA_DIR:/var/lib/postgresql -t qgis/postgis:$VERSION /start.sh" -echo 'Running:' -echo $CMD -eval $CMD -NEWID=`cat $IDFILE` -echo "Postgis has been committed as $1 and redeployed as $NEWID" -docker ps -a | grep $NEWID -echo "If thhere was no pre-existing database, you can access this using" -IPADDRESS=`docker inspect postgis | grep IPAddress | grep -o '[0-9\.]*'` -echo "psql -l -p 5432 -h $IPADDRESS -U $PGUSER" -echo "and password $PGPASS" diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index d765ccc2..00000000 --- a/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -docker-compose==1.28 \ No newline at end of file diff --git a/scenario_tests/collations/docker-compose.yml b/scenario_tests/collations/docker-compose.yml index 9e4e57e0..2fb399d0 100644 --- a/scenario_tests/collations/docker-compose.yml +++ b/scenario_tests/collations/docker-compose.yml @@ -1,5 +1,5 @@ -version: '2.1' +version: '3.9' volumes: pg-data-dir: @@ -11,8 +11,6 @@ services: pg: image: 'kartoza/postgis:${TAG:-manual-build}' restart: 'always' - # You can optionally mount to volume, to play with the persistence and - # observe how the node will behave after restarts. volumes: - pg-data-dir:/var/lib/postgresql - ./tests:/tests @@ -35,8 +33,6 @@ services: pg-new: image: 'kartoza/postgis:${TAG:-manual-build}' restart: 'always' - # You can optionally mount to volume, to play with the persistence and - # observe how the node will behave after restarts. volumes: - new-pg-data-dir:/opt/data/postgis - ./tests:/tests @@ -62,8 +58,6 @@ services: pg-gosu: image: 'kartoza/postgis:${TAG:-manual-build}' restart: 'always' - # You can optionally mount to volume, to play with the persistence and - # observe how the node will behave after restarts. volumes: - pg-data-dir-gs:/var/lib/postgresql - ./tests:/tests diff --git a/scenario_tests/datadir_init/docker-compose-gs.yml b/scenario_tests/datadir_init/docker-compose-gs.yml index c77d83e3..bb71d708 100644 --- a/scenario_tests/datadir_init/docker-compose-gs.yml +++ b/scenario_tests/datadir_init/docker-compose-gs.yml @@ -1,4 +1,4 @@ -version: '2.1' +version: '3.9' volumes: default-pg-data-dir: new-pg-data-dir: diff --git a/scenario_tests/datadir_init/docker-compose.yml b/scenario_tests/datadir_init/docker-compose.yml index 732721ed..015ede98 100644 --- a/scenario_tests/datadir_init/docker-compose.yml +++ b/scenario_tests/datadir_init/docker-compose.yml @@ -1,4 +1,4 @@ -version: '2.1' +version: '3.9' volumes: default-pg-data-dir: new-pg-data-dir: diff --git a/scenario_tests/extensions/docker-compose.yml b/scenario_tests/extensions/docker-compose.yml index 3a247099..219544e1 100644 --- a/scenario_tests/extensions/docker-compose.yml +++ b/scenario_tests/extensions/docker-compose.yml @@ -1,5 +1,5 @@ -version: '2.1' +version: '3.9' services: pg: diff --git a/scenario_tests/init_scripts/docker-compose.yml b/scenario_tests/init_scripts/docker-compose.yml index 47ed3b25..d4626850 100644 --- a/scenario_tests/init_scripts/docker-compose.yml +++ b/scenario_tests/init_scripts/docker-compose.yml @@ -1,4 +1,4 @@ -version: '2.1' +version: '3.9' volumes: default-pg-data-dir-md5: new-pg-data-dir: diff --git a/scenario_tests/logical_replication/docker-compose-gs.yml b/scenario_tests/logical_replication/docker-compose-gs.yml index 17d24f39..835fc131 100644 --- a/scenario_tests/logical_replication/docker-compose-gs.yml +++ b/scenario_tests/logical_replication/docker-compose-gs.yml @@ -1,5 +1,5 @@ -version: '2.1' +version: '3.9' volumes: pg-publisher-data-dir: diff --git a/scenario_tests/logical_replication/docker-compose.yml b/scenario_tests/logical_replication/docker-compose.yml index 7b9f56a3..aad31dd9 100644 --- a/scenario_tests/logical_replication/docker-compose.yml +++ b/scenario_tests/logical_replication/docker-compose.yml @@ -1,5 +1,5 @@ -version: '2.1' +version: '3.9' volumes: pg-publisher-data-dir: diff --git a/scenario_tests/multiple_databases/docker-compose.yml b/scenario_tests/multiple_databases/docker-compose.yml index fdce20f7..1c483b25 100644 --- a/scenario_tests/multiple_databases/docker-compose.yml +++ b/scenario_tests/multiple_databases/docker-compose.yml @@ -1,5 +1,5 @@ -version: '2.1' +version: '3.9' volumes: pg-db-data-dir: diff --git a/scenario_tests/streaming_replication/docker-compose-gs-promote.yml b/scenario_tests/streaming_replication/docker-compose-gs-promote.yml new file mode 100644 index 00000000..494a3aba --- /dev/null +++ b/scenario_tests/streaming_replication/docker-compose-gs-promote.yml @@ -0,0 +1,62 @@ + +version: '2.1' + +volumes: + pg-master-data-dir: + pg-node-data-dir: + +services: + pg-master: + image: 'kartoza/postgis:${TAG:-manual-build}' + restart: 'always' + + volumes: + - pg-master-data-dir:/var/lib/postgresql + - ./tests:/tests + - ../utils:/lib/utils + - ./scripts/setup-master.sql:/docker-entrypoint-initdb.d/setup-master.sql + environment: + + ALLOW_IP_RANGE: '0.0.0.0/0' + + # We can specify optional credentials + POSTGRES_PASS: 'docker' + REPLICATION_USER: 'replicator' + REPLICATION_PASS: 'replicator' + REPLICATION: 'true' + RUN_AS_ROOT: false + healthcheck: + interval: 60s + timeout: 30s + retries: 3 + test: "pg_isready" + + pg-node: + image: 'kartoza/postgis:${TAG:-manual-build}' + restart: 'always' + + volumes: + - pg-node-data-dir:/var/lib/postgresql + - ./tests:/tests + - ../utils:/lib/utils + + environment: + + ALLOW_IP_RANGE: '0.0.0.0/0' + POSTGRES_PASS: 'docker' + REPLICATE_FROM: 'pg-master' + REPLICATION: 'true' + RUN_AS_ROOT: false + PROMOTE_MASTER: false + DESTROY_DATABASE_ON_RESTART: 'True' + REPLICATION_USER: 'replicator' + REPLICATION_PASS: 'replicator' + depends_on: + pg-master: + condition: service_healthy + + healthcheck: + interval: 60s + timeout: 30s + retries: 3 + test: "pg_isready" diff --git a/scenario_tests/streaming_replication/docker-compose-gs.yml b/scenario_tests/streaming_replication/docker-compose-gs.yml index 537153a2..431a3d5d 100644 --- a/scenario_tests/streaming_replication/docker-compose-gs.yml +++ b/scenario_tests/streaming_replication/docker-compose-gs.yml @@ -1,5 +1,5 @@ -version: '2.1' +version: '3.9' volumes: pg-master-data-dir: diff --git a/scenario_tests/streaming_replication/docker-compose-root-promote.yml b/scenario_tests/streaming_replication/docker-compose-root-promote.yml new file mode 100644 index 00000000..470d3eec --- /dev/null +++ b/scenario_tests/streaming_replication/docker-compose-root-promote.yml @@ -0,0 +1,55 @@ + +version: '2.1' + +volumes: + pg-master-data-dir: + pg-node-data-dir: + +services: + pg-master: + image: 'kartoza/postgis:${TAG:-manual-build}' + restart: 'always' + volumes: + - pg-master-data-dir:/var/lib/postgresql + - ./tests:/tests + - ../utils:/lib/utils + - ./scripts/setup-master.sql:/docker-entrypoint-initdb.d/setup-master.sql + environment: + ALLOW_IP_RANGE: '0.0.0.0/0' + # We can specify optional credentials + POSTGRES_PASS: 'docker' + REPLICATION_USER: 'replicator' + REPLICATION_PASS: 'replicator' + REPLICATION: 'true' + RUN_AS_ROOT: true + healthcheck: + interval: 60s + timeout: 30s + retries: 3 + test: "pg_isready" + + pg-node: + image: 'kartoza/postgis:${TAG:-manual-build}' + restart: 'always' + volumes: + - pg-node-data-dir:/var/lib/postgresql + - ./tests:/tests + - ../utils:/lib/utils + environment: + ALLOW_IP_RANGE: '0.0.0.0/0' + POSTGRES_PASS: 'docker' + REPLICATE_FROM: 'pg-master' + REPLICATION: 'true' + RUN_AS_ROOT: true + PROMOTE_MASTER: false + DESTROY_DATABASE_ON_RESTART: 'True' + REPLICATION_USER: 'replicator' + REPLICATION_PASS: 'replicator' + depends_on: + pg-master: + condition: service_healthy + healthcheck: + interval: 60s + timeout: 30s + retries: 3 + test: "pg_isready" diff --git a/scenario_tests/streaming_replication/docker-compose.yml b/scenario_tests/streaming_replication/docker-compose.yml index b15fe07f..f483b467 100644 --- a/scenario_tests/streaming_replication/docker-compose.yml +++ b/scenario_tests/streaming_replication/docker-compose.yml @@ -1,5 +1,5 @@ -version: '2.1' +version: '3.9' volumes: pg-master-data-dir: diff --git a/scenario_tests/streaming_replication/scripts/setup-master.sql b/scenario_tests/streaming_replication/scripts/setup-master.sql new file mode 100644 index 00000000..adbbde0a --- /dev/null +++ b/scenario_tests/streaming_replication/scripts/setup-master.sql @@ -0,0 +1,11 @@ +-- Create a table +CREATE TABLE IF NOT EXISTS sweets + ( + id SERIAL, + name TEXT, + price DECIMAL, + CONSTRAINT sweets_pkey PRIMARY KEY (id) + ); + +-- Inserts records into the table +INSERT INTO sweets (name, price) VALUES ('strawberry', 4.50), ('Coffee', 6.20), ('lollipop', 3.80); diff --git a/scenario_tests/streaming_replication/test.sh b/scenario_tests/streaming_replication/test.sh index fc3f746c..200638f5 100755 --- a/scenario_tests/streaming_replication/test.sh +++ b/scenario_tests/streaming_replication/test.sh @@ -11,8 +11,9 @@ if [[ $(dpkg -l | grep "docker-compose") > /dev/null ]];then VERSION='docker compose' fi - +#### # Run service as root user +#### ${VERSION} up -d if [[ -n "${PRINT_TEST_LOGS}" ]]; then @@ -39,7 +40,9 @@ ${VERSION} exec -T pg-node /bin/bash /tests/test_node.sh ${VERSION} down -v +#### # Run service as none root +#### ${VERSION} -f docker-compose-gs.yml up -d if [[ -n "${PRINT_TEST_LOGS}" ]]; then @@ -64,4 +67,64 @@ done; # Execute tests ${VERSION} -f docker-compose-gs.yml exec -T pg-node /bin/bash /tests/test_node.sh -${VERSION} -f docker-compose-gs.yml down -v \ No newline at end of file +${VERSION} -f docker-compose-gs.yml down -v + + +#### +# Run service as root user for node promotion +#### +${VERSION} -f docker-compose-root-promote.yml up -d + +if [[ -n "${PRINT_TEST_LOGS}" ]]; then + ${VERSION} -f docker-compose-root-promote.yml logs -f & +fi + +sleep 30 + +# Update env variable +sed -i 's/\(PROMOTE_MASTER: \)false/\1true/' docker-compose-root-promote.yml + +# Bring up node with option to promote node + +${VERSION} -f docker-compose-root-promote.yml up -d pg-node + +# Preparing node cluster +until ${VERSION} -f docker-compose-root-promote.yml exec -T pg-node pg_isready; do + sleep 30 +done; + +# Execute tests +${VERSION} -f docker-compose-root-promote.yml exec -T pg-node /bin/bash /tests/test_node_promotion.sh + +${VERSION} -f docker-compose-root-promote.yml down -v +sed -i 's/\(PROMOTE_MASTER: \)true/\1false/' docker-compose-root-promote.yml + +#### +# Run service as none root user for node promotion +#### +${VERSION} -f docker-compose-gs-promote.yml up -d + +if [[ -n "${PRINT_TEST_LOGS}" ]]; then + ${VERSION} -f docker-compose-gs-promote.yml logs -f & +fi + +sleep 30 + +# Update env variable +sed -i 's/\(PROMOTE_MASTER: \)false/\1true/' docker-compose-gs-promote.yml + +# Bring up node with option to promote node + +${VERSION} -f docker-compose-gs-promote.yml up -d pg-node + +# Preparing node cluster +until ${VERSION} -f docker-compose-gs-promote.yml exec -T pg-node pg_isready; do + sleep 30 +done; + +# Execute tests +${VERSION} -f docker-compose-gs-promote.yml exec -T pg-node /bin/bash /tests/test_node_promotion.sh + +${VERSION} -f docker-compose-gs-promote.yml down -v +sed -i 's/\(PROMOTE_MASTER: \)true/\1false/' docker-compose-gs-promote.yml + diff --git a/scenario_tests/streaming_replication/tests/test_node_promotion.sh b/scenario_tests/streaming_replication/tests/test_node_promotion.sh new file mode 100644 index 00000000..47c3d3be --- /dev/null +++ b/scenario_tests/streaming_replication/tests/test_node_promotion.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +set -e + +source /scripts/env-data.sh + +# execute tests +pushd /tests + +PGHOST=localhost \ +PGDATABASE=gis \ +PYTHONPATH=/lib \ + python3 -m unittest -v test_replication.TestReplicationPromotion diff --git a/scenario_tests/streaming_replication/tests/test_replication.py b/scenario_tests/streaming_replication/tests/test_replication.py index 06bbf62d..8c3fd422 100644 --- a/scenario_tests/streaming_replication/tests/test_replication.py +++ b/scenario_tests/streaming_replication/tests/test_replication.py @@ -56,4 +56,27 @@ def test_read_data(self): rows = c.fetchall() self.assertEqual(len(rows), 1) +class TestReplicationPromotion(unittest.TestCase): + + def setUp(self): + self.db = DBConnection() + + def test_read_data(self): + # create new table + self.db.conn.autocommit = True + with self.db.cursor() as c: + c.execute( + """ + INSERT INTO sweets (name ,price) values ('Test', 10); + """ + ) + c.execute( + """ + SELECT * FROM sweets where name = 'Test'; + """ + ) + + rows = c.fetchone() + self.assertEqual(len(rows), 3) + diff --git a/scenario_tests/utils/utils.py b/scenario_tests/utils/utils.py index 1bae0172..91d11728 100644 --- a/scenario_tests/utils/utils.py +++ b/scenario_tests/utils/utils.py @@ -10,17 +10,18 @@ def __init__(self): def table_exists(self, table_name, table_schema='public'): cur = self.conn.cursor() - query = ( - 'select ' - 'exists(' - 'select 1 ' - 'from information_schema.tables ' - 'where table_name = %s and table_schema = %s)') - cur.execute(query, (table_name, table_schema)) + query = '''select exists (select 1 from information_schema.tables \ + where table_name = %s and table_schema = %s)''' % (table_name, table_schema) + + cur.execute(query) try: row = cur.fetchone() - return row[0] - except: + if row is not None: + return row[0] + else: + return None + except Exception as e: + print(f"An error occurred: {e}") return False @staticmethod diff --git a/scripts/docker-entrypoint.sh b/scripts/docker-entrypoint.sh index ea71e4c0..870f47f2 100755 --- a/scripts/docker-entrypoint.sh +++ b/scripts/docker-entrypoint.sh @@ -74,8 +74,17 @@ else if [[ ${RUN_AS_ROOT} =~ [Ff][Aa][Ll][Ss][Ee] ]];then non_root_permission "${USER_NAME}" "${DB_GROUP_NAME}" else - chown -R postgres:postgres "${DATADIR}" "${WAL_ARCHIVE}" - chmod -R 750 "${DATADIR}" "${WAL_ARCHIVE}" + dir_ownership=("${DATADIR}" "${WAL_ARCHIVE}") + for directory in "${dir_ownership[@]}"; do + if [[ $(stat -c '%U' "${directory}") != "postgres" ]] && [[ $(stat -c '%G' "${directory}") != "postgres" ]];then + chown -R postgres:postgres "${directory}" + fi + done + for directory in "${dir_ownership[@]}"; do + if [ "$(stat -c %a "$directory")" != "750" ]; then + chmod -R 750 "$directory" + fi + done fi source /scripts/setup-replication.sh fi diff --git a/scripts/env-data.sh b/scripts/env-data.sh index 4061837d..ecc6b459 100644 --- a/scripts/env-data.sh +++ b/scripts/env-data.sh @@ -20,9 +20,10 @@ SQLDIR="/usr/share/postgresql/${POSTGRES_MAJOR_VERSION}/contrib/postgis-${POSTGI EXTDIR="/usr/share/postgresql/${POSTGRES_MAJOR_VERSION}/extension/" SETVARS="POSTGIS_ENABLE_OUTDB_RASTERS=1 POSTGIS_GDAL_ENABLED_DRIVERS=ENABLE_ALL" LOCALONLY="-c listen_addresses='127.0.0.1'" -PG_BASEBACKUP="/usr/bin/pg_basebackup" +PG_BASEBACKUP="/usr/lib/postgresql/${POSTGRES_MAJOR_VERSION}/bin/pg_basebackup" PROMOTE_FILE="/tmp/pg_promote_master" NODE_PROMOTION="/usr/lib/postgresql/${POSTGRES_MAJOR_VERSION}/bin/pg_ctl" +DATA_DIR_CONTROL="/usr/lib/postgresql/${POSTGRES_MAJOR_VERSION}/bin/pg_controldata" PGSTAT_TMP="/var/run/postgresql/" PG_PID="/var/run/postgresql/${POSTGRES_MAJOR_VERSION}-main.pid" @@ -34,7 +35,7 @@ PG_PID="/var/run/postgresql/${POSTGRES_MAJOR_VERSION}-main.pid" # 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) -function file_env { +function file_env() { local var="$1" local fileVar="${var}_FILE" local def="${2:-}" @@ -65,7 +66,7 @@ function boolean() { file_env 'POSTGRES_PASS' file_env 'POSTGRES_USER' -file_env 'POSTGRES_DBNAME' + function create_dir() { DATA_PATH=$1 @@ -211,7 +212,7 @@ fi if [ -z "${ARCHIVE_CLEANUP_COMMAND}" ]; then # https://www.postgresql.org/docs/12/runtime-config-wal.html - ARCHIVE_CLEANUP_COMMAND="pg_archivecleanup ${WAL_ARCHIVE} %r" + ARCHIVE_CLEANUP_COMMAND="/usr/lib/postgresql/${POSTGRES_MAJOR_VERSION}/bin/pg_archivecleanup ${WAL_ARCHIVE} %r" fi if [ -z "${WAL_LEVEL}" ]; then @@ -401,6 +402,17 @@ if [ -z "${TIMEZONE}" ]; then TIMEZONE='Etc/UTC' fi +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 # usable function definitions function kill_postgres { PID=$(cat "${PG_PID}") @@ -587,7 +599,7 @@ function non_root_permission() { directory_checker "${dir_names}" fi done - services=("/usr/lib/postgresql/" "/etc/" "/var/run/!(secrets)" "/var/lib/" "/usr/bin" "/tmp" "/scripts") + services=("/usr/lib/postgresql/" "/etc/" "/var/log/postgresql" "/var/run/!(secrets)" "/var/lib/" "/usr/bin" "/tmp" "/scripts") for paths in "${services[@]}"; do directory_checker "${paths}" done @@ -605,3 +617,4 @@ function role_check() { fi } + diff --git a/scripts/locale.gen b/scripts/locale.gen deleted file mode 100644 index 39952867..00000000 --- a/scripts/locale.gen +++ /dev/null @@ -1,484 +0,0 @@ -# This file lists locales that you wish to have built. You can find a list -# of valid supported locales at /usr/share/i18n/SUPPORTED, and you can add -# user defined locales to /usr/local/share/i18n/SUPPORTED. If you change -# this file, you need to rerun locale-gen. - - -aa_DJ ISO-8859-1 -aa_DJ.UTF-8 UTF-8 -aa_ER UTF-8 -aa_ER@saaho UTF-8 -aa_ET UTF-8 -af_ZA ISO-8859-1 -af_ZA.UTF-8 UTF-8 -ak_GH UTF-8 -am_ET UTF-8 -an_ES ISO-8859-15 -an_ES.UTF-8 UTF-8 -anp_IN UTF-8 -ar_AE ISO-8859-6 -ar_AE.UTF-8 UTF-8 -ar_BH ISO-8859-6 -ar_BH.UTF-8 UTF-8 -ar_DZ ISO-8859-6 -ar_DZ.UTF-8 UTF-8 -ar_EG ISO-8859-6 -ar_EG.UTF-8 UTF-8 -ar_IN UTF-8 -ar_IQ ISO-8859-6 -ar_IQ.UTF-8 UTF-8 -ar_JO ISO-8859-6 -ar_JO.UTF-8 UTF-8 -ar_KW ISO-8859-6 -ar_KW.UTF-8 UTF-8 -ar_LB ISO-8859-6 -ar_LB.UTF-8 UTF-8 -ar_LY ISO-8859-6 -ar_LY.UTF-8 UTF-8 -ar_MA ISO-8859-6 -ar_MA.UTF-8 UTF-8 -ar_OM ISO-8859-6 -ar_OM.UTF-8 UTF-8 -ar_QA ISO-8859-6 -ar_QA.UTF-8 UTF-8 -ar_SA ISO-8859-6 -ar_SA.UTF-8 UTF-8 -ar_SD ISO-8859-6 -ar_SD.UTF-8 UTF-8 -ar_SS UTF-8 -ar_SY ISO-8859-6 -ar_SY.UTF-8 UTF-8 -ar_TN ISO-8859-6 -ar_TN.UTF-8 UTF-8 -ar_YE ISO-8859-6 -ar_YE.UTF-8 UTF-8 -as_IN UTF-8 -ast_ES ISO-8859-15 -ast_ES.UTF-8 UTF-8 -ayc_PE UTF-8 -az_AZ UTF-8 -be_BY CP1251 -be_BY.UTF-8 UTF-8 -be_BY@latin UTF-8 -bem_ZM UTF-8 -ber_DZ UTF-8 -ber_MA UTF-8 -bg_BG CP1251 -bg_BG.UTF-8 UTF-8 -bhb_IN.UTF-8 UTF-8 -bho_IN UTF-8 -bn_BD UTF-8 -bn_IN UTF-8 -bo_CN UTF-8 -bo_IN UTF-8 -br_FR ISO-8859-1 -br_FR.UTF-8 UTF-8 -br_FR@euro ISO-8859-15 -brx_IN UTF-8 -bs_BA ISO-8859-2 -bs_BA.UTF-8 UTF-8 -byn_ER UTF-8 -ca_AD ISO-8859-15 -ca_AD.UTF-8 UTF-8 -ca_ES ISO-8859-1 -ca_ES.UTF-8 UTF-8 -ca_ES.UTF-8@valencia UTF-8 -ca_ES@euro ISO-8859-15 -ca_ES@valencia ISO-8859-15 -ca_FR ISO-8859-15 -ca_FR.UTF-8 UTF-8 -ca_IT ISO-8859-15 -ca_IT.UTF-8 UTF-8 -ce_RU UTF-8 -chr_US UTF-8 -cmn_TW UTF-8 -crh_UA UTF-8 -cs_CZ ISO-8859-2 -cs_CZ.UTF-8 UTF-8 -csb_PL UTF-8 -cv_RU UTF-8 -cy_GB ISO-8859-14 -cy_GB.UTF-8 UTF-8 -da_DK ISO-8859-1 -da_DK.UTF-8 UTF-8 -de_AT ISO-8859-1 -de_AT.UTF-8 UTF-8 -de_AT@euro ISO-8859-15 -de_BE ISO-8859-1 -de_BE.UTF-8 UTF-8 -de_BE@euro ISO-8859-15 -de_CH ISO-8859-1 -de_CH.UTF-8 UTF-8 -de_DE ISO-8859-1 -de_DE.UTF-8 UTF-8 -de_DE@euro ISO-8859-15 -de_IT ISO-8859-1 -de_IT.UTF-8 UTF-8 -de_LI.UTF-8 UTF-8 -de_LU ISO-8859-1 -de_LU.UTF-8 UTF-8 -de_LU@euro ISO-8859-15 -doi_IN UTF-8 -dv_MV UTF-8 -dz_BT UTF-8 -el_CY ISO-8859-7 -el_CY.UTF-8 UTF-8 -el_GR ISO-8859-7 -el_GR.UTF-8 UTF-8 -en_AG UTF-8 -en_AU ISO-8859-1 -en_AU.UTF-8 UTF-8 -en_BW ISO-8859-1 -en_BW.UTF-8 UTF-8 -en_CA ISO-8859-1 -en_CA.UTF-8 UTF-8 -en_DK ISO-8859-1 -en_DK.ISO-8859-15 ISO-8859-15 -en_DK.UTF-8 UTF-8 -en_GB ISO-8859-1 -en_GB.ISO-8859-15 ISO-8859-15 -en_GB.UTF-8 UTF-8 -en_HK ISO-8859-1 -en_HK.UTF-8 UTF-8 -en_IE ISO-8859-1 -en_IE.UTF-8 UTF-8 -en_IE@euro ISO-8859-15 -en_IL UTF-8 -en_IN UTF-8 -en_NG UTF-8 -en_NZ ISO-8859-1 -en_NZ.UTF-8 UTF-8 -en_PH ISO-8859-1 -en_PH.UTF-8 UTF-8 -en_SG ISO-8859-1 -en_SG.UTF-8 UTF-8 -en_US ISO-8859-1 -en_US.ISO-8859-15 ISO-8859-15 -en_US.UTF-8 UTF-8 -en_ZA ISO-8859-1 -en_ZA.UTF-8 UTF-8 -en_ZM UTF-8 -en_ZW ISO-8859-1 -en_ZW.UTF-8 UTF-8 -eo UTF-8 -es_AR ISO-8859-1 -es_AR.UTF-8 UTF-8 -es_BO ISO-8859-1 -es_BO.UTF-8 UTF-8 -es_CL ISO-8859-1 -es_CL.UTF-8 UTF-8 -es_CO ISO-8859-1 -es_CO.UTF-8 UTF-8 -es_CR ISO-8859-1 -es_CR.UTF-8 UTF-8 -es_CU UTF-8 -es_DO ISO-8859-1 -es_DO.UTF-8 UTF-8 -es_EC ISO-8859-1 -es_EC.UTF-8 UTF-8 -es_ES ISO-8859-1 -es_ES.UTF-8 UTF-8 -es_ES@euro ISO-8859-15 -es_GT ISO-8859-1 -es_GT.UTF-8 UTF-8 -es_HN ISO-8859-1 -es_HN.UTF-8 UTF-8 -es_MX ISO-8859-1 -es_MX.UTF-8 UTF-8 -es_NI ISO-8859-1 -es_NI.UTF-8 UTF-8 -es_PA ISO-8859-1 -es_PA.UTF-8 UTF-8 -es_PE ISO-8859-1 -es_PE.UTF-8 UTF-8 -es_PR ISO-8859-1 -es_PR.UTF-8 UTF-8 -es_PY ISO-8859-1 -es_PY.UTF-8 UTF-8 -es_SV ISO-8859-1 -es_SV.UTF-8 UTF-8 -es_US ISO-8859-1 -es_US.UTF-8 UTF-8 -es_UY ISO-8859-1 -es_UY.UTF-8 UTF-8 -es_VE ISO-8859-1 -es_VE.UTF-8 UTF-8 -et_EE ISO-8859-1 -et_EE.ISO-8859-15 ISO-8859-15 -et_EE.UTF-8 UTF-8 -eu_ES ISO-8859-1 -eu_ES.UTF-8 UTF-8 -eu_ES@euro ISO-8859-15 -eu_FR ISO-8859-1 -eu_FR.UTF-8 UTF-8 -eu_FR@euro ISO-8859-15 -fa_IR UTF-8 -ff_SN UTF-8 -fi_FI ISO-8859-1 -fi_FI.UTF-8 UTF-8 -fi_FI@euro ISO-8859-15 -fil_PH UTF-8 -fo_FO ISO-8859-1 -fo_FO.UTF-8 UTF-8 -fr_BE ISO-8859-1 -fr_BE.UTF-8 UTF-8 -fr_BE@euro ISO-8859-15 -fr_CA ISO-8859-1 -fr_CA.UTF-8 UTF-8 -fr_CH ISO-8859-1 -fr_CH.UTF-8 UTF-8 -fr_FR ISO-8859-1 -fr_FR.UTF-8 UTF-8 -fr_FR@euro ISO-8859-15 -fr_LU ISO-8859-1 -fr_LU.UTF-8 UTF-8 -fr_LU@euro ISO-8859-15 -fur_IT UTF-8 -fy_DE UTF-8 -fy_NL UTF-8 -ga_IE ISO-8859-1 -ga_IE.UTF-8 UTF-8 -ga_IE@euro ISO-8859-15 -gd_GB ISO-8859-15 -gd_GB.UTF-8 UTF-8 -gez_ER UTF-8 -gez_ER@abegede UTF-8 -gez_ET UTF-8 -gez_ET@abegede UTF-8 -gl_ES ISO-8859-1 -gl_ES.UTF-8 UTF-8 -gl_ES@euro ISO-8859-15 -gu_IN UTF-8 -gv_GB ISO-8859-1 -gv_GB.UTF-8 UTF-8 -ha_NG UTF-8 -hak_TW UTF-8 -he_IL ISO-8859-8 -he_IL.UTF-8 UTF-8 -hi_IN UTF-8 -hne_IN UTF-8 -hr_HR ISO-8859-2 -hr_HR.UTF-8 UTF-8 -hsb_DE ISO-8859-2 -hsb_DE.UTF-8 UTF-8 -ht_HT UTF-8 -hu_HU ISO-8859-2 -hu_HU.UTF-8 UTF-8 -hy_AM UTF-8 -hy_AM.ARMSCII-8 ARMSCII-8 -ia_FR UTF-8 -id_ID ISO-8859-1 -id_ID.UTF-8 UTF-8 -ig_NG UTF-8 -ik_CA UTF-8 -is_IS ISO-8859-1 -is_IS.UTF-8 UTF-8 -it_CH ISO-8859-1 -it_CH.UTF-8 UTF-8 -it_IT ISO-8859-1 -it_IT.UTF-8 UTF-8 -it_IT@euro ISO-8859-15 -iu_CA UTF-8 -ja_JP.EUC-JP EUC-JP -ja_JP.UTF-8 UTF-8 -ka_GE GEORGIAN-PS -ka_GE.UTF-8 UTF-8 -kk_KZ PT154 -kk_KZ.RK1048 RK1048 -kk_KZ.UTF-8 UTF-8 -kl_GL ISO-8859-1 -kl_GL.UTF-8 UTF-8 -km_KH UTF-8 -kn_IN UTF-8 -ko_KR.EUC-KR EUC-KR -ko_KR.UTF-8 UTF-8 -kok_IN UTF-8 -ks_IN UTF-8 -ks_IN@devanagari UTF-8 -ku_TR ISO-8859-9 -ku_TR.UTF-8 UTF-8 -kw_GB ISO-8859-1 -kw_GB.UTF-8 UTF-8 -ky_KG UTF-8 -lb_LU UTF-8 -lg_UG ISO-8859-10 -lg_UG.UTF-8 UTF-8 -li_BE UTF-8 -li_NL UTF-8 -lij_IT UTF-8 -ln_CD UTF-8 -lo_LA UTF-8 -lt_LT ISO-8859-13 -lt_LT.UTF-8 UTF-8 -lv_LV ISO-8859-13 -lv_LV.UTF-8 UTF-8 -lzh_TW UTF-8 -mag_IN UTF-8 -mai_IN UTF-8 -mg_MG ISO-8859-15 -mg_MG.UTF-8 UTF-8 -mhr_RU UTF-8 -mi_NZ ISO-8859-13 -mi_NZ.UTF-8 UTF-8 -mk_MK ISO-8859-5 -mk_MK.UTF-8 UTF-8 -ml_IN UTF-8 -mn_MN UTF-8 -mni_IN UTF-8 -mr_IN UTF-8 -ms_MY ISO-8859-1 -ms_MY.UTF-8 UTF-8 -mt_MT ISO-8859-3 -mt_MT.UTF-8 UTF-8 -my_MM UTF-8 -nan_TW UTF-8 -nan_TW@latin UTF-8 -nb_NO ISO-8859-1 -nb_NO.UTF-8 UTF-8 -nds_DE UTF-8 -nds_NL UTF-8 -ne_NP UTF-8 -nhn_MX UTF-8 -niu_NU UTF-8 -niu_NZ UTF-8 -nl_AW UTF-8 -nl_BE ISO-8859-1 -nl_BE.UTF-8 UTF-8 -nl_BE@euro ISO-8859-15 -nl_NL ISO-8859-1 -nl_NL.UTF-8 UTF-8 -nl_NL@euro ISO-8859-15 -nn_NO ISO-8859-1 -nn_NO.UTF-8 UTF-8 -nr_ZA UTF-8 -nso_ZA UTF-8 -oc_FR ISO-8859-1 -oc_FR.UTF-8 UTF-8 -om_ET UTF-8 -om_KE ISO-8859-1 -om_KE.UTF-8 UTF-8 -or_IN UTF-8 -os_RU UTF-8 -pa_IN UTF-8 -pa_PK UTF-8 -pap_AW UTF-8 -pap_CW UTF-8 -pl_PL ISO-8859-2 -pl_PL.UTF-8 UTF-8 -ps_AF UTF-8 -pt_BR ISO-8859-1 -pt_BR.UTF-8 UTF-8 -pt_PT ISO-8859-1 -pt_PT.UTF-8 UTF-8 -pt_PT@euro ISO-8859-15 -quz_PE UTF-8 -raj_IN UTF-8 -ro_RO ISO-8859-2 -ro_RO.UTF-8 UTF-8 -ru_RU ISO-8859-5 -ru_RU.CP1251 CP1251 -ru_RU.KOI8-R KOI8-R -ru_RU.UTF-8 UTF-8 -ru_UA KOI8-U -ru_UA.UTF-8 UTF-8 -rw_RW UTF-8 -sa_IN UTF-8 -sat_IN UTF-8 -sc_IT UTF-8 -sd_IN UTF-8 -sd_IN@devanagari UTF-8 -se_NO UTF-8 -sgs_LT UTF-8 -shs_CA UTF-8 -si_LK UTF-8 -sid_ET UTF-8 -sk_SK ISO-8859-2 -sk_SK.UTF-8 UTF-8 -sl_SI ISO-8859-2 -sl_SI.UTF-8 UTF-8 -so_DJ ISO-8859-1 -so_DJ.UTF-8 UTF-8 -so_ET UTF-8 -so_KE ISO-8859-1 -so_KE.UTF-8 UTF-8 -so_SO ISO-8859-1 -so_SO.UTF-8 UTF-8 -sq_AL ISO-8859-1 -sq_AL.UTF-8 UTF-8 -sq_MK UTF-8 -sr_ME UTF-8 -sr_RS UTF-8 -sr_RS@latin UTF-8 -ss_ZA UTF-8 -st_ZA ISO-8859-1 -st_ZA.UTF-8 UTF-8 -sv_FI ISO-8859-1 -sv_FI.UTF-8 UTF-8 -sv_FI@euro ISO-8859-15 -sv_SE ISO-8859-1 -sv_SE.ISO-8859-15 ISO-8859-15 -sv_SE.UTF-8 UTF-8 -sw_KE UTF-8 -sw_TZ UTF-8 -szl_PL UTF-8 -ta_IN UTF-8 -ta_LK UTF-8 -tcy_IN.UTF-8 UTF-8 -te_IN UTF-8 -tg_TJ KOI8-T -tg_TJ.UTF-8 UTF-8 -th_TH TIS-620 -th_TH.UTF-8 UTF-8 -the_NP UTF-8 -ti_ER UTF-8 -ti_ET UTF-8 -tig_ER UTF-8 -tk_TM UTF-8 -tl_PH ISO-8859-1 -tl_PH.UTF-8 UTF-8 -tn_ZA UTF-8 -tr_CY ISO-8859-9 -tr_CY.UTF-8 UTF-8 -tr_TR ISO-8859-9 -tr_TR.UTF-8 UTF-8 -ts_ZA UTF-8 -tt_RU UTF-8 -tt_RU@iqtelif UTF-8 -ug_CN UTF-8 -uk_UA KOI8-U -uk_UA.UTF-8 UTF-8 -unm_US UTF-8 -ur_IN UTF-8 -ur_PK UTF-8 -uz_UZ ISO-8859-1 -uz_UZ.UTF-8 UTF-8 -uz_UZ@cyrillic UTF-8 -ve_ZA UTF-8 -vi_VN UTF-8 -wa_BE ISO-8859-1 -wa_BE.UTF-8 UTF-8 -wa_BE@euro ISO-8859-15 -wae_CH UTF-8 -wal_ET UTF-8 -wo_SN UTF-8 -xh_ZA ISO-8859-1 -xh_ZA.UTF-8 UTF-8 -yi_US CP1255 -yi_US.UTF-8 UTF-8 -yo_NG UTF-8 -yue_HK UTF-8 -zh_CN GB2312 -zh_CN.GB18030 GB18030 -zh_CN.GBK GBK -zh_CN.UTF-8 UTF-8 -zh_HK BIG5-HKSCS -zh_HK.UTF-8 UTF-8 -zh_SG GB2312 -zh_SG.GBK GBK -zh_SG.UTF-8 UTF-8 -zh_TW BIG5 -zh_TW.EUC-TW EUC-TW -zh_TW.UTF-8 UTF-8 -zu_ZA ISO-8859-1 -zu_ZA.UTF-8 UTF-8 -zu_ZA.UTF-8 UTF-8 diff --git a/scripts/setup-conf.sh b/scripts/setup-conf.sh index 1791d2d2..75c2ef86 100644 --- a/scripts/setup-conf.sh +++ b/scripts/setup-conf.sh @@ -119,8 +119,8 @@ fi # Optimise PostgreSQL shared memory for PostGIS # shmall units are pages and shmmax units are bytes(?) equivalent to the desired shared_buffer size set in setup_conf.sh - in this case 500MB -echo "kernel.shmmax=543252480" >> /etc/sysctl.conf -echo "kernel.shmall=2097152" >> /etc/sysctl.conf +echo "kernel.shmmax=${KERNEL_SHMMAX}" >> /etc/sysctl.conf +echo "kernel.shmall=${KERNEL_SHMALL}" >> /etc/sysctl.conf # Put lock file to make sure conf was not reinitialized touch "${SETUP_LOCKFILE}" diff --git a/scripts/setup-database.sh b/scripts/setup-database.sh index 32df8dba..71a6f91b 100644 --- a/scripts/setup-database.sh +++ b/scripts/setup-database.sh @@ -88,7 +88,7 @@ trap "echo \"Sending SIGTERM to postgres\"; killall -s SIGTERM postgres" SIGTERM su - postgres -c "${POSTGRES} -D ${DATADIR} -c config_file=${CONF} ${LOCALONLY} &" # wait for postgres to come up -until su - postgres -c "pg_isready"; do +until su - postgres -c "/usr/lib/postgresql/${POSTGRES_MAJOR_VERSION}/bin/pg_isready"; do sleep 1 done echo "postgres ready" diff --git a/scripts/setup-replication.sh b/scripts/setup-replication.sh index fe3f21fc..c9d52cd6 100755 --- a/scripts/setup-replication.sh +++ b/scripts/setup-replication.sh @@ -9,7 +9,7 @@ source /scripts/env-data.sh if [[ ${RUN_AS_ROOT} =~ [Ff][Aa][Ll][Ss][Ee] ]];then function START_COMMAND() { PARAM=$1 - gosu ${USER_NAME} bash -c "$1" + gosu "${USER_NAME}" bash -c "$1" } else function START_COMMAND() { @@ -29,26 +29,48 @@ if [[ "$WAL_LEVEL" == 'replica' && "${REPLICATION}" =~ [Tt][Rr][Uu][Ee] ]]; then fi - until START_COMMAND "/usr/lib/postgresql/${POSTGRES_MAJOR_VERSION}/bin/pg_isready -h ${REPLICATE_FROM} -p ${REPLICATE_PORT}" - do - echo -e "[Entrypoint] \e[1;31m Waiting for master to ping... \033[0m" - sleep 1s - done - if [[ "$DESTROY_DATABASE_ON_RESTART" =~ [Tt][Rr][Uu][Ee] ]]; then - echo -e "[Entrypoint] \e[1;31m Get initial database from master \033[0m" - configure_replication_permissions - if [ -f "${DATADIR}/backup_label.old" ]; then - echo -e "[Entrypoint] \e[1;31m PG Basebackup already exists so proceed to start the DB \033[0m" + if [[ "${PROMOTE_MASTER}" =~ [Ff][Aa][Ll][Ss][Ee] ]];then + + until START_COMMAND "/usr/lib/postgresql/${POSTGRES_MAJOR_VERSION}/bin/pg_isready -h ${REPLICATE_FROM} -p ${REPLICATE_PORT}" + do + echo -e "[Entrypoint] \e[1;31m Waiting for master to ping... \033[0m" + sleep 1s + done + if [[ "$DESTROY_DATABASE_ON_RESTART" =~ [Tt][Rr][Uu][Ee] ]]; then + echo -e "[Entrypoint] \e[1;31m Get initial database from master \033[0m" + configure_replication_permissions + if [ -f "${DATADIR}/backup_label.old" ]; then + echo -e "[Entrypoint] \e[1;31m PG Basebackup already exists so proceed to start the DB \033[0m" + else + streaming_replication + + fi + fi + + else + if [ ! -f "${DATADIR}/backup_label.old" ]; then + echo "Streaming replication hasn't been started yet" + exit 1 else - streaming_replication + if [[ ${RUN_AS_ROOT} =~ [Ff][Aa][Ll][Ss][Ee] ]];then + chown -R "${USER_NAME}":"${DB_GROUP_NAME}" /var/run/postgresql + START_COMMAND "/etc/init.d/postgresql start ${POSTGRES_MAJOR_VERSION}" + else + START_COMMAND "/etc/init.d/postgresql start ${POSTGRES_MAJOR_VERSION}" + fi + + STANDBY_MODE=$(START_COMMAND "${DATA_DIR_CONTROL} $DATADIR" | grep "Database cluster state:") + if [[ "$STANDBY_MODE" == *"in archive recovery"* ]]; then + START_COMMAND "${NODE_PROMOTION} promote -D ${DATADIR}" + fi + echo -e "\e[32m [Entrypoint] Replicant has been promoted to master, please shut down \e[1;31m pg-master \033[0m" + kill_postgres fi - fi - # Promote to master if desired - if [[ ! -z "${PROMOTE_MASTER}" ]]; then - ${START_COMMAND} "${NODE_PROMOTION} promote -D ${DATADIR}" + fi +#end main if fi