C1ouD
C1ouD
发布于 2026-02-19 / 12 阅读
0
0

Immich:云相册部署实践

功能

开源项目Immich(Immich)用来搭建个人云相册,实现相册上传、持久化存储、公网访问,核心特点如下:

  • 全平台同步:Immich拥有iOS和Android原生客户端,支持后台自动备份功能。

  • AI技术驱动:通过AI技术栈实现照片的人脸识别与聚类、语义化搜索、目标检测等智能功能。

  • 高性能架构:其出色的预加载和缓存机制即使面对数十万张照片也毫不逊色。

  • 多用户与共享协作:支持多账户管理,拥有“伴侣共享”功能,可选择将指定相册共享给他人。

  • 多维元数据管理:支持完整EXIF查看,内置交互式地图,可进行多维度数据筛选。

基于以上丰富的功能,Immich是我在搭建云相册时的首选。

性能

但同样的,由于功能的复杂性,Immich 对运行机器的性能也有一定的要求,尤其是进行机器学习计算时会消耗大量GPU性能。

一开始我打算将项目部署在我的云服务器(2C2G)上,但是即使是经过深度优化的 Immich 项目待机时也会占用1G左右的运行内存,在容器启动时内存占用甚至会飙升到2G以上。

为了防止云服务器内其他项目被拖慢,我决定将 Immich 部署到本地,这里有两个方案:一是部署到闲置台式机上,二是部署到我的笔记本上。考虑到相册服务需要长时间启动,台式机即使只运行一个项目也需要很高的待机功耗,所以最终决定将 Immich 部署到我的笔记本上。

双栈网络方案

考虑到笔记本连接的网络大部分情况下是没有公网ipv4地址的,但是运营商基本都会给ipv6的公网地址,所以为了同时兼顾云服务器的带宽压力和使用体验,采用ipv4转发+ipv6直连的解决方案。

原理

graph LR A[客户端/手机] -- DNS解析 --> B{Happy Eyeballs} B -- "优先 IPv6 (直连)" --> C[本地笔记本:2283] B -- "回退 IPv4 (frp)" --> D[云服务器:7000] D -- "隧道转发" --> C C --> E[Immich 服务]

利用DNS域名解析时的Happy Eyeballs算法Happy Eyeballs - Wikipedia),输入域名时DNS会自动从ipv4和ipv6中选择最优路线进行解析(大部分情况都是ipv6最优,所以在ipv6环境下都会进行直连),当客户端没有ipv6环境或者ipv6环境较差时,会自动回退到ipv4环境解析,理论延迟只有几毫秒。

IPV4转发逻辑

使用frp(fatedier/frp)内网穿透,将本地 Immich 端口映射到公网域名。根据云服务器上下行带宽推测,这条线路平均速率为 10~20mbit/s ,上传大视频时稍慢,但也能用。

IPV6直连逻辑

稍微复杂一点,因为运营商给分配的ipv6公网地址不是恒定不变的,对于家用宽带来说,运营商默认使用DHCPv6自动分配,所以不能将域名指向固定ipv6地址。需要使用动态域名解析(DDNS),本地运行一个程序每隔一段时间检测一次ipv6地址,若发生改变则通过 AccessKey 直接修改域名的DNS解析地址。

本地需要直接开放 Immich 对应端口,因为运营商默认禁止80和443端口访问,所以不能直接通过纯域名访问,只能在域名后显式指定端口访问。

部署

本地进行部署就比较方便了,Immich支持docker容器化部署。我采用的是docker desktop+wsl的部署方案,将容器挂在在本地特定文件夹下的WSL系统中。

关键代码

在docker-compose.yml中显式指定端口:

ports:
    - '0.0.0.0:2283:2283'  #ipv4,用于接收frp数据
    - '[::]:2283:2283'     #ipv6

在frpc.toml中配置frp客户端:

serverAddr = "***"
serverPort = 7000
auth.token = "***"

[[proxies]]
name = "immich-tcp-c1p"
type = "tcp"
localIP = "127.0.0.1"
localPort = 2283
remotePort = 2283

在云服务器的frps.toml中配置frp服务端:

bindPort = 7000
auth.token = "***"

DDNS配置

我使用了ddns-go(jeessy2/ddns-go)动态域名解析进行配置,由于WSL网络配置,直接在windows环境下运行ddns-go更方便,直接在Github下载压缩包,获取.exe文件运行。

cd D:\WSL\ddns-go
.\ddns-go.exe -l :9877   #指定端口防止端口冲突

运行成功后访问 http://127.0.0.1:9877 即可进行配置。

这样基本就部署完了,注意在笔记本上把windows防火墙相应端口开放并允许边缘遍历。

完善

剩下的就是排雷和完善环节了。包括本地WSL中配置SSL证书允许https访问(使用NPM进行端口映射)、配置Nginx大文件优化......

参考与相关链接


评论