news 2026/9/7 17:21:56

Immich 自托管照片视频管理方案:功能体系、部署配置与源码实现解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Immich 自托管照片视频管理方案:功能体系、部署配置与源码实现解析

Immich 自托管照片视频管理方案:功能体系、部署配置与源码实现解析

【免费下载链接】immichHigh performance self-hosted photo and video management solution.项目地址: https://gitcode.com/GitHub_Trending/im/immich

Immich 是一个高性能的自托管(self-hosted)照片与视频备份管理解决方案,提供移动端与 Web 端双客户端,支持自动备份、多用户、智能搜索与人脸识别等能力。本文基于仓库中的土耳其语项目介绍文档 readme_i18n/README_tr_TR.md 展开,完整继承其功能特性矩阵与演示信息,并结合 install.sh、docker/docker-compose.yml 以及server/src/services下的服务端源码,讲清 Immich 的部署方式、运行要求、功能边界与底层实现依据,帮助你评估、部署并深入理解这套方案。

项目定位与核心主张

土耳其语 README 将 Immich 定义为“Yüksek performanslı, kendine ait barındırılan fotoğraf ve video yedekleme çözümü”(高性能的自托管照片与视频备份解决方案)。这一定位包含三层含义:

  1. 自托管(self-hosted):所有照片、视频与元数据存储在用户自己的服务器与磁盘上,官方提供 Docker Compose 部署方式与一键安装脚本,数据归属完全由用户掌控;
  2. 备份(backup):移动端应用打开时自动备份、支持后台备份与按相册选择性备份,是移动设备照片的主要备份目标;
  3. 高性能:服务端基于 NestJS(TypeScript)实现,数据库为带向量扩展的 PostgreSQL,配合虚拟滚动、缩略图生成与视频转码等机制支撑大体量图库的流畅浏览。

文档同时给出两条重要提醒:

  • 3-2-1 备份策略警告:对珍贵的照片与视频,应始终遵循 3-2-1 备份方案(3 份数据、2 种介质、1 份异地)。Immich 作为自托管系统,本身是 3-2-1 中的“一份”,不能替代完整备份体系;
  • 官方文档入口:包括安装指南在内的正式文档以仓库内的docs/目录为准,例如 安装要求、环境变量说明、Docker Compose 安装。

部署:从一键脚本到 Compose 文件

一键安装脚本

仓库根目录的 install.sh 是最简部署入口,其主流程(见 install.sh 起)为:

  1. 在当前目录创建./immich-app目录(若已存在则覆盖其中的 YAML 文件);
  2. 下载docker-compose.yml.env文件(.env源自仓库中的 docker/example.env);
  3. .env中的DB_PASSWORD生成随机密码(先尝试sha256sum | base64,失败时退化为拼接$RANDOM);
  4. 执行docker compose up --remove-orphans -d启动容器,成功后打印访问地址http://<IP>:2283,并提示后续修改.env的标准流程:docker compose down→ 修改.envdocker compose up --remove-orphans -d

脚本要求系统已安装docker compose(V2 Compose 插件,而非已弃用的docker-compose)与curl

Compose 四容器架构

docker/docker-compose.yml 定义了生产部署的完整拓扑,共 4 个服务加 1 个模型缓存卷:

服务镜像作用与关键点
immich-serverghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}主服务,暴露端口2283:2283;将${UPLOAD_LOCATION}挂载到容器内/data,依赖redisdatabase(见 docker-compose.yml)
immich-machine-learningghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}机器学习容器,负责 CLIP、人脸识别与 OCR 推理;挂载命名卷model-cache:/cache用于缓存模型权重(见 docker-compose.yml)
redisdocker.io/valkey/valkey:9(固定摘要)缓存与队列,健康检查为redis-cli ping
databaseghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0(固定摘要)内置向量扩展的 PostgreSQL 14;POSTGRES_INITDB_ARGS: '--data-checksums'开启数据校验,shm_size: 128mb(见 docker-compose.yml)

两个值得注意的工程细节:

  • 硬件加速是可选扩展:server 与 machine-learning 两个服务都预留了extends注释位,分别指向 docker/hwaccel.transcoding.yml(转码加速:nvencquicksyncrkmppvaapi等)与 docker/hwaccel.ml.yml(推理加速:armnncudarocmopenvinorknn等),对应官方文档 ML 硬件加速 与 硬件转码;
  • Compose 文件须与发布版本匹配:文件头注释明确提醒 main 分支的docker-compose.yml可能与最新 release 不兼容,应从对应 release 下载。

