#!/usr/bin/env bash # DictIA — Restore script # # Restores a DictIA backup archive created by backup.sh. # # Usage: bash restore.sh [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 [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 ==="