NAS 中的照片和视频已经按目录保存,但逐层打开文件夹查看并不方便。这次使用 Immich 提供统一的浏览入口:原文件继续留在挂载分区中,通过外部资源库建立索引,在页面中查看照片和播放视频。
部署沿用前文的目录规划,应用数据与数据库放在 SSD 上,已有媒体目录以只读方式挂载。immich-server 使用 UID 1000、GID 2000 运行,与 docker-nas 共享组对应。
为什么选择 Immich
这里需要的是照片与视频的浏览体验,而不只是文件列表。Immich 可以扫描已有媒体、提取元数据、生成缩略图,并按时间线展示内容;视频还可以生成用于播放的转码版本,具体兼容性取决于源文件、浏览器与转码配置。
Immich 需要数据库、后台任务和额外的缩略图空间,并不是最轻量的文件浏览器。本例以现有配置为基础,只部署服务端、Valkey 和 PostgreSQL,不部署机器学习服务。
目录结构与界面展示的区别
已有文件可能按下面的方式归档:
图片/
└── 用户A/
├── 2025/
│ └── 12/
│ └── 图片1.jpg
└── 2026/
└── 10/
└── 图片2.jpg
把“用户A”作为外部资源库的导入路径,可以递归索引下方的年月目录,原文件不需要移动。
Immich 官方目前没有将外部资源库目录自动转换为相册的机制。因此,无法自动化实现期望的功能。需要手动创建相册,也可以在扫描完成后手动整理。参见 外部资源库与相册的官方说明 。
准备目录
mkdir -p /mnt/ssd/docker/compose/immich
mkdir -p /mnt/ssd/docker/data/immich/{data,postgres}
sudo chown -R 1000:2000 /mnt/ssd/docker/data/immich/data
| 宿主机目录 | 容器目录 | 用途 |
|---|---|---|
/mnt/ssd/docker/data/immich/data |
/data |
上传文件、缩略图、转码文件等应用数据 |
/mnt/ssd/docker/data/immich/postgres |
/var/lib/postgresql/data |
数据库,保存账户、索引与相册等信息 |
/mnt/hdd/ |
/mnt/media |
已有照片与视频,挂载为只读 |
已有媒体目录需要允许 UID 1000 或 GID 2000 读取文件、进入各级目录。这里不批量修改原文件的所有者,按前文的共享组权限配置即可。
1000:2000 只用于 immich-server,不要直接套用到 PostgreSQL。数据库镜像使用自身的运行身份管理数据目录;数据库应保存在本地、支持 Linux 权限的文件系统中,不使用 SMB/NFS 网络共享。
创建配置文件
Compose 配置
创建 /mnt/ssd/docker/compose/immich/compose.yaml:
name: immich
services:
immich-server:
container_name: immich_server
image: ghcr.io/immich-app/immich-server:release
# 使用前文配置的共享组访问媒体目录。
user: '1000:2000'
env_file:
- .env
volumes:
# 可写目录:上传文件、缩略图与转码产物。
- ${UPLOAD_LOCATION}:/data
# 只读目录:已有照片与视频。
- ${STORAGE_DIR}:/mnt/media:ro
- /etc/localtime:/etc/localtime:ro
ports:
- 2070:2283
depends_on:
- redis
- database
restart: always
healthcheck:
disable: false
redis:
container_name: immich_redis
image: docker.io/valkey/valkey:9@sha256:418652cfb58ef879d4978c33553735d7147016032d5aefaa14c828e611eb9dfd
healthcheck:
test: redis-cli ping | grep -q PONG || exit 1
restart: always
database:
container_name: immich_postgres
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE_NAME}
POSTGRES_INITDB_ARGS: '--data-checksums'
# 数据库放在 SSD 上,保留默认存储类型。
# DB_STORAGE_TYPE: 'HDD'
volumes:
# PostgreSQL 数据目录单独持久化。
- ${DB_DATA_LOCATION}:/var/lib/postgresql/data
shm_size: 128mb
restart: always
healthcheck:
disable: false
env_file 将 .env 中的数据库连接参数传入服务端。仅把 .env 放在 Compose 目录中,只会参与 Compose 变量替换,不会自动把所有变量传给容器。
外部媒体挂载保留 :ro,避免应用修改或删除原文件;/data 与数据库目录仍然需要可写。非 root 运行方式可参考 Immich 官方 FAQ
。
环境变量
在同目录下创建 .env:
UPLOAD_LOCATION=/mnt/ssd/docker/data/immich/data
DB_DATA_LOCATION=/mnt/ssd/docker/data/immich/postgres
STORAGE_DIR=/mnt/hdd/
# 替换为自己的随机密码,仅使用字母和数字。
DB_PASSWORD=ChangeThisToYourRandomPassword123
DB_USERNAME=postgres
DB_DATABASE_NAME=immich
STORAGE_DIR 是宿主机上的媒体根目录。后台添加外部资源库时,需要填写映射后的容器路径 /mnt/media/...。
文中保留草稿中的服务与依赖镜像配置。Immich 的服务端和数据库扩展需要配套使用,首次部署或升级时,应对照 对应发行版的 Compose 文件 ,不要单独替换数据库大版本或扩展镜像。官方安装步骤见 Docker Compose 部署文档 。
启动服务
cd /mnt/ssd/docker/compose/immich
docker compose pull
docker compose up -d
docker compose logs --tail=100 immich-server
在浏览器访问 http://服务器IP:2070,按页面提示创建管理员账户。
本例没有部署机器学习容器,初始化后在管理设置中关闭机器学习相关任务。首次索引时的缩略图生成与视频转码仍会占用 CPU 和 SSD 空间,先扫描少量文件确认浏览、播放正常,再扩大扫描范围。
添加外部资源库
以宿主机目录 /mnt/hdd/图片/用户A 为例:
- 使用管理员账户进入“管理 → 外部库”。
- 创建资源库,选择所属账户,并将图库命名为“用户A”。
- 添加导入路径
/mnt/media/图片/用户A。 - 保存后执行扫描,等待索引和缩略图任务完成。
- 返回照片时间线,查看已识别的照片与视频。
配置方法参考 官方外部资源库指南
。导入路径必须使用容器内路径,不填写宿主机的 /mnt/hdd/...。只添加需要展示的子目录,避免把整个挂载分区作为扫描范围。
外部资源库用于索引原位置上的媒体,不需要通过上传方式再复制一份原文件;缩略图和转码产物会占用额外空间。每个外部资源库归属一个账户,目录名称“用户A”本身不会自动建立账户或访问隔离。
日常浏览与更新
照片与文件夹
时间线适合按拍摄日期查看媒体。希望保留文件夹浏览入口时,可在账户设置的功能选项中开启文件夹视图。
需要独立展示“用户A”的内容时,可以分配给对应账户,或手动整理相册。
视频播放
扫描后等待视频相关任务完成,再测试页面播放。播放不兼容或转码较慢时,检查管理后台的转码设置与任务日志。本例未开启硬件加速,使用 CPU 处理;N100 的硬件转码需要另外配置,不在这份 Compose 中默认启用。
新增文件
通过共享目录添加照片或视频后,需要重新扫描,才能更新索引。可以手动执行,也可以在管理设置中配置外部资源库的扫描周期。
只读挂载限制对原文件的写入,不会阻止数据库索引和缩略图生成。若在 Immich 之外移动或重命名文件,重新扫描后可能被识别为新条目,原条目上的相册关联等信息也可能丢失。使用方式与限制见 外部资源库文档 。
使用中发现的问题
以下是本次使用中的实际现象,未确认具体原因。
部分图片格式识别异常
挂载额外存储并添加为外部资源库后,发现部分图片格式识别存在问题(不显示封面图、展示比例不对)。
视频预览的方向键行为不符合预期
在大图预览界面中查看视频时,按键盘左、右方向键,实际会切换到上一个或下一个媒体条目,而不是控制当前视频的播放进度。
| 按键 | 期望行为 | 实际行为 |
|---|---|---|
| 左方向键 | 当前视频快退 | 切换到上一个媒体条目 |
| 右方向键 | 当前视频快进 | 切换到下一个媒体条目 |
这一交互与视频播放器的使用预期不一致,影响连续观看体验。
数据保留与升级
应用数据、数据库和原始媒体需要分别备份。只保留 /mnt/hdd/ 中的原文件,不能恢复账户、相册和应用设置;只备份数据库,也不能代替原文件备份。
升级前查看发行说明和官方 Compose 变更,确认服务端、数据库及相关扩展的兼容关系。备份方法参考 Immich 备份与恢复文档 。