关键环境变量

docker/example.env 暴露了安装后必须理解的核心配置:

# 上传文件的存储位置(照片视频本体、缩略图等) UPLOAD_LOCATION=./library # 数据库文件存储位置。不支持网络共享盘 DB_DATA_LOCATION=./postgres # 时区(可选,TZ 标识符) # TZ=Etc/UTC # Immich 版本,可固定到具体版本号,如 "v2.1.0" IMMICH_VERSION=v3 # PostgreSQL 连接口令,应改为随机密码,仅限 A-Za-z0-9 DB_PASSWORD=postgres # 以下无需修改 DB_USERNAME=postgres DB_DATABASE_NAME=immich

配合 docs/docs/install/environment-variables.md,可以看到这两个位置变量(UPLOAD_LOCATIONDB_DATA_LOCATION)与 Compose 文件中的挂载行一一对应:修改挂载位置的正确方式是改.env而不是改 Compose 的volumes行。

硬件与软件要求

来自 docs/docs/install/requirements.md 的官方要求,是部署前必须核对的清单:

硬件

  • 操作系统:推荐 Linux 或 *nix 64 位系统(Ubuntu、Debian 等);非 Linux 平台的 Docker 体验较差,官方明确不推荐,且支持能力有限;
  • 内存:最低 6GB,推荐 8GB。仅 4GB 内存的机器可以禁用机器学习功能运行;
  • CPU:最低 2 核,推荐 4 核;支持amd64arm64。自v3起,amd64平台的 ML 容器要求>= x86-64-v2微架构(约 2012 年后的大多数 CPU 满足);不支持该指令集的 CPU 只能停留在不再受支持的v2.7.5
  • 存储:推荐支持用户/组权限的 Unix 文件系统(EXT4、ZFS、APFS 等);缩略图与转码视频平均会使图库体积增加 10-20%
  • Postgres 数据库文件:通常为 1-3GB,DB_DATA_LOCATION应使用本地 SSD,绝不使用任何网络共享;若使用 Docker 资源限制,Postgres 至少需要 2GB 内存。

软件

  • Docker Engine(Linux/WSL2)或 Docker Desktop(Windows/macOS),必须带 Compose 插件;
  • 必须使用docker compose命令,旧版docker-compose已弃用,不再受 Immich 支持。

Windows 用户的特例:Postgres 数据必须落在支持属主/权限的文件系统上,NTFS/exFAT/WSL 挂载目录均不可用;可将.envDB_DATA_LOCATION=./postgres改为DB_DATA_LOCATION=pgdata,并在 Compose 底部volumes:下追加pgdata:改用 Docker 命名卷。

在线 Demo 与登录凭据

README(含土耳其语版本)提供了官方演示环境,便于在部署前体验完整功能:

Demo 访问地址: https://demo.immich.app 登录凭据: email: demo@immich.app password: demo

移动端应用接入 Demo 时,将Server Endpoint URL一项填写为https://demo.immich.app即可登录同一演示实例。这为评估搜索、相册、地图等 Web/移动端功能提供了零成本途径。

功能特性矩阵

以下表格完整继承自土耳其语 README 的功能矩阵(Mobile/Web 双端支持情况),是了解 Immich 功能边界的权威清单:

功能MobileWeb
上传并查看视频与照片支持支持
应用打开时自动备份支持N/A
可选定相册进行备份支持N/A
将照片与视频下载到本地设备支持支持
多用户支持支持支持
相册与共享相册支持支持
可删除/可拖动的滚动条支持支持
RAW 格式支持(HEIC、HEIF、DNG、Apple ProRaw)支持支持
元数据视图(EXIF、地图)支持支持
按元数据、物体、人脸与 CLIP 搜索支持支持
管理功能(用户管理)不支持支持
后台备份支持N/A
虚拟滚动支持支持
OAuth 支持支持支持
API 密钥N/A支持
LivePhoto 备份与播放iOS支持
用户自定义存储结构支持支持
公开分享不支持支持
归档与收藏夹支持支持
世界地图不支持支持
伙伴分享(Partner Sharing)支持支持
人脸识别与聚类不支持支持
离线支持支持不支持

对照英文主 README.md 的功能表可以看到,当前主干版本还新增了若干特性:资产去重(Prevent duplication of assets)、360 度全景图显示、Memories(多年前的今天)、只读图库、堆叠照片(Stacked Photos)、标签(Tags)与文件夹视图(Folder View),且“公开分享”“全球地图”“人脸识别”“LivePhoto 播放”在英文表中已标注为双端或部分支持——说明土耳其语译版相对主干略滞后,实际功能应以 README.md 与docs/docs/features/目录(如 标签、文件夹视图、人脸聚类、搜索)为准。

