102 lines
2.5 KiB
Bash
102 lines
2.5 KiB
Bash
#!/usr/bin/env bash
|
|
# DictIA — Restore script
|
|
#
|
|
# Restores a DictIA backup archive created by backup.sh.
|
|
#
|
|
# Usage: bash restore.sh <ARCHIVE_PATH> [PROJECT_DIR]
|
|
set -euo pipefail
|
|
|
|
ARCHIVE="${1:-}"
|
|
PROJECT_DIR="${2:-$(cd "$(dirname "$0")/../.." && pwd)}"
|
|
|
|
if [ -z "$ARCHIVE" ] || [ ! -f "$ARCHIVE" ]; then
|
|
echo "Usage: bash restore.sh <backup-archive.tar.gz> [project-dir]"
|
|
echo
|
|
echo "Available backups:"
|
|
ls -1t "$PROJECT_DIR/backups"/dictia-*.tar.gz 2>/dev/null | head -5 || echo " (none found)"
|
|
exit 1
|
|
fi
|
|
|
|
echo "=== DictIA Restore ==="
|
|
echo "Archive: $ARCHIVE"
|
|
echo "Target: $PROJECT_DIR"
|
|
echo
|
|
|
|
# Validate archive
|
|
echo "Validating archive..."
|
|
TMPDIR=$(mktemp -d)
|
|
tar xzf "$ARCHIVE" -C "$TMPDIR"
|
|
BACKUP_DIR=$(ls -1d "$TMPDIR"/dictia-* | head -1)
|
|
|
|
if [ ! -f "$BACKUP_DIR/manifest.json" ]; then
|
|
echo "ERROR: Invalid backup archive (no manifest.json)"
|
|
rm -rf "$TMPDIR"
|
|
exit 1
|
|
fi
|
|
|
|
echo "Manifest:"
|
|
cat "$BACKUP_DIR/manifest.json"
|
|
echo
|
|
echo
|
|
|
|
# Confirmation
|
|
read -rp "This will overwrite current data. Continue? [y/N] " CONFIRM
|
|
if [ "$CONFIRM" != "y" ] && [ "$CONFIRM" != "Y" ]; then
|
|
echo "Aborted."
|
|
rm -rf "$TMPDIR"
|
|
exit 0
|
|
fi
|
|
|
|
# Stop services
|
|
echo
|
|
echo "Stopping DictIA services..."
|
|
COMPOSE_FILE=""
|
|
for f in cloud local-cpu local-gpu; do
|
|
if [ -f "$PROJECT_DIR/deployment/docker/docker-compose.$f.yml" ]; then
|
|
COMPOSE_FILE="$PROJECT_DIR/deployment/docker/docker-compose.$f.yml"
|
|
fi
|
|
done
|
|
if [ -n "$COMPOSE_FILE" ]; then
|
|
docker compose -f "$COMPOSE_FILE" down 2>/dev/null || true
|
|
fi
|
|
|
|
# Restore data
|
|
if [ -d "$BACKUP_DIR/data" ]; then
|
|
echo "Restoring data/..."
|
|
rm -rf "$PROJECT_DIR/data"
|
|
cp -a "$BACKUP_DIR/data" "$PROJECT_DIR/data"
|
|
fi
|
|
|
|
# Restore .env
|
|
if [ -f "$BACKUP_DIR/dot-env" ]; then
|
|
echo "Restoring .env..."
|
|
cp "$BACKUP_DIR/dot-env" "$PROJECT_DIR/.env"
|
|
fi
|
|
|
|
# Restore ASR stats
|
|
if [ -f "$BACKUP_DIR/asr-usage-stats.json" ]; then
|
|
echo "Restoring ASR proxy stats..."
|
|
cp "$BACKUP_DIR/asr-usage-stats.json" "$PROJECT_DIR/deployment/asr-proxy/usage-stats.json"
|
|
fi
|
|
|
|
# Restore Docker volumes
|
|
if [ -f "$BACKUP_DIR/whisperx-cache.tar.gz" ]; then
|
|
echo "Restoring whisperx-cache volume..."
|
|
docker volume create whisperx-cache 2>/dev/null || true
|
|
docker run --rm -v whisperx-cache:/target -v "$BACKUP_DIR":/backup \
|
|
alpine sh -c "cd /target && tar xzf /backup/whisperx-cache.tar.gz" 2>/dev/null || true
|
|
fi
|
|
|
|
# Cleanup
|
|
rm -rf "$TMPDIR"
|
|
|
|
# Restart services
|
|
echo
|
|
echo "Restarting DictIA..."
|
|
if [ -n "$COMPOSE_FILE" ]; then
|
|
docker compose -f "$COMPOSE_FILE" up -d
|
|
fi
|
|
|
|
echo
|
|
echo "=== Restore complete ==="
|