群晖 Photos 停更之后,我把两万张照片迁到了 Immich。整个过程比想象中顺,但有三个地方必须先想清楚,否则后面迁移会很痛苦。
一、目录规划
Immich 的所有数据都在一个 UPLOAD_LOCATION 下,这个目录决定了你以后能不能无痛迁移。我的做法是:
/volume1/immich/
├── library/ # 原始照片,按用户和日期分目录
├── thumbs/ # 缩略图,可重建
├── encoded-video/ # 转码后的视频,可重建
├── profile/ # 头像
└── backup/ # 数据库 dump,每天一次
原则很简单:只有 library/ 不可再生。缩略图和转码视频都能从原图重建,所以它们可以放在缓存盘上,备份时直接跳过。
二、Compose 配置
services:
immich-server:
image: ghcr.io/immich-app/immich-server:release
restart: unless-stopped
volumes:
- /volume1/immich/library:/usr/src/app/upload
- /etc/localtime:/etc/localtime:ro
env_file:
- .env
ports:
- '2283:2283'
depends_on:
- redis
- database
immich-machine-learning:
image: ghcr.io/immich-app/immich-machine-learning:release
restart: unless-stopped
volumes:
- model-cache:/cache
redis:
image: docker.io/valkey/valkey:8-bookworm
restart: unless-stopped
database:
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0
restart: unless-stopped
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE_NAME}
POSTGRES_INITDB_ARGS: '--data-checksums'
volumes:
- /volume1/immich/pgdata:/var/lib/postgresql/data
volumes:
model-cache:
注意 POSTGRES_INITDB_ARGS: '--data-checksums',这几秒钟的代价换来的是数据库底层校验,值得。
三、人脸识别的实测
机器是 N100,开启机器学习容器后:
| 任务 | 两万张照片耗时 | CPU 占用 |
|---|---|---|
| 缩略图生成 | 约 40 分钟 | 60% |
| 人脸检测 | 约 3 小时 | 45% |
| 智能搜索索引 | 约 5 小时 | 55% |
建议分批导入。一次性扔两万张进去,机器会连续满载十几个小时,风扇噪音很难忽略。我的做法是按年份分成六批,每晚导一批,白天正常用。
四、反向代理
用 Caddy 是最省事的,两行配置:
photos.example.com {
reverse_proxy 192.168.1.2:2283
}
如果要开外网访问,务必先配好 HTTPS 再暴露端口。Immich 默认是 HTTP,直接映射到公网等于把相册挂在裸奔的端口上。
更稳妥的做法是只走内网 + WireGuard。相册这种东西,能不开公网就别开。我自己的方案是 Tailscale 组网,出门在外也能看,但不对公网暴露任何端口。
五、备份策略
数据库和照片要分开备份:
# 每天凌晨 dump 数据库
docker exec immich_postgres pg_dumpall --clean --if-exists \
--username=postgres > /volume1/immich/backup/db-$(date +%F).sql
# 每周用 rsync 把 library 同步到备份盘
rsync -a --delete /volume1/immich/library/ /volume2/backup/immich-library/
数据库 dump 要保留最近 14 天,因为照片库的 schema 升级有概率失败,留够回滚窗口。
六、结论
Immich 现在的完成度已经超过大多数商业相册。人脸识别准、时间线流畅、手机端自动备份可用,唯一的要求是你得愿意花一个下午把目录和备份规划好。
迁移完成那天我算了一下:两万张照片,索引占用 38G,原始文件 210G。放在自建 NAS 上,一年的电费还不够买一杯咖啡。
评论
评论功能默认关闭。想开启的话,去
src/lib/site.ts里把giscus.enabled改成true,填上你的repo和repoId即可——基于 GitHub Discussions, 不需要服务器,也不用数据库。