关键功能的源码实现印证

以下各节从服务端源码验证上表中最具工程含量的几项功能,全部证据来自server/src/services下的 NestJS 服务层。

用户自定义存储结构

“用户自定义存储结构”由 server/src/services/storage-template.service.ts 实现。该服务基于 Handlebars 模板引擎渲染资产的落盘路径,内置 21 个预设模板(storage-template.service.ts),例如:

{{y}}/{{y}}-{{MM}}-{{dd}}/{{filename}} {{y}}/{{#if album}}{{album}}{{else}}Other/{{MM}}{{/if}}/{{filename}} {{make}}/{{model}}/{{lensModel}}/{{filename}}

支持的日期与相机元数据 token 包括:y/yy(年)、M/MM/MMM/MMMM(月)、d/dd(日)、W/WW(周)、h/hh/H/HH(时)、m/mm(分)、s/ss/SSS(秒),以及albumalbum-startDate-ymakemodellensModelfilenameassetId等字段(见 storage-template.service.ts)。

从源码结构看,模板在ConfigInit/ConfigUpdate事件时编译并缓存(onConfigInit),ConfigValidate事件会用一个模拟资产(/upload/test/IMG_123.jpg)试渲染来校验模板合法性——这意味着在管理端保存模板前,服务端会先做“干跑”验证,非法模板不会直接生效。渲染时文件名还会经过sanitize-filename清洗。官方文档 存储模板 给出了更多配置示例。

多维度搜索

“按元数据、物体、人脸与 CLIP 搜索”对应 server/src/services/search.service.ts。该服务对外暴露的方法覆盖矩阵中提到的全部搜索维度:

  • searchPerson:按人名查找人脸聚类(personRepository.getByName,支持withHidden隐藏人员参数);
  • searchPlaces:按地名搜索(searchRepository.searchPlaces);
  • searchMetadata:按 EXIF/元数据条件组合检索,支持按 checksum(28 位 base64 或 hex)精确定位资产,并通过albumIds与共享链接(shared link)访问控制做权限收敛;
  • getExploreData:探索视图,聚合“最多城市”与“最近添加”两组数据(maxFields: 12, minAssetsPerField: 5);
  • 语义搜索依赖SmartSearchDtoisSmartSearchEnabled开关,并将 CLIP 文本向量结果放入一个容量 100 的 LRU 缓存(embeddingCache)以减少对 ML 服务的重复请求。

CLIP 向量之所以能落库查询,与 Compose 中数据库镜像自带vectorchord+pgvectors扩展直接对应;语义侧的推理模型位于 machine-learning/immich_ml/models/clip 目录。

人脸识别与聚类

矩阵中“人脸识别与聚类(Web 支持)”由 server/src/services/person.service.ts 的服务端部分与 ML 容器协同完成:人脸特征提取在machine-learning容器的 facial_recognition 模型 中执行,服务端负责聚类分组、命名与展示,对应文档 更好的面孔聚类 与 人脸识别。

转码、HLS 与后台任务

Web 端流畅播放视频依赖服务端转码:server/src/services/transcoding.service.ts管理转码作业,hls.service.ts 提供 HLS 分片播放流,queue.service.ts 负责后台任务队列调度(与redis容器配合),job.service.ts 管理任务状态。这也解释了为什么 Compose 中 server 容器依赖redis——缩略图生成、转码、缩略图清理等都走异步队列。

API 密钥与多用户

矩阵中“API 密钥(仅 Web 支持)”由 server/src/services/api-key.service.ts 实现,配合 docs/docs/features/command-line-interface.md 中提到的 CLI(packages/cli),允许用户用个人密钥以编程方式访问自己的数据(例如脚本化上传,见 docs/docs/guides/python-file-upload.md)。多用户与认证由auth.service.tsuser-admin.service.ts等承担,OAuth 配置见 docs/docs/administration/oauth.md。

翻译生态与本文档的位置

土耳其语 README 是 Immich 官方翻译体系的一部分:

  • readme_i18n/目录存放 22 个语言的 README 译本(README_tr_TR.md即其一),由根 README.md 的语言导航入口统一链接;
  • 产品界面翻译由仓库根i18n/目录维护,覆盖 100+ 语言文件(如 i18n/tr.json、i18n/en.json);
  • 翻译贡献流程见 docs/docs/developer/translations.md。

这也意味着:阅读土耳其语文档的社区成员与英文社区获得的是同一份功能与版本语义,翻译版本仅存在措辞层面的滞后。

备份策略提醒与总结

Immich 的 README 反复强调 3-2-1 备份原则:自托管服务器只是备份链中的一环,重要照片视频仍应保持多份、多介质、异地的完整策略。仓库内 docs/docs/administration/backup-and-restore.md 也提供了服务端自身的备份与恢复指导。

综合来看,Immich 的技术形态可以概括为:

  • 部署侧:4 容器 Compose 架构(server + machine-learning + redis + 向量版 Postgres),一键脚本 install.sh 完成初始化,UPLOAD_LOCATION/DB_DATA_LOCATION双位置变量掌控全部数据落盘;
  • 功能侧:以移动端自动备份为入口,Web 端承载管理、分享与高级检索,功能矩阵中“N/A/不支持”的边界(如移动端的 API 密钥、Web 端的后台备份)清晰明确;
  • 实现侧:NestJS 服务层 + Handlebars 存储模板 + 向量数据库搜索 + 异步任务队列,各功能点均可在server/src/services/中找到对应实现,ML 能力独立容器化并支持多种硬件加速后端。

对于需要完全掌握自己照片数据、又希望获得接近云端相册体验(智能搜索、人脸聚类、地图、分享)的自托管用户,这套“Docker 部署 + 移动/Web 双端 + 可插拔 ML 加速”的架构是完整可复现的方案。

【免费下载链接】immichHigh performance self-hosted photo and video management solution.项目地址: https://gitcode.com/GitHub_Trending/im/immich

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/7 17:21:43

Python数据可视化实战:从班级成绩到微信好友画像

做数据可视化项目&#xff0c;我一直有个观点&#xff1a;数据量大小不是关键&#xff0c;能不能把数字讲成人话才是核心。这次拿Python把两个看似不搭边的数据源——班级学生信息和微信好友列表——放在一起做了一次全景分析&#xff0c;前者是典型的校园结构化数据&#xff0…

作者头像 李华
网站建设 2026/9/7 17:20:58

甲骨文裁员3万人:传统软件巨头转型背后,技术人如何自救?

“卧槽了&#xff0c;甲骨文裁员3万人了”&#xff0c;这句话刷屏的时候&#xff0c;我正在整理新项目的技术方案。说实话&#xff0c;做了十几年开发&#xff0c;见过不少公司起起落落&#xff0c;但看到这种级别的调整&#xff0c;还是心里一紧。不是说甲骨文倒了&#xff0c…

作者头像 李华
网站建设 2026/9/7 17:20:55

谷歌生态学习笔记:从搜索指令到账号配置的实操指南

作为一个做了十多年技术内容、也带过不少新人的人&#xff0c;我有个习惯&#xff1a;每学一个系统&#xff0c;都会留下笔记。这个“学习谷歌 | 一级 | 第11课 学习笔记”的标题&#xff0c;我盯着看了很久&#xff0c;原因很简单——市面上讲“用谷歌”的内容一大堆&#xff…

作者头像 李华
网站建设 2026/9/7 17:20:42

2026年GEO服务商推荐,适配豆包GEO,高性价比优选,新手也能闭眼冲

2026年GEO服务商推荐&#xff0c;适配豆包GEO&#xff0c;高性价比优选&#xff0c;新手也能闭眼冲 2026年&#xff0c;AI搜索已经彻底改变了用户获取信息的方式。豆包月活突破6亿&#xff0c;DeepSeek、Kimi渗透率持续攀升&#xff0c;超过63%的互联网用户习惯直接向AI提问获取…

作者头像 李华
网站建设 2026/9/7 17:15:32

【计算机毕业设计单片机案例】基于 STM32 单片机的盆栽种植环境智能监测设备设计与实现 基于 STM32 单片机的农业环境采集与外设执行控制系统设计(010507)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机&#xff0c;Java、小程序技术领域和毕业项目实战 ✌️…

作者头像 李华
网站建设 2026/9/7 17:12:49

会务智能体如何化解千人大会调度难题:从信息孤岛到自动协同

大型活动做多了&#xff0c;最怕的不是现场乱&#xff0c;而是乱起来没人看得见。一千人以上的论坛、展会&#xff0c;你以为最大的风险是PPT放不出来&#xff1f;不是&#xff0c;是嘉宾航班晚点、茶歇数量对不上、某个VIP环节没人引导、志愿者在错误的位置站了四十分钟——这…

作者头像 李华