Immich - 目前最强的Google Photos开源Self Host替代

前几天,按耐不住内心的躁动,又开始折腾各种 Self Host 的玩具了。因为Nextcloud Photos的功能、稳定性、速度、颜值、易用度,各个方面都不够看,于是又起了歪心思。想起来之前用过的 Photoprism,于是从它开始,Reddit里面搜刮一番,看看2023年的当下是不是又有什么好东西出来了。没想到,还真有收获。

Immich 介绍

Home | Immich
immich Self-hosted photo and video backup solution directly from your mobile phone
GitHub - immich-app/immich: Self-hosted photo and video backup solution directly from your mobile phone.
Self-hosted photo and video backup solution directly from your mobile phone. - GitHub - immich-app/immich: Self-hosted photo and video backup solution directly from your mobile phone.

从文档看,作者最初的目标就非常的直接,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的流行也基本验证了,用户本质上要的是方便、多样的 data access,而文件夹仅仅是Indexing的一种方式罢了。只要data access能足够好,用户也就不会那么执着于“文件夹-文件”这种具体的组织形式了。
(呃,难道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 [Recommended] | Immich
Docker Compose is the recommended method to run Immich in production. Below are the steps to deploy Immich with Docker Compose.

Docker Compose YAML文件在:docker-compose.yml。另外还有搭配的 example.env (自然是需要改成 .env 才能送进 docker compose 里面)。

最终在外面给Immich做反代的时候,需要用到的是 2283 端口。Immich似乎是在这个上面也跑了一个Nginx做反代。

跑起来之后会启动不少的Containers。

照旧,还是用 Nginx Proxy Manager 做反代和SSL卸载,一切都用默认就可以了。

使用体验

搞定 Reverse Proxy,DNS,等一众操作之后,就可以开始享受了。

创世之初,空空如也
基本的相册View,注意最右边的滚动条是带有时间的。这个功能似乎被称作Scrubbable/draggable scrollbar
主页最上面还会有这种“多少多少年之前“的回忆贴。相当的Google Photos了
Reverse geocoding 这种自然是有的
后台任务管理,井井有条。
Explore里面有人物/物品识别;Sharing掌管共享相册,以及分享出去的相片;Favorites和Archive也都支持

Bulk Import

最后,谁家还没有个几百个G的照片呢?官方提供给了一个 Immich-CLI的工具,可以还算是比较方便的解决这个问题。虽然不是非常的优雅,不过这类问题通常是一次性的,所以给个CLI也是可以接受的。

Bulk Upload (Using the CLI) | Immich
You can use the CLI to upload an existing gallery to the Immich server

我这里发现最好用的方式是这样。用一个 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的功能:

Read-only Gallery [Experimental] | Immich
Overview

不过就手机端的功能来说,众多选择里面,还是Immich最好用。