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