自托管 · Docker

Immich 自建相册:跑了一个月,说点真实的

Google Photos 的免费额度早就用完了,每年续费一百多,说贵不贵,但照片放在别人服务器上这件事一直让我不太舒服。 于是找了个周末,把大概 1.2 万张照片从 Takeout 导出来,装了一套 Immich。

现在跑了整整一个月,两台手机自动备份,家里三个人都在用。结论先放这儿:能替代,但别指望零维护。

先说结论

  • 安装确实简单,一个 compose 文件搞定,二十分钟能用
  • 人脸识别和以图搜图是同类里最好用的,比 PhotoPrism 明显强
  • 手机端自动备份稳定,但第一次全量上传很吃 CPU
  • 升级要小心,两个大版本之间改过数据库结构

我的环境

项目配置
机器N100 小主机,16G 内存
系统Debian 12
存储2T SSD + 4T 机械盘(照片放机械盘)
照片量约 12000 张,共 68G

怎么装的

官方给了一份 compose 模板,我把用不到的部分删了,实际上就三个服务:

services:
  immich-server:
    image: ghcr.io/immich-app/immich-server:release
    volumes:
      - ./library:/data
      - /mnt/photos:/mnt/photos:ro
    env_file: .env
    ports:
      - "2283:2283"

  database:
    image: tensorchord/pgvecto-rs:pg15-v0.2.0
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes:
      - ./pgdata:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine

前面的反向代理我用 Caddy 加的,证书自动签,这段配置只有两行:

photos.example.com {
  reverse_proxy 127.0.0.1:2283
}

用下来好的地方

最满意的是搜索。直接在搜索框里打「海边」「猫」「身份证」,它能把对应的照片翻出来,中文识别也没问题——这一点上国内几个自建方案都不太行。

另一个是「回忆」和相册共享。把家庭相册共享出去以后,家里老人手机上看照片的体验和 Google Photos 差不多, 他们完全不知道后端是我那台小主机。

踩到的坑

1. 第一次备份把 CPU 打满了

两台手机同时上传一万多张,缩略图生成和机器学习任务一起跑,N100 直接满载了一个晚上,风扇声一直在。 后来在设置里把「机器学习」的并发调到 1,又限制了任务时间窗口,才恢复正常。

2. 半夜挂过一次

有天早上发现所有图都裂了,容器起不来。翻日志发现是数据库容器被 OOM 杀了,原因是照片库变大以后 默认的内存限制不够。给 compose 加了 mem_limit 和 swap 之后没再出现。

如果你的照片超过一万张,先把内存留够再谈稳定性。这是我这次最大的教训。

3. 升级别跨太多版本

官方 release 之间偶尔会有数据库迁移,我一般先看 release notes 里的 breaking changes, 然后 docker compose pull && docker compose up -d。备份数据库这件事别偷懒。

值不值得

对我来说值得。一年省下的订阅费刚好覆盖一块硬盘,更重要的是照片在自己手里,随时能打包带走。 代价是要接受「它偶尔会坏」这个事实,并且愿意花半个小时修。

如果你只是想找个地方存照片、不想碰命令行,那还是继续用云服务吧,别为难自己。


下篇打算写 Immich 的备份策略:数据库、原图、缩略图分别怎么备,以及我踩过的恢复失败。