#!/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 "$@"