侧边栏壁纸
博主头像
是羊刀仙啊 博主等级

闲不下来!

  • 累计撰写 187 篇文章
  • 累计创建 51 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

最强第三方相册?威联通NAS一键部署immich

羊刀仙
2025-09-02 / 0 评论 / 0 点赞 / 8 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

本期要和大家分享一款网传最好用的第三方相册工具——Immich 的部署流程,采用官方推荐的Docker Compose方式进行部署。

演示环境选择在 威联通 NAS 平台,型号为 TS-464C,搭载 Intel N5095 四核处理器内存 8GB

截屏2025-09-02 10.48.20.png

需要说明的是,Immich 官方并没有给出明确的“最低硬件要求”。不过,由于系统运行过程中涉及 数据库、机器学习、人脸/物体识别以及视频转码 等功能,这些都会消耗一定的 CPU、内存和硬盘 IO。从稳定性和兼容性出发,我个人建议优先使用 x86 架构的服务器或 NAS,因为相关的镜像和硬件加速支持更成熟。

综合来看,无论是从 硬件配置 还是 用户普及度 的角度,TS-464C 都是一个较为合理的演示平台。接下来,就以这台设备为例,完成 Immich 的部署。

⚠️注意:本文仅展示Immich如何部署于威联通NAS,分享部署代码及显卡调用验证。不包含使用演示,因为我并不用它,并且官方文档肯定比我更详细~

照片是不可替代的数据,请遵循 3-2-1 原则。切勿依赖单一工具或单一副本。

准备工作

因为 Immich 的功能较多,所以要事先做做准备工作。

首先看看下图所示的example.envhwaccel.transcoding.ymldocker-compose.yml这三个模版中的内容,不需要下载~

截屏2025-09-01 14.35.10.png

起初我是打算按照所给的docker-compose.yml来,但看了看,还是直接一套撸吧,就是部署代码会长一点点。

部署流程

直接给到大家硬件加速的版本。独显版本(TS-673A),以及不启用硬件加速版本放在文末。

除将 immich_server 固定为明确 tag 外,immich-machine-learning 也与之保持同一 tag;其它镜像严格沿用官方 docker compose 中的镜像名与摘要(digest),不做改动。

services:
  database:
    container_name: immich_postgres
    # Postgres 14 + pgvecto-rs 扩展(满足 Immich 向量检索需求)
    image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0
    environment:
      # ⚠️ 首次部署前把密码改成仅含字母数字的强密码(容器初始化后再改会麻烦)
      - POSTGRES_PASSWORD=ChangeMeAlnum24Chars
      - POSTGRES_USER=postgres          # Immich 默认用 postgres 用户
      - POSTGRES_DB=immich              # Immich 使用的数据库名
      - POSTGRES_INITDB_ARGS=--data-checksums  # 开启数据校验,提升一致性
      # - DB_STORAGE_TYPE=HDD           # 如果数据库在机械盘,可取消注释以使用更保守参数
    volumes:
      # 本地持久化数据库目录(务必是本机磁盘,别放 NFS/SMB)
      - /share/Container/immich/postgres:/var/lib/postgresql/data
    shm_size: 128mb                    # 提升 Postgres 共享内存,避免复杂查询时异常
    restart: always

  redis:
    container_name: immich_redis
    # Valkey(Redis 分支),固定到带 sha256 的镜像,避免上游变动
    image: docker.io/valkey/valkey:8-bookworm@sha256:a137a2b60aca1a75130022d6bb96af423fefae4eb55faf395732db3544803280
    healthcheck:
      test: redis-cli ping || exit 1   # 简单健康检查:可 ping 则健康
    restart: always

  immich-machine-learning:
    container_name: immich_machine_learning
    # 机器学习服务:OpenVINO 变体(Intel/CPU 上推理更快更稳)
    image: ghcr.io/immich-app/immich-machine-learning:v1.140.1-openvino
    environment:
      - TZ=Asia/Shanghai               # 容器内时区
      - OPENVINO_DEVICE=AUTO           # 设备选择策略(报错时可改 CPU)
    volumes:
      # 模型缓存持久化到主机目录,避免每次重启重新下载
      # 支持的其他模型压缩包也可丢在这下面
      # 重启应用就会在配置中出现
      # 一般默认模型是最为贴合你配置的
      - /share/Container/immich/model-cache:/cache
    restart: always
    healthcheck:
      disable: false                   # 保留默认健康检查(镜像内置)

  immich-server:
    container_name: immich_server
    # Immich 主服务(API/转码/任务等)
    image: ghcr.io/immich-app/immich-server:v1.140.1
    devices:
      - /dev/dri:/dev/dri              # 将宿主机 iGPU 映射进容器(VAAPI/QuickSync 依赖)
    environment:
      - TZ=Asia/Shanghai
      - LIBVA_DRIVER_NAME=iHD          # VAAPI 驱动(如花屏/失败可换 i965 试)
      # —— 连接数据库与 Redis(通过服务名直连,无需写 IP)——
      - DB_HOST=database               # 指向上面的 database 服务
      - DB_PORT=5432
      - DB_USERNAME=postgres
      - DB_PASSWORD=ChangeMeAlnum24Chars
      - DB_DATABASE_NAME=immich
      - REDIS_HOST=redis               # 指向上面的 redis(valkey)服务
      - REDIS_PORT=6379
    volumes:
      # 照片/视频库:把 NAS 目录直接映射为 /data(Immich 里即看到 /data)
      - /share/Phone/picture:/data
      # 同步宿主时间到容器,确保日志/计划任务时间一致
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "2283:2283"                    # 浏览器访问 http://<NAS内网IP>:2283
    depends_on:
      - redis
      - database                       # 等数据库与 Redis 就绪再启动
    restart: always
    healthcheck:
      disable: false                   # 保留默认健康检查

