为何选择自托管相册服务?
在数字时代,我们的照片和视频正从数量和体积两个方向以前所未有的速度增长。以前16G的手机存储空间,现在这个数只够计算RAM的容量。主流厂商的手机存储起步均达到128G,面对如此庞大的数据,传统的存储方式不仅面临隐私风险,同时费用也相当可观,还不做到随时随地访问、同步。基于这些问题,我开始寻找一款能在NAS上自托管的相册服务。
经过多轮筛选比较,我最终选择了Immich作为我的主力相册管理解决方案。在本文中,我将全方位分享Immich的独特优势、部署实践以及使用体验,希望能为同样寻求隐私保护和自主控制的你提供有价值的参考。
相册服务横向对比
下面表格,是我使用过的几款可以用于管理相册的服务,表格中列举了几项服务之间的功能对比。
NextCloud和Kodbox属于私有云盘+企业协同办公工具,只是其中包含相册备份管理服务。虽然此类工具能提供类似云网盘、团队协作等功能,但是在相册智能化、专用AI识别、时间线浏览、地理视图等专业功能上,要弱于专业的相册服务,但如果只使用相册服务,又会显得整个服务过于臃肿,因此pass此类工具。
AList重点功能是网盘聚合,可以读取和管理主流网盘的内容,通过精细的路径配置可以做到像使用本地资源管理器一样方便,但如果背后的存储支持还是基于网盘,则有悖于我们搭建自托管相册服务的初衷。
其实从严格意义上来说,只有Immich和PhotoPrism属于相册服务。
重点对比:Immich vs PhotoPrism
1. AI识别能力深度
Immich:采用可插拔的机器学习架构,支持接入TensorFlow、PyTorch等框架的自定义模型。用户可以针对特定需求(如识别特定宠物品种、特殊场景)训练和部署专属模型。
PhotoPrism:内置识别引擎,功能完整但扩展性有限,无法灵活定制识别模型。
2. 硬件加速支持
Immich:对硬件解码有深度优化,支持Intel QSV、NVIDIA NVENC、VA-API等多种方案,视频处理效率极高。
PhotoPrism:视频处理能力相对基础,缺少细粒度的硬件加速配置。
3. 移动端体验
Immich:提供接近Google Photos的移动端体验,支持后台自动同步、智能相册、离线查看等功能。
PhotoPrism:主要依赖PWA(渐进式Web应用),在后台同步和原生体验上有差距。
4. 存储管理
Immich:支持存储模板和规则引擎,可按日期、地点、设备等维度自动整理照片。
PhotoPrism:采用单一时间线视图,组织方式相对固定。
Immich核心优势详解(来源于DeepSeek总结)
1. 可扩展的机器学习框架
Immich最大的亮点是其模块化的机器学习架构。与封闭的AI系统不同,它允许用户:
自定义人脸识别模型:可以针对家庭成员训练专属识别模型,特别适合识别幼儿(婴儿面部特征变化快,通用模型识别率低)
文本识别(OCR)定制:支持多语言OCR模型,甚至可以训练识别特定手写体的模型
场景识别优化:针对家庭场景优化识别算法,能更准确识别“家庭聚会”、“后院烧烤”等个性化场景
2. 全面的硬件加速支持
我的NAS配置为Intel N100处理器,利用Immich的硬件加速能力:
# 硬件加速配置示例
devices:
- /dev/dri:/dev/dri # 共享GPU设备给容器
Immich支持:
Intel Quick Sync Video (QSV):高效H.264/H.265编解码
NVIDIA CUDA:机器学习推理加速
VA-API:开源视频加速接口
AMD AMF:AMD显卡加速
实测中,4K视频的缩略图生成速度提升3-5倍,大幅降低CPU负载。
3. 智能存储管理模板
Immich的存储模板系统让文件组织变得优雅:
# 支持的模板变量示例
{year}/{month}/{day}/{filename} # 按日期组织
{device}/{year}/{month}/{filename} # 按设备+日期组织
{location}/{year}/{month}/{filename} # 按地点组织
更强大的是规则引擎:
自动将“截图”移动到专用文件夹
根据GPS信息将旅行照片归类
识别重复照片并标记处理
4. 其他值得关注的优点
原生应用体验
iOS/Android应用功能完整,支持后台同步
原生的分享和协作功能
智能相册自动更新
强大的搜索功能
自然语言搜索:“上个月在公园拍的小孩照片”
多条件筛选:人物+地点+时间组合搜索
EXIF元数据深度检索
完善的API体系
完整的REST API文档
Webhook支持自动化流程
第三方应用集成能力
服务部署详解
这里放下官方的环境建议与要求:

