#!/bin/bash set -eo pipefail : "${POSTGRES_HOST:?Please set the environment variable.}" : "${POSTGRES_USER:?Please set the environment variable.}" : "${POSTGRES_PASSWORD:?Please set the environment variable.}" : "${AWS_ACCESS_KEY_ID:?Please set the environment variable.}" : "${AWS_SECRET_ACCESS_KEY:?Please set the environment variable.}" : "${RESTIC_PASSWORD:?Please set the environment variable.}" : "${RESTIC_REPOSITORY:?Please set the environment variable.}" : "${RESTIC_HOST:?Please set the environment variable.}" POSTGRES_PORT="${POSTGRES_PORT:-5432}" POSTGRES_SSL_MODE=${POSTGRES_SSL_MODE:-"require"} RESTIC_TAG=${RESTIC_TAG:-"pg_basebackup"} LOKI_URL="http://loki.monitoring:3100/loki/api/v1/push" SERVICE_NAME="pg_backup" send_loki_status() { local status="$1" local timestamp_ns=$(date +%s%N) local level="info" if [ "$status" = "failed" ]; then level="error" fi curl -v -H "Content-Type: application/json" \ -s -X POST "$LOKI_URL" \ --data-raw "{ \"streams\": [ { \"stream\": { \"service_name\": \"$SERVICE_NAME\", \"level\": \"$level\" }, \"values\": [ [ \"$timestamp_ns\", \"$status\" ] ] } ] }" } trap 'send_loki_status failed' ERR PGPASSWORD=${POSTGRES_PASSWORD} pg_basebackup -h "${POSTGRES_HOST}" -d "sslmode=${POSTGRES_SSL_MODE}" -D /tmp/backup -U ${POSTGRES_USER} -F t -z -P restic --verbose backup -H ${RESTIC_HOST} --tag ${RESTIC_TAG} /tmp/backup restic forget --prune --keep-within 14d --host ${RESTIC_HOST} send_loki_status "done"