- scripts/auto_restart_agent.sh — monitor and restart dead processes (3-attempt backoff) - scripts/backup_pipeline.sh — daily backups with retention + offsite rsync hook - scripts/telegram_thread_reporter.py — route messages to ops/burn/main threads - infrastructure/cron/*.crontab — scheduling for new automations
81 lines
2.5 KiB
Bash
81 lines
2.5 KiB
Bash
#!/usr/bin/env bash
|
|
# backup_pipeline.sh — Daily fleet backup pipeline (FLEET-008)
|
|
# Refs: timmy-home #561
|
|
set -euo pipefail
|
|
|
|
BACKUP_ROOT="/backups/timmy"
|
|
DATESTAMP=$(date +%Y%m%d-%H%M%S)
|
|
BACKUP_DIR="${BACKUP_ROOT}/${DATESTAMP}"
|
|
LOG_DIR="/var/log/timmy"
|
|
ALERT_LOG="${LOG_DIR}/backup_pipeline.log"
|
|
mkdir -p "$BACKUP_DIR" "$LOG_DIR"
|
|
|
|
TELEGRAM_BOT_TOKEN="${TELEGRAM_BOT_TOKEN:-}"
|
|
TELEGRAM_CHAT_ID="${TELEGRAM_CHAT_ID:-}"
|
|
OFFSITE_TARGET="${OFFSITE_TARGET:-}"
|
|
|
|
log() { echo "[$(date -Iseconds)] $1" | tee -a "$ALERT_LOG"; }
|
|
|
|
send_telegram() {
|
|
local msg="$1"
|
|
if [[ -n "$TELEGRAM_BOT_TOKEN" && -n "$TELEGRAM_CHAT_ID" ]]; then
|
|
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
|
|
-d "chat_id=${TELEGRAM_CHAT_ID}" -d "text=${msg}" >/dev/null 2>&1 || true
|
|
fi
|
|
}
|
|
|
|
status=0
|
|
|
|
# --- Gitea repositories ---
|
|
if [[ -d /root/gitea ]]; then
|
|
tar czf "${BACKUP_DIR}/gitea-repos.tar.gz" -C /root gitea 2>/dev/null || true
|
|
log "Backed up Gitea repos"
|
|
fi
|
|
|
|
# --- Agent configs and state ---
|
|
for wiz in bezalel allegro ezra timmy; do
|
|
if [[ -d "/root/wizards/${wiz}" ]]; then
|
|
tar czf "${BACKUP_DIR}/${wiz}-home.tar.gz" -C /root/wizards "${wiz}" 2>/dev/null || true
|
|
log "Backed up ${wiz} home"
|
|
fi
|
|
done
|
|
|
|
# --- System configs ---
|
|
cp /etc/crontab "${BACKUP_DIR}/crontab" 2>/dev/null || true
|
|
cp -r /etc/systemd/system "${BACKUP_DIR}/systemd" 2>/dev/null || true
|
|
log "Backed up system configs"
|
|
|
|
# --- Evennia worlds (if present) ---
|
|
if [[ -d /root/evennia ]]; then
|
|
tar czf "${BACKUP_DIR}/evennia-worlds.tar.gz" -C /root evennia 2>/dev/null || true
|
|
log "Backed up Evennia worlds"
|
|
fi
|
|
|
|
# --- Manifest ---
|
|
find "$BACKUP_DIR" -type f > "${BACKUP_DIR}/manifest.txt"
|
|
log "Backup manifest written"
|
|
|
|
# --- Offsite sync ---
|
|
if [[ -n "$OFFSITE_TARGET" ]]; then
|
|
if rsync -az --delete "${BACKUP_DIR}/" "${OFFSITE_TARGET}/${DATESTAMP}/" 2>/dev/null; then
|
|
log "Offsite sync completed"
|
|
else
|
|
log "WARNING: Offsite sync failed"
|
|
status=1
|
|
fi
|
|
fi
|
|
|
|
# --- Retention: keep last 7 days ---
|
|
find "$BACKUP_ROOT" -mindepth 1 -maxdepth 1 -type d -mtime +7 -exec rm -rf {} + 2>/dev/null || true
|
|
log "Retention applied (7 days)"
|
|
|
|
if [[ "$status" -eq 0 ]]; then
|
|
log "Backup pipeline completed: ${BACKUP_DIR}"
|
|
send_telegram "✅ Daily backup completed: ${DATESTAMP}"
|
|
else
|
|
log "Backup pipeline completed with WARNINGS: ${BACKUP_DIR}"
|
|
send_telegram "⚠️ Daily backup completed with warnings: ${DATESTAMP}"
|
|
fi
|
|
|
|
exit "$status"
|