1
0
mirror of https://gitlab.com/bramw/baserow.git synced 2024-11-21 15:27:53 +00:00
bramw_baserow/deploy/all-in-one/pgautoupgrade/docker-postgres-upgrade.sh
2024-04-03 08:04:17 +00:00

218 lines
9.4 KiB
Bash
Executable File

#!/bin/bash
# This script is heavily inspired by https://github.com/pgautoupgrade/docker-pgautoupgrade/blob/main/docker-entrypoint.sh
# with some modifications to fit the Baserow use case.
startup_echo(){
/baserow/supervisor/wrapper.sh GREEN STARTUP echo -e "\e[32m$*\e[0m"
}
init_data_directory() {
local data_dir=$1
startup_echo "Initialising PostgreSQL ${POSTGRES_VERSION} data directory . . ."
# Check if the data directory is not empty, and if not, empty it
if [ -n "$(ls -A ${data_dir})" ]; then
rm -r "${data_dir}"/*
fi
"${POSTGRES_BIN_FOLDER}/initdb" \
--encoding=UTF8 \
--username='postgres' \
-D "${data_dir}"
}
_main() {
startup_echo "****************************************************************************************"
startup_echo "Existing PostgreSQL version found: ${POSTGRES_OLD_VERSION}, upgrading to PostgreSQL ${POSTGRES_VERSION} ..."
startup_echo "****************************************************************************************"
startup_echo "************************************"
startup_echo "PostgreSQL data directory: ${PGDATA}"
startup_echo "************************************"
# /baserow/data/postgres
# Check for presence of old/new directories, indicating a failed previous autoupgrade
startup_echo "----------------------------------------------------------------------"
startup_echo "Checking for left over artifacts from a failed previous autoupgrade..."
startup_echo "----------------------------------------------------------------------"
#Tmp. directory which will be used to safely back-up the existing data:
local OLD="${PGAUTOUPGRADE_DIR}/${POSTGRES_OLD_VERSION}"
#Tmp. directory which will be used for upgrading the data files to the new version:
local NEW="${PGAUTOUPGRADE_DIR}/${POSTGRES_VERSION}"
if [ -d "${OLD}" ]; then
startup_echo "***************************************"
startup_echo "Left over OLD directory found. Exiting."
startup_echo "***************************************"
exit 2
fi
if [ -d "${NEW}" ]; then
startup_echo "***************************************"
startup_echo "Left over NEW directory found. Exiting."
startup_echo "***************************************"
exit 3
fi
startup_echo "-------------------------------------------------------------------------------"
startup_echo "No artifacts found from a failed previous autoupgrade. Continuing the process."
startup_echo "-------------------------------------------------------------------------------"
# Don't automatically abort on non-0 exit status, as that messes with these upcoming mv commands
set +e
startup_echo "---------------------------------------"
startup_echo "Creating OLD temporary directory ${OLD}"
startup_echo "---------------------------------------"
mkdir -m 700 "${OLD}"
if [ ! -d "${OLD}" ]; then
startup_echo "*********************************************************************"
startup_echo "Creation of temporary directory '${OLD}' failed. Aborting completely"
startup_echo "*********************************************************************"
exit 4
fi
startup_echo "--------------------------------------------"
startup_echo "Creating OLD temporary directory is complete"
startup_echo "--------------------------------------------"
startup_echo "--------------------------------------------------------------"
startup_echo "Moving existing data files into OLD temporary directory ${OLD}"
startup_echo "--------------------------------------------------------------"
mv -v "${PGDATA}"/* "${OLD}"
startup_echo "--------------------------------------------------------------------"
startup_echo "Copying existing data files into OLD temporary directory is complete"
startup_echo "--------------------------------------------------------------------"
startup_echo "---------------------------------------"
startup_echo "Creating NEW temporary directory ${NEW}"
startup_echo "---------------------------------------"
mkdir -m 700 "${NEW}"
if [ ! -d "${NEW}" ]; then
startup_echo "********************************************************************"
startup_echo "Creation of temporary directory '${NEW}' failed. Aborting completely"
startup_echo "********************************************************************"
# With a failure at this point we should be able to move the old data back
# to its original location
mv -v "${OLD}"/* "${PGDATA}"
exit 5
fi
startup_echo "--------------------------------------------"
startup_echo "Creating NEW temporary directory is complete"
startup_echo "--------------------------------------------"
# Return the error handling back to automatically aborting on non-0 exit status
set -e
startup_echo "--------------------------------------------------------------------------------"
startup_echo "Updating PostgreSQL configuration files to point at the correct data directories"
startup_echo "--------------------------------------------------------------------------------"
sed -i "s;/var/lib/postgresql/${POSTGRES_OLD_VERSION}/main;$OLD;g" ${POSTGRES_OLD_LOCATION}/postgresql.conf
sed -i "s;${PGDATA%/};${NEW};g" ${POSTGRES_LOCATION}/postgresql.conf
startup_echo "------------------------------------------------"
startup_echo "Updating PostgreSQL configuration files complete"
startup_echo "------------------------------------------------"
# Initialise the new PostgreSQL database directory
startup_echo "---------------------------------------"
startup_echo "Initialising new PostgreSQL ${POSTGRES_VERSION} database"
startup_echo "---------------------------------------"
init_data_directory "${NEW}"
startup_echo "------------------------------------"
startup_echo "New database initialisation complete"
startup_echo "------------------------------------"
# Change into the PostgreSQL database directory, to avoid a pg_upgrade error about write permissions
cd "${PGDATA}"
startup_echo "--------------------------------"
startup_echo "Running pg_upgrade check command"
startup_echo "--------------------------------"
${POSTGRES_BIN_FOLDER}/pg_upgrade \
--check \
--username='postgres' \
--link \
-d ${OLD} \
-D ${NEW} \
-b ${POSTGRES_OLD_BIN_FOLDER} \
-B ${POSTGRES_BIN_FOLDER} \
-o "-c config_file=${POSTGRES_OLD_LOCATION}/postgresql.conf" \
-O "-c config_file=${POSTGRES_LOCATION}/postgresql.conf"
if [ $? -ne 0 ]; then
startup_echo "----------------------------------------------------------"
startup_echo "pg_upgrade check failed. Refer to `pg_upgrade` documentation at https://www.postgresql.org/docs/current/pgupgrade.html, Baserow community at https://community.baserow.io/ or contact Baserow support for assistance."
startup_echo "----------------------------------------------------------"
exit 6
fi
# Run the pg_upgrade command itself
startup_echo "---------------------------------------"
startup_echo "Running pg_upgrade command, from $(pwd)"
startup_echo "---------------------------------------"
${POSTGRES_BIN_FOLDER}/pg_upgrade \
--username='postgres' \
--link \
-d ${OLD} \
-D ${NEW} \
-b ${POSTGRES_OLD_BIN_FOLDER} \
-B ${POSTGRES_BIN_FOLDER} \
-o "-c config_file=${POSTGRES_OLD_LOCATION}/postgresql.conf" \
-O "-c config_file=${POSTGRES_LOCATION}/postgresql.conf"
startup_echo "--------------------------------------"
startup_echo "Running pg_upgrade command is complete"
startup_echo "--------------------------------------"
# TODO for future upgrades: check if the next step is necessary
startup_echo "--------------------------------------------------------"
startup_echo "Re-hashing user password to use new default SCRAM-SHA-256 encryption"
startup_echo "--------------------------------------------------------"
${POSTGRES_BIN_FOLDER}/pg_ctl \
-D ${NEW} \
start
PGPASSWORD=$POSTGRES_PASSWORD ${POSTGRES_BIN_FOLDER}/psql \
-U postgres \
-d $POSTGRES_DB \
-c "ALTER USER \"$POSTGRES_USER\" WITH PASSWORD '$POSTGRES_PASSWORD';"
${POSTGRES_BIN_FOLDER}/pg_ctl \
-D ${NEW} \
stop
startup_echo "-------------------------------------------------"
startup_echo "Re-hashing user password complete, server stopped"
startup_echo "-------------------------------------------------"
startup_echo "----------------------------------------------------------------------------------------"
startup_echo "Replacing the original data directory with the upgraded one which supports PostgreSQL ${POSTGRES_VERSION}"
startup_echo "----------------------------------------------------------------------------------------"
mv -v "${NEW}"/* "${PGDATA}"
if [ -f "${OLD}/baserow_db_setup" ]; then
startup_echo "------------------------------------------"
startup_echo "Moving the Baserow DB setup indicator file"
startup_echo "------------------------------------------"
mv -v "${OLD}/baserow_db_setup" "${PGDATA}/"
fi
startup_echo "*************************"
startup_echo "*** Upgrade complete. ***"
startup_echo "*************************"
}
_main "$@"