朋友上周发我一张截图,iPhone 存储空间那一栏,照片占了 84G,总容量 128G,系统提示"存储空间几乎已满"。
他问我两件事:iCloud 每月 6 块的 50G 够不够用,还有没有别的办法。
我说,你家里不是有台吃灰的旧电脑吗,我教你在上面搭个相册。
这就是 Immich——开源的 Google Photos 替代品,人脸识别、时间线、地图、共享相册都有,部署在自己机器上,照片不进别人的服务器。
这篇是我在他那台机器上装完的完整记录,包括 8G 内存怎么撑住这套东西。
先说清楚这台机器扛不扛得住
Immich 不是个轻量应用,它是一套微服务:
- immich-server:主服务,管上传、相册、时间线
- immich-machine-learning:机器学习,负责人脸识别、物体识别、智能搜索
- postgres:数据库(新版带向量扩展 pgvecto-rs)
- redis:缓存队列
我这台是 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,登录时填:
- 服务器地址:
http://你的公网IP:2283或者域名 - 账号密码:刚才注册的管理员
登录后进设置 → 备份:
- 开启"自动备份"
- 选择要备份的相册(建议只选 Camera 相册,别全选,不然第一次上传要跑一整天)
- 打开"仅前台备份"(后台备份在 iOS 上不太稳定)
第一次备份 84G 照片,我这边实测:
| 项目 | 数据 |
|---|---|
| 照片数量 | 约 3.2 万张 |
| 总大小 | 84G |
| 局域网上传 | 约 2 小时 |
| 外网上传(家宽上行 30M) | 约 8 小时 |
局域网内速度吃的是交换机带宽,外网就看你家上行。
五、8G 内存的调优
装完跑了两天,我发现一个问题:机器学习容器一直吃满 1.5G,机器开始 swap,整个系统变卡。
原因是它默认会跑所有模型:人脸识别、物体识别、CLIP 搜索。
我做的调整:
1. 关掉不用的智能功能
在网页端 管理 → 设置 → 机器学习:
- 关闭"智能搜索(CLIP)"
- 保留人脸识别(这个最有用)
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 50G 每月 6 块,一年 72 块;200G 每月 21 块,一年 252 块
- 这台 Mac mini 功耗 13W,24 小时开机,一年电费约 68 块(按 0.6 元/度算)
- 硬盘 2T 移动硬盘,一次性 400 块左右
三年下来,自建的成本比 iCloud 200G 便宜,而且容量是自己的、照片是自己的。
缺点也明显:断电就停、硬盘坏了要自己恢复、外网访问看家里上行。
朋友现在用了两周,说最大的感受是"终于不用每个月盯着那个 6 块钱了"。
最后
Immich 是我在 Docker 全家桶里装的第六个服务,也是朋友用得最勤的一个。
下一篇写 Vaultwarden——把密码也搬回自己家。
装的过程中有报错,把日志贴评论区,我帮你看看。
---
如果你也在折腾这套服务,碰到卡住的地方,可以加我微信 lige0552 聊聊。白天要上班,消息回得慢,看到都会回。