功能
开源项目Immich(Immich)用来搭建个人云相册,实现相册上传、持久化存储、公网访问,核心特点如下:
全平台同步:Immich拥有iOS和Android原生客户端,支持后台自动备份功能。
AI技术驱动:通过AI技术栈实现照片的人脸识别与聚类、语义化搜索、目标检测等智能功能。
高性能架构:其出色的预加载和缓存机制即使面对数十万张照片也毫不逊色。
多用户与共享协作:支持多账户管理,拥有“伴侣共享”功能,可选择将指定相册共享给他人。
多维元数据管理:支持完整EXIF查看,内置交互式地图,可进行多维度数据筛选。
基于以上丰富的功能,Immich是我在搭建云相册时的首选。
性能
但同样的,由于功能的复杂性,Immich 对运行机器的性能也有一定的要求,尤其是进行机器学习计算时会消耗大量GPU性能。
一开始我打算将项目部署在我的云服务器(2C2G)上,但是即使是经过深度优化的 Immich 项目待机时也会占用1G左右的运行内存,在容器启动时内存占用甚至会飙升到2G以上。
为了防止云服务器内其他项目被拖慢,我决定将 Immich 部署到本地,这里有两个方案:一是部署到闲置台式机上,二是部署到我的笔记本上。考虑到相册服务需要长时间启动,台式机即使只运行一个项目也需要很高的待机功耗,所以最终决定将 Immich 部署到我的笔记本上。
双栈网络方案
考虑到笔记本连接的网络大部分情况下是没有公网ipv4地址的,但是运营商基本都会给ipv6的公网地址,所以为了同时兼顾云服务器的带宽压力和使用体验,采用ipv4转发+ipv6直连的解决方案。
原理
利用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大文件优化......
参考与相关链接
Immich: Immich
frp: fatedier/frp
ddns-go: jeessy2/ddns-go
Nginx Proxy Manager (NPM): Nginx Proxy Manager
WSL网络配置说明: Microsoft Learn
Happy Eyeballs: RFC 8305 - Happy Eyeballs