-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathbackup.sh
More file actions
executable file
·71 lines (58 loc) · 2.32 KB
/
backup.sh
File metadata and controls
executable file
·71 lines (58 loc) · 2.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#!/bin/bash
set -e
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
BACKUP_DIR="${SCRIPT_DIR}/backups"
TIMESTAMP=$(date +%Y%m%dT%H%M%S)
# Load BACKUP_TARGET from .env if available
if [ -f "$SCRIPT_DIR/.env" ]; then
BACKUP_TARGET=$(grep -E '^BACKUP_TARGET=' "$SCRIPT_DIR/.env" | cut -d= -f2-)
fi
# State files — everything git doesn't track but you'd want back
BACKUP_PATHS=(
.env
context.md
ssh-keys/
logs/
data/
skills/private/
)
# ── Local backup (tar) ────────────────────────────────────────────────
mkdir -p "$BACKUP_DIR"
# Build tar args — only include paths that exist
TAR_ARGS=()
for p in "${BACKUP_PATHS[@]}"; do
[ -e "$SCRIPT_DIR/$p" ] && TAR_ARGS+=("$p")
done
if [ ${#TAR_ARGS[@]} -eq 0 ]; then
echo "Nothing to back up."
exit 0
fi
TARBALL="$BACKUP_DIR/h-cli-backup-${TIMESTAMP}.tar.gz"
tar czf "$TARBALL" -C "$SCRIPT_DIR" "${TAR_ARGS[@]}"
echo "Local: $TARBALL"
# Keep only last 5 local backups
ls -t "$BACKUP_DIR"/h-cli-backup-*.tar.gz 2>/dev/null | tail -n +6 | xargs -r rm --
# ── Remote backup (rsync) ─────────────────────────────────────────────
if [ -z "$BACKUP_TARGET" ]; then
echo "Remote: skipped (BACKUP_TARGET not set in .env)"
exit 0
fi
# Use h-cli SSH key if available
SSH_KEY="$SCRIPT_DIR/ssh-keys/id_ed25519"
SSH_OPTS=""
[ -f "$SSH_KEY" ] && SSH_OPTS="-e \"ssh -i $SSH_KEY\""
# Build rsync include list
RSYNC_ARGS=()
for p in "${BACKUP_PATHS[@]}"; do
[ -e "$SCRIPT_DIR/$p" ] && RSYNC_ARGS+=("$p")
done
eval rsync -avz --relative $SSH_OPTS "${RSYNC_ARGS[@]/#/$SCRIPT_DIR/.\/}" "$BACKUP_TARGET"
echo "Remote: pushed state to $BACKUP_TARGET"
# ── Pull processed training data back ─────────────────────────────────
# Pipeline drops processed Q/A into a known path on the remote.
# Pull it into data/ for local ingest into Qdrant.
IMPORT_PATH="data/import/"
mkdir -p "$SCRIPT_DIR/$IMPORT_PATH"
eval rsync -avz $SSH_OPTS "$BACKUP_TARGET/$IMPORT_PATH" "$SCRIPT_DIR/$IMPORT_PATH" 2>/dev/null && \
echo "Remote: pulled training data from $BACKUP_TARGET/$IMPORT_PATH" || \
echo "Remote: no training data to pull (ok)"