#!/bin/bash # ====== 织忆恢复脚本 ====== # 从 server Gitea 恢复所有数据 # 用法:./restore.sh [backup_date] # backup_date: 可选,默认最新 set -e BACKUP_DATE="${1:-latest}" PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" GITEA_BASE="http://192.168.123.11:3000/xiaoxue_admin" echo "[$(date '+%Y-%m-%d %H:%M:%S')] ===== 开始恢复织忆 =====" # 1. Clone 配置仓库 echo "[1/5] 拉取 Hermes 配置..." if [ -d "${PROJECT_ROOT}/zhiyi-config" ]; then cd "${PROJECT_ROOT}/zhiyi-config" git pull origin main else git clone "${GITEA_BASE}/zhiyi-config.git" "${PROJECT_ROOT}/zhiyi-config" fi # 2. 恢复核心人格文件 echo "[2/5] 恢复人格文件..." cp "${PROJECT_ROOT}/zhiyi-config/SOUL.md" "${HOME}/.hermes/SOUL.md" cp "${PROJECT_ROOT}/zhiyi-config/AGENTS.md" "${HOME}/.hermes/AGENTS.md" cp "${PROJECT_ROOT}/zhiyi-config/MEMORY.md" "${HOME}/.hermes/MEMORY.md" cp "${PROJECT_ROOT}/zhiyi-config/USER.md" "${HOME}/.hermes/USER.md" echo " 人格文件恢复完成" # 3. 恢复配置文件 echo "[3/5] 恢复配置文件..." [ -f "${PROJECT_ROOT}/zhiyi-config/config.yaml" ] && \ cp "${PROJECT_ROOT}/zhiyi-config/config.yaml" "${HOME}/.hermes/config.yaml" [ -f "${PROJECT_ROOT}/zhiyi-config/.env" ] && \ cp "${PROJECT_ROOT}/zhiyi-config/.env" "${HOME}/.hermes/.env" [ -f "${PROJECT_ROOT}/zhiyi-config/auth.json" ] && \ cp "${PROJECT_ROOT}/zhiyi-config/auth.json" "${HOME}/.hermes/auth.json" echo " 配置文件恢复完成" # 4. 恢复 skills / cron echo "[4/5] 恢复 skills 和 cron..." [ -d "${PROJECT_ROOT}/zhiyi-config/skills" ] && \ rsync -a "${PROJECT_ROOT}/zhiyi-config/skills/" "${HOME}/.hermes/skills/" [ -d "${PROJECT_ROOT}/zhiyi-config/cron" ] && \ rsync -a "${PROJECT_ROOT}/zhiyi-config/cron/" "${HOME}/.hermes/cron/" [ -f "${PROJECT_ROOT}/zhiyi-config/kanban.db" ] && \ cp "${PROJECT_ROOT}/zhiyi-config/kanban.db" "${HOME}/.hermes/kanban.db" echo " skills/cron 恢复完成" # 5. 恢复织忆数据 echo "[5/5] 恢复织忆数据..." # Clone 数据仓库(如果需要) if [ ! -d "${PROJECT_ROOT}/zhiyi-backup" ]; then git clone "${GITEA_BASE}/zhiyi-backup.git" "${PROJECT_ROOT}/zhiyi-backup" fi cd "${PROJECT_ROOT}/zhiyi-backup" # 找最新备份 if [ "${BACKUP_DATE}" = "latest" ]; then BACKUP_FILE=$(ls -t *.tar.gz 2>/dev/null | head -1) else BACKUP_FILE="zhiyi_backup_${BACKUP_DATE}.tar.gz" fi if [ -n "${BACKUP_FILE}" ] && [ -f "${BACKUP_FILE}" ]; then echo " 使用备份: ${BACKUP_FILE}" # 解压到临时目录 TMP_DIR="/tmp/zhiyi_restore_$$" mkdir -p "${TMP_DIR}" tar -xzf "${BACKUP_FILE}" -C "${TMP_DIR}" DATA_DIR=$(ls -d "${TMP_DIR}"/zhiyi_backup_* 2>/dev/null | head -1) if [ -n "${DATA_DIR}" ] && [ -d "${DATA_DIR}/memoryweave" ]; then sudo rsync -a "${DATA_DIR}/memoryweave/" /var/lib/memoryweave/ sudo chown -R root:root /var/lib/memoryweave/ echo " 数据恢复完成: $(du -sh /var/lib/memoryweave/ | cut -f1)" else echo " ERROR: 备份格式错误,无法恢复" fi rm -rf "${TMP_DIR}" else echo " WARN: 未找到备份文件 ${BACKUP_FILE},跳过数据恢复" fi # 6. 重启服务 echo "" echo "[完成] 准备重启服务..." # 检查 zhiyi 进程 if pgrep -f "zhiyi" > /dev/null; then echo " 重启 zhiyi..." pkill -f "zhiyi" 2>/dev/null || true sleep 2 fi # 启动 zhiyi cd "${PROJECT_ROOT}/go" if [ -f "./zhiyi" ]; then nohup ./zhiyi >> "${HOME}/.hermes/logs/zhiyi.log" 2>&1 & sleep 3 else echo " WARN: zhiyi binary 不存在,需要重新编译" fi # 7. 健康检查 echo "" echo "健康检查..." sleep 2 if curl -s http://localhost:7821/health > /dev/null 2>&1; then echo "✓ 织忆服务正常" else echo "✗ 织忆服务异常,请检查日志" tail -20 "${HOME}/.hermes/logs/zhiyi.log" 2>/dev/null || true fi echo "" echo "[$(date '+%Y-%m-%d %H:%M:%S')] ===== 恢复完成 ====="