朋友上周发我一张截图,iPhone 存储空间那一栏,照片占了 84G,总容量 128G,系统提示"存储空间几乎已满"。

他问我两件事:iCloud 每月 6 块的 50G 够不够用,还有没有别的办法。

我说,你家里不是有台吃灰的旧电脑吗,我教你在上面搭个相册。

这就是 Immich——开源的 Google Photos 替代品,人脸识别、时间线、地图、共享相册都有,部署在自己机器上,照片不进别人的服务器。

这篇是我在他那台机器上装完的完整记录,包括 8G 内存怎么撑住这套东西。

先说清楚这台机器扛不扛得住

Immich 不是个轻量应用,它是一套微服务:

我这台是 2014 款 Mac mini,i5-4278U,8G 内存,Ubuntu 24.04。

结论先给:能跑,但要限制内存,机器学习容器是最吃资源的那个。

一、准备目录

sudo mkdir -p /opt/docker/immich
sudo mkdir -p /opt/docker/immich/library
sudo mkdir -p /opt/docker/immich/postgres
sudo chown -R $USER:$USER /opt/docker/immich

library 放原始照片,postgres 放数据库。照片建议单独挂一块盘,别和系统盘挤在一起。

二、写 compose 文件

Immich 新版不再提供单文件 compose,官方推荐用 .env 加 compose。我整理的这份是精简可跑版:

services:
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:release
    volumes:
      - /opt/docker/immich/library:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - .env
    ports:
      - "2283:2283"
    depends_on:
      - redis
      - database
    restart: unless-stopped
    mem_limit: 1g

  immich-machine-learning:
    container_name: immich_machine_learning
    image: ghcr.io/immich-app/immich-machine-learning:release
    volumes:
      - model-cache:/cache
    env_file:
      - .env
    restart: unless-stopped
    mem_limit: 1536m

  redis:
    container_name: immich_redis
    image: docker.io/redis:6.2-alpine
    restart: unless-stopped
    mem_limit: 256m

  database:
    container_name: immich_postgres
    image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_DB: ${DB_DATABASE_NAME}
      POSTGRES_INITDB_ARGS: '--data-checksums'
    volumes:
      - /opt/docker/immich/postgres:/var/lib/postgresql/data
    restart: unless-stopped
    mem_limit: 1g

volumes:
  model-cache:

配套的 .env:

DB_PASSWORD=换成你自己的强密码
DB_USERNAME=immich
DB_DATABASE_NAME=immich

注意数据库镜像不能用官方 postgres:14,Immich 要带向量扩展的版本,用官方给的那个 tag。

三、启动和初始化

cd /opt/docker/immich
docker compose up -d

第一次拉镜像比较久,尤其是 machine-learning 那个,一两个 G。

拉完访问 http://服务器IP:2283,第一次进来是管理员注册页。第一个注册的账号自动成为管理员,所以装完立刻注册,别把地址暴露出去太久。

四、手机端自动备份

这是这套东西的核心价值。

App Store 搜 Immich,登录时填:

登录后进设置 → 备份:

第一次备份 84G 照片,我这边实测:

项目数据
照片数量约 3.2 万张
总大小84G
局域网上传约 2 小时
外网上传(家宽上行 30M)约 8 小时

局域网内速度吃的是交换机带宽,外网就看你家上行。

五、8G 内存的调优

装完跑了两天,我发现一个问题:机器学习容器一直吃满 1.5G,机器开始 swap,整个系统变卡。

原因是它默认会跑所有模型:人脸识别、物体识别、CLIP 搜索。

我做的调整:

1. 关掉不用的智能功能

在网页端 管理 → 设置 → 机器学习:

2. 限制并发

immich-machine-learning:
  environment:
    - MACHINE_LEARNING_WORKERS=1

默认可能开多个 worker,老机器上跑不动。

3. 上传时暂停

如果只是备份、不需要人脸识别,可以在设置里把机器学习的任务队列清空,让它只在上传完成后跑。

调完这些,内存占用从 4.2G 降到 3.1G,swap 基本不动了。

六、几个坑

坑一:时区不对,照片时间全乱

容器里要挂 /etc/localtime,或者在 .env 里加 TZ=Asia/Shanghai。我第一次没加,所有照片显示成 UTC 时间,时间线错位八小时。

坑二:人脸识别把家人认成一个人

机器学习要跑一阵才准,刚开始识别率低是正常的。可以在网页上手动合并人物、删除误识别。

坑三:数据库不能随便升大版本

Immich 每次大版本更新可能要跑数据库迁移,8G 内存的机器上迁移容易 OOM。升级前先备份 postgres 目录。

坑四:外网访问必须走 HTTPS

手机 App 用 http 也能连,但浏览器端很多功能(比如分享链接)要求 https。我是用 Nginx Proxy Manager 套了一层证书,后面单独写。

七、值不值得

算笔账:

三年下来,自建的成本比 iCloud 200G 便宜,而且容量是自己的、照片是自己的。

缺点也明显:断电就停、硬盘坏了要自己恢复、外网访问看家里上行。

朋友现在用了两周,说最大的感受是"终于不用每个月盯着那个 6 块钱了"。

最后

Immich 是我在 Docker 全家桶里装的第六个服务,也是朋友用得最勤的一个。

下一篇写 Vaultwarden——把密码也搬回自己家。

装的过程中有报错,把日志贴评论区,我帮你看看。

---

如果你也在折腾这套服务,碰到卡住的地方,可以加我微信 lige0552 聊聊。白天要上班,消息回得慢,看到都会回。