SPB Git

spb/akos

Public
1.7 KB · 23 lines shellscript
1#!/bin/bash2# AKOS backup: pg_dump (custom format) + artifacts tarball → $AKOS_BACKUP_DIR, keep last 14, optional rsync to $AKOS_BACKUP_REMOTE.3set -euo pipefail4export PATH=/opt/homebrew/opt/postgresql@17/bin:/opt/homebrew/bin:/usr/bin:/bin5ROOT="$(cd "$(dirname "$0")/.." && pwd)"6# .env fills in only variables that are not already set (so tests/operators can override)7if [ -f "$ROOT/.env" ]; then while IFS='=' read -r k v; do case "$k" in ''|\#*) continue;; esac; [ -z "${!k:-}" ] && export "$k=$v"; done < "$ROOT/.env"; fi8DB="${DATABASE_URL:-postgresql://akos@127.0.0.1:5432/akos}"9DIR="${AKOS_BACKUP_DIR:-$HOME/backups/akos}"10DATA="${AKOS_DATA_DIR:-$ROOT/data}"11TS="$(date -u +%Y%m%d-%H%M%S)"12mkdir -p "$DIR"13pg_dump --format=custom --no-owner --file "$DIR/akos-$TS.dump" "$DB"14if [ -d "$DATA/artifacts" ]; then tar -C "$DATA" -czf "$DIR/akos-$TS-artifacts.tgz" artifacts; fi15FILES="$DIR/akos-$TS.dump"; [ -f "$DIR/akos-$TS-artifacts.tgz" ] && FILES="$FILES $DIR/akos-$TS-artifacts.tgz"16(cd "$DIR" && shasum -a 256 $(for f in $FILES; do basename "$f"; done) > "akos-$TS.sha256")17ls -1t "$DIR"/akos-*.dump | tail -n +15 | while read -r f; do b="${f%.dump}"; rm -f "$f" "$b-artifacts.tgz" "$b.sha256"; done18echo "backup ok: $DIR/akos-$TS.dump ($(du -h "$DIR/akos-$TS.dump" | cut -f1)) artifacts=$( [ -f "$DIR/akos-$TS-artifacts.tgz" ] && du -h "$DIR/akos-$TS-artifacts.tgz" | cut -f1 || echo none)"19if [ -n "${AKOS_BACKUP_REMOTE:-}" ]; then20  host="${AKOS_BACKUP_REMOTE%%:*}"; rpath="${AKOS_BACKUP_REMOTE#*:}"21  if ssh -o BatchMode=yes -o ConnectTimeout=10 "$host" "mkdir -p $rpath" 2>/dev/null && rsync -a --timeout=120 "$DIR"/akos-$TS.* "$AKOS_BACKUP_REMOTE/" 2>/dev/null; then echo "remote copy ok: $AKOS_BACKUP_REMOTE"; else echo "remote copy FAILED (local backup kept)"; fi22fi23
Files · main
Menu

Theme