Immich
Immich 可以理解成一个"自己的私人照片云相册系统"。
它不只是一个"看文件夹里照片"的网页,而是一整套系统:
- 负责保存照片和视频
- 负责记录这些照片属于谁、拍摄时间、地点、缩略图、人脸信息
- 负责在网页和手机上展示
- 负责搜索、时间轴、地图、人脸聚类、视频转码等功能
所以它不是"文件夹浏览器",而是:
文件 + 数据库 + 后台处理任务 + 网页界面
共同组成的一套系统
9.1、部署
Immich 的目标是:
-
照片、视频主数据 放在
NAS上 -
数据库 放在本地
NVMe上 -
历史照片 先放到
import目录,再手动导入 -
网页访问地址 为:
http://设备IP:2283
分工是:
NAS:保存照片、视频- 本地
NVMe:保存数据库和项目配置
9.1.1、创建项目目录
bash
mkdir -p /mnt/nvme/my-project/project-docker/project-immich
mkdir -p /mnt/nvme/my-project/project-docker/project-immich/postgres
mkdir -p /mnt/nvme/my-project/project-docker/project-immich/model-cache
sudo chown -R 1001:1001 /mnt/nvme/my-project/project-docker/project-immich
mkdir -p /mnt/nas/docker-data/project-immich
mkdir -p /mnt/nas/docker-data/project-immich/library
mkdir -p /mnt/nas/docker-data/project-immich/import
sudo chown -R $USER:$USER /mnt/nvme/my-project/project-docker/project-immich
sudo chown -R $USER:$USER /mnt/nas/docker-data/project-immich
推荐项目目录结构:
bash
# 本地 NVMe
/mnt/nvme/my-project/project-docker/
└── project-immich/
├── postgres # PostgreSQL 数据库目录
├── model-cache # AI 模型缓存目录
├── .env # 环境变量配置 下载官方配置然后修改
├── configuration.yml # Immich 功能配置
├── docker-compose.yml # Docker 编排文件 下载官方配置然后修改
├── hwaccel.ml.yml # 机器学习硬件加速配置 下载官方配置然后修改
└── hwaccel.transcoding.yml # 视频转码硬件加速配置 下载官方配置然后修改
# NAS(NFS 挂载)
/mnt/nas/docker-data/
└── project-immich/
├── library # Immich 主存储根目录
└── import # 导入源目录
postgres:这是Immich的数据库目录。
作用:保存照片记录、用户、时间轴、元数据、人脸信息等。
必须放本地NVMe,不要放NAS。.env里也明确写了数据库不支持网络共享。model-cache:这是AI模型缓存目录。
作用:保存机器学习模型缓存,避免每次重新下载。.env:这是环境变量配置文件。
作用:统一写主存储位置、数据库位置、版本、密码等。configuration.yml:这是Immich功能配置文件。
作用:定义转码方式、编码格式、分辨率等。当前使用rkmpp。docker-compose.yml:这是Docker启动配置文件。
作用:定义要启动哪些容器、挂载哪些目录、开放哪个端口。hwaccel.ml.yml:这是机器学习加速配置。
作用:给immich-machine-learning提供RKNN相关设备。hwaccel.transcoding.yml:这是视频转码加速配置。
作用:给immich-server提供RKMPP相关设备。library:这是Immich的主存储根目录。
注意:它不是"原图目录"这个单独概念,而是Immich的整个数据根目录。import:这是导入源目录。
作用:放历史照片,之后手动执行导入命令。
它不会自动转移到主存储里。
9.1.2、创建容器
9.1.2.1、官方配置说明
先从官方示例基础上下载,再按当前设备环境修改:
bash
wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env
wget -O hwaccel.transcoding.yml https://github.com/immich-app/immich/releases/latest/download/hwaccel.transcoding.yml
wget -O hwaccel.ml.yml https://github.com/immich-app/immich/releases/latest/download/hwaccel.ml.yml
ls
在实际部署中新增或定制的:
configuration.yml:这是为了当前RK平台转码策略单独加上的运行配置文件,当前实际内容为rkmpp + h264 + aac + 1080p等参数。model-cache:不是配置文件,而是模型缓存目录。理论上可由容器自动下载模型,但实际部署中设备端下载不稳定,所以采用了"PC端下载后手动复制到设备"的方式。
9.1.2.2、为什么需要修改官方配置
官方配置的目标是:
- 保证"尽可能多机器都能先跑起来"
- 默认走最通用的本地目录方案
- 默认不启用硬件加速
- 默认不为某一种具体
ARM板卡做特别适配
而当前实际环境是:
- 设备:
NanoPi M6 - 系统:
Debian - 主存储:
NAS(NFS) - 数据库:本地
NVMe - 视频转码:
RKMPP - 机器学习:
RKNN - 还需要额外支持
/import导入历史照片
所以必须对官方配置做有针对性的修改。
9.1.2.3、.env 文件修改说明
-
主存储目录
UPLOAD_LOCATION修改前(官方): 官方默认把照片主存储放在当前项目目录下的
./library。envUPLOAD_LOCATION=./library修改后(当前实际): 当前实际改为本地
NAS路径。env# UPLOAD_LOCATION=/mnt/nvme/my-project/project-docker/project-immich/library UPLOAD_LOCATION=/mnt/nas/docker-data/project-immich/library官方默认适合:
- 本机测试
- 小规模使用
- 所有数据都放在同一块本地磁盘
当前实际环境希望:
-
大量照片和视频放到
NAS -
减少本地
NVMe占用 -
方便长期扩容和集中管理
修改后,
Immich主存储从"本地项目目录"改成了"NAS挂载目录"。也就是说:
- 新上传照片
CLI导入的历史照片Immich管理的数据目录
都会落在
NAS上
-
数据库目录
DB_DATA_LOCATION修改前(官方): 官方默认把数据库放当前项目目录下的
./postgres。envDB_DATA_LOCATION=./postgres修改后(当前实际): 当前实际改为本地
NVMe路径。envDB_DATA_LOCATION=/mnt/nvme/my-project/project-docker/project-immich/postgres官方默认适合快速启动,数据库也放项目目录中。
但数据库不适合放在
NAS/NFS上,官方注释里也明确写了"网络共享不支持数据库"。当前实际环境里:
- 照片放
NAS - 数据库放本地
NVMe
这是最合理的分工。
修改后:
PostgreSQL数据保留在本地NVMe- 数据库性能和稳定性更好
- 避免
NFS带来的风险
- 照片放
-
时区
TZ修改前(官方): 默认不启用时区设置。
env# TZ=Etc/UTC修改后(当前实际):
envTZ=Asia/Shanghai为了让:
- 日志时间
- 网页显示时间
- 时间轴时间
更符合当前使用习惯。
修改后时间显示更直观,不容易出现"为什么拍摄时间差了几个小时"的疑问。
- 时间显示更符合本地使用习惯
- 管理和排错更直观
-
数据库密码
DB_PASSWORD修改前(官方): 默认密码是演示用途。
envDB_PASSWORD=postgres修改后(当前实际):
envDB_PASSWORD=aaaaa官方默认密码只是示例,不适合长期使用。
数据库不再使用官方示例密码,更适合实际部署。
-
数据库用户
DB_USERNAME修改前(官方): 默认密码是演示用途。
envDB_USERNAME=postgres修改后(当前实际):
envDB_USERNAME=my-immich官方默认直接用
postgres用户,适合简单演示。当前环境中使用专门的
Immich数据库用户,更利于区分用途。数据库身份更明确,后续维护时更容易区分。
-
新增
IMMICH_CONFIG_FILE修改前(官方): 官方
.env中没有这一项。修改后(当前实际):
envIMMICH_CONFIG_FILE=/config/configuration.yml当前实际部署中,增加了单独的
configuration.yml,并在docker-compose.yml中挂载到了容器里。要让
Immich正确读取这个配置,就需要在.env中显式指定。这条变量和
docker-compose.yml里的挂载配合后,Immich才能正确读取自定义转码配置。 -
新增
MACHINE_LEARNING_RKNN_THREADS修改前(官方): 官方
.env中没有这一项。修改后(当前实际):
envMACHINE_LEARNING_RKNN_THREADS=3为了适配
RKNN机器学习服务,显式指定线程数,避免完全使用默认值。让
RKNN相关任务的资源占用更可控。
9.1.2.4、docker-compose.yml 文件修改说明
-
immich-server是否启用硬件转码扩展修改前(官方): 默认不启用硬件转码扩展。
yml# extends: # file: hwaccel.transcoding.yml # service: cpu修改后(当前实际):
ymlextends: file: hwaccel.transcoding.yml service: rkmpp官方默认用
CPU模式,兼容性最好,但是当前设备是RK平台,希望利用:/dev/rga/dev/mpp_service/dev/dri/dev/mali0
等硬件能力进行视频转码,而不是单纯用
CPU。修改后:
immich-server会继承rkmpp的设备挂载- 视频转码尽量走硬件,而不是纯
CPU
-
immich-machine-learning镜像是否启用RKNN修改前(官方): 官方使用普通镜像
ymlimage: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}修改后(当前实际):
ymlimage: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}-rknn官方默认用通用
CPU版镜像。当前设备是RK平台,所以使用-rknn版本。机器学习服务更贴合
RK平台硬件推理环境。 -
immich-machine-learning是否启用rknn扩展修改前(官方): 注释状态
yml# extends: # file: hwaccel.ml.yml # service: cpu修改后(当前实际):
ymlextends: file: hwaccel.ml.yml service: rknn官方默认不启用任何机器学习硬件加速。当前设备环境是
RK,所以要显式启用rknn。机器学习容器能获得
RKNN所需的设备与权限。与-rknn镜像配合使用 -
是否挂载
/import修改前(官方): 官方只有
yml- ${UPLOAD_LOCATION}:/data - /etc/localtime:/etc/localtime:ro修改后(当前实际):
yml- ${UPLOAD_LOCATION}:/data - /mnt/nas/docker-data/project-immich/import:/import:ro - /etc/localtime:/etc/localtime:ro官方默认只考虑:
- 手机上传
- 网页上传
- 直接进入
Immich主存储
而当前环境中还有"历史照片批量导入"的需求,所以需要单独挂载
/import。可以执行:
bashdocker exec -it immich_server immich upload --recursive /import来导入
NAS中已有照片 -
是否挂载
configuration.yml修改前(官方): 官方没有这一项。
修改后(当前实际):
yml- ${UPLOAD_LOCATION}:/data - /mnt/nas/docker-data/project-immich/import:/import:ro - /etc/localtime:/etc/localtime:ro - ./configuration.yml:${IMMICH_CONFIG_FILE}因为当前部署中新增了
configuration.yml,希望对视频转码策略进行明确控制,而不是完全使用默认行为。- 容器可以读取自定义的转码配置
rkmpp、编码格式、分辨率等参数生效
-
model-cache的挂载方式修改前(官方): 也就是 Docker 自己管理的匿名/命名 volume。
yml- model-cache:/cache修改后(当前实际):
yml- ./model-cache:/cache因为官方方式适合:
- 容器能自己在线下载模型
- 不需要用户手动接管模型目录
而当前环境中,设备端下载模型不稳定,所以改为本地目录后,可以:
- 在
PC上下载模型 - 手动复制到
model-cache - 由容器直接读取
模型缓存从"
Docker内部 volume"变成"本地可见目录",更容易维护和备份。
9.1.2.5、hwaccel.transcoding.yml 文件修改说明
修改前(官方): 官方版本里,rkmpp 已经给出了大部分 RK 设备,但以下几项默认是注释掉的:
yml
#- /dev/mali0:/dev/mali0
#- /etc/OpenCL:/etc/OpenCL:ro
#- /usr/lib/aarch64-linux-gnu/libmali.so.1:/usr/lib/aarch64-linux-gnu/libmali.so.1:ro
修改后(当前实际): 实际版本把这些打开了
yml
- /dev/mali0:/dev/mali0
- /etc/OpenCL:/etc/OpenCL:ro
- /usr/lib/aarch64-linux-gnu/mali/libmali.so.1:/usr/lib/aarch64-linux-gnu/libmali.so.1:ro
当前设备环境中,为了让 RK 平台的相关图形OpenCL/Mali 能力更完整可用,需要把这些额外挂进去。
修改前效果
- 官方默认配置更保守
- 兼容性更稳
- 但不一定能完整使用当前板子上的相关能力
修改后效果
- 容器能访问更多
RK相关设备与库 - 更适合当前
NanoPi M6实际环境
修改后:
- 容器能访问
mali0设备。- 更完整地支持当前平台相关图形/计算能力。
- 容器中的相关硬件能力调用更完整。
9.1.2.6、hwaccel.ml.yml 文件修改说明
这一份文件的变化不在于"内容大量修改",而在于"从官方提供但未启用,变成了实际启用"。
修改前(官方): 虽然官方文件里已经提供 rknn,但官方 docker-compose.yml 默认并没有启用它。
yml
rknn:
security_opt:
- systempaths=unconfined
- apparmor=unconfined
devices:
- /dev/dri:/dev/dri
修改后(当前实际): 当前使用版本与官方提供的 rknn 方案基本一致,但是在 docker-compose.yml 里实际启用了:
yml
extends:
file: hwaccel.ml.yml
service: rknn
并配合 -rknn 镜像。
几乎无本质改动,从"未启用"变成"已启用",机器学习推理不再只是默认
CPU方式,而是切换为更贴合当前设备的硬件推理路径。
9.1.2.6、configuration.yml 文件编写说明
这份文件不属于官方基础四件套之一,而是当前实际部署中新增的"运行策略文件"。
官方默认情况
官方基础 compose 并没有要求你单独准备这一份文件。
如果不加,Immich 会使用默认运行行为。
当前实际文件:
yml
ffmpeg:
accel: rkmpp
accelDecode: true
targetVideoCodec: h264
targetAudioCodec: aac
targetResolution: "1080"
crf: 18
preset: ultrafast
各项参数说明
accel: rkmpp:转码使用RKMPP。accelDecode: true:解码也尽量使用硬件加速。targetVideoCodec: h264:视频转为h264。targetAudioCodec: aac:音频转为aac。targetResolution: "1080":目标分辨率为1080p。crf: 18:控制视频质量。数值越小质量越高。preset: ultrafast:优先速度,降低转码耗时。
当前环境希望:
- 明确使用
RKMPP - 明确输出编码
- 明确目标分辨率
- 明确压缩质量与速度策略
视频转码策略更可控,不再完全依赖默认参数,相当于把"运行策略"单独抽出来。
9.1.2.7、model-cache 目录说明
理论上,模型缓存可以由容器第一次启动时自动下载,但是在国内网络不稳定,经常需要手动下载,然后手动复制到指定目录
/mnt/nvme/my-project/project-docker/project-immich/model-cache
- 模型目录变成可见、可管理、可备份
- 更适合当前环境长期维护
9.1.2.8、下载模型导入设备
-
win系统下载模型-
打开
PowerShell,执行:py -m pip install -U "huggingface_hub[cli]" -
然后执行
mkdir D:\immich-models cd D:\immich-models hf download immich-app/buffalo_l --local-dir .\buffalo_l hf download immich-app/ViT-B-32__openai --local-dir .\ViT-B-32__openai这两条命令的意思是:把
immich-app/buffalo_l和immich-app/ViT-B-32__openai整个仓库下载到本地文件夹。hf download官方支持下载整个仓库,--local-dir官方支持直接下载到你指定的目录。如果
hf命令提示找不到,就把PowerShell关掉重新开一次。如果你遇到限流或需要登录,再给命令补一个--token 你的HF令牌,这是官方支持的参数。
-
-
确认
Windows上下载出来的关键文件下载完后,在
Windows上检查这两个文件是否存在:dir D:\immich-models\buffalo_l\detection\rknpu\rk3588\model.rknn dir D:\immich-models\ViT-B-32__openai\visual\model.onnx这两个路径是按当前
M6的日志来的:buffalo_l需要用到detection\rknpu\rk3588\model.rknn,ViT-B-32__openai需要visual\model.onnx。 -
把文件夹拷到设备
先在设备上准备目录:
mkdir -p /mnt/nvme/my-project/project-docker/project-immich/model-cache/facial-recognition mkdir -p /mnt/nvme/my-project/project-docker/project-immich/model-cache/clip rm -rf /mnt/nvme/my-project/project-docker/project-immich/model-cache/facial-recognition/buffalo_l rm -rf /mnt/nvme/my-project/project-docker/project-immich/model-cache/clip/ViT-B-32__openai然后在
Windows PowerShell里用scp复制:scp -r D:\immich-models\buffalo_l mo@你的M6IP:/mnt/nvme/my-project/project-docker/project-immich/model-cache/facial-recognition/ scp -r D:\immich-models\ViT-B-32__openai mo@你的M6IP:/mnt/nvme/my-project/project-docker/project-immich/model-cache/clip/复制完成后,设备上应该变成这样:
/mnt/nvme/my-project/project-docker/project-immich/model-cache/ ├── facial-recognition/ │ └── buffalo_l/ └── clip/ └── ViT-B-32__openai/ -
重启机器学习容器
回到设备上执行:
cd /mnt/nvme/my-project/project-docker/project-immich docker compose up -d --force-recreate immich-machine-learning docker compose logs -f immich-machine-learning如果目录放对了,接下来它应该优先从
/cache读本地模型,而不是继续去连huggingface.co。Immich官方也明确说,手动下载后放进 cache folder 是支持的处理方式。
9.1.3、启动容器
9.1.3.1、启动前检查
在真正启动之前,先检查:
检查 NAS 是否已挂载
bash
findmnt /mnt/nas
如果没挂载成功,不要启动 Immich。
检查项目文件是否齐全
bash
cd /mnt/nvme/my-project/project-docker/project-immich
ls -la
应看到:
.envconfiguration.ymldocker-compose.ymlhwaccel.ml.ymlhwaccel.transcoding.yml
9.1.3.2、启动
进入项目目录:
bash
cd /mnt/nvme/my-project/project-docker/project-immich
启动:
bash
docker compose down && docker compose up -d
查看运行状态:
bash
docker ps
查看日志:
bash
docker compose logs -f immich-server
9.1.3.3、运行后的目录理解
真正保存照片的目录在哪里:
这是最容易搞错的地方,当前设置的是:
UPLOAD_LOCATION=/mnt/nas/docker-data/project-immich/library
这个目录被挂进容器里的 /data。
所以 Immich 会在这个目录下面自己创建结构,类似这样:
/mnt/nas/docker-data/project-immich/library/
├── library
├── upload
├── thumbs
├── encoded-video
├── profile
└── backups
注意:
- 原始照片实际保存在
upload/ - 不是
library/library
也就是说,真正的照片路径通常在:
/mnt/nas/docker-data/project-immich/library/upload
这些子目录说明:
upload:保存原始照片和视频。
这是最重要的目录。thumbs:保存缩略图。encoded-video:保存转码视频。profile:保存 AI 相关数据。backups:保存备份相关内容。library:这个目录不是你直觉中的"主照片目录",通常不要自己手动碰。
9.1.4、配置文件内容
docker-compose.yml
yml
name: immich
services:
immich-server:
container_name: immich_server
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
extends:
file: hwaccel.transcoding.yml
service: rkmpp
volumes:
- ${UPLOAD_LOCATION}:/data
- /mnt/nas/docker-data/project-immich/import:/import:ro
- /etc/localtime:/etc/localtime:ro
- ./configuration.yml:${IMMICH_CONFIG_FILE}
env_file:
- .env
ports:
- '2283:2283'
depends_on:
- redis
- database
restart: always
healthcheck:
disable: false
immich-machine-learning:
container_name: immich_machine_learning
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}-rknn
extends:
file: hwaccel.ml.yml
service: rknn
volumes:
- ./model-cache:/cache
env_file:
- .env
restart: always
healthcheck:
disable: false
redis:
container_name: immich_redis
image: docker.io/valkey/valkey:9@sha256:aaaaaaaaaaaaaaaaaa
healthcheck:
test: redis-cli ping || exit 1
restart: always
database:
container_name: immich_postgres
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:aaaaaaaaaaaaaaaaaaaaaa
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE_NAME}
POSTGRES_INITDB_ARGS: '--data-checksums'
# Uncomment the DB_STORAGE_TYPE: 'HDD' var if your database isn't stored on SSDs
# DB_STORAGE_TYPE: 'HDD'
volumes:
- ${DB_DATA_LOCATION}:/var/lib/postgresql/data
shm_size: 128mb
restart: always
healthcheck:
disable: false
volumes:
model-cache:
.env
env
UPLOAD_LOCATION=/mnt/nas/docker-data/project-immich/library
DB_DATA_LOCATION=/mnt/nvme/my-project/project-docker/project-immich/postgres
TZ=Asia/Shanghai
IMMICH_VERSION=v2
DB_PASSWORD=aaaaaa
DB_USERNAME=my-immich
DB_DATABASE_NAME=immich
IMMICH_CONFIG_FILE=/config/configuration.yml
MACHINE_LEARNING_RKNN_THREADS=3
hwaccel.ml.yml
yml
services:
armnn:
devices:
- /dev/mali0:/dev/mali0
volumes:
- /lib/firmware/mali_csffw.bin:/lib/firmware/mali_csffw.bin:ro
- /usr/lib/libmali.so:/usr/lib/libmali.so:ro
rknn:
security_opt:
- systempaths=unconfined
- apparmor=unconfined
devices:
- /dev/dri:/dev/dri
cpu: {}
cuda:
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities:
- gpu
rocm:
group_add:
- video
devices:
- /dev/dri:/dev/dri
- /dev/kfd:/dev/kfd
openvino:
device_cgroup_rules:
- 'c 189:* rmw'
devices:
- /dev/dri:/dev/dri
volumes:
- /dev/bus/usb:/dev/bus/usb
openvino-wsl:
devices:
- /dev/dri:/dev/dri
- /dev/dxg:/dev/dxg
volumes:
- /dev/bus/usb:/dev/bus/usb
- /usr/lib/wsl:/usr/lib/wsl
hwaccel.transcoding.yml
yml
services:
cpu: {}
nvenc:
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities:
- gpu
- compute
- video
quicksync:
devices:
- /dev/dri:/dev/dri
rkmpp:
security_opt:
- systempaths=unconfined
- apparmor=unconfined
group_add:
- video
devices:
- /dev/rga:/dev/rga
- /dev/dri:/dev/dri
- /dev/dma_heap:/dev/dma_heap
- /dev/mpp_service:/dev/mpp_service
- /dev/mali0:/dev/mali0
volumes:
- /etc/OpenCL:/etc/OpenCL:ro
- /usr/lib/aarch64-linux-gnu/mali/libmali.so.1:/usr/lib/aarch64-linux-gnu/libmali.so.1:ro
vaapi:
devices:
- /dev/dri:/dev/dri
vaapi-wsl:
devices:
- /dev/dri:/dev/dri
- /dev/dxg:/dev/dxg
volumes:
- /usr/lib/wsl:/usr/lib/wsl
environment:
- LIBVA_DRIVER_NAME=d3d12
configuration.yml
yml
ffmpeg:
accel: rkmpp
accelDecode: true
targetVideoCodec: h264
targetAudioCodec: aac
targetResolution: "1080"
crf: 18
preset: ultrafast
9.2、使用
9.2.1、首次访问
浏览器访问:
http://设备IP:2283
例如设备 IP 是 111.111.0.11,那么访问:
http://111.111.0.11:2283
首次进入后按页面提示创建管理员账号。
9.2.2、日常正常使用
最简单的使用方式是:
- 手机安装
Immich App - 登录
Immich服务器 - 手机照片直接上传
这样照片会直接进入 Immich 的主存储,不需要经过 import。
9.2.3、历史照片批量导入
如果有很多已经存在 NAS 上的历史照片,正确做法是 CLI upload 导入,webui中的 "外部库" 选项不会复制到指定的目录:
| 功能 | 外部库 | CLI upload |
|---|---|---|
| 是否复制文件 | ❌ 不复制 | ✅ 会复制 |
| 文件存放位置 | 原地(import) |
/library/upload |
| 是否占用双倍空间 | ❌ | ✅ |
是否受 Immich 管控 |
部分 | 完全 |
| 删除行为 | 不影响原文件 | 受 Immich 控制 |
9.2.3.1、把照片先放进 import
例如:
/mnt/nas/docker-data/project-immich/import
里面可以按你的习惯分目录,例如:
import/
└── test/
├── 2018/
├── 2019/
├── 2020/
└── ...
9.2.3.2、导入前先清理垃圾文件
有些 NAS 会生成缩略图目录和无效链接文件。
建议先清理:
find /mnt/nas/docker-data/project-immich/import -type d -name ".@__thumb" -exec rm -rf {} +
find /mnt/nas/docker-data/project-immich/import -type f -name "*.link" -delete
9.2.3.3、CLI登录
-
获取
Immich API Key-
打开网页"
http://你的设备IP:2283" -
登录账号 -> 点击右上角头像 -> 进入
Account Settings → API Keys -
点击:
Create API Key
-
-
在容器里登录
docker exec -it immich_server immich login-key http://localhost:2283 YOUR_API_KEY
9.2.3.4、先 dry-run 预检查
先不要直接正式导入,先测试一次:
docker exec -it immich_server immich upload --dry-run --recursive /import
这里必须记住:
- 一定要加
--recursive - 因为历史照片都在多层子目录里
- 不加的话会提示
No files found
9.2.3.5、正式导入
确认 dry-run 没问题后,执行:
docker exec -it immich_server immich upload --recursive /import
这条命令会做这些事:
- 递归扫描
/import - 识别图片和视频
- 去重
- 复制到
Immich主存储 - 写入数据库
- 后续生成缩略图、元数据、
AI信息
注意:
- 它不是简单复制
- 也不会自动删除
import里的原文件
9.2.3.6、导入后如何确认成功
查看容量:
du -sh /mnt/nas/docker-data/project-immich/library/upload
查看文件数量:
find /mnt/nas/docker-data/project-immich/library/upload -type f | wc -l
网页里查看:
- 时间轴里是否出现照片
- 随机点开几张能否正常显示
9.2.3.7、导入后是否会自动清空 import
不会。
import 只是导入源目录。
导入后原文件还会继续保留在 import。
如果确认导入成功、网页显示正常,再手动清空:
rm -rf /mnt/nas/docker-data/project-immich/import/*
第一次导入时,建议不要急着删,先确认没问题。
9.3、维护
9.3.1、常用运维命令
bash
# 查看容器状态
docker ps
docker compose ps
# 查看日志
docker compose logs -f immich-server
docker compose logs -f database
docker compose logs -f immich-machine-learning
# 重启
docker compose restart
# 停止
docker compose down
# 启动
docker compose up -d
9.3.2、检查挂载是否正确
检查主存储映射:
bash
docker inspect immich_server | grep /data
应看到类似:
bash
/mnt/nas/docker-data/project-immich/library:/data:rw
检查导入目录映射:
bash
docker inspect immich_server | grep /import
docker exec -it immich_server ls -lah /import
9.3.3、查看实际照片是否在增长
bash
du -sh /mnt/nas/docker-data/project-immich/library/upload
find /mnt/nas/docker-data/project-immich/library/upload -type f | wc -l
9.3.4、彻底重建时怎么做
如果以后要彻底从零开始:
-
停服务
bashdocker compose down -
删除数据库目录
bashsudo rm -rf /mnt/nvme/my-project/project-docker/project-immich/postgres mkdir -p /mnt/nvme/my-project/project-docker/project-immich/postgres -
删除主存储目录
bashsudo rm -rf /mnt/nas/docker-data/project-immich/library mkdir -p /mnt/nas/docker-data/project-immich/library -
重新启动
bashdocker compose up -d
注意:
- 不要只删照片文件不删数据库
- 否则会出现数据库里还有记录、实际文件没了的问题