# Cyrene 项目迁移指南:Linux → Windows ## 1. 概述 本文档详细说明如何将 Cyrene 项目从 Linux 开发/运行环境迁移到 Windows 平台。迁移涵盖所有源代码、配置模板、文档和辅助工具,同时排除编译产物、依赖包和敏感信息。 --- ## 2. 迁移的文件范围 ### ✅ 包含的文件 | 类别 | 路径 | 说明 | |------|------|------| | Go 源代码 | `backend/*/cmd/`, `backend/*/internal/` | 所有 Go 后端服务源码 | | Go 模块文件 | `backend/*/go.mod`, `backend/*/go.sum` | Go 依赖声明 | | Go workspace | `backend/go.work` | Go 工作区配置 | | TypeScript/React 源代码 | `frontend/web/src/`, `frontend/packages/` | 前端源码 | | 前端配置文件 | `frontend/web/vite.config.ts`, `frontend/web/tsconfig.json`, `frontend/web/tailwind.config.ts` 等 | 构建和样式配置 | | 前端入口 | `frontend/web/index.html` | HTML 入口 | | 公共资源 | `frontend/web/public/` | 静态资源(头像、背景图、manifest 等) | | DevTools | `devtools/` | 管理面板源码 | | Python 测试脚本 | `debug/cache/*.py` | 调试和端到端测试脚本 | | Shell 调试脚本 | `debug/*.sh`, `debug/*.mjs` | Chromium 调试、诊断脚本 | | 项目配置 | `.editorconfig`, `.gitignore`, `package.json` 等 | 项目级配置 | | Docker 配置 | `docker-compose*.yml`, `backend/*/Dockerfile` | 容器化部署配置 | | Caddy 配置 | `Caddyfile` | 反向代理配置 | | 文档 | `docs/`, `Deploy.md`, `Migration.md` | 项目文档 | | 环境变量模板 | `backend/.env.example` | 配置参考模板 | | 脚本 | `scripts/` | 辅助脚本(migrate.sh, setup-whisper.sh 等) | | 许可证 | `LICENSE` | 项目许可证 | ### ❌ 排除的文件 | 类别 | 路径模式 | 原因 | |------|----------|------| | 编译后的 Go 二进制 | `main`, `backend/*/main`, `backend/*/cmd/*` (不含 `.go`) | 平台相关,需在 Windows 重新编译 | | Windows 可执行文件 | `*.exe` | 旧的 Windows 编译产物 | | Node.js 依赖 | `node_modules/`, `frontend/web/node_modules/`, `frontend/node_modules/`, `devtools/node_modules/` | 体积大,通过 `npm install` 重新安装 | | 前端构建产物 | `frontend/web/dist/` | 通过 `npm run build` 重新构建 | | 敏感配置文件 | `backend/.env` | 包含 API 密钥和密码 | | 锁文件 | `package-lock.json`, `frontend/web/package-lock.json`, `frontend/package-lock.json` | 跨平台 npm 依赖树可能不同 | | Git 内部数据 | `.git/objects`, `.git/refs`, `.git/logs` | 减小压缩包体积 | | 日志文件 | `*.log`, `logs/`, `debug/logs/` | 运行时产物 | | 临时文件 | `tmp/` | 临时目录 | --- ## 3. 方式一:Git 克隆(推荐) Git 是最可靠的跨平台传输方式,保留完整的版本历史和 `.git` 元数据。 ```bash git clone <仓库地址> cd Cyrene git checkout dev ``` 克隆完成后,手动创建 `backend/.env` 文件: ```bash # 在 Windows 命令行 (cmd) 中: copy backend\.env.example backend\.env # 或在 PowerShell 中: Copy-Item backend\.env.example backend\.env ``` 然后编辑 [`backend/.env`](backend/.env),填入实际的 API 密钥、数据库密码等配置值。 --- ## 4. 方式二:rsync / SCP 传输 使用 [`scripts/migrate.sh`](scripts/migrate.sh) 脚本在 Linux 端打包源文件,排除二进制和编译产物。 ```bash # 打包到默认目录 /tmp bash scripts/migrate.sh # 或指定输出目录 bash scripts/migrate.sh ~/Desktop ``` 脚本会生成 `cyrene-source-YYYYMMDD_HHMMSS.tar.gz` 压缩包。 然后通过以下任一方式传输到 Windows: - **U 盘 / 移动硬盘**:直接复制压缩包 - **网络共享 (SMB)**:将压缩包放入共享文件夹,在 Windows 上访问 - **scp**(如果 Windows 启用了 SSH Server): ```bash scp /tmp/cyrene-source-*.tar.gz user@windows-host:C:\Users\user\Downloads\ ``` 在 Windows 上解压(需要安装 tar 或使用 7-Zip / WinRAR): ```bash # Git Bash / WSL2: tar -xzf cyrene-source-*.tar.gz # PowerShell (Windows 10 1803+): tar -xzf cyrene-source-*.tar.gz ``` --- ## 5. Windows 环境准备 ### 5.1 基础软件 | 软件 | 最低版本 | 下载地址 | 说明 | |------|---------|---------|------| | Go | 1.21+ | https://go.dev/dl/ | Go 编译器,安装后需设置 `GOPATH` | | Node.js | 18+ (推荐 20+) | https://nodejs.org/ | 包含 npm,用于前端构建 | | Git for Windows | 最新版 | https://git-scm.com/download/win | 提供 Git Bash 终端 | | PostgreSQL | 15+ | https://www.postgresql.org/download/windows/ | 数据库,需安装 **pgvector** 扩展 | ### 5.2 PostgreSQL + pgvector 扩展 ```sql -- 连接到 cyrene_ai 数据库后执行 CREATE EXTENSION IF NOT EXISTS vector; ``` > **注意**:Windows 上的 pgvector 安装请参考 https://github.com/pgvector/pgvector#windows ### 5.3 推荐:WSL2 如果希望获得与 Linux 一致的开发体验,推荐启用 WSL2 (Windows Subsystem for Linux): ```powershell # 在 PowerShell (管理员) 中执行 wsl --install -d Ubuntu-22.04 ``` 然后在 WSL2 中按 Linux 原生方式编译和运行。前端开发可在 Windows 原生环境进行以获得更好的热更新体验。 ### 5.4 环境变量设置 在 Windows 上有三种方式设置环境变量: **方式 A:使用 `.env` 文件(推荐)** 项目各服务会自动读取 [`backend/.env`](backend/.env.example),将 `.env.example` 复制为 `.env` 并填入实际值即可。 **方式 B:命令行临时设置 (cmd)** ```cmd set LLM_API_KEY=sk-xxxxx set POSTGRES_PASSWORD=your-password go run ./cmd/main.go ``` **方式 C:命令行临时设置 (PowerShell)** ```powershell $env:LLM_API_KEY="sk-xxxxx" $env:POSTGRES_PASSWORD="your-password" go run ./cmd/main.go ``` > **注意**:Windows 使用 `set` / `$env:` 而非 Linux 的 `export`。 --- ## 6. Windows 上的编译和启动步骤 ### 6.1 Go 后端编译 在 Windows 上编译 Go 服务会自动生成 `.exe` 后缀的可执行文件。 ```powershell # 编译 memory-service cd backend\memory-service go build -o main.exe .\cmd\main.go # 编译 iot-debug-service cd backend\iot-debug-service go build -o main.exe .\cmd\main.go # 编译 ai-core cd backend\ai-core go build -o main.exe .\cmd\main.go # 编译 gateway cd backend\gateway go build -o main.exe .\cmd\main.go # 编译 voice-service (可选) cd backend\voice-service go build -o main.exe .\cmd\main.go ``` 如果使用 Git Bash,可以用 `/` 路径: ```bash cd backend/ai-core && go build -o main.exe ./cmd/main.go ``` ### 6.2 前端构建 ```powershell cd frontend\web npm install npm run build ``` 开发模式: ```powershell npm run dev ``` 前端开发服务器将运行在 `http://localhost:5173`。 ### 6.3 数据库配置 1. 确保 PostgreSQL 服务已启动 2. 创建数据库和用户(参考 [`backend/.env.example`](backend/.env.example) 中的配置): ```sql CREATE USER cyrene WITH PASSWORD 'your-password'; CREATE DATABASE cyrene_ai OWNER cyrene; \c cyrene_ai CREATE EXTENSION IF NOT EXISTS vector; ``` 3. 在 [`backend/.env`](backend/.env.example) 中配置数据库连接信息。 ### 6.4 基础设施服务 使用 Docker Desktop for Windows 启动基础设施: ```powershell docker-compose -f docker-compose.dev.db.yml up -d ``` 这将启动 PostgreSQL、Redis、Qdrant、MinIO 和 NATS 服务。 ### 6.5 启动顺序 **推荐使用 DevTools 一键启动**(自动编译 + 按序启动 + 健康检查): ```cmd cd devtools node src\index.js :: 浏览器打开 http://localhost:9090,点击「一键启动」 ``` 或使用启动脚本: ```cmd devtools.bat ``` DevTools 会按以下顺序自动编译并启动所有 6 个服务: | 顺序 | 服务 | 端口 | 说明 | |------|------|------|------| | 1 | memory-service | 8091 | 记忆 CRUD 与检索 | | 2 | iot-debug-service | 8083 | 模拟智能家居设备 | | 3 | voice-service | 8093 | TTS/STT 语音服务 | | 4 | ai-core | 8081 | LLM 推理与编排 | | 5 | gateway | 8080 | API 网关 / JWT / WebSocket | | 6 | frontend | 5173 | React 开发服务器 | > 每个步骤会自动等待健康检查通过后再启动下一个服务。如果 Go 二进制未编译,DevTools 会自动先编译再启动。 如需手动逐个启动: ```powershell # 按顺序执行,每个在独立终端中运行 cd backend\memory-service && go build -o main.exe .\cmd\main.go && .\main.exe cd backend\tool-engine && go build -o main.exe .\cmd\main.go && .\main.exe cd backend\iot-debug-service && go build -o main.exe .\cmd\main.go && .\main.exe cd backend\voice-service && go build -o main.exe .\cmd\main.go && .\main.exe cd backend\ai-core && go build -o main.exe .\cmd\main.go && .\main.exe cd backend\gateway && go build -o main.exe .\cmd\main.go && .\main.exe cd frontend\web && npm install && npm run dev ``` --- ## 7. Windows 特殊注意事项 ### 7.1 路径分隔符 Windows 使用反斜杠 `\` 作为路径分隔符,而 Linux 使用正斜杠 `/`。 - **Go 代码**中:`filepath.Join()` 和 `os.PathSeparator` 会自动处理跨平台路径 - **前端代码**中:Vite/Webpack 会自动处理路径 - **配置文件**中:使用正斜杠 `/`(Go 在 Windows 上也能识别) - **命令行**中:cmd 使用 `\`,PowerShell 和 Git Bash 同时支持 `/` 和 `\` ### 7.2 文件权限 Windows 不需要 `chmod` 命令。Go 编译生成 `.exe` 文件后直接可执行,无需设置执行权限。 ### 7.3 端口占用检查 **Windows (cmd):** ```cmd netstat -ano | findstr :8080 ``` **PowerShell:** ```powershell Get-NetTCPConnection -LocalPort 8080 ``` 找到占用端口的 PID 后,使用以下命令终止进程: ```cmd taskkill /PID /F ``` ### 7.4 换行符差异 - Linux 使用 `LF` (`\n`) - Windows 使用 `CRLF` (`\r\n`) 建议在 Git for Windows 安装时选择 "Checkout as-is, commit Unix-style line endings",或将 Git 配置为: ```bash git config --global core.autocrlf input ``` 项目的 [`.editorconfig`](.editorconfig) 文件中已配置换行符规则,大多数 IDE 会自动遵循。 ### 7.5 Caddy / 反向代理替代方案 Linux 下使用 Caddy 作为反向代理。Windows 上的替代方案: - **Caddy for Windows**:https://caddyserver.com/download (原生支持 Windows) - **Nginx for Windows**:http://nginx.org/en/docs/windows.html - **直接访问**:开发阶段可直接访问各服务的 localhost 端口,无需反向代理 ### 7.6 Chromium Headless [`debug/chromium_debugging.sh`](debug/chromium_debugging.sh) 脚本是为 Linux 环境编写的。在 Windows 上使用 Chromium headless 需要: 1. 安装 Chrome 或 Chromium 浏览器 2. 手动启动 headless 模式: ```cmd "C:\Program Files\Google\Chrome\Application\chrome.exe" --headless --remote-debugging-port=9222 ``` ### 7.7 Docker Desktop Windows 上的 Docker 容器通过 Docker Desktop 运行。注意: - 需要启用 Hyper-V 或 WSL2 后端 - 卷挂载路径使用 Windows 路径格式 - `docker-compose.dev.db.yml` 中的相对路径在 PowerShell 中可能需要调整 ### 7.8 终端选择 推荐使用以下终端之一: | 终端 | 路径分隔符 | 推荐度 | |------|-----------|--------| | **Git Bash** | `/` | ⭐⭐⭐ 最接近 Linux 体验 | | **PowerShell 7+** | 兼容 `/` 和 `\` | ⭐⭐⭐ 功能最强大 | | **cmd** | `\` | ⭐ 不推荐 | ### 7.9 换行符注意事项 编译 Go 源码时可能遇到行尾符警告,可忽略。如需消除警告: ```bash # 在 Git Bash 中转换所有 Go 文件为 LF find backend -name "*.go" -exec dos2unix {} \; ``` --- ## 8. 验证清单 迁移完成后,逐项检查以下内容: | # | 检查项 | 验证方法 | |---|--------|---------| | 1 | ✅ 所有 Go 服务编译通过 | 在每个 `backend/*` 目录执行 `go build -o main.exe ./cmd/main.go` | | 2 | ✅ 前端构建成功 | `cd frontend\web && npm run build` 无报错 | | 3 | ✅ 数据库连接正常 | 使用 `psql` 或数据库客户端连接 PostgreSQL | | 4 | ✅ pgvector 扩展已安装 | `SELECT * FROM pg_extension WHERE extname='vector';` 返回一行 | | 5 | ✅ memory-service 启动成功 | 无 panic 日志,监听 8091 端口 | | 6 | ✅ iot-debug-service 启动成功 | 访问 `http://localhost:8083/api/v1/health` 返回 200 | | 7 | ✅ voice-service 启动成功 | 访问 `http://localhost:8093/api/v1/health` 返回 200 | | 8 | ✅ ai-core 启动成功 | 访问 `http://localhost:8081/api/v1/health` 返回 200 | | 9 | ✅ gateway 启动成功 | 访问 `http://localhost:8080/api/v1/health` 返回 200 | | 10 | ✅ 前端开发服务器启动 | 访问 `http://localhost:5173` 显示登录页面 | | 11 | ✅ WebSocket 连接正常 | 登录后聊天功能正常,能收到 AI 回复 | | 12 | ✅ IoT 设备控制正常 | 发送 IoT 控制指令,设备响应正确 | | 13 | ✅ 语音合成 (TTS) 正常 | AI 回复能正常播放语音 | | 14 | ✅ 语音识别 (ASR) 正常 | 语音输入能被正确识别 | --- ## 9. 常见问题 ### Q: `go build` 报 `package ... is not in GOROOT` A: 确保在 `backend/` 目录下使用 Go workspace。`backend/go.work` 已配置好模块路径,直接在子目录编译即可。 ### Q: `npm install` 报 node-gyp 错误 A: 安装 Windows 构建工具: ```powershell npm install --global windows-build-tools ``` 或安装 Visual Studio Build Tools with C++ workload。 ### Q: PostgreSQL 无法连接 A: 检查: 1. PostgreSQL 服务是否启动(`services.msc` 中查看) 2. `pg_hba.conf` 是否允许本地连接 3. 防火墙是否阻止了 5432 端口 ### Q: 端口被占用 A: 参考 [7.3 端口占用检查](#73-端口占用检查) 找到并终止占用进程。