mirror of
https://github.com/hanzoai/sentinel.git
synced 2026-09-29 22:34:33 +00:00
87 lines
3.2 KiB
Bash
Executable File
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 "$@"
|