#! /usr/bin/env bash SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) USER_HOME=$HOME [[ -n "${SUDO_USER}" ]] && USER_HOME="$(eval "echo ~${SUDO_USER}")" . ${SHRC_D:-$SCRIPT_DIR}/01_util.functions set -e # create backup folder folder="./dumps/" mkdir -p "$folder" # get namespaces with postgres database pod json_results=$( # While tcdbinfo lists all SQL databases, we want only postgresql # in this script. "${SCRIPT_DIR}/tcdbinfo.sh" --json "${@}" \ | jq -s '.[] | select( .protocol = "postgresql" )' ) namespaces=$(<<<"$json_results" jq -sr '.[] | .name') for ns in $namespaces; do # extract application name app=$(echo "$ns" | sed 's/^ix-//') echo "Creating database backup for $app." file="$app.sql" # Scale down deployment to avoid inconsistencies in DB k3s kubectl scale deploy "$app" -n "$ns" --replicas=0 while true; do k3s kubectl get pods -n "$ns" | grep -i -q terminating || break; done; k3s kubectl exec -n "$ns" -c "$app"-postgresql "$app"-postgresql-0 -- bash -c " PGPASSWORD=\$POSTGRES_PASSWORD $( # Does not affect the output ) pg_dump -Fc -U \$POSTGRES_USER -d \$POSTGRES_DB -f /tmp/$file " k3s kubectl cp -n "$ns" -c "$app"-postgresql "$app-postgresql-0:tmp/$file" $folder$file # Scale deployment back up k3s kubectl scale deploy "$app" -n "$ns" --replicas=1 if [ ! -f "$folder$file" ]; then >&2 echo "$folder$file does not exist." exit 1 fi echo "File $file created." done exit 0