spb/spbgit Public MIT
SPB Git — the platform hosting itself
JavaScript 73.9%
CSS 11.7%
Nunjucks 11.6%
Shell 2.7%
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