#!/bin/bash # Backup script for hindsight (Adolf's long-term memory bank) and the # openai_adolf-state Docker volume (Matrix E2EE identity/sessions + config). # Mirrors the seafile/vaultwarden/openai-llm-dbs backup.sh pattern (same repo): # dump/tar via `docker exec`, gzip, retention of last 5. Backup-freshness # monitored via .age items. # # hindsight is an embedded Postgres (pg0) instance living at # /mnt/ssd/dbs/hindsight on the host, bind-mounted into the `hindsight` # container at /home/hindsight/.pg0. We use pg_dump against the live, # running instance (safe, no downtime/quiescing needed — same rationale as # openai-llm-dbs). # # adolf-state is a named Docker volume (openai_adolf-state) owned by the # container's `node` user, not readable directly from the host as this # script's operator. We tar it from inside the `adolf` container instead # (docker exec has access via the mount; no host-side permission needed). # # Run every 3 days via root crontab (same schedule as sibling backups), e.g.: # 0 4 */3 * * /home/alvis/agap_git/openai/backup-hindsight-adolf.sh >> /mnt/backups/hindsight-adolf/backup.log 2>&1 # # Restore: # # hindsight (drop+recreate the DB first if restoring into a fresh instance, # # since the dump is a plain SQL dump, not --clean): # gunzip -c /mnt/backups/hindsight-adolf//hindsight.sql.gz | \ # docker exec -i -e PGPASSWORD=hindsight hindsight \ # /home/hindsight/.pg0/installation/18.1.0/bin/psql -U hindsight -h 127.0.0.1 -p 5432 hindsight # # # adolf-state (container must be stopped first so files aren't overwritten # # while in use; extract into the volume's mountpoint): # docker stop adolf # docker run --rm -v openai_adolf-state:/target -v /mnt/backups/hindsight-adolf/:/backup:ro \ # alpine sh -c "rm -rf /target/* && tar xzf /backup/adolf-state.tar.gz -C /target" # docker start adolf set -euo pipefail BACKUP_DIR="/mnt/backups/hindsight-adolf" DATE=$(date '+%Y%m%d-%H%M') DEST="$BACKUP_DIR/$DATE" mkdir -p "$DEST" # Backup-freshness monitoring is now done via .age items (calculated fields showing # age of the backup). The .ts (timestamp) trappers were unreliable (history.push not # landing); removed in kb#189 in favor of .age overdue triggers. # --- hindsight (Postgres logical dump, live/read-only) --- echo "Dumping hindsight..." docker exec -e PGPASSWORD=hindsight hindsight \ /home/hindsight/.pg0/installation/18.1.0/bin/pg_dump -U hindsight -h 127.0.0.1 -p 5432 hindsight \ | gzip > "$DEST/hindsight.sql.gz" echo "Dumped: hindsight -> $DEST/hindsight.sql.gz" # --- adolf-state (tar the volume from inside the adolf container) --- echo "Archiving adolf-state..." docker exec adolf tar czf - -C /home/node/.openclaw . > "$DEST/adolf-state.tar.gz" echo "Archived: adolf-state -> $DEST/adolf-state.tar.gz" echo "$(date): Backup complete: $DEST" ls -la "$DEST/" # Rotate: keep last 5 backups ls -1dt "$BACKUP_DIR"/[0-9]*-[0-9]* 2>/dev/null | tail -n +6 | xargs -r rm -rf