SPB Git

Repository Public MIT

backup.sh 1.3 KB 25 lines shellscript

1#!/bin/bash2# Daily backup: compressed pg_dump + incremental copy of the immutable blob store.3# Reads DATABASE_URL and DATA_DIR from the repository .env. Optional: BACKUP_DIR, BACKUP_REMOTE (rsync target).4set -euo pipefail5cd "$(dirname "$0")/.."6export PATH="/opt/homebrew/opt/postgresql@17/bin:/opt/homebrew/bin:$PATH"7set -a; . ./.env; set +a8BACKUP_DIR="${BACKUP_DIR:-$HOME/backups/skills-spboucher-ai}"9umask 07710mkdir -p "$BACKUP_DIR/db" "$BACKUP_DIR/blobs" "$DATA_DIR/blobs"11stamp="$(date -u +%Y%m%dT%H%M%SZ)"12out="$BACKUP_DIR/db/skills-$stamp.sql.gz"13pg_dump --no-owner --no-privileges "$DATABASE_URL" | gzip -9 > "$out.part"14gzip -t "$out.part"15mv "$out.part" "$out"16# Blobs are content-addressed and never change: copy new ones only, never delete.17rsync -a --ignore-existing "$DATA_DIR/blobs/" "$BACKUP_DIR/blobs/"18# Keep 30 daily dumps.19ls -1t "$BACKUP_DIR"/db/skills-*.sql.gz | tail -n +31 | xargs -I{} rm -f {}20if [ -n "${BACKUP_REMOTE:-}" ]; then21  rsync -a --ignore-existing "$BACKUP_DIR/blobs/" "$BACKUP_REMOTE/blobs/"22  rsync -a "$BACKUP_DIR/db/" "$BACKUP_REMOTE/db/"23fi24echo "{\"level\":\"info\",\"event\":\"backup\",\"dump\":\"$out\",\"bytes\":$(stat -f%z "$out" 2>/dev/null || stat -c%s "$out"),\"blobs\":$(find "$BACKUP_DIR/blobs" -type f | wc -l | tr -d ' ')}"25
Files main
Menu

Theme