immich支持在任意环境部署,常见的Nas系统如:unRaid、TrueNAS、群晖系统等,如果你的NAS是纯linux,也可以使用docker compose直接进行部署,官方也提供了开箱即用的脚本,方便初学者快速使用。当然在Windows中也可以进行部署,但它是以WSL的形似部署在docker中运行的,大家都不建议这么玩。
官方推荐使用docker compose进行部署,后期容器升级管理都相对方便简单,此外官方提供了十分全面的部署脚本。你可以直接使用官方的部署脚本进行部署,如果你的设备配置较高且内存充足,建议使用我的docker-compose.yml脚本,我的脚本中包含了immichweb服务(必须)+redis库(必须)+数据库(必须,immich使用pgSQL,有版本要求,建议使用官方的版本)+immich机器学习服务(非必须)+备份服务(非必须)。
1. 环境准备
首先创建部署目录(如./immich-app),用于存储docker-compose.yml和.env文件:
mkdir -p ./immich-app
cd immich
创建环境配置文件 .env,这里可以下载官方的example.env文件,可以使用下面的命令进行下载,需要注意的是,下载后需要手动修改为.env。
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env我的.env:
# You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables
# 图片存储目录
UPLOAD_LOCATION=/DataCenter/photo_center/immich/library
# 数据库存储目录(由于immich是以数据为主导,而不是图片为主导,所以要定期备份该目录)
DB_DATA_LOCATION=/DataCenter/photo_center/immich/postgres
# 所使用的软件版本,不修改
IMMICH_VERSION=release
# 数据库链接密码
DB_PASSWORD=****
# 无需修改下面内容
###################################################################################
DB_USERNAME=postgres
DB_DATABASE_NAME=immich
TZ=Asia/Shanghai官方.env:
# You can find documentation for all the supported env variables at https://docs.immich.app/install/environment-variables
# The location where your uploaded files are stored
UPLOAD_LOCATION=./library
# The location where your database files are stored. Network shares are not supported for the database
DB_DATA_LOCATION=./postgres
# To set a timezone, uncomment the next line and change Etc/UTC to a TZ identifier from this list: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
# TZ=Etc/UTC
# The Immich version to use. You can pin this to a specific version like "v2.1.0"
IMMICH_VERSION=v2
# Connection secret for postgres. You should change it to a random password
# Please use only the characters `A-Za-z0-9`, without special characters or spaces
DB_PASSWORD=postgres
# The values below this line do not need to be changed
###################################################################################
DB_USERNAME=postgres
DB_DATABASE_NAME=immich
创建docker compose脚本文件,这里是官方的docker-compose.yml,可以使用下面的命令进行下载,下载后保持名字不变。
wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml官方docker-compose.yml内容:
#
# WARNING: To install Immich, follow our guide: https://docs.immich.app/install/docker-compose
#
# Make sure to use the docker-compose.yml of the current release:
#
# https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
#
# The compose file on main may not be compatible with the latest release.
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: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
volumes:
# Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file
- ${UPLOAD_LOCATION}:/data
- /etc/localtime:/etc/localtime:ro
env_file:
- .env
ports:
- '2283:2283'
depends_on:
- redis
- database
restart: always
healthcheck:
disable: false
immich-machine-learning:
container_name: immich_machine_learning
# For hardware acceleration, add one of -[armnn, cuda, rocm, openvino, rknn] to the image tag.
# Example tag: ${IMMICH_VERSION:-release}-cuda
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
# extends: # uncomment this section for hardware acceleration - see https://docs.immich.app/features/ml-hardware-acceleration
# file: hwaccel.ml.yml
# service: cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference - use the `-wsl` version for WSL2 where applicable
volumes:
- model-cache:/cache
env_file:
- .env
restart: always
healthcheck:
disable: false
redis:
container_name: immich_redis
image: docker.io/valkey/valkey:9@sha256:fb8d272e529ea567b9bf1302245796f21a2672b8368ca3fcb938ac334e613c8f
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:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23
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:
# Do not edit the next line. If you want to change the database storage location on your system, edit the value of DB_DATA_LOCATION in the .env file
- ${DB_DATA_LOCATION}:/var/lib/postgresql/data
shm_size: 128mb
restart: always
volumes:
model-cache:
我的docker-compose.yml内容:
name: immich
services:
immich-server:
container_name: immich_server
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
volumes:
- ${UPLOAD_LOCATION}:/usr/src/app/upload
- /etc/localtime:/etc/localtime:ro
env_file:
- .env
devices:
# 容器共享宿主GPU,用于硬解
- /dev/dri:/dev/dri
ports:
- 2283:2283
depends_on:
- redis
- database
restart: always
healthcheck:
disable: false
immich-machine-learning:
container_name: immich_machine_learning
# For hardware acceleration, add one of -[armnn, cuda, openvino] to the image tag.
# 如果你使用cuda、arm,记得修改这里
# Example tag: ${IMMICH_VERSION:-release}-cuda
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
# extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration
# file: hwaccel.ml.yml
# service: cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable
volumes:
# 设置模型缓存目录
- model-cache:/cache
env_file:
- .env
restart: always
healthcheck:
disable: false
redis:
container_name: immich_redis
image: library/redis:6.2-alpine@sha256:84882e87b54734154586e5f8abd4dce69fe7311315e2fc6d67c29614c8de2672
healthcheck:
test: redis-cli ping || exit 1
restart: always
database:
container_name: immich_postgres
image: tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE_NAME}
POSTGRES_INITDB_ARGS: '--data-checksums'
volumes:
- ${DB_DATA_LOCATION}:/var/lib/postgresql/data
restart: always
healthcheck:
test: pg_isready --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' || exit 1; Chksum="$$(psql --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' --tuples-only --no-align --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')"; echo "checksum failure count is $$Chksum"; [ "$$Chksum" = '0' ] || exit 1
interval: 5m
start_interval: 30s
start_period: 5m
command: ["postgres", "-c" ,"shared_preload_libraries=vectors.so", "-c", 'search_path="$$user", public, vectors', "-c", "logging_collector=on", "-c", "max_wal_size=2GB", "-c", "shared_buffers=512MB", "-c", "wal_compression=on"]
backup:
container_name: immich_db_dumper
image: prodrigestivill/postgres-backup-local:14
env_file:
- .env
environment:
POSTGRES_HOST: database
POSTGRES_CLUSTER: 'TRUE'
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: ${DB_DATABASE_NAME}
SCHEDULE: "@daily"
POSTGRES_EXTRA_OPTS: '--clean --if-exists'
BACKUP_DIR: /db_dumps
volumes:
- /DataCenter/backup_center/immich_db_dumps:/db_dumps
restart: always
depends_on:
- database
deploy:
resources:
limits:
cpus: '1'
memory: 256M
volumes:
model-cache:
2.容器部署
启动容器
docker compose up -d访问应用
浏览器打开(记得防火墙放行端口):
http://你的NAS_IP:2283首次访问创建管理员账户