没错,把代码适当修改下就能用。只需你稍微修改下,比如应用配置目录、大模型缓存目录、照片目录以及访问端口等等

接着打开威联通的Container Station创建新的应用程序。涉及到多个镜像以及模型,需要等待一段时间。

截屏2025-09-02 15.02.35 拷贝.png

使用展示

按照上文部署,浏览器输入NAS_IP:2283即可访问服务。

截屏2025-09-01 17.06.41.png

初次使用要创建超级账户。

截屏2025-09-01 17.07.22 拷贝.png

进行登录。

截屏2025-09-01 17.27.52 拷贝.png

前面部署时我们定义过时区之类的信息,系统会自动帮你自动适配语言等。初始化过程还有用户隐私、存储模版这些我就先不设置开启了,反正都可以进去再改。

截屏2025-09-01 17.29.16.png

威联通从最早就一直奉行的3-2-1备份策略,照片对大部分人来说应该都挺重要,也建议大家多多备份守护时光回忆。

截屏2025-09-01 17.31.29.png

完成初始化后先别急,我们对集显进行核验。

在容器中,找到immich_server,点击执行,选择/bin/bash,依次输入以下指令进行验证:

# 1) 设备节点是否映射进来
ls -l /dev/dri

# 2) FFmpeg 是否识别到 VAAPI
ffmpeg -hide_banner -hwaccels

# 3) 有没有 VAAPI 编码器
ffmpeg -hide_banner -encoders | egrep 'h264_vaapi|hevc_vaapi' || true

截屏2025-09-02 09.37.48.png

如上图的输出结果所示,已经充分证明:

/dev/dri 里的 card0 / renderD128 被映射进容器;

ffmpeg 识别到 vaapi;

存在 h264_vaapi / hevc_vaapi 编码器。

说明 N5095 的集显(iGPU)已被容器正确识别并可用。

初始化完成后,点击左侧栏的设置,有非常多的可配置项目。视频转码设置位于最底下。

截屏2025-09-02 09.56.33.png

点击 转码/硬件加速:

硬件加速类型:选 VAAPI

硬件解码:建议开启(能降 CPU 占用)

恒定质量模式:保持 Auto(主要对 NVENC 有意义;VAAPI 下让它自动即可)

首选硬件设备:保持 auto;如需手动,填 /dev/dri/renderD128

设置完毕后别忘记保存生效。

截屏2025-09-02 10.01.59.png

我上传了果子上的一千来张Live Photo,以及HEVC视频,也是照样爆的~所以不建议大家一次性导入过多的内容,包括使用威联通自带的Qsirch,Qumagie等,索引和识别会占用大量的系统资源。因此建议分批上传。

截屏2025-09-02 11.01.11.png

独显调用

我的TS-673A因为家里网络问题,不能远程操作,所以尝试着修改了部署代码,有配置独显的朋友可以试试看。

