#!/usr/bin/env bash # # deploy/dalidou/cron-backup.sh # ------------------------------ # Daily backup + retention cleanup via the AtoCore API. # # Intended to run from cron on Dalidou: # # # Daily at 03:00 UTC # 0 3 * * * /srv/storage/atocore/app/deploy/dalidou/cron-backup.sh >> /var/log/atocore-backup.log 2>&1 # # What it does: # 1. Creates a runtime backup (db + registry, no chroma by default) # 2. Runs retention cleanup with --confirm to delete old snapshots # 3. Logs results to stdout (captured by cron into the log file) # # Fail-open: exits 0 even on API errors so cron doesn't send noise # emails. Check /var/log/atocore-backup.log for diagnostics. # # Environment variables: # ATOCORE_URL default http://127.0.0.1:8100 # ATOCORE_BACKUP_CHROMA default false (set to "true" for cold chroma copy) set -euo pipefail ATOCORE_URL="${ATOCORE_URL:-http://127.0.0.1:8100}" INCLUDE_CHROMA="${ATOCORE_BACKUP_CHROMA:-false}" TIMESTAMP="$(date -u +%Y-%m-%dT%H:%M:%SZ)" log() { printf '[%s] %s\n' "$TIMESTAMP" "$*"; } log "=== AtoCore daily backup starting ===" # Step 1: Create backup log "Step 1: creating backup (chroma=$INCLUDE_CHROMA)" BACKUP_RESULT=$(curl -sf -X POST \ -H "Content-Type: application/json" \ -d "{\"include_chroma\": $INCLUDE_CHROMA}" \ "$ATOCORE_URL/admin/backup" 2>&1) || { log "ERROR: backup creation failed: $BACKUP_RESULT" exit 0 } log "Backup created: $BACKUP_RESULT" # Step 2: Retention cleanup (confirm=true to actually delete) log "Step 2: running retention cleanup" CLEANUP_RESULT=$(curl -sf -X POST \ -H "Content-Type: application/json" \ -d '{"confirm": true}' \ "$ATOCORE_URL/admin/backup/cleanup" 2>&1) || { log "ERROR: cleanup failed: $CLEANUP_RESULT" exit 0 } log "Cleanup result: $CLEANUP_RESULT" log "=== AtoCore daily backup complete ==="