docs: 新增 README + 更新 Deploy.md + 整理 .gitignore
- 新增 README.md 完整项目概览(架构、功能、快速开始) - 更新 Deploy.md 修正过时的服务状态和端口信息 - 整理 .gitignore 补充缺失规则并移除无效项 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
+45
-33
@@ -1,29 +1,17 @@
|
||||
# ========== 依赖 ==========
|
||||
node_modules/
|
||||
|
||||
# ========== 构建产物 ==========
|
||||
dist/
|
||||
.env
|
||||
backend/.env
|
||||
*.log
|
||||
data/
|
||||
docs/
|
||||
.DS_Store
|
||||
dev_must_read.md
|
||||
scripts/tunnel.sh
|
||||
.debug/
|
||||
*.exe
|
||||
|
||||
# Test scripts
|
||||
test/
|
||||
|
||||
# DevTools
|
||||
devtools/node_modules/
|
||||
devtools/logs/
|
||||
devtools/package-lock.json
|
||||
|
||||
# Go 编译二进制 (模块根 + cmd/ 内产出)
|
||||
# ========== Go 编译二进制 ==========
|
||||
backend/ai-core/main
|
||||
backend/ai-core/cmd/main
|
||||
backend/ai-core/ai-core
|
||||
backend/gateway/main
|
||||
backend/gateway/cmd/main
|
||||
backend/gateway/cmd/gateway
|
||||
backend/gateway/gateway
|
||||
backend/iot-debug-service/main
|
||||
backend/iot-debug-service/cmd/main
|
||||
@@ -32,25 +20,49 @@ backend/memory-service/main
|
||||
backend/memory-service/cmd/main
|
||||
backend/memory-service/memory-service
|
||||
backend/tool-engine/main
|
||||
backend/tool-engine/cmd/main
|
||||
backend/tool-engine/cmd/tool-engine
|
||||
backend/tool-engine/tool-engine
|
||||
backend/voice-service/voice-service
|
||||
backend/voice-service/cmd/voice-service
|
||||
|
||||
# Compiled binaries (voice-service)
|
||||
backend/voice-service/main
|
||||
backend/voice-service/main2
|
||||
backend/voice-service/voice-svc-new
|
||||
backend/voice-service/cmd/main
|
||||
backend/voice-service/cmd/voice-service
|
||||
backend/voice-service/voice-service
|
||||
backend/cmd/
|
||||
|
||||
# Compiled binaries (gateway)
|
||||
backend/gateway/cmd/gateway
|
||||
|
||||
# Stale build artifact (legacy)
|
||||
backend/cmd
|
||||
|
||||
# 用户上传文件
|
||||
# ========== 运行时数据 ==========
|
||||
logs/
|
||||
*.log
|
||||
*.pid
|
||||
uploads/
|
||||
backend/gateway/uploads/
|
||||
data/
|
||||
|
||||
# Voice Service 外部依赖 (C++编译产物 / 模型文件)
|
||||
# ========== 环境与敏感配置 ==========
|
||||
.env
|
||||
backend/.env
|
||||
.claude/
|
||||
|
||||
# ========== 文档 (项目规范:docs/ 不纳入版本管理) ==========
|
||||
docs/
|
||||
|
||||
# ========== 调试临时文件 (项目规范:debug/cache/ 为临时脚本目录) ==========
|
||||
debug/cache/
|
||||
debug/logs/
|
||||
|
||||
# ========== DevTools 运行时 ==========
|
||||
devtools/node_modules/
|
||||
devtools/logs/
|
||||
devtools/package-lock.json
|
||||
|
||||
# ========== 语音服务外部依赖 (C++ 编译产物 / 模型文件) ==========
|
||||
backend/voice-service/whisper.cpp/
|
||||
backend/voice-service/models/
|
||||
backend/voice-service/models/
|
||||
|
||||
# ========== 打包归档 ==========
|
||||
*.tar.gz
|
||||
*.zip
|
||||
|
||||
# ========== 平台杂项 ==========
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
scripts/tunnel.sh
|
||||
|
||||
@@ -1,106 +1,184 @@
|
||||
# Cyrene 部署指南
|
||||
|
||||
## 环境要求
|
||||
|
||||
- Go 1.21+
|
||||
- Node.js 20+
|
||||
- Docker & Docker Compose
|
||||
|
||||
## 快速启动
|
||||
|
||||
### 1. 启动基础设施
|
||||
基础设施包括 PostgreSQL (pgvector)、Redis、Qdrant (向量数据库)、MinIO (对象存储) 和 NATS (消息队列)。
|
||||
### 1. 环境变量配置
|
||||
|
||||
```bash
|
||||
docker-compose -f docker-compose.dev.db.yml up -d
|
||||
cp backend/.env.example backend/.env
|
||||
# 编辑 backend/.env,至少配置 LLM_API_KEY
|
||||
```
|
||||
|
||||
### 2. 编译并启动后端服务
|
||||
### 2. 启动基础设施
|
||||
|
||||
```bash
|
||||
# AI-Core (LLM 推理服务)
|
||||
docker compose -f docker-compose.dev.db.yml up -d
|
||||
```
|
||||
|
||||
此命令启动以下服务:
|
||||
|
||||
| 服务 | 端口 | 用途 |
|
||||
|------|------|------|
|
||||
| PostgreSQL + pgvector | 5432 | 关系数据库与向量检索 |
|
||||
| Redis | 6379 | 缓存与会话 |
|
||||
| Qdrant | 6333 (HTTP) / 6334 (gRPC) | 向量数据库 |
|
||||
| MinIO | 9000 (API) / 9001 (Console) | 对象存储 |
|
||||
| NATS | 4222 / 8222 (Monitoring) | 消息队列 |
|
||||
|
||||
### 3. 启动后端服务
|
||||
|
||||
推荐使用 DevTools 一键管理:
|
||||
|
||||
```bash
|
||||
./devtools.sh start all # 编译并顺序启动所有后端 + 前端
|
||||
./devtools.sh status # 查看各服务运行状态
|
||||
./devtools.sh restart gateway # 单独重启某个服务
|
||||
```
|
||||
|
||||
或手动逐服务启动(每个在新终端中):
|
||||
|
||||
```bash
|
||||
# 1) 记忆服务
|
||||
cd backend/memory-service && go build -o main ./cmd/main.go && ./main
|
||||
|
||||
# 2) 工具引擎
|
||||
cd backend/tool-engine && go build -o main ./cmd/main.go && ./main
|
||||
|
||||
# 3) IoT 调试服务 (模拟智能家居设备)
|
||||
cd backend/iot-debug-service && go build -o main ./cmd/main.go && ./main
|
||||
|
||||
# 4) 语音服务 (可选,需安装 whisper.cpp)
|
||||
cd backend/voice-service && go build -o main ./cmd/main.go && ./main
|
||||
|
||||
# 5) AI-Core (LLM 推理与对话编排)
|
||||
cd backend/ai-core && go build -o main ./cmd/main.go && ./main
|
||||
|
||||
# Gateway (API 网关)
|
||||
# 6) Gateway (API 网关,最后启动)
|
||||
cd backend/gateway && go build -o main ./cmd/main.go && ./main
|
||||
```
|
||||
|
||||
### 3. 安装依赖并启动前端
|
||||
### 4. 启动前端
|
||||
|
||||
```bash
|
||||
cd frontend/web && npm install && npm run dev
|
||||
```
|
||||
|
||||
### 4. 启动 DevTools (可选)
|
||||
访问 `http://localhost:5173`
|
||||
|
||||
### 5. 启动 DevTools 管理面板 (可选)
|
||||
|
||||
```bash
|
||||
cd devtools && npm install && npm start
|
||||
```
|
||||
|
||||
访问 `http://localhost:9090`
|
||||
|
||||
## 使用 Docker Compose 完整启动
|
||||
|
||||
```bash
|
||||
docker-compose -f docker-compose.dev.yml up -d
|
||||
```
|
||||
|
||||
此命令将启动所有基础设施服务以及 AI-Core 和 Gateway 后端服务。
|
||||
|
||||
## 生产环境部署
|
||||
### 开发环境
|
||||
|
||||
```bash
|
||||
docker-compose -f docker-compose.yml up -d
|
||||
docker compose -f docker-compose.dev.yml up -d
|
||||
```
|
||||
|
||||
生产环境额外包含 Caddy 反向代理(自动 TLS)。
|
||||
启动所有基础设施 + 6 个后端服务(AI-Core、Gateway、Memory Service、Tool Engine、Voice Service、IoT Debug Service),前端仍需本地启动。
|
||||
|
||||
## 环境变量
|
||||
### 生产环境
|
||||
|
||||
参考 `backend/.env.example` 配置以下变量:
|
||||
```bash
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
| 变量 | 说明 |
|
||||
|------|------|
|
||||
| `ENV` | 运行环境 (`development` / `production`) |
|
||||
| `LLM_API_URL` | LLM API 地址 |
|
||||
| `LLM_API_KEY` | LLM API 密钥 |
|
||||
| `LLM_MODEL` | 主模型 (默认 `gpt-4o`) |
|
||||
| `LLM_FALLBACK_MODEL` | 回退模型 (默认 `gpt-4o-mini`) |
|
||||
| `POSTGRES_HOST` / `POSTGRES_PORT` / `POSTGRES_USER` / `POSTGRES_PASSWORD` / `POSTGRES_DB` | PostgreSQL 连接信息 |
|
||||
| `REDIS_HOST` / `REDIS_PORT` / `REDIS_PASSWORD` | Redis 连接信息 |
|
||||
| `JWT_SECRET` | JWT 签名密钥 |
|
||||
| `JWT_EXPIRY_HOURS` | JWT 过期时间 (默认 720 小时) |
|
||||
| `MINIO_ENDPOINT` / `MINIO_ACCESS_KEY` / `MINIO_SECRET_KEY` / `MINIO_BUCKET` | MinIO 对象存储配置 |
|
||||
| `VECTOR_DB_URL` / `VECTOR_DB_COLLECTION` | Qdrant 向量数据库配置 |
|
||||
| `ADMIN_USERNAME` / `ADMIN_PASSWORD` | 管理员账户 (开发阶段) |
|
||||
| `TTS_PROVIDER` / `TTS_VOICE` | TTS 语音合成配置 |
|
||||
| `ASR_PROVIDER` / `ASR_MODEL` | ASR 语音识别配置 |
|
||||
额外包含 Caddy 反向代理(自动 TLS),前端静态文件由 Gateway 直接托管。
|
||||
|
||||
## 项目结构
|
||||
## 项目架构
|
||||
|
||||
```
|
||||
Cyrene/
|
||||
├── frontend/web/ # React 前端 (Vite + TypeScript)
|
||||
├── backend/ai-core/ # AI 推理核心 (LLM 对话、记忆、人设)
|
||||
├── backend/gateway/ # API 网关 (路由、鉴权、WebSocket)
|
||||
├── backend/memory-service/ # 记忆服务 (规划中)
|
||||
├── backend/tool-engine/ # 工具引擎 (规划中)
|
||||
├── backend/voice-service/ # 语音服务 (规划中)
|
||||
├── backend/proto/ # Protobuf 定义 (规划中)
|
||||
├── devtools/ # 管理面板
|
||||
└── scripts/ # 辅助脚本
|
||||
├── frontend/web/ # React 前端 (Vite + TypeScript + Tailwind + Zustand)
|
||||
├── backend/
|
||||
│ ├── ai-core/ # AI 推理核心 (LLM 对话编排、人设注入、工具调用、后台思考)
|
||||
│ ├── gateway/ # API 网关 (JWT 认证、路由、限流、WebSocket Hub)
|
||||
│ ├── memory-service/ # 记忆服务 (CRUD、语义检索、LLM 提取)
|
||||
│ ├── tool-engine/ # 工具引擎 (12+ 内置工具:计算器、HTTP、IoT、文件等)
|
||||
│ ├── voice-service/ # 语音服务 (Edge-TTS + Whisper STT)
|
||||
│ ├── iot-debug-service/ # IoT 调试服务 (8 个模拟设备:灯/空调/窗帘/传感器/门锁)
|
||||
│ └── proto/ # Protobuf 定义 (预留)
|
||||
├── devtools/ # 开发管理面板 (Express)
|
||||
├── scripts/ # 辅助脚本
|
||||
├── test/ # E2E 测试 (CDP/Chromium)
|
||||
├── docs/ # 文档与调试记录
|
||||
├── debug/ # 诊断脚本
|
||||
├── docker-compose.dev.db.yml # 开发基础设施 (仅 DB)
|
||||
├── docker-compose.dev.yml # 开发环境 (DB + 后端服务)
|
||||
├── docker-compose.yml # 生产环境 (DB + 后端 + Caddy)
|
||||
└── Caddyfile # 反向代理配置
|
||||
```
|
||||
|
||||
## 端口
|
||||
## 服务端口
|
||||
|
||||
| 端口 | 服务 |
|
||||
|------|------|
|
||||
| 5173 | 前端开发服务器 (Vite) |
|
||||
| 5173 | 前端 (Vite) |
|
||||
| 8080 | Gateway API |
|
||||
| 8081 | AI-Core API |
|
||||
| 3001 | DevTools 管理面板 |
|
||||
| 8083 | IoT 调试服务 |
|
||||
| 8091 | 记忆服务 |
|
||||
| 8092 | 工具引擎 |
|
||||
| 8093 | 语音服务 |
|
||||
| 9090 | DevTools 管理面板 |
|
||||
| 5432 | PostgreSQL |
|
||||
| 6379 | Redis |
|
||||
| 6333 | Qdrant HTTP API |
|
||||
| 6334 | Qdrant gRPC API |
|
||||
| 9000 | MinIO S3 API |
|
||||
| 6333 | Qdrant HTTP |
|
||||
| 6334 | Qdrant gRPC |
|
||||
| 9000 | MinIO S3 |
|
||||
| 9001 | MinIO Console |
|
||||
| 4222 | NATS |
|
||||
| 8222 | NATS HTTP Monitoring |
|
||||
| 8222 | NATS Monitoring |
|
||||
|
||||
## 环境变量
|
||||
|
||||
参考 `backend/.env.example`:
|
||||
|
||||
| 变量 | 说明 | 默认值 |
|
||||
|------|------|--------|
|
||||
| `ENV` | 运行环境 | `development` |
|
||||
| `LLM_API_URL` | LLM API 地址 | `https://api.openai.com/v1` |
|
||||
| `LLM_API_KEY` | LLM API 密钥 | — |
|
||||
| `LLM_MODEL` | 主模型 | `gpt-4o` |
|
||||
| `LLM_FALLBACK_MODEL` | 回退模型 | `gpt-4o-mini` |
|
||||
| `POSTGRES_HOST` | PostgreSQL 主机 | `localhost` |
|
||||
| `POSTGRES_PORT` | PostgreSQL 端口 | `5432` |
|
||||
| `POSTGRES_USER` | PostgreSQL 用户 | `cyrene` |
|
||||
| `POSTGRES_PASSWORD` | PostgreSQL 密码 | — |
|
||||
| `POSTGRES_DB` | PostgreSQL 库名 | `cyrene_ai` |
|
||||
| `REDIS_HOST` | Redis 主机 | `localhost` |
|
||||
| `REDIS_PORT` | Redis 端口 | `6379` |
|
||||
| `JWT_SECRET` | JWT 签名密钥 | — |
|
||||
| `JWT_EXPIRY_HOURS` | JWT 过期时间 | `720` |
|
||||
| `MINIO_ENDPOINT` | MinIO 地址 | `localhost:9000` |
|
||||
| `MINIO_ACCESS_KEY` | MinIO Access Key | — |
|
||||
| `MINIO_SECRET_KEY` | MinIO Secret Key | — |
|
||||
| `VECTOR_DB_URL` | Qdrant 地址 | `http://localhost:6333` |
|
||||
| `ADMIN_USERNAME` | 管理员账户 | `admin` |
|
||||
| `ADMIN_PASSWORD` | 管理员密码 | — |
|
||||
| `ADMIN_NICKNAME` | 昔涟对管理员的称呼 | `管理员` |
|
||||
| `REGISTRATION_ENABLED` | 开放注册 | `true` |
|
||||
| `ENABLE_BACKGROUND_THINKING` | 后台思考 | `true` |
|
||||
| `INTERNAL_SERVICE_TOKEN` | 内部服务通信 Token | — |
|
||||
| `WEBHOOK_API_KEY` | Webhook API Key | — |
|
||||
| `IOT_SERVICE_URL` | IoT 服务地址 | `http://localhost:8083` |
|
||||
| `TTS_PROVIDER` | TTS 引擎 | `edge-tts` |
|
||||
| `TTS_VOICE` | TTS 语音 | `zh-CN-XiaoxiaoNeural` |
|
||||
| `ASR_PROVIDER` | ASR 引擎 | `faster-whisper` |
|
||||
| `ASR_MODEL` | ASR 模型 | `medium` |
|
||||
|
||||
## 平台迁移
|
||||
|
||||
从 Linux 迁移到 Windows 的详细指南见 [Migration.md](Migration.md)。
|
||||
|
||||
@@ -0,0 +1,173 @@
|
||||
# Cyrene (昔涟) — AI 伙伴平台
|
||||
|
||||
昔涟是一个开源的 AI 伙伴平台,提供多人格对话、IoT 设备操控、记忆管理、自动化规则、知识库、语音交互等功能。
|
||||
|
||||
## 架构
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ Frontend (React + Vite) │
|
||||
│ localhost:5173 │
|
||||
└─────────────────────┬───────────────────────────────────┘
|
||||
│ HTTP + WebSocket
|
||||
┌─────────────────────▼───────────────────────────────────┐
|
||||
│ Gateway (Go/Gin) │
|
||||
│ localhost:8080 │
|
||||
│ JWT Auth · Rate Limit · WS Hub · API 路由 │
|
||||
└──┬────────┬────────┬────────┬────────┬────────┬────────┘
|
||||
│ │ │ │ │ │
|
||||
▼ ▼ ▼ ▼ ▼ ▼
|
||||
┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────────┐
|
||||
│ AI │ │Memory│ │Tool │ │Voice │ │ IoT │ │ Infra │
|
||||
│ Core │ │Svc │ │Engine│ │Svc │ │Debug │ │ │
|
||||
│:8081 │ │:8091 │ │:8092 │ │:8093 │ │:8083 │ │ PG:5432 │
|
||||
│ │ │ │ │ │ │ │ │ │ │ Redis │
|
||||
│ LLM │ │CRUD │ │执行 │ │STT/ │ │模拟 │ │ :6379 │
|
||||
│ 编排 │ │检索 │ │工具 │ │TTS │ │设备 │ │ Qdrant │
|
||||
│ 人设 │ │ │ │调用 │ │ │ │管理 │ │ :6333 │
|
||||
│ 工具 │ │ │ │ │ │ │ │ │ │ MinIO │
|
||||
│ 后台 │ │ │ │ │ │ │ │ │ │ :9000 │
|
||||
│ 思考 │ │ │ │ │ │ │ │ │ │ NATS │
|
||||
└──────┘ └──────┘ └──────┘ └──────┘ └──────┘ └──────────┘
|
||||
```
|
||||
|
||||
## 功能
|
||||
|
||||
- **多人格对话** — 可配置的角色扮演系统,带上下文构建和子会话路由
|
||||
- **IoT 操控** — 模拟智能家居设备(灯、空调、窗帘、传感器、门锁),支持语音/文本控制
|
||||
- **记忆管理** — LLM 驱动的长期记忆提取、存储和检索(PostgreSQL + pgvector)
|
||||
- **自动化** — 规则引擎 + 场景执行(定时、条件触发、Webhook)
|
||||
- **每日简报** — 定时生成当日汇总
|
||||
- **提醒** — 创建/管理定时提醒,到期 WebSocket 推送
|
||||
- **知识库** — 文档管理 + 向量检索
|
||||
- **文件管理** — 上传、下载、缩略图、图片 AI 分析
|
||||
- **语音交互** — 浏览器端 STT(Web Speech API)+ TTS,服务端支持 Whisper
|
||||
- **WebSocket** — 实时消息推送、IoT 状态广播、通知
|
||||
- **PWA** — 可安装为桌面/移动应用,离线支持
|
||||
- **后台思考** — AI 在对话间隙自主进行反思和记忆整理
|
||||
- **Webhook 接入** — 支持 Discord、通用 Webhook 第三方平台接入
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
Cyrene/
|
||||
├── frontend/
|
||||
│ ├── web/ # React 前端 (Vite + TypeScript + Tailwind)
|
||||
│ └── packages/shared/ # 共享类型/工具
|
||||
├── backend/
|
||||
│ ├── ai-core/ # AI 推理核心 (LLM 编排、人设注入、工具调用、后台思考)
|
||||
│ ├── gateway/ # API 网关 (JWT 认证、路由、限流、WebSocket Hub)
|
||||
│ ├── memory-service/ # 记忆服务 (CRUD、检索、LLM 提取)
|
||||
│ ├── tool-engine/ # 工具引擎 (计算器、HTTP、IoT、文件操作等)
|
||||
│ ├── voice-service/ # 语音服务 (TTS/STT,基于 Edge-TTS + Whisper)
|
||||
│ ├── iot-debug-service/# IoT 调试服务 (模拟智能家居设备)
|
||||
│ └── proto/ # Protobuf 定义 (预留)
|
||||
├── devtools/ # 开发管理面板 (Express,服务管理/日志/性能)
|
||||
├── scripts/ # 辅助脚本 (Whisper 安装、SSH 隧道、数据迁移)
|
||||
├── test/ # E2E 测试脚本 (CDP/Chromium)
|
||||
├── docs/ # 项目文档与调试记录
|
||||
├── debug/ # 诊断与缓存脚本
|
||||
├── docker-compose.dev.db.yml # 开发环境基础设施 (仅 DB)
|
||||
├── docker-compose.dev.yml # 开发环境一键启动
|
||||
├── docker-compose.yml # 生产环境 (含 Caddy)
|
||||
└── Caddyfile # 反向代理配置
|
||||
```
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 前提条件
|
||||
|
||||
- Go 1.21+
|
||||
- Node.js 20+
|
||||
- Docker & Docker Compose
|
||||
|
||||
### 1. 启动基础设施
|
||||
|
||||
```bash
|
||||
docker compose -f docker-compose.dev.db.yml up -d
|
||||
```
|
||||
|
||||
启动 PostgreSQL (pgvector)、Redis、Qdrant、MinIO、NATS。
|
||||
|
||||
### 2. 启动后端服务
|
||||
|
||||
使用 DevTools 一键管理:
|
||||
|
||||
```bash
|
||||
./devtools.sh start all # 编译并启动所有后端 + 前端
|
||||
./devtools.sh status # 查看服务状态
|
||||
./devtools.sh logs ai-core # 查看 AI-Core 日志
|
||||
```
|
||||
|
||||
或手动逐个启动:
|
||||
|
||||
```bash
|
||||
# 编译并运行各服务
|
||||
cd backend/memory-service && go run ./cmd/main.go &
|
||||
cd backend/tool-engine && go run ./cmd/main.go &
|
||||
cd backend/iot-debug-service && go run ./cmd/main.go &
|
||||
cd backend/voice-service && go run ./cmd/main.go &
|
||||
cd backend/ai-core && go run ./cmd/main.go &
|
||||
cd backend/gateway && go run ./cmd/main.go &
|
||||
```
|
||||
|
||||
### 3. 启动前端
|
||||
|
||||
```bash
|
||||
cd frontend/web && npm install && npm run dev
|
||||
```
|
||||
|
||||
访问 `http://localhost:5173`,默认管理员账户 `admin` / `cyrene-dev-admin`。
|
||||
|
||||
### 4. 配置环境变量
|
||||
|
||||
```bash
|
||||
cp backend/.env.example backend/.env
|
||||
# 编辑 backend/.env,填入 LLM API Key 等必要配置
|
||||
```
|
||||
|
||||
## 服务端口
|
||||
|
||||
| 端口 | 服务 |
|
||||
|------|------|
|
||||
| 5173 | 前端 (Vite dev server) |
|
||||
| 8080 | Gateway API |
|
||||
| 8081 | AI-Core (LLM 推理) |
|
||||
| 8083 | IoT 调试服务 |
|
||||
| 8091 | 记忆服务 |
|
||||
| 8092 | 工具引擎 |
|
||||
| 8093 | 语音服务 |
|
||||
| 9090 | DevTools 管理面板 |
|
||||
| 5432 | PostgreSQL |
|
||||
| 6379 | Redis |
|
||||
| 6333 | Qdrant HTTP |
|
||||
| 6334 | Qdrant gRPC |
|
||||
| 9000 | MinIO S3 |
|
||||
| 9001 | MinIO Console |
|
||||
| 4222 | NATS |
|
||||
| 8222 | NATS Monitoring |
|
||||
|
||||
## 技术栈
|
||||
|
||||
| 层 | 技术 |
|
||||
|----|------|
|
||||
| 前端 | React 18, TypeScript, Vite, Tailwind CSS, Zustand |
|
||||
| 后端 | Go, Gin, net/http |
|
||||
| 数据库 | PostgreSQL + pgvector |
|
||||
| 缓存 | Redis |
|
||||
| 向量库 | Qdrant |
|
||||
| 对象存储 | MinIO |
|
||||
| 消息队列 | NATS |
|
||||
| 反向代理 | Caddy (生产环境) |
|
||||
| 语音 | Edge-TTS / Whisper.cpp |
|
||||
|
||||
## 部署
|
||||
|
||||
- 开发环境:`docker compose -f docker-compose.dev.yml up -d`
|
||||
- 生产环境:`docker compose up -d`(含 Caddy 反向代理 + 自动 TLS)
|
||||
|
||||
详见 [Deploy.md](Deploy.md) 和 [Migration.md](Migration.md)(Linux → Windows 迁移指南)。
|
||||
|
||||
## License
|
||||
|
||||
MIT
|
||||
@@ -1,242 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# ==================== 配置 ====================
|
||||
ROOT_HOST="${CHROMIUM_MANAGER_HOST:-127.0.0.1}"
|
||||
ROOT_PORT="${CHROMIUM_MANAGER_PORT:-19520}"
|
||||
BASE_URL="http://$ROOT_HOST:$ROOT_PORT"
|
||||
|
||||
# ==================== 颜色 ====================
|
||||
GREEN='\033[0;32m'
|
||||
RED='\033[0;31m'
|
||||
YELLOW='\033[1;33m'
|
||||
CYAN='\033[0;36m'
|
||||
NC='\033[0m'
|
||||
|
||||
# ==================== 帮助 ====================
|
||||
show_help() {
|
||||
cat << EOF
|
||||
${CYAN}Chromium 调试管理器${NC}
|
||||
用法: ./chromium_debugging.sh <命令> [选项]
|
||||
|
||||
${GREEN}命令:${NC}
|
||||
start 启动 Chromium(带 GUI,显示在 root 桌面)
|
||||
stop 停止 Chromium
|
||||
restart 重启 Chromium
|
||||
status 查看 Chromium 状态
|
||||
debug-url 获取 WebSocket 调试地址(给 VS Code 插件用)
|
||||
log 查看 Chromium 日志(默认最近 50 行)
|
||||
log -f 实时跟踪日志
|
||||
help 显示此帮助
|
||||
|
||||
${YELLOW}环境变量:${NC}
|
||||
CHROMIUM_MANAGER_HOST 管理服务地址(默认 127.0.0.1)
|
||||
CHROMIUM_MANAGER_PORT 管理服务端口(默认 19520)
|
||||
|
||||
${CYAN}示例:${NC}
|
||||
./chromium_debugging.sh start # 启动 Chromium
|
||||
./chromium_debugging.sh status # 查看状态
|
||||
./chromium_debugging.sh debug-url # 获取调试地址
|
||||
EOF
|
||||
}
|
||||
|
||||
# ==================== API 调用 ====================
|
||||
|
||||
call_api() {
|
||||
local ENDPOINT="$1"
|
||||
local RESULT
|
||||
local HTTP_CODE
|
||||
|
||||
RESULT=$(curl -s -w "\n%{http_code}" -X GET "$BASE_URL$ENDPOINT" 2>/dev/null)
|
||||
HTTP_CODE=$(echo "$RESULT" | tail -1)
|
||||
RESULT=$(echo "$RESULT" | sed '$d')
|
||||
|
||||
if [ "$HTTP_CODE" != "200" ]; then
|
||||
echo "{\"status\":\"error\",\"message\":\"连接管理服务失败 ($HTTP_CODE),请确认 root 上已运行 chromium-manager.sh\"}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo "$RESULT"
|
||||
return 0
|
||||
}
|
||||
|
||||
# ==================== 命令实现 ====================
|
||||
|
||||
cmd_start() {
|
||||
echo -e "${YELLOW}🚀 请求启动 Chromium...${NC}"
|
||||
local RESULT=$(call_api "/start")
|
||||
local STATUS=$(echo "$RESULT" | python3 -c "import sys,json;print(json.load(sys.stdin).get('status','unknown'))" 2>/dev/null)
|
||||
|
||||
if [ "$STATUS" = "ok" ]; then
|
||||
local PID=$(echo "$RESULT" | python3 -c "import sys,json;print(json.load(sys.stdin).get('pid',''))" 2>/dev/null)
|
||||
echo -e "${GREEN}✅ Chromium 已启动 (PID: $PID)${NC}"
|
||||
echo -e " 调试地址: ${CYAN}http://$ROOT_HOST:9222${NC}"
|
||||
elif [ "$STATUS" = "error" ]; then
|
||||
local MSG=$(echo "$RESULT" | python3 -c "import sys,json;print(json.load(sys.stdin).get('message','未知错误'))" 2>/dev/null)
|
||||
echo -e "${RED}❌ $MSG${NC}"
|
||||
else
|
||||
echo -e "${RED}❌ 请求失败${NC}"
|
||||
echo "$RESULT"
|
||||
fi
|
||||
}
|
||||
|
||||
cmd_stop() {
|
||||
echo -e "${YELLOW}🛑 请求停止 Chromium...${NC}"
|
||||
local RESULT=$(call_api "/stop")
|
||||
local STATUS=$(echo "$RESULT" | python3 -c "import sys,json;print(json.load(sys.stdin).get('status','unknown'))" 2>/dev/null)
|
||||
|
||||
if [ "$STATUS" = "ok" ]; then
|
||||
echo -e "${GREEN}✅ Chromium 已停止${NC}"
|
||||
else
|
||||
local MSG=$(echo "$RESULT" | python3 -c "import sys,json;print(json.load(sys.stdin).get('message','未知错误'))" 2>/dev/null)
|
||||
echo -e "${YELLOW}⚠️ $MSG${NC}"
|
||||
fi
|
||||
}
|
||||
|
||||
cmd_restart() {
|
||||
echo -e "${YELLOW}🔄 请求重启 Chromium...${NC}"
|
||||
local RESULT=$(call_api "/restart")
|
||||
local STATUS=$(echo "$RESULT" | python3 -c "import sys,json;print(json.load(sys.stdin).get('status','unknown'))" 2>/dev/null)
|
||||
|
||||
if [ "$STATUS" = "ok" ]; then
|
||||
local PID=$(echo "$RESULT" | python3 -c "import sys,json;print(json.load(sys.stdin).get('pid',''))" 2>/dev/null)
|
||||
echo -e "${GREEN}✅ Chromium 已重启 (PID: $PID)${NC}"
|
||||
else
|
||||
local MSG=$(echo "$RESULT" | python3 -c "import sys,json;print(json.load(sys.stdin).get('message','未知错误'))" 2>/dev/null)
|
||||
echo -e "${RED}❌ $MSG${NC}"
|
||||
fi
|
||||
}
|
||||
|
||||
cmd_status() {
|
||||
local RESULT=$(call_api "/status")
|
||||
if [ $? -ne 0 ]; then
|
||||
echo -e "${RED}❌ 无法连接管理服务${NC}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
local STATUS=$(echo "$RESULT" | python3 -c "import sys,json;print(json.load(sys.stdin).get('status','unknown'))" 2>/dev/null)
|
||||
|
||||
if [ "$STATUS" = "running" ]; then
|
||||
local PID=$(echo "$RESULT" | python3 -c "import sys,json;print(json.load(sys.stdin).get('pid',''))" 2>/dev/null)
|
||||
echo -e "${GREEN}✅ Chromium 运行中${NC}"
|
||||
echo -e " PID: ${CYAN}$PID${NC}"
|
||||
echo -e " 调试端口: ${CYAN}$ROOT_HOST:9222${NC}"
|
||||
|
||||
local BROWSER=$(echo "$RESULT" | python3 -c "
|
||||
import sys,json
|
||||
data = json.load(sys.stdin)
|
||||
info = data.get('browser_info', {})
|
||||
if isinstance(info, dict):
|
||||
print(f\" 浏览器: {info.get('Browser', '未知')}\")
|
||||
ua = info.get('User-Agent', '')
|
||||
if ua:
|
||||
print(f\" 用户代理: {ua[:80]}...\")
|
||||
" 2>/dev/null)
|
||||
echo -e "$BROWSER"
|
||||
else
|
||||
echo -e "${YELLOW}⏹️ Chromium 未运行${NC}"
|
||||
fi
|
||||
}
|
||||
|
||||
cmd_debug_url() {
|
||||
local RESULT=$(call_api "/status")
|
||||
if [ $? -ne 0 ]; then return 1; fi
|
||||
|
||||
local STATUS=$(echo "$RESULT" | python3 -c "import sys,json;print(json.load(sys.stdin).get('status','unknown'))" 2>/dev/null)
|
||||
|
||||
if [ "$STATUS" != "running" ]; then
|
||||
echo -e "${RED}❌ Chromium 未运行,请先执行 start${NC}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 获取 WebSocket 调试地址
|
||||
local WS_URL=$(curl -s "http://$ROOT_HOST:9222/json/version" 2>/dev/null | python3 -c "
|
||||
import sys,json
|
||||
try:
|
||||
data = json.load(sys.stdin)
|
||||
print(data.get('webSocketDebuggerUrl', ''))
|
||||
except:
|
||||
print('')
|
||||
" 2>/dev/null)
|
||||
|
||||
local PAGE_WS=$(curl -s "http://$ROOT_HOST:9222/json" 2>/dev/null | python3 -c "
|
||||
import sys,json
|
||||
try:
|
||||
pages = json.load(sys.stdin)
|
||||
if pages:
|
||||
print(pages[0].get('webSocketDebuggerUrl', ''))
|
||||
else:
|
||||
print('')
|
||||
except:
|
||||
print('')
|
||||
" 2>/dev/null)
|
||||
|
||||
if [ -n "$WS_URL" ]; then
|
||||
echo -e "${GREEN}🔗 调试地址:${NC}"
|
||||
echo -e " 浏览器: ${CYAN}$WS_URL${NC}"
|
||||
if [ -n "$PAGE_WS" ]; then
|
||||
echo -e " 当前页面: ${CYAN}$PAGE_WS${NC}"
|
||||
fi
|
||||
echo ""
|
||||
echo -e "${YELLOW}💡 VS Code 插件配置示例:${NC}"
|
||||
echo " {"
|
||||
echo " \"type\": \"chrome\","
|
||||
echo " \"request\": \"attach\","
|
||||
echo " \"name\": \"Attach to Chromium\","
|
||||
echo " \"port\": 9222,"
|
||||
echo " \"host\": \"$ROOT_HOST\""
|
||||
echo " }"
|
||||
else
|
||||
echo -e "${RED}❌ 无法获取调试地址${NC}"
|
||||
fi
|
||||
}
|
||||
|
||||
cmd_log() {
|
||||
# 先看看管理服务能不能返回日志路径
|
||||
local LOG_PATH=$(curl -s "http://$ROOT_HOST:9222/json/version" 2>/dev/null | python3 -c "
|
||||
import sys,json
|
||||
print('ok')
|
||||
" 2>/dev/null)
|
||||
|
||||
if [ $? -ne 0 ] || [ -z "$LOG_PATH" ]; then
|
||||
echo -e "${YELLOW}⚠️ 无法直接访问日志文件${NC}"
|
||||
echo " root 上的日志目录: ~/debug/logs/chromium/"
|
||||
echo " 可以在 root 上用 cat/tail 查看"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 通过 Chromium 的 API 简单确认它在运行
|
||||
echo -e "${YELLOW}📄 日志文件在 root 上: ~/debug/logs/chromium/${NC}"
|
||||
echo -e " 请在 root 终端查看,或使用 ssh root@localhost 'tail -f ~/debug/logs/chromium/chromium-*.log'"
|
||||
}
|
||||
|
||||
# ==================== 主入口 ====================
|
||||
|
||||
case "${1:-help}" in
|
||||
start)
|
||||
cmd_start
|
||||
;;
|
||||
stop)
|
||||
cmd_stop
|
||||
;;
|
||||
restart)
|
||||
cmd_restart
|
||||
;;
|
||||
status)
|
||||
cmd_status
|
||||
;;
|
||||
debug-url|debug_url|url)
|
||||
cmd_debug_url
|
||||
;;
|
||||
log)
|
||||
shift
|
||||
cmd_log "$@"
|
||||
;;
|
||||
help|--help|-h)
|
||||
show_help
|
||||
;;
|
||||
*)
|
||||
echo -e "${RED}未知命令: $1${NC}"
|
||||
show_help
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
@@ -9,7 +9,7 @@ services:
|
||||
container_name: cyrene_postgres
|
||||
environment:
|
||||
POSTGRES_USER: cyrene
|
||||
POSTGRES_PASSWORD: change_me
|
||||
POSTGRES_PASSWORD: cyrene_pass
|
||||
POSTGRES_DB: cyrene_ai
|
||||
ports:
|
||||
- "5432:5432"
|
||||
|
||||
Reference in New Issue
Block a user