sync: scission owner/template + brain-template-export + BRAIN_MODE guard + /visualize scope filter + port orphelins fix
This commit is contained in:
72
scripts/brain-db-backup.sh
Executable file
72
scripts/brain-db-backup.sh
Executable file
@@ -0,0 +1,72 @@
|
||||
#!/usr/bin/env bash
|
||||
# brain-db-backup.sh — Backup journalier brain.db → repo git dédié
|
||||
# Usage: bash scripts/brain-db-backup.sh [backup_dir]
|
||||
# Cron: 0 4 * * * bash ~/Dev/Brain/scripts/brain-db-backup.sh
|
||||
#
|
||||
# Stratégie :
|
||||
# 1. SQLite vacuum into backup (copie propre, pas de lock stale)
|
||||
# 2. Commit daté dans le repo backup
|
||||
# 3. Push Gitea (silencieux si remote absent)
|
||||
# 4. Rétention : 30 fichiers max (rotation automatique)
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
BRAIN_DB="${BRAIN_DB:-$HOME/Dev/Brain/brain.db}"
|
||||
BACKUP_DIR="${1:-$HOME/Dev/Brain/brain-db-backup}"
|
||||
RETENTION=30
|
||||
DATE=$(date '+%Y-%m-%d')
|
||||
BACKUP_FILE="brain-${DATE}.db"
|
||||
|
||||
# --- Vérifications ---
|
||||
if [[ ! -f "$BRAIN_DB" ]]; then
|
||||
echo "❌ brain.db introuvable : $BRAIN_DB" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# --- Init repo backup si premier run ---
|
||||
if [[ ! -d "$BACKUP_DIR" ]]; then
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
git -C "$BACKUP_DIR" init
|
||||
echo "# brain-db-backup" > "$BACKUP_DIR/README.md"
|
||||
echo "Backups journaliers de brain.db — généré par brain-db-backup.sh" >> "$BACKUP_DIR/README.md"
|
||||
echo "" >> "$BACKUP_DIR/README.md"
|
||||
echo "*.db binary" > "$BACKUP_DIR/.gitattributes"
|
||||
git -C "$BACKUP_DIR" add .
|
||||
git -C "$BACKUP_DIR" commit -m "init: brain-db-backup repo"
|
||||
echo "✅ Repo backup initialisé : $BACKUP_DIR"
|
||||
fi
|
||||
|
||||
# --- Backup via SQLite vacuum (copie propre) ---
|
||||
python3 -c "
|
||||
import sqlite3, shutil, sys
|
||||
src = '${BRAIN_DB}'
|
||||
dst = '${BACKUP_DIR}/${BACKUP_FILE}'
|
||||
conn = sqlite3.connect(src)
|
||||
bkp = sqlite3.connect(dst)
|
||||
conn.backup(bkp)
|
||||
bkp.close()
|
||||
conn.close()
|
||||
print(f'✅ Backup : {dst}')
|
||||
"
|
||||
|
||||
# --- Rotation : garder les N plus récents ---
|
||||
cd "$BACKUP_DIR"
|
||||
ls -1t brain-*.db 2>/dev/null | tail -n +$((RETENTION + 1)) | while read old; do
|
||||
rm -f "$old"
|
||||
echo "🗑 Rotation : $old supprimé"
|
||||
done
|
||||
|
||||
# --- Commit ---
|
||||
git -C "$BACKUP_DIR" add -A
|
||||
if git -C "$BACKUP_DIR" diff --cached --quiet; then
|
||||
echo "ℹ️ Aucun changement — brain.db identique au dernier backup"
|
||||
exit 0
|
||||
fi
|
||||
git -C "$BACKUP_DIR" commit -m "backup: brain.db ${DATE}"
|
||||
|
||||
# --- Push (silencieux si pas de remote) ---
|
||||
if git -C "$BACKUP_DIR" remote get-url origin &>/dev/null; then
|
||||
git -C "$BACKUP_DIR" push -q && echo "✅ Push Gitea OK" || echo "⚠️ Push échoué (réseau ?)"
|
||||
else
|
||||
echo "ℹ️ Pas de remote — backup local uniquement. Ajouter : git -C $BACKUP_DIR remote add origin <url>"
|
||||
fi
|
||||
Reference in New Issue
Block a user