警告: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 StartedRust0152- DDeepSeek-V4-ProDeepSeek-V4-Pro(总参数 1.6 万亿,激活 49B)面向复杂推理和高级编程任务,在代码竞赛、数学推理、Agent 工作流等场景表现优异,性能接近国际前沿闭源模型。Python00
LongCat-Video-Avatar-1.5最新开源LongCat-Video-Avatar 1.5 版本,这是一款经过升级的开源框架,专注于音频驱动人物视频生成的极致实证优化与生产级就绪能力。该版本在 LongCat-Video 基础模型之上构建,可生成高度稳定的商用级虚拟人视频,支持音频-文本转视频(AT2V)、音频-文本-图像转视频(ATI2V)以及视频续播等原生任务,并能无缝兼容单流与多流音频输入。00
auto-devAutoDev 是一个 AI 驱动的辅助编程插件。AutoDev 支持一键生成测试、代码、提交信息等,还能够与您的需求管理系统(例如Jira、Trello、Github Issue 等)直接对接。 在IDE 中,您只需简单点击,AutoDev 会根据您的需求自动为您生成代码。Kotlin03
Intern-S2-PreviewIntern-S2-Preview,这是一款高效的350亿参数科学多模态基础模型。除了常规的参数与数据规模扩展外,Intern-S2-Preview探索了任务扩展:通过提升科学任务的难度、多样性与覆盖范围,进一步释放模型能力。Python00
skillhubopenJiuwen 生态的 Skill 托管与分发开源方案,支持自建与可选 ClawHub 兼容。Python0112