37 lines
1.0 KiB
Bash
37 lines
1.0 KiB
Bash
#!/bin/sh
|
|
set -eu
|
|
|
|
export PGDATA="${PGDATA:-/tmp/postgres-data}"
|
|
BACKUP_DIR="${BACKUP_DIR:-/backup}"
|
|
LATEST_BACKUP="$BACKUP_DIR/latest.sql"
|
|
INIT_DIR="/docker-entrypoint-initdb.d"
|
|
|
|
mkdir -p "$BACKUP_DIR" "$INIT_DIR"
|
|
|
|
if [ ! -s "$PGDATA/PG_VERSION" ] && [ -s "$LATEST_BACKUP" ]; then
|
|
echo "Found persistent backup at $LATEST_BACKUP, preparing restore on first init."
|
|
cp "$LATEST_BACKUP" "$INIT_DIR/001-restore.sql"
|
|
fi
|
|
|
|
docker-entrypoint.sh "$@" &
|
|
postgres_pid="$!"
|
|
|
|
until pg_isready -h 127.0.0.1 -U "$POSTGRES_USER" -d "$POSTGRES_DB"; do
|
|
echo "Waiting for PostgreSQL before backup loop..."
|
|
sleep 5
|
|
done
|
|
|
|
while kill -0 "$postgres_pid" 2>/dev/null; do
|
|
if PGPASSWORD="$POSTGRES_PASSWORD" pg_dump -h 127.0.0.1 -U "$POSTGRES_USER" "$POSTGRES_DB" > "$BACKUP_DIR/latest.sql.tmp"; then
|
|
mv "$BACKUP_DIR/latest.sql.tmp" "$LATEST_BACKUP"
|
|
echo "Persistent backup updated at $LATEST_BACKUP"
|
|
else
|
|
echo "Persistent backup failed"
|
|
rm -f "$BACKUP_DIR/latest.sql.tmp"
|
|
fi
|
|
|
|
sleep "${BACKUP_INTERVAL_SECONDS:-60}"
|
|
done
|
|
|
|
wait "$postgres_pid"
|