创建相册、上传照片
APP下载
登录你的immich后台,可以从这个地方找到下载链接,

当然你也可从下面的链接直接下载
更新容器
需要切换到docker-compose.yml脚本所在目录,请确认更新前服务未在使用。
d进阶配置与优化建议
硬件加速深度配置
immich支持多种硬件平台:

对于不同硬件平台,Immich提供针对性的优化,请将下面对应平台的内容,内联到docker-compose.yml中的immich-machine-learning上去,如下实例:
immich-machine-learning:
container_name: immich_machine_learning
# Note the `-cuda` at the end
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}-cuda
# Note the lack of an `extends` section
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities:
- gpu
volumes:
- model-cache:/cache
env_file:
- .env
restart: alwaysARM NN:
先决条件:
仅支持Mali GPU
已安装相应的Linux内核驱动
/dev/mali0 可访问。
配置:
services:
armnn:
devices:
- /dev/mali0:/dev/mali0
volumes:
- /lib/firmware/mali_csffw.bin:/lib/firmware/mali_csffw.bin:ro # Mali firmware for your chipset (not always required depending on the driver)
- /usr/lib/libmali.so:/usr/lib/libmali.so:ro # Mali driver for your chipset (always required)
NVIDIA GPU配置:
先决条件:
GPU算力需≥5.2
安装nvidia驱动,且版本≥545(支持CUDA 12.3)
配置:
cuda:
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities:
- gpu
RK NN配置:
先决条件:
目前仅支持RK3566、RK3568、RK3576和RK3588.
需要安装相应内核驱动
RKNPU 驱动 V0.9.8 或更高版本必须在主机服务器中提供
可以通过查看版本来确认查看
cat /sys/kernel/debug/rknpu/version
配置:
rknn:
security_opt:
- systempaths=unconfined
- apparmor=unconfined
devices:
- /dev/dri:/dev/dri
cpu: {}硬解
支持的平台如下图:

