Docker Compose 部署 Immich:替代群晖 Photos 的完整记录

Docker Compose 部署 Immich:替代群晖 Photos 的完整记录

群晖 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, 不需要服务器,也不用数据库。