Immich - 目前最强的Google Photos开源Self Host替代
前几天,按耐不住内心的躁动,又开始折腾各种 Self Host 的玩具了。因为Nextcloud Photos的功能、稳定性、速度、颜值、易用度,各个方面都不够看,于是又起了歪心思。想起来之前用过的 Photoprism,于是从它开始,Reddit里面搜刮一番,看看2023年的当下是不是又有什么好东西出来了。没想到,还真有收获。
Immich 介绍
从文档看,作者最初的目标就非常的直接,Self Host版本的Google Photos。从现在的结果看,基本上以及达到了,或者说最难的部分应该基本上都搞定了。在一些小的Feature上面,随着时间推移,应该不会是什么问题。
作为对标Google Photos的存在,移动端的上传/同步,以及Gallery的体验就非常重要。同时各种AI加持的功能也都不能少,比如人脸识别,目标识别之类的。在此之后基本功也不能拉下,一个稳定高效的后端服务以及Web端体验都是非常重要的。这几个方面Immich无疑都做的非常好。
为什么是Immich
挑几个重点说一下:
- 良好的上传体验
这一点相比Nextcloud优势很大。虽然最近也有一些基于Nextcloud的作品,比如Les Pas,可能也还不错,不过我没有尝试了。就Nextcloud本身的原生APP而言,各种重复上传,上传失败已经快痛不欲生了。Nextcloud在面对大一点的视频文件的时候,总是会一遍一遍不停的上传。这点跟之前Nextcloud和Seafile的对比中就非常明显,可以说Nextcloud在最基本的,替代Dropbox这件事情上,其实根本就没有做好。Nextcloud的事情以后再细说了。
Photoprism,原生就没有App,需要花钱买PhotoSync来做这件事。Photoprism确实更像一个单纯了Web端画廊。缺少原生App让我觉得,在当前这个时代,意义也许就不是很大了,虽然各种AI以及地图的Reverse Geocoding看起来也很Fancy。但是缺少便利的输入体验,这些后续的功能都是空中楼阁。
别跟我提那堆基于Webdav/Samba之类的同步方案,都不靠谱。
这些文件协议如果说只是临时用一下,做下Demo,也是可以的。但是长期使用,在单纯的“同步照片“这么一件事上面,动用好几个App,搞定好几个Configuration。这样还想要“稳定,高效,无感“,基本就是无稽之谈。
也许Syncthing是靠谱的。而且如果同时也用Syncthing做其他文件的同步的话,那么使用Syncthing,搭配一个基于文件夹定时(或者event driven,不过这类signal通常不太靠谱)扫描的方案,也是可以的。
不过现在有了Immich,终于(大概)不用再自己捣腾这类细节了。
Librephotos是另一个比较流行的选择。但是他家的App目前只有在iOS上面有一个完成度似乎很不错的选择,但是Android上面还是Work-in-progress。
- 移动端Gallery体验优异
iOS和Android上面都有原生的App。而且体验和UI都接近Google Photos。有完善的上传状态指示,一个速度优异的Gallery,和必要的Auto Backup的设置。还有黑白Theme。一切都很到位。
相比之下,Photoprism就没有移动端的正经App,所以自然不会有什么离线体验。而Librephotos的Andorid端App也还没有达到同样的完成度。至于Nextcloud原生App,毕竟对标是Google Drive,没有人会用Google Drive看照片吧。
很久之前还用过Seafile,不过Seafile确实不能说是Gallery吧。
- 清晰的后端文件结构所有权
这点非常简单,Immich应该是没有指望你再去动它自己存照片的地方的。虽然官方直接提供了一个看起来很好的 Storage Template 功能来让用户指定一个模版,用来收纳照片。但是这其实并不符合印象中大多数人那种:“基于Album,创建文件夹管理照片文件”的习惯。至少Immich提供的Storage Template不是我的习惯,所以个人不是很看重。但是把照片就完好无损的当作“照片文件“存在后端,这对家庭Self Host 用户是非常好的。毕竟还有备份的需求,而文件的备份就很方便。Seafile在这点就恰恰相反,后端存储是chunk by chunk的,虽然从功能角度出发完全可以理解,应该说是非常正确的决定,但是也确实给家庭用户的备份和文件管理造成了一定麻烦(但是Seafile作为企业方案非常非常好)。
(呃,难道Google Photos的流行不是只能证明人民喜欢免费的东西吗)
Photoprism和Librephotos,如果没记错的话,都是那种:
“首先,我自己存起来的文件你不要管,你也不找指望有什么diretory hierarchy是你想要借用的。噢,等下,你要bulk import啊,那你给一个文件夹,我扫描,但是不改文件结构就可以了。什么,你说你要继续用这个import给我的文件夹?你要自己用文件夹管理相册?行吧,那我就对你这个文件夹定时扫描吧,但是除此之外你通过App上传的照片我就自己找地方放了啊,你就不要管了。“
从灵活性来讲,这样的设计无可厚非。但是我现在觉得,这样的设计对于 Consistency的牺牲其实还是有点点大的。这种混合的模式,有时候很难说 Database 里面的数据和 FS 上面存的照片,对应关系有多高的保证。实话实说也只能算是我的个人喜好吧。感觉上,这类App如果想在稳定性,功能性上面走得远,这类过于底层的“后端文件层级“的信息,是不应该暴露给用户的。暴露给用户可以说是灵活了,但是对于一致性的牺牲,很可能在后面通过各种Bug表现出来。
Nextcloud就是完全基于文件结构了,只是扫描,Index,生成Thumbnail了。这类其实个人觉得也是很合理的选择。就相当于Nextcloud只是一个Web端的,打开了Gallery视图文件管理器。
不过还是那个问题,对数据没有真正的Ownership,总是造成一些麻烦的。如果用户对后端数据频繁的更改,如果后端文件系统的Event Signal不那么可靠,很多很重要的功能都无法做到最好,比如稳定的上传,比如去重。
- 稳定,高效,颜值高,UX好
Immich性能非常强悍,这点最应该惭愧的是Nextcloud(万恶的Php),Photoprism其实也还好,Librephotos我就不清楚了。但是可以肯定的说,Immich确实是惊喜。
我的服务器只给了2核(还是i5 7600K这种老家伙),4GB内存。上传了30K+的照片和一堆出去游玩的视频。运行一切正常,网页反应迅速。转码,人脸识别,物品识别,这些虽然会花很多时间,但是Immich在收到别的更重要的请求时,并不会被这些后台运行的任务耽搁到。而这一类后台任务,在4GB的内存下,也没有爆掉,实在是惊喜。
颜值和UX比较主观,不过个人感觉确实一切都对标Google Photos,因而就很好用,很好上手。
- 多用户
这点就不像Photoprism,Immich从最开始就是多用户的,而且各种照片、Album分享支持的飞起。像Shared Album这类,在外出游玩的时候实在是神器。对比之下,Nextcloud虽然也是自然多用户,但是其他的劣势已经注定不行了,也没有APP。Photoprism是没有默认多用户的,多用户应该就要付费了,然而缺少原生APP导致就算有多用户,也没什么意义。Librephotos没用过,就不说了。
Immich 还差在哪里?
- Immich目前不支持修改EXIF。这个应该已经在路线图上面了。这个功能印象中Photoprism是有的(不确定),Nextcloud应该是有的(但是Nextcloud各种Bug,有时能改,有时说找不到文件)
- Immich目前应该不支持GPU。这个Photoprism确定有的。不过现在用下来感觉也许不是很有必要。现在Immich上面的人脸识别的效率,只用CPU,感觉已经很够了。准确率也还可以。几个人之间用起来,确实感觉不是非有GPU不可了。
- Immich目前不支持修改图片。不过我相信这个会很快来到。个人对于这个功能还是期待的,有时有些照片就是需要转90度。
Immich 部署
Immich官方提供了Docker Compose的方式,个人用下来感觉很不错。基本不需要改太多东西,也就是改改密码,改一下Volume的位置就可以了。
推荐好好阅读官方文章:
Docker Compose YAML文件在:docker-compose.yml。另外还有搭配的 example.env (自然是需要改成 .env 才能送进 docker compose 里面)。
最终在外面给Immich做反代的时候,需要用到的是 2283 端口。Immich似乎是在这个上面也跑了一个Nginx做反代。
跑起来之后会启动不少的Containers。
照旧,还是用 Nginx Proxy Manager 做反代和SSL卸载,一切都用默认就可以了。
使用体验
搞定 Reverse Proxy,DNS,等一众操作之后,就可以开始享受了。
Bulk Import
最后,谁家还没有个几百个G的照片呢?官方提供给了一个 Immich-CLI的工具,可以还算是比较方便的解决这个问题。虽然不是非常的优雅,不过这类问题通常是一次性的,所以给个CLI也是可以接受的。
我这里发现最好用的方式是这样。用一个 SAMBA mount 把之前的照片都mount到 Immich这个server所在的Host上面。然后再Bulk Import,这样可以确保绕过 Reverse Proxy,也不涉及什么 DNS,速度应该是最快了。
docker run -it --rm \
--network immich_default
-v "<your_samba_mount>:/import" \
ghcr.io/immich-app/immich-cli:latest \
upload \
--key <Your_Immich_API_key> \
--server http://immich-server:3001 \
--recursive -y --album
- immich_api_key 可以从每个 User 自己的setting里面找到
还可以根据自己的情况选择几个thread,比如两个thread: -t 2
.
最后别忘了还是有手机上的App,好使!
最后的最后,祝大家都能重新找回当初Google Photos还免费时的喜悦😀。
然而最终还是打脸了,Immich也添加了使用一个给定的文件夹内照片的的功能,所谓 Read-only Gallery的功能:
不过就手机端的功能来说,众多选择里面,还是Immich最好用。