同上,将对应平台的内容内联到docker-compose.yml中的immich-server去,然后执行重启操作:
NVENC配置:
先决条件:
安装官方驱动
配置:
nvenc:
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities:
- gpu
- compute
- video
QuickSync(QSV)配置:
先决条件:
9th以上的CPU
11th以前的CPU,需要参考该该链接启用低功耗模式。
11thCPU搭配5.15内核,需要升级内核(摘自Jellyfin文档)。
配置:
quicksync:
devices:
- /dev/dri:/dev/driRKMPP配置:
配置:
rkmpp:
security_opt: # enables full access to /sys and /proc, still far better than privileged: true
- 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 # only required to enable OpenCL-accelerated HDR -> SDR tonemapping
volumes:
#- /etc/OpenCL:/etc/OpenCL:ro # only required to enable OpenCL-accelerated HDR -> SDR tonemapping
#- /usr/lib/aarch64-linux-gnu/libmali.so.1:/usr/lib/aarch64-linux-gnu/libmali.so.1:ro # only required to enable OpenCL-accelerated HDR -> SDR tonemapping
自定义模型部署
参考自这篇文章:Immich 智能搜索 - 支持中文的 CLIP 大模型 | 一起玩 NAS!
这个链接中,有Immich目前支持的模型列表:immich-app (Immich)
新版immich支持直接修改模型名称,然后自动拉取模型,只要模型名称和网络都没问题即可。
操作步骤:
在immich后台 管理 -> 设置 -> 机器学习设置 -> 智能搜索 -> CLIP 模型中粘贴模型名称(XLM-Roberta-Large-Vit-B-16Plus),点击保存。之后在 任务 中重新运行 智能搜索 任务。
下图是我immich服务的相关配置截图,仅供参考:

在
六、总结与展望
经过一年多的深度使用

Immich不仅满足了我对私有相册的所有期待,其灵活的架构还为未来的扩展提供了无限可能。相比商业云服务,Immich在保护隐私的同时,通过开源社区的力量不断进化。
值得称赞的特性:
真正尊重用户数据主权
模块化设计便于功能扩展
活跃的社区和持续的更新
接近商业产品的用户体验
待改进的方面:
初始设置对新手有一定门槛
移动端某些高级功能仍需完善
文档虽然完整,但中文支持可以加强
对于正在考虑自托管相册服务的你,我建议:
如果重视AI识别和移动体验 → 选择Immich
如果偏好简单部署和稳定 → 考虑PhotoPrism
如果已有Nextcloud生态 → 使用Nextcloud Photos
在数据隐私日益重要的今天,掌握自己数字记忆的控制权不仅是一种技术选择,更是一种生活态度。Immich为我们提供了这样一条路径:既不牺牲便利性,又能守护珍贵记忆。
部署资源:
官方文档:Quick start | Immich
GitHub仓库:immich-app/immich: High performance self-hosted photo and video management solution.
希望这篇详尽的指南能帮助你顺利部署属于自己的智能相册系统。如果有任何问题或心得,欢迎在评论区交流分享!
评论