#!/usr/bin/env bash # DictIA — Backup script # # Creates a timestamped backup of data, env, and Docker volumes. # Keeps the last N backups (default: 5). # # Usage: bash backup.sh [BACKUP_DIR] set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)" BACKUP_BASE="${1:-$PROJECT_DIR/backups}" KEEP_COUNT=5 TIMESTAMP=$(date +%Y%m%d-%H%M%S) BACKUP_DIR="$BACKUP_BASE/dictia-$TIMESTAMP" echo "=== DictIA Backup ===" echo "Project: $PROJECT_DIR" echo "Backup: $BACKUP_DIR" echo mkdir -p "$BACKUP_DIR" # 1. Data directory if [ -d "$PROJECT_DIR/data" ]; then echo "[1/4] Backing up data/..." cp -a "$PROJECT_DIR/data" "$BACKUP_DIR/data" else echo "[1/4] No data/ directory found, skipping." fi # 2. Environment file if [ -f "$PROJECT_DIR/.env" ]; then echo "[2/4] Backing up .env..." cp "$PROJECT_DIR/.env" "$BACKUP_DIR/dot-env" else echo "[2/4] No .env found, skipping." fi # 3. ASR Proxy stats ASR_STATS="$PROJECT_DIR/deployment/asr-proxy/usage-stats.json" if [ -f "$ASR_STATS" ]; then echo "[3/4] Backing up ASR proxy stats..." cp "$ASR_STATS" "$BACKUP_DIR/asr-usage-stats.json" else echo "[3/4] No ASR proxy stats, skipping." fi # 4. Docker volumes (if using managed volumes) echo "[4/4] Checking Docker volumes..." if docker volume ls --format '{{.Name}}' 2>/dev/null | grep -q "whisperx-cache"; then echo " Exporting whisperx-cache volume..." docker run --rm -v whisperx-cache:/source -v "$BACKUP_DIR":/backup \ alpine tar czf /backup/whisperx-cache.tar.gz -C /source . 2>/dev/null || true fi # Write manifest cat > "$BACKUP_DIR/manifest.json" </dev/null | wc -l) if [ "$BACKUP_COUNT" -gt "$KEEP_COUNT" ]; then echo echo "Rotating backups (keeping last $KEEP_COUNT)..." ls -1t "$BACKUP_BASE"/dictia-*.tar.gz | tail -n +"$((KEEP_COUNT + 1))" | xargs rm -f fi echo echo "=== Backup complete ==="