modify: S3对象存储

This commit is contained in:
2026-08-21 15:30:28 +08:00
parent c0b9d7e75f
commit 5ba1a2a8cd
4 changed files with 463 additions and 10 deletions
+90 -5
View File
@@ -315,7 +315,91 @@ cd /app
---
## 5. 隔离性约束
## 5. 文件传输:直连 S3/Minio 对象存储(不依赖网关)
进程插件可直接对接 S3/Minio 对象存储做文件传输——上传、下载、删除、预签名 URL
均由**插件自己的配置**(`[workers.config.storage]`)驱动,**数据路径不经过网关**
(预签名 URL 模式下网关甚至不参与数据传输:设备/浏览器拿到 URL 后直传/直取 Minio)。
### 5.1 配置
```toml
# config/workers/<name>/config.toml
[workers.config.storage]
endpoint = "192.168.1.10:9000" # Minio 地址 host:port(不带协议前缀)
access_key = "minioadmin"
secret_key = "minioadmin"
bucket = "chongming-files"
secure = false # false=http(默认),true=https
region = "" # 可选
auto_create_bucket = true # 可选,默认 true:启动时确保 bucket 存在
```
语义(`chongming_worker.storage.StorageClient.from_config`):
| 情形 | 行为 |
| ---- | ---- |
| 未配置 / `enabled = false` | 存储关闭(`self.storage = None`),端点自行降级 |
| 配置段存在但缺必填键(endpoint/access_key/secret_key/bucket) | **启动硬失败**(ValueError),快速反馈配置错误 |
| 连接失败 / bucket 不可用 | 告警降级为 None(不影响其他端点) |
### 5.2 SDK 用法
基类在 `_bootstrap` 阶段检测到 `config["storage"]` 段即自动初始化
`self.storage`(无需任何额外代码);插件在 `on_init` 发布到 global_var 供路由读取:
```python
class DemoPlugin(Plugin):
async def on_init(self):
if self.storage is not None: # 配置了 storage 段才初始化
self.set_var("storage", self.storage)
```
路由内使用(同步核心 + async 包装,RPC handler 直接 await):
```python
from ..global_var import require
storage = require("storage")
await storage.aput_bytes("dir/file.txt", data) # 上传字节
await storage.aput_file("dir/file.txt", "/tmp/a.txt") # 上传本地文件
data = await storage.aget_bytes("dir/file.txt") # 下载字节
await storage.aget_file("dir/file.txt", "/tmp/b.txt") # 下载到本地文件
url = await storage.apresigned_put_url("dir/file.txt") # 预签名 PUT(设备直传)
url = await storage.apresigned_get_url("dir/file.txt") # 预签名 GET(设备直取)
await storage.adelete("dir/file.txt") # 删除
```
API 一览(`chongming_worker.storage.StorageClient`):
| 方法(async 同名加 `a` 前缀) | 说明 |
| ---- | ---- |
| `put_file(object_key, local_path, content_type=None)` | 上传本地文件(fput_object) |
| `put_bytes(object_key, data, content_type=None)` | 上传内存字节 |
| `get_file(object_key, local_path)` | 下载到本地文件 |
| `get_bytes(object_key)` | 下载为字节 |
| `delete(object_key)` | 删除对象 |
| `presigned_put_url(object_key, expires=3600)` | 预签名 PUT URL(默认 1 小时) |
| `presigned_get_url(object_key, expires=3600)` | 预签名 GET URL(默认 1 小时) |
### 5.3 参考示例
`workers/demo` 演示了 4 个文件传输端点(`config/workers/demo/` 下对应 TOML):
- `POST /demo/presign_upload` — filename → object_key + 预签名 PUT URL(设备直传)
- `GET /demo/presign_download` — object_key → 预签名 GET URL(设备直取)
- `POST /demo/upload_bytes` — base64 小文件经 Zenoh RPC 上传(大文件请用预签名直传)
- `GET /demo/download_bytes` — base64 小文件经 Zenoh RPC 下载
配置后重启 worker 即可用;未配置时这些端点返回「storage 未配置」错误(降级演示)。
> 依赖:minio SDK 随 `chongming-worker` 一起安装(utils/worker pyproject 已声明),
> 进程插件无需额外 `requirements.txt`。SDK 侧 `chongming_worker.storage` 不依赖网关包,
> 隔离性约束与打包流程均不受影响。
---
## 6. 隔离性约束
进程插件**禁止 import `chongming`(网关包)**,只允许依赖:
@@ -331,7 +415,7 @@ cd /app
---
## 6. 进程内契约校验
## 7. 进程内契约校验
Worker 进程启动时自读 TOML 并**在自己进程内**做三方一致性校验
(`chongming_worker.contracts.validate_worker_contracts`),校验失败直接退出:
@@ -346,7 +430,7 @@ Worker 进程启动时自读 TOML 并**在自己进程内**做三方一致性校
---
## 7. 常见问题排查
## 8. 常见问题排查
| 现象 | 原因 / 处理 |
| ---- | ----------- |
@@ -356,11 +440,12 @@ Worker 进程启动时自读 TOML 并**在自己进程内**做三方一致性校
| 路由没出现 | worker 是否就绪(日志「路由发布完成」);网关 RouteRegistry 是否订阅(启动流程 5.1);每 10s 自愈重发布,稍等或重启 worker |
| 路由一直 404 | worker 是否已退出(优雅退出会摘除路由);进程被 SIGKILL 时描述符残留,重启 worker 后重发布自愈覆盖 |
| 找不到插件配置 | `worker_serve` 须在项目根目录下运行(读 `config/workers/<name>/config.toml`,`--config` 可指定全局配置路径) |
| storage.* 端点报「storage 未配置」 | 插件 config.toml 未配置 `[workers.config.storage]`(或 `enabled = false` / 连接失败降级)。补齐配置后重启 worker;启动日志可见「对象存储已就绪」或「storage 连接失败」告警 |
| 容器内 import `workers.demo` 失败 | 确认在容器工作目录(zip 根)启动,`start.sh` 内含 `cd "$(dirname "$0")"`,worker_serve 会把 CWD 加入 sys.path |
---
## 8. 相关命令速查
## 9. 相关命令速查
```bash
uv run worker_serve --type <name> # 本地调试独立 Worker 进程
@@ -373,7 +458,7 @@ uv run python test_process_mode_e2e.py # 端到端测试(先启动网
---
## 9. 参考
## 10. 参考
- [主 README:进程插件与混合部署](../README.md)
- [Worker 插件开发指南(inline,结构约定与装饰器细节)](../src/plugins/README.md)