Files
rustfs/examples/plugin-template-image/README.md

88 lines
5.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# RustFS 图像插件模板
## 给 AI coding agent 的任务提示词
> 你正在基于 RustFS OCI 插件模板开发一个独立的对象处理插件。先阅读本 README、`src/main.rs` 和 `Cargo.toml`,再按我的业务要求修改。保持 Runner 的 `rustfs.job/v2alpha1` 输入与本地制品输出合同:从 `/input/input.json` 读取完整 attempt identity、精确对象版本和有界参数;从 `/credentials/credential.json` 读取短期凭据;只读获取指定版本;只把产物和 `result.json` 写到 `/output`。使用 Rust 和 libvips 实现图像操作,为每个新分支补测试。拒绝缺失或 `null` versionId、未知字段、越界尺寸和不支持的格式。禁止把凭据放进日志、命令行、环境变量或结果文件。完成后运行 README 中的测试和 Docker 构建,报告实际命令、结果、支持范围和未实现能力。
请把这段提示词连同具体业务需求交给 agent。它会把本目录作为可运行模板,不需要先猜 Runner 的容器文件协议。
## 当前样例
样例接收已版本化的 RustFS 图片对象,使用 Runner 提供的短期只读 S3 凭据获取指定 `versionId`,再用 libvips 做缩略处理和格式转换。它支持:
- 等比缩小并限制在目标宽高内(`fit: "inside"`);
- 等比缩小并居中裁剪(`fit: "cover"`);源图不足时不放大,结果会小于目标边长;
- 根据图片方向元数据自动旋正;
- 输出 PNG、JPEG 或 WebP;JPEG/WebP 使用 libvips 默认编码质量。
这个测试插件只实现上述基础操作。腾讯云数据万象还覆盖水印、模糊、锐化、EXIF/主色调、动图和智能处理等能力;这些都不是本样例已支持的功能。后续可以按需把单项能力做成明确参数和测试,不要在 manifest 或 README 中宣称未实现的功能。
## Runner 文件合同
Runner 会把以下只读文件和可写目录挂进容器:
- `/input/input.json`:`rustfs.job/v2alpha1`,包含 `attempt`、`object` 和 `parameters`;`object.version` 必须是具体非空版本,不能是 S3 的 `null` 哨兵。
- `/credentials/credential.json`:`access_key`、`secret_key` 和可选 `session_token`。这是 attempt 级短期凭据,只用于读源对象。
- `/output/`:唯一可写目录。插件写入 `image.png`、`image.jpg` 或 `image.webp`,并写 `result.json` 声明文件名和原始完整 attempt identity。Runner 负责把本地产物上传到受控结果桶并绑定精确版本。
最小输入示例:
```json
{
"schema": "rustfs.job/v2alpha1",
"attempt": {
"platform": "example",
"run": "00000000-0000-4000-8000-000000000001",
"attempt": "00000000-0000-4000-8000-000000000002",
"epoch": "1",
"session": "00000000-0000-4000-8000-000000000003",
"control_generation": "generation-1"
},
"object": {
"bucket": "images",
"key": "uploads/photo.jpg",
"version": "3Lg...exact-version"
},
"parameters": {
"width": 320,
"height": 240,
"fit": "cover",
"format": "webp"
}
}
```
`parameters` 可省略:默认 320×240、inside、WebP。源对象上限为 32 MiB,解码像素上限为 50 MP,目标边长上限为 10,000 像素,输出上限为 Runner 的 16 MiB 本地制品预算。容器应通过 CLI `--endpoint` 和 `--region` 接收存储地址,不接受密钥参数;HTTPS 是默认要求,仅 loopback HTTP 允许本地 smoke test。
结果文件形状:
```json
{
"schema": "rustfs.job/v2alpha1",
"attempt": { "与输入完全相同的 identity" },
"outcome": "ACCEPTED",
"artifacts": [{ "name": "image", "file": "image.webp" }]
}
```
## 构建与测试
需要 Docker Compose v2 或 Docker CLI,并使用与 Runner 节点相同的 CPU 架构构建。直接运行 Cargo 测试还需要安装 libvips 开发包和 `pkg-config`;Docker 构建会准备这些依赖并运行单测,运行镜像只带二进制、CA 证书和 libvips 运行库:
```sh
cargo test --locked --manifest-path examples/plugin-template-image/Cargo.toml
docker build -t rustfs-image-transform:dev examples/plugin-template-image
```
把镜像构建并签名后,按 Runner 的受信镜像流程配置 digest 和发布者,不要让 Runner 通过 tag 或无约束 pull 取得镜像。任务命令示例:
```json
["/usr/local/bin/rustfs-image-transform", "--endpoint", "https://s3.example.internal:9000", "--region", "us-east-1"]
```
## 扩展边界
每次扩展先决定输入参数、尺寸/像素/帧/内存上限、输出格式与失败语义,然后为变换和边界条件加测试。增加水印或检测能力时,明确字体、图片资源从哪里来,以及是否需要额外权限;不要假设容器可写宿主文件或能访问任意网络。生产镜像应继续使用 Runner 实施的非 root、只读根文件系统、网络出口限制、CPU/内存/PID 和输出容量限制。
功能参考:[腾讯云数据万象图片处理](https://cloud.tencent.com/document/product/1246/45270);处理引擎:[libvips 操作列表](https://github.com/libvips/libvips/blob/master/doc/function-list.md);Rust bindings:[libvips crate](https://docs.rs/libvips/2.3.0/libvips/)。