警告:Immich 移动端 Beta 版切换前必看,否则你的 1TB 照片将面临重复噩梦。
在自建相册的圈子里,Immich 的更新速度快得惊人,尤其是它的 Mobile Beta 计划,总是诱惑着开发者去尝试最新的功能。但作为一名处理过数 TB 级图片库的架构师,我必须给你一个极其严肃的警告:Beta 版不是给你生产环境用的,尤其是涉及到“专辑同步”和“备份逻辑”变更时。
如果你最近打算从稳定版切换到 Beta 版,或者反之,你极大概率会触发一个让所有整理癖崩溃的 Bug——大规模重复上传。原本已经在服务器上安家落户的 1TB 照片,会因为客户端 Hash 校验逻辑的微小偏移,被系统判定为“新文件”,从而开启一场毁灭性的重新上传风暴。
💡 报错现象总结:启用 Beta 版并切换完成后,为已完全上传的专辑开启备份,应用却开始重新上传该专辑的所有资源。最终导致服务器上出现大量内容完全一致、但 ID 不同的重复项,相册瀑布流瞬间被“双胞胎”图片占满。
Hash 校验的断层:为什么 Immich 认不出它“亲生”的照片?
Immich 判断一张照片是否已上传,核心逻辑依赖于文件哈希(Hash)比对。但在 Beta 版切换 的过程中,移动端与服务端的同步契约往往会发生断裂。
根据 Issue #12614 及其相关高评讨论,问题出在专辑(Album)的增量备份逻辑上。当 Beta 版应用扫描本地相册时,如果其内置的索引数据库(Local SQLite)在版本迁移中被重置,它会尝试重新触发一次全量的 Asset Discovery。
# 案发现场:服务端日志显示大量的上传请求,尽管文件已经存在
[Nest] 7 - 04/28/2026, 11:47:39 DEBUG [Microservices:StorageService]
Incoming upload request for asset: photo_2026_04.jpg
[Nest] 7 - 04/28/2026, 11:47:39 DEBUG [Microservices:StorageService]
No matching hash found in current session context, creating new asset record...
| 场景 | 稳定版 (Release) | Beta 切换期间 | 架构师底层诊断 |
|---|---|---|---|
| Hash 校验依据 | 完整文件哈希 | 属性偏移或部分哈希 | 校验逻辑不一致导致唯一性约束失效 |
| 专辑索引状态 | 持久化映射 | 易在版本切换时丢失映射 | 客户端由于找不到“已上传”标记而重试 |
| 服务器行为 | 拦截重复文件 | 若 API 路径变更则判定为新资源 | 缺乏强力的全局文件去重(Deduplication)保护 |
“文件爆炸”后的次生灾难:存储空间与索引压力
1TB 的重复照片不仅仅是浪费空间那么简单。Immich 的微服务架构在面临突发的大规模上传时,会瞬间拉爆 I/O。
- Redis 队列堆积:数万个上传任务会塞满 Redis 队列,导致正常的 Web 端浏览无法响应。
- Postgres 索引膨胀:每一张重复照片都会生成新的元数据、人脸识别记录和矢量索引,这会让你的数据库备份文件体积翻倍,查询效率骤降。
- 清理难度极大:由于它们是作为“新资源”进入系统的,简单的物理文件去重工具很难干净地删除数据库里的关联记录。
如何从“重复噩梦”中手动抢救?
如果你已经手快点了备份,看着正在疯狂增长的存储占用,你不得不采取以下“原生态”的笨办法:
- 立即断网并强行停止容器:先保住剩下的空间,防止数据库进一步污染。
- 手动 SQL 查重:你需要编写复杂的 PostgreSQL 查询语句,通过
checksum字段找出所有重复的assetsID。 - 危险的物理删除:你得在
/upload目录下手动匹配并删除那些新生成的、带有随机后缀的重复文件。 - 重置客户端缓存:彻底卸载 Beta 应用,清除所有应用数据,再切回稳定版重新登录。
这一套操作不仅风险极高(容易误删原始照片),而且过程极其枯燥。对于大部分只想安静用个相册的用户来说,这简直是技术霸凌。
使用“一键去重补丁”与稳定版镜像
与其在出事后去写复杂的 SQL 脚本,不如在切换前就给自己准备好“后悔药”。
我已经针对 Beta 版切换引发的重复上传问题,在 GitCode 维护了一个**《Immich 历史稳定版本镜像仓库》,并且提供了一个专用的“重复图片一键去重”Python 脚本**。
这个脚本能直接与 Immich 的 API 握手,安全地扫描并删除所有因版本切换产生的冗余 Asset 记录,同时保持你的专辑结构不受损坏。
在决定折腾 Beta 版之前,请务必前往 GitCode 备好这套方案。记住,备份你的数据库永远比修复它要容易得多。
[运行 GitCode 上的“重复图片一键去重”Python 脚本]
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust088- DDeepSeek-V4-ProDeepSeek-V4-Pro(总参数 1.6 万亿,激活 49B)面向复杂推理和高级编程任务,在代码竞赛、数学推理、Agent 工作流等场景表现优异,性能接近国际前沿闭源模型。Python00
MiniMax-M2.7MiniMax-M2.7 是我们首个深度参与自身进化过程的模型。M2.7 具备构建复杂智能体应用框架的能力,能够借助智能体团队、复杂技能以及动态工具搜索,完成高度精细的生产力任务。Python00
GLM-5.1GLM-5.1是智谱迄今最智能的旗舰模型,也是目前全球最强的开源模型。GLM-5.1大大提高了代码能力,在完成长程任务方面提升尤为显著。和此前分钟级交互的模型不同,它能够在一次任务中独立、持续工作超过8小时,期间自主规划、执行、自我进化,最终交付完整的工程级成果。Jinja00
Kimi-K2.6Kimi K2.6 是一款开源的原生多模态智能体模型,在长程编码、编码驱动设计、主动自主执行以及群体任务编排等实用能力方面实现了显著提升。Python00
Hy3-previewHy3 preview 是由腾讯混元团队研发的2950亿参数混合专家(Mixture-of-Experts, MoE)模型,包含210亿激活参数和38亿MTP层参数。Hy3 preview是在我们重构的基础设施上训练的首款模型,也是目前发布的性能最强的模型。该模型在复杂推理、指令遵循、上下文学习、代码生成及智能体任务等方面均实现了显著提升。Python00