Initial release: DictIA v0.8.14-alpha (fork de Speakr, AGPL-3.0)
This commit is contained in:
89
deployment/tools/backup.sh
Normal file
89
deployment/tools/backup.sh
Normal file
@@ -0,0 +1,89 @@
|
||||
#!/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" <<MANIFEST
|
||||
{
|
||||
"timestamp": "$TIMESTAMP",
|
||||
"project_dir": "$PROJECT_DIR",
|
||||
"hostname": "$(hostname)",
|
||||
"contents": {
|
||||
"data": $([ -d "$BACKUP_DIR/data" ] && echo "true" || echo "false"),
|
||||
"env": $([ -f "$BACKUP_DIR/dot-env" ] && echo "true" || echo "false"),
|
||||
"asr_stats": $([ -f "$BACKUP_DIR/asr-usage-stats.json" ] && echo "true" || echo "false"),
|
||||
"whisperx_cache": $([ -f "$BACKUP_DIR/whisperx-cache.tar.gz" ] && echo "true" || echo "false")
|
||||
}
|
||||
}
|
||||
MANIFEST
|
||||
|
||||
# Compress
|
||||
echo
|
||||
echo "Compressing backup..."
|
||||
ARCHIVE="$BACKUP_BASE/dictia-$TIMESTAMP.tar.gz"
|
||||
tar czf "$ARCHIVE" -C "$BACKUP_BASE" "dictia-$TIMESTAMP"
|
||||
rm -rf "$BACKUP_DIR"
|
||||
echo "Archive: $ARCHIVE ($(du -h "$ARCHIVE" | cut -f1))"
|
||||
|
||||
# Rotate old backups
|
||||
BACKUP_COUNT=$(ls -1 "$BACKUP_BASE"/dictia-*.tar.gz 2>/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 ==="
|
||||
Reference in New Issue
Block a user