Files
sentinel/config/cdc/postgres-entrypoint.sh
2024-02-15 17:01:50 +00:00

87 lines
3.2 KiB
Bash
Executable File

#!/bin/bash
# This script replaces the default docker entrypoint for postgres in the
# development environment.
# Its job is to ensure postgres is properly configured to support the
# Change Data Capture pipeline (by setting access permissions and installing
# the replication plugin we use for CDC). Unfortunately the default
# Postgres image does not allow this level of configurability so we need
# to do it this way in order not to have to publish and maintain our own
# Postgres image.
#
# This then, at the end, transfers control to the default entrypoint.
set -e
cdc_setup_hba_conf() {
# Ensure pg-hba is properly configured to allow connections
# to the replication slots.
PG_HBA="$PGDATA/pg_hba.conf"
if [ ! -f "$PG_HBA" ]; then
echo "DB not initialized. Postgres will take care of pg_hba"
elif [ "$(grep -c -E "^host\s+replication" "$PGDATA"/pg_hba.conf)" != 0 ]; then
echo "Replication config already present in pg_hba. Not changing anything."
else
# Execute the same script we run on DB initialization
/docker-entrypoint-initdb.d/init_hba.sh
fi
}
install_wal2json() {
# Install the latest version of wal2json if it is not already
# present in /wal2json
# If we cannot download the latest version from github the following
# attempts are made:
# - see if there is a valid version on the volume. Use that
# - see if for any reason there is already a version in the postgres
# lib directory
# If not it is a bad day. And this stops the process.
set +e
LATEST_VERSION_FILE="/wal2json/latest.so"
ARCH=$(uname -m)
FILE_NAME="wal2json-Linux-$ARCH-musl.so"
LATEST_VERSION=$(
wget "https://api.github.com/repos/getsentry/wal2json/releases/latest" -O - |
grep '"tag_name":' |
sed -E 's/.*"([^"]+)".*/\1/'
)
if [[ $LATEST_VERSION ]]; then
if [ ! -f "/wal2json/$LATEST_VERSION/$FILE_NAME" ]; then
mkdir -p "/wal2json/$LATEST_VERSION"
if wget \
"https://github.com/getsentry/wal2json/releases/download/$LATEST_VERSION/$FILE_NAME" \
-P "/wal2json/$LATEST_VERSION/"; then
ln -sf "/wal2json/$LATEST_VERSION/$FILE_NAME" "$LATEST_VERSION_FILE"
fi
fi
ln -sf "$LATEST_VERSION_FILE" /usr/local/lib/postgresql/wal2json.so
elif [ -f $LATEST_VERSION_FILE ]; then
# We did not manage to detect the latest version or we failed at downloading.
# Try to failover
REAL_FILE=$(realpath $LATEST_VERSION_FILE)
echo "Cannot download latest version. Found $REAL_FILE on disk"
ln -sf "$LATEST_VERSION_FILE" /usr/local/lib/postgresql/wal2json.so
elif [ -f "/usr/local/lib/postgresql/wal2json.so" ]; then
# Somehow our volume is not in a good state but there is still a version
# in the library directory. We take that one.
echo "Cannot download latest version. Found a version on disk"
else
echo "wal2json is not installed and cannot download latest version"
exit 1
fi
set -e
echo "wal2json installed"
}
echo "Setting up Change Data Capture"
if [ "$1" = 'postgres' ]; then
cdc_setup_hba_conf
install_wal2json
fi
exec /docker-entrypoint.sh "$@"