What happened?
从包含 libvips/FFmpeg 的完整 Docker 镜像切换到 slim 镜像时,数据库里已有的媒体处理配置不会被 slim 镜像的 bootstrap 环境变量覆盖。因此可能出现以下状态:
vips_cli.enabled = true,配置的扩展列表仍包含 heic、heif 等格式;
- 当前容器里实际找不到
vips 命令;
- 已经生成并缓存的旧缩略图仍然可以读取;
- 新上传的同格式图片无法生成缩略图;
- 管理端显示的是持久化配置,而
/public/thumbnail-support 返回的是经过命令可用性过滤后的有效能力,两者看起来互相矛盾。
现场曾观察到一份不包含 heic 的缩略图能力响应:
{
"code": "success",
"msg": "",
"data": {
"version": 1,
"image_preview": {
"enabled": true,
"extensions": ["apng", "bmp", "exr", "ff", "gif", "hdr", "ico", "jfif", "jpeg", "jpg", "pam", "pbm", "pgm", "png", "pnm", "ppm", "qoi", "tga", "tif", "tiff", "webp"]
},
"image_thumbnail": {
"enabled": true,
"extensions": ["apng", "bmp", "exr", "ff", "gif", "hdr", "ico", "jfif", "jpeg", "jpg", "pam", "pbm", "pgm", "png", "pnm", "ppm", "qoi", "tga", "tif", "tiff", "webp"]
},
"audio_thumbnail": {
"enabled": true,
"extensions": ["aac", "aif", "aiff", "ape", "flac", "m4a", "m4b", "m4p", "m4r", "mp3", "ogg", "opus", "wav", "wv"]
},
"video_thumbnail": {
"enabled": false
}
}
}
这份响应适合用来讨论接口语义,但不足以单独证明某个部署当前使用了 slim 镜像。部署诊断仍需同时核对镜像 digest、容器内命令和数据库配置。
Steps to reproduce
- 使用 full 镜像启动 AsterDrive,并确保媒体处理 registry 中
vips_cli 已启用、用途包含 thumbnail:image、扩展列表包含 heic。
- 为一个 HEIC 文件生成缩略图,确认缓存已经存在。
- 保留同一数据库和数据卷,将服务切换到同版本
-slim 镜像。
- 确认容器内
command -v vips 返回空,但管理端仍显示持久化的 vips_cli.enabled = true。
- 请求
GET /api/v1/public/thumbnail-support,并分别读取旧 HEIC 文件和新上传 HEIC 文件的缩略图。
Expected behavior
需要明确并统一以下三个概念:
- Configured capability:用户在数据库中配置并启用的处理器及扩展。
- Runtime availability:当前进程是否能找到并执行
vips / ffmpeg / ffprobe。
- Effective generation capability:当前实例能否为新文件生成对应派生内容。
讨论倾向:
- 管理端保留并展示用户配置,不因临时切换镜像而静默改写数据库;
- 同时明确展示处理器当前
available / unavailable 状态,而不是只显示 enabled;
/public/thumbnail-support 的扩展语义需要明确:
- 若它表示“配置支持范围”,应保留已启用
vips_cli 的扩展,并提供独立的 runtime availability/effective 字段;
- 若它表示“当前可生成能力”,则继续过滤缺失命令的扩展,但管理端和诊断接口必须说明过滤原因;
- 已有缩略图缓存继续可读;处理器缺失只影响新派生内容生成;
- 新生成失败应返回现有结构化 processor-unavailable 错误,并给出选择 full 镜像或关闭对应处理器的运维提示。
Actual behavior
- Slim 镜像中的
ASTER_BOOTSTRAP_ENABLE_VIPS_CLI=false、ASTER_BOOTSTRAP_ENABLE_FFMPEG_CLI=false 和 ASTER_BOOTSTRAP_ENABLE_FFPROBE_CLI=false 只决定 fresh database 的初始值,不覆盖已有数据库配置。
public_thumbnail_support 会在 vips_cli / ffmpeg_cli 分支先调用 command_is_available,命令缺失时不合并该处理器的扩展。
- 管理配置仍保留
enabled = true,但公开能力列表已经按运行环境缩减;目前没有足够清晰的状态解释这项差异。
- 旧缓存仍可能正常显示,使问题表现为“旧文件正常、新文件失败”,容易被误判为扩展识别或缓存故障。
Media metadata boundary
/public/media-data-support 与 /public/thumbnail-support 是两份不同契约:
- HEIC 图片元数据可由内置 Rust 解析链处理;
- HEIC 缩略图/图片预览通常依赖可用的 libvips CLI 或 storage-native processor;
media-data-support 中存在 heic 不代表当前实例能生成 HEIC 缩略图;
thumbnail-support 中缺少 heic 也不代表无法读取 HEIC 元数据。
两条接口需要独立测试,前端不能把其中一条当成另一条的替代能力表。
Suggested direction
优先保留用户配置,并新增可计算的 effective 状态,而不是在启动时修改数据库:
{
"kind": "vips_cli",
"configured_enabled": true,
"runtime_available": false,
"effective_enabled": false,
"unavailable_reason": "command_not_found"
}
公开匿名接口不应暴露本地命令路径;管理员接口或诊断日志可以返回结构化原因。最终是否让 /public/thumbnail-support.extensions 表示 configured 或 effective capability,需要在本 issue 中确定后固定为文档和测试契约。
Acceptance criteria
AsterDrive version
v0.5.0 / current master
Installation method
Docker / Compose (full -> slim runtime variant)
Related issues
Checklist
What happened?
从包含 libvips/FFmpeg 的完整 Docker 镜像切换到
slim镜像时,数据库里已有的媒体处理配置不会被 slim 镜像的 bootstrap 环境变量覆盖。因此可能出现以下状态:vips_cli.enabled = true,配置的扩展列表仍包含heic、heif等格式;vips命令;/public/thumbnail-support返回的是经过命令可用性过滤后的有效能力,两者看起来互相矛盾。现场曾观察到一份不包含
heic的缩略图能力响应:{ "code": "success", "msg": "", "data": { "version": 1, "image_preview": { "enabled": true, "extensions": ["apng", "bmp", "exr", "ff", "gif", "hdr", "ico", "jfif", "jpeg", "jpg", "pam", "pbm", "pgm", "png", "pnm", "ppm", "qoi", "tga", "tif", "tiff", "webp"] }, "image_thumbnail": { "enabled": true, "extensions": ["apng", "bmp", "exr", "ff", "gif", "hdr", "ico", "jfif", "jpeg", "jpg", "pam", "pbm", "pgm", "png", "pnm", "ppm", "qoi", "tga", "tif", "tiff", "webp"] }, "audio_thumbnail": { "enabled": true, "extensions": ["aac", "aif", "aiff", "ape", "flac", "m4a", "m4b", "m4p", "m4r", "mp3", "ogg", "opus", "wav", "wv"] }, "video_thumbnail": { "enabled": false } } }这份响应适合用来讨论接口语义,但不足以单独证明某个部署当前使用了 slim 镜像。部署诊断仍需同时核对镜像 digest、容器内命令和数据库配置。
Steps to reproduce
vips_cli已启用、用途包含thumbnail:image、扩展列表包含heic。-slim镜像。command -v vips返回空,但管理端仍显示持久化的vips_cli.enabled = true。GET /api/v1/public/thumbnail-support,并分别读取旧 HEIC 文件和新上传 HEIC 文件的缩略图。Expected behavior
需要明确并统一以下三个概念:
vips/ffmpeg/ffprobe。讨论倾向:
available/unavailable状态,而不是只显示enabled;/public/thumbnail-support的扩展语义需要明确:vips_cli的扩展,并提供独立的 runtime availability/effective 字段;Actual behavior
ASTER_BOOTSTRAP_ENABLE_VIPS_CLI=false、ASTER_BOOTSTRAP_ENABLE_FFMPEG_CLI=false和ASTER_BOOTSTRAP_ENABLE_FFPROBE_CLI=false只决定 fresh database 的初始值,不覆盖已有数据库配置。public_thumbnail_support会在vips_cli/ffmpeg_cli分支先调用command_is_available,命令缺失时不合并该处理器的扩展。enabled = true,但公开能力列表已经按运行环境缩减;目前没有足够清晰的状态解释这项差异。Media metadata boundary
/public/media-data-support与/public/thumbnail-support是两份不同契约:media-data-support中存在heic不代表当前实例能生成 HEIC 缩略图;thumbnail-support中缺少heic也不代表无法读取 HEIC 元数据。两条接口需要独立测试,前端不能把其中一条当成另一条的替代能力表。
Suggested direction
优先保留用户配置,并新增可计算的 effective 状态,而不是在启动时修改数据库:
{ "kind": "vips_cli", "configured_enabled": true, "runtime_available": false, "effective_enabled": false, "unavailable_reason": "command_not_found" }公开匿名接口不应暴露本地命令路径;管理员接口或诊断日志可以返回结构化原因。最终是否让
/public/thumbnail-support.extensions表示 configured 或 effective capability,需要在本 issue 中确定后固定为文档和测试契约。Acceptance criteria
vips_cli/ffmpeg_cli/ffprobe_cli有明确的 configured、available、effective 状态。/public/thumbnail-support对扩展列表的 configured/effective 语义在 API 文档中明确,并由缺失命令测试锁定。/public/media-data-support与/public/thumbnail-support分别覆盖 HEIC,证明元数据解析与缩略图生成互不替代。AsterDrive version
v0.5.0/ currentmasterInstallation method
Docker / Compose (
full->slimruntime variant)Related issues
Checklist