Initial release: DictIA v0.8.14-alpha (fork de Speakr, AGPL-3.0)
This commit is contained in:
101
deployment/tools/restore.sh
Normal file
101
deployment/tools/restore.sh
Normal file
@@ -0,0 +1,101 @@
|
||||
#!/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 ==="
|
||||
Reference in New Issue
Block a user