SPB Git

spb/spbgit Public MIT

SPB Git — the platform hosting itself

JavaScript 73.9% CSS 11.7% Nunjucks 11.6% Shell 2.7%
1.8 KB · 41 lines shellscript
Raw Blame History
1#!/bin/bash2# ─────────────────────────────────────────────3#  SPB Git — Personal Git Platform4# ─────────────────────────────────────────────5#  Author  : Simon-Pierre Boucher6#  Contact : contact@spboucher.ai7#  File    : deploy/backup.sh8#  Purpose : Nightly backup — tar.zst of bare repos + data, keep 149#  License : MIT © Simon-Pierre Boucher10# ─────────────────────────────────────────────11#12# Cron (crontab -e on m3u96a):13#   15 3 * * * /bin/bash <app>/deploy/backup.sh >> <prefix>/spbgit/logs/backup.log 2>&114#15set -euo pipefail1617if [ "$(uname)" = "Darwin" ]; then PREFIX="$HOME/srv"; else PREFIX="/srv"; fi18GIT_ROOT="${SPBGIT_GIT_ROOT:-$PREFIX/git}"19DATA_DIR="${SPBGIT_DATA_DIR:-$PREFIX/spbgit/data}"20BACKUP_DIR="${SPBGIT_BACKUP_DIR:-$PREFIX/spbgit/backups}"21KEEP=142223mkdir -p "$BACKUP_DIR"24STAMP="$(date +%Y%m%d-%H%M%S)"2526if tar --help 2>/dev/null | grep -q -- --zstd; then27  ARCHIVE="$BACKUP_DIR/spbgit-$STAMP.tar.zst"28  tar --zstd -cf "$ARCHIVE" -C "$(dirname "$GIT_ROOT")" "$(basename "$GIT_ROOT")" -C "$(dirname "$DATA_DIR")" "$(basename "$DATA_DIR")"29else30  ARCHIVE="$BACKUP_DIR/spbgit-$STAMP.tar.gz"31  tar -czf "$ARCHIVE" -C "$(dirname "$GIT_ROOT")" "$(basename "$GIT_ROOT")" -C "$(dirname "$DATA_DIR")" "$(basename "$DATA_DIR")"32fi3334# Rotate: keep the newest $KEEP archives.35ls -1t "$BACKUP_DIR"/spbgit-*.tar.* 2>/dev/null | tail -n +$((KEEP + 1)) | while read -r old; do36  rm -f "$old"37done3839SIZE="$(du -h "$ARCHIVE" | cut -f1 | tr -d ' ')"40echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] backup ok: $ARCHIVE ($SIZE), $(ls -1 "$BACKUP_DIR"/spbgit-*.tar.* | wc -l | tr -d ' ') archives kept"41