diff --git a/assistant/src/module/assistant/proxy/s3.ts b/assistant/src/module/assistant/proxy/s3.ts index eb734bd..3968603 100644 --- a/assistant/src/module/assistant/proxy/s3.ts +++ b/assistant/src/module/assistant/proxy/s3.ts @@ -39,6 +39,14 @@ export const s3Proxy = async (req: http.IncomingMessage, res: http.ServerRespons if (objectPath.startsWith(s3.bucket + '/')) { objectPath = objectPath.replace(s3.bucket + '/', ''); } + if (objectPath.endsWith('/')) { + // 获取目录列表 + res.statusCode = 200; + res.setHeader('Content-Type', 'application/json; charset=utf-8'); + const list = await oss.listObjects(objectPath); + res.end(JSON.stringify(list, null, 2)); + return; + } oss.getObject(objectPath).then((response) => { if (!response.Body) { res.statusCode = 404; diff --git a/cli-center/src/data/docs/10-config.md b/cli-center/src/data/docs/10-config.md index f725fee..0f3341a 100644 --- a/cli-center/src/data/docs/10-config.md +++ b/cli-center/src/data/docs/10-config.md @@ -1,6 +1,6 @@ --- title: '配置项介绍' -description: 'Assistant 应用配置项完整说明文档,包括应用信息、代理、服务器、认证、AI等各项配置详解' +description: 'Assistant 应用配置项完整说明文档,包括应用信息、代理、服务器、认证、AI、存储等各项配置详解' tags: ['config', 'configuration', 'settings', 'assistant'] createdAt: '2025-12-18' --- @@ -22,28 +22,38 @@ createdAt: '2025-12-18' } ``` -- **id**: `string` - 应用唯一标识符,用于识别具体设备或应用实例 -- **url**: `string` - 应用访问地址 +| 字段 | 类型 | 说明 | +|------|------|------| +| id | `string` | 应用唯一标识符,用于识别具体设备或应用实例 | +| url | `string` | 应用访问地址 | ## token - 访问令牌 +用于身份验证的访问令牌。 + ```json { "token": "your-access-token" } ``` -- **token**: `string` - 用于身份验证的访问令牌 +| 字段 | 类型 | 说明 | +|------|------|------| +| token | `string` | 访问令牌 | ## registry - 注册中心 +注册中心地址,默认为 `https://kevisual.cn`。 + ```json { "registry": "https://kevisual.cn" } ``` -- **registry**: `string` - 注册中心地址,默认为 `https://kevisual.cn` +| 字段 | 类型 | 说明 | +|------|------|------| +| registry | `string` | 注册中心地址 | ## proxy - 前端代理配置 @@ -61,16 +71,18 @@ createdAt: '2025-12-18' } ``` -- **proxy**: `ProxyInfo[]` - 代理配置数组 - - **path**: `string` - 匹配的路径前缀 - - **target**: `string` - 目标服务器地址 - - **pathname**: `string` - 转发到目标服务器的路径 +| 字段 | 类型 | 说明 | +|------|------|------| +| proxy | `ProxyInfo[]` | 代理配置数组 | +| proxy[].path | `string` | 匹配的路径前缀 | +| proxy[].target | `string` | 目标服务器地址 | +| proxy[].pathname | `string` | 转发到目标服务器的路径 | 示例:访问 `/root/home` 会被转发到 `https://kevisual.cn/root/home` ## api - API代理配置 -专门用于API请求的代理配置。 +专门用于 API 请求的代理配置,例如 `/api` 或 `/v1` 开头的请求。 ```json { @@ -89,17 +101,23 @@ createdAt: '2025-12-18' } ``` -- **api.proxy**: `ProxyInfo[]` - API代理配置数组,配置方式同 `proxy` +| 字段 | 类型 | 说明 | +|------|------|{------| +| api.proxy | `ProxyInfo[]` | API代理配置数组 | ## description - 应用描述 +应用的描述信息。 + ```json { "description": "我的助手应用" } ``` -- **description**: `string` - 应用的描述信息 +| 字段 | 类型 | 说明 | +|------|------|------| +| description | `string` | 应用描述信息 | ## server - 服务器配置 @@ -114,8 +132,10 @@ createdAt: '2025-12-18' } ``` -- **server.path**: `string` - 服务器监听地址,默认 `127.0.0.1` -- **server.port**: `number` - 服务器监听端口号 +| 字段 | 类型 | 说明 | +|------|------|------| +| server.path | `string`` | 服务器监听地址,默认 `127.0.0.1` | +| server.port | `number` | 服务器监听端口号 | ## share - 远程访问配置 @@ -130,8 +150,10 @@ createdAt: '2025-12-18' } ``` -- **share.url**: `string` - 远程应用代理地址 -- **share.enabled**: `boolean` - 是否启用远程访问功能 +| 字段 | 类型 | 说明 | +|------|------|------| +| share.url | `string` | 远程应用代理地址 | +| share.enabled | `boolean` | 是否启用远程访问功能 | ## watch - 文件监听配置 @@ -145,21 +167,27 @@ createdAt: '2025-12-18' } ``` -- **watch.enabled**: `boolean` - 是否启用文件监听 +| 字段 | 类型 | 说明 | +|------|------|------| +| watch.enabled | `boolean` | 是否启用文件监听 | ## home - 首页路径 +访问根路径 `/` 时自动重定向的首页地址。 + ```json { "home": "/root/home" } ``` -- **home**: `string` - 访问根路径 `/` 时自动重定向的首页地址 +| 字段 | 类型 | 说明 | +|------|------|------| +| home | `string` | 首页路径 | ## ai - AI功能配置 -启用和配置本地AI代理功能。 +启用和配置本地 AI 代理功能。 ```json { @@ -172,28 +200,32 @@ createdAt: '2025-12-18' } ``` -- **ai.enabled**: `boolean` - 是否启用AI功能 -- **ai.provider**: `string` - AI提供商,可选 `'DeepSeek'` | `'Custom'` 或其他自定义值 -- **ai.apiKey**: `string` - API密钥 -- **ai.model**: `string` - 使用的模型名称 +| 字段 | 类型 | 说明 | +|------|------|------| +| ai.enabled | `boolean` | 是否启用 AI 功能 | +| ai.provider | `string` | AI 提供商,可选 `'DeepSeek'` | `'Custom'` | +| ai.apiKey | `string` | API 密钥 | +| ai.model | `string` | 使用的模型名称 | -## scripts - 自定义脚本 +## asr - 语音识别配置 -定义自定义脚本命令,在应用启动时执行。 +配置阿里云语音识别服务。 ```json { - "scripts": { - "start": "node server.js", - "build": "npm run build", - "custom": "echo 'Hello World'" + "asr": { + "enabled": true, + "token": "your-asr-token" } } ``` -- **scripts**: `Record` - 键值对形式的脚本配置 - - key: 脚本名称 - - value: 要执行的命令 +| 字段 | 类型 | 说明 | +|------|------|------| +| asr.enabled | `boolean` | 是否启用语音识别功能 | +| asr.token | `string` | 阿里云 ASR 服务令牌 | + +使用模型:`qwen3-asr-flash-realtime` ## auth - 认证和权限配置 @@ -207,33 +239,70 @@ createdAt: '2025-12-18' } ``` -- **auth**: `AuthPermission` - 认证权限配置对象 - - **share**: 共享访问模式 - - `"protected"` - 需要认证才能访问(默认) - - `"public"` - 公开访问,无需认证 - - `"private"` - 私有访问,完全禁止外部访问 +| 字段 | 类型 | 说明 | +|------|------|------| +| auth.share | `string` | 共享访问模式,影响 pages 目录下页面的对外共享权限 | -> **说明**: `share` 配置影响 pages 目录下页面的对外共享权限 +**share 可选值:** +- `"protected"` - 需要认证才能访问(默认) +- `"public"` - 公开访问,无需认证 +- `"private"` - 私有访问,完全禁止外部访问 -## https - HTTPS证书配置 +## storage - 存储配置 -配置HTTPS服务和证书。 +配置文件存储,支持本地文件系统和 S3/MinIO 两种存储方式。 + +### 本地文件存储 (FileStorage) ```json { - "https": { - "type": "https", - "keyPath": "/path/to/private.key", - "certPath": "/path/to/certificate.crt" - } + "storage": [ + { + "id": "local-storage", + "path": "./uploads", + "type": "local" + } + ] } ``` -- **https.type**: `'https' | 'http'` - 服务协议类型,默认 `'http'` -- **https.keyPath**: `string` - SSL证书私钥文件路径 -- **https.certPath**: `string` - SSL证书文件路径 +### S3/MinIO 存储 (S3Storage) -> **注意**: 通常不需要配置HTTPS,可以通过反向代理(如Nginx)实现HTTPS访问 +```json +{ + "storage": [ + { + "id": "s3-storage", + "bucket": "my-bucket", + "region": "us-east-1", + "accessKeyId": "AKIAXXXXXXXXXXXXXXXX", + "secretAccessKey": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", + "endpoint": "https://s3.amazonaws.com", + "type": "s3" + }, + { + "id": "minio-storage", + "bucket": "my-bucket", + "region": "us-east-1", + "accessKeyId": "minioadmin", + "secretAccessKey": "minioadmin", + "endpoint": "http://localhost:9000", + "type": "minio" + } + ] +} +``` + +| 字段 | 类型 | 说明 | +|------|------|------| +| storage[].id | `string` | 存储标识符,唯一标识一个存储配置 | +| storage[].type | `'local' \| 's3' \| 'minio'` | 存储类型 | +| storage[].path | `string` | 本地存储路径(仅 type 为 `local` 时有效) | +| storage[].bucket | `string` | 存储桶名称(仅 type 为 `s3` 或 `minio` 时有效) | +| storage[].region | `string` | 存储区域(仅 type 为 `s3` 或 `minio` 时有效) | +| storage[].accessKeyId | `string` | 访问密钥 ID(仅 type 为 `s3` 或 `minio` 时有效) | +| storage[].secretAccessKey | `string` | 访问密钥(仅 type 为 `s3` 或 `minio` 时有效) | +| storage[].endpoint | `string` | 服务端点地址(仅 type 为 `s3` 或 `minio` 时有效,可选) | ## 完整配置示例 @@ -279,13 +348,29 @@ createdAt: '2025-12-18' "apiKey": "sk-xxx", "model": "deepseek-chat" }, - "scripts": { - "setup": "npm install", - "dev": "npm run dev" + "asr": { + "enabled": true, + "token": "your-asr-token" }, "auth": { "share": "protected" - } + }, + "storage": [ + { + "id": "local-storage", + "path": "./uploads", + "type": "local" + }, + { + "id": "s3-storage", + "bucket": "my-bucket", + "region": "us-east-1", + "accessKeyId": "AKIAXXXXXXXXXXXXXXXX", + "secretAccessKey": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", + "endpoint": "https://s3.amazonaws.com", + "type": "s3" + } + ] } ``` @@ -295,8 +380,8 @@ createdAt: '2025-12-18' ## 最佳实践 -1. **安全性**: 不要在配置文件中硬编码敏感信息(如 token、apiKey),建议使用环境变量 +1. **安全性**: 不要在配置文件中硬编码敏感信息(如 token、apiKey、secretAccessKey),建议使用环境变量 2. **端口选择**: 确保选择的端口未被占用 3. **代理配置**: 合理配置代理路径,避免路径冲突 -4. **HTTPS**: 生产环境建议使用反向代理配置HTTPS,而非直接在应用中配置 -5. **权限控制**: 根据实际需求选择合适的 `auth.share` 模式 +4. **权限控制**: 根据实际需求选择合适的 `auth.share` 模式 +5. **存储配置**: 根据应用规模选择合适的存储方式,本地存储适合开发和小型应用,S3/MinIO 适合生产环境