services:
  database:
    container_name: immich_postgres
    image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0
    environment:
      POSTGRES_PASSWORD: ChangeMeAlnum24Chars
      POSTGRES_USER: postgres
      POSTGRES_DB: immich
      POSTGRES_INITDB_ARGS: '--data-checksums'
      # DB_STORAGE_TYPE: 'HDD'   # 若数据库在机械盘,可取消注释(更保守参数)
    volumes:
      - /share/Container/immich/postgres:/var/lib/postgresql/data
    shm_size: 128mb
    restart: always
    logging:
      driver: json-file
      options: { max-size: "50m", max-file: "3" }

  redis:
    container_name: immich_redis
    image: docker.io/valkey/valkey:8-bookworm@sha256:a137a2b60aca1a75130022d6bb96af423fefae4eb55faf395732db3544803280
    healthcheck:
      test: redis-cli ping || exit 1
    restart: always
    logging:
      driver: json-file
      options: { max-size: "50m", max-file: "3" }

  immich-machine-learning:
    container_name: immich_machine_learning
    # CUDA 变体:用 GTX 1050 Ti 加速识别/向量
    image: ghcr.io/immich-app/immich-machine-learning:v1.140.1-cuda
    environment:
      - TZ=Asia/Shanghai
      - NVIDIA_VISIBLE_DEVICES=all
      - NVIDIA_DRIVER_CAPABILITIES=compute,video,utility
    # 若 Container Station 未自动注入 GPU,手动映射设备节点:
    devices:
      - /dev/nvidia0:/dev/nvidia0
      - /dev/nvidiactl:/dev/nvidiactl
      - /dev/nvidia-uvm:/dev/nvidia-uvm
      - /dev/nvidia-uvm-tools:/dev/nvidia-uvm-tools
    volumes:
      - /share/Container/immich/model-cache:/cache
    restart: always
    ulimits:
      nofile: { soft: 65536, hard: 65536 }
    logging:
      driver: json-file
      options: { max-size: "50m", max-file: "3" }
    healthcheck:
      disable: false

  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:v1.140.1
    # NVENC:映射 NVIDIA 设备并声明能力
    environment:
      - TZ=Asia/Shanghai
      - NVIDIA_VISIBLE_DEVICES=all
      - NVIDIA_DRIVER_CAPABILITIES=compute,video,utility
      # 连接 Postgres / Valkey
      - DB_HOST=database
      - DB_PORT=5432
      - DB_USERNAME=postgres
      - DB_PASSWORD=ChangeMeAlnum24Chars
      - DB_DATABASE_NAME=immich
      - REDIS_HOST=redis
      - REDIS_PORT=6379
    devices:
      - /dev/nvidia0:/dev/nvidia0
      - /dev/nvidiactl:/dev/nvidiactl
      - /dev/nvidia-uvm:/dev/nvidia-uvm
      - /dev/nvidia-uvm-tools:/dev/nvidia-uvm-tools
    volumes:
      - /share/Phone/picture:/data
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "2283:2283"
    depends_on: [redis, database]
    restart: always
    ulimits:
      nofile: { soft: 65536, hard: 65536 }
    logging:
      driver: json-file
      options: { max-size: "50m", max-file: "3" }
    healthcheck:
      disable: false

不开启硬解

实际上注释掉一部分代码即可,不过还是建议配置硬解吧😂

services:
  database:
    container_name: immich_postgres
    # Postgres 14 + pgvecto-rs(满足 Immich 向量检索)
    image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0
    environment:
      POSTGRES_PASSWORD: ChangeMeAlnum24Chars   # ← 改成仅含 A–Z/a–z/0–9 的强密码
      POSTGRES_USER: postgres
      POSTGRES_DB: immich
      POSTGRES_INITDB_ARGS: '--data-checksums'
      # DB_STORAGE_TYPE: 'HDD'                  # 如果数据库在机械盘,可取消注释
    volumes:
      - /share/Container/immich/postgres:/var/lib/postgresql/data
    shm_size: 128mb
    restart: always

  redis:
    container_name: immich_redis
    image: docker.io/valkey/valkey:8-bookworm@sha256:a137a2b60aca1a75130022d6bb96af423fefae4eb55faf395732db3544803280
    healthcheck:
      test: redis-cli ping || exit 1
    restart: always

  immich-machine-learning:
    container_name: immich_machine_learning
    # CPU 版本(不启用硬件加速)
    image: ghcr.io/immich-app/immich-machine-learning:v1.140.1
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - /share/Container/immich/model-cache:/cache   # 模型缓存持久化
    restart: always
    healthcheck:
      disable: false

  immich-server:
    container_name: immich_server
    # 不映射 /dev/dri、不设置 VAAPI/NVENC 变量(即纯软件转码)
    image: ghcr.io/immich-app/immich-server:v1.140.1
    environment:
      - TZ=Asia/Shanghai
      # 连接 Postgres / Valkey
      - DB_HOST=database
      - DB_PORT=5432
      - DB_USERNAME=postgres
      - DB_PASSWORD=ChangeMeAlnum24Chars       # ← 与上面数据库密码一致
      - DB_DATABASE_NAME=immich
      - REDIS_HOST=redis
      - REDIS_PORT=6379
    volumes:
      - /share/Phone/picture:/data
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "2283:2283"
    depends_on:
      - redis
      - database
    restart: always
    healthcheck:
      disable: false

最后

用了几天,也没觉得像大家说得那么神。

可能因为我的主要需求不在这方面吧?

希望能对各位有所帮助。

感谢观看,本文完~

0

评论区