前言

10月初因为google one订阅计划到期没续,导致google one存储空间耗尽,接着连锁反应导致我的gmail因为没有空间而无法使用,所以终于下定决心:

要自建相册服务,不能在关键时候被google卡脖子!

(开玩笑的


immich的优缺点

上周弄了个机器部署immich,实际使用一段时间后,几个最突出的优点:

  • 全终端覆盖,除了web服务之外,官方就提供了ios和android的app
  • web和app的ui/ux都模仿的google photos,所以上手使用没难度

但是,但是啊,immich用起来确实各方面都还可以,但也有不少槽点,列举一二:

  • immich只能指定一个目录,也就是上传目录、缩略图目录、原图目录、转码视频目录,统统都一个目录下(aka一个硬盘)。导致会有原始媒体文件体积的20%左右的空间,是被缩略图、缓存之类消耗掉的,这导致硬盘空间更容易耗尽,意味着会需要更频繁的更换大容量硬盘和迁移/恢复。

  • 上传了7万多张照片+视频以后,web端浏览非常、非常的卡,首页时间线的瀑布流展示出来需要等5~10秒钟左右。

  • 上传照片的流程:新照片被重命名并放到upload目录 → immich读取新照片的exif → immich把新照片归档到指定根目录并还原文件名。这个流程如果顺利的话就很完美,没有问题。但我在短短几天的时候过程中,出现了好几次上传的照片被积压在upload目录,无论怎么在管理员的Job管理页面重启读取照片metadata的任务,积压在upload目录的文件都毫无变化,无法正确归档。最后的解决方案,第一次碰到这问题时,我简单排查以后感觉是immich-microserver出了问题,也不知道咋bugfix,索性备份了400G的内容以后重新部署。第二次在重新部署的immich服务上又碰到了这个问题,还好这次积压的不多只有17个文件,我下载到本地,根据日期核对图库以后,确认原图已经存在于图库,所以直接清空了upload目录。


物色其它方案

因为使用中种种的槽点,尤其是照片积压在upload目录这个严重的bug,所以我又开始物色其它自建相册方案:lychee、piwigo、photoprism、etc…

古人有云:少年不知愁滋味,乱花渐欲迷人眼。看着这么多的方案,一时不知道该先试哪个。

看了一圈官方文档以后,挑中了photoprism。

优点如下:

  • 自定义图库目录、缩略图目录、原图目录、转码视频目录,可以分别指定路径。这就可以实现原图放一个硬盘(方便维护),缩略图和缓存放ssd(加速图片浏览)。这简直就是对着immich的弱点痛打啊。
  • 多语言支持,自带中文。虽然相册服务那点简单的英文对我来说没有使用障碍,但有中文可选总是加分的。
  • web端使用起来体验比immich响应速度快,可配置的内容更多更细致。

看完photoprism的文档以后,十分心动,立刻就弄个虚拟机,开始部署。


部署photoprism

我的机器用的系统时debian 12 bookworm stable,使用官网推荐的docker compose方案进行部署。

使用的photoprism版本是Build 231011-63f708417,docker-compose.yml文件中指定的version是3.5。注意不同的版本可能部署方式会有出入,最终以官网的文档为准。

官网文档:https://docs.photoprism.app/getting-started/docker-compose/

第一步:安装docker和docker-compose。

apt install docker

apt install docker-compose

第二步:下载docker-compose.yml文件。

mkdir ~/.photoprism

cd ~/.photoprism

wget https://dl.photoprism.app/docker/docker-compose.yml

第三步:配置参数。

注意: 自建相册服务一般很少会反复折腾,都是部署好了以后就是24H运行除非硬盘满了。所以下面的10个参数一定要好好理解后进行配置,避免返工。

下载好docker-compose.yml以后,用文本编辑器打开,有以下几个参数需要修改:

账户密码类配置项:

1. PHOTOPRISM_ADMIN_USER:网页端管理员登录的用户名,默认是admin,建议修改

2. PHOTOPRISM_ADMIN_PASSWORD:网页端管理员登录的密码,建议修改

3. PHOTOPRISM_DATABASE_PASSWORD:数据库的密码,建议修改

4. MARIADB_PASSWORD:服务默认用的数据库是mariadb,这里配置photoprism数据库的密码。注意这个密码要和上一条中的PHOTOPRISM_DATABASE_PASSWORD的密码保持一致

5. MARIADB_ROOT_PASSWORD:数据库的root账户密码,建议修改

文件路径类配置项:

1. "~/Pictures:/photoprism/originals":这项指定原图的归档目录,建议指向一个大容量hdd,一个硬盘专门用来放原图,方便后期维护。

2. "~/Import:/photoprism/import" :这项指定需要导入的目录,默认是注释的(不启用),可选,有图库需要批量导入的可以这里指定路径,然后系统会把图片转移到originals目录进行归档。

3. "./storage:/photoprism/storage":这里指定存储目录,用来存放配置文件、缩略图、转码的视频等等,建议指向一块ssd以提高浏览速度。

4. "./database:/var/lib/mysql":这里指定数据库目录,用来存放数据库文件。默认指向当前目录。

用户权限类:

1. user: "1000:1000": 这项指定运行photoprism服务的用户(uid:gid),默认是注释的(不启用),可选。也就是默认是root用户跑服务,如果不想用root账号跑,需要改这个配置。这里要注意,在服务初始化之前就要做好这项配置。如果服务已初始化但想要修改用户,需要改其它地方。我没测试后面的情况,这里不再赘述。

好了,调整完以上10个参数之后,就可以开始拉镜像创建容器跑服务了。

因为docker-hub国内被封,这里建议提前用国内镜像,或者vpn,要不然拉取镜像很慢。

docker-compose up -d

两个镜像,合计占用2GB存储空间。

REPOSITORY              TAG       IMAGE ID       SIZE
photoprism/photoprism   latest    9ef132aa0f45   1.86GB
mariadb                 10.11     32c5888d2fa9   403MB

访问photoprism

web端访问地址:http://photoprism-host-ip:2342

没有移动端的app,官方建议使用phtososync这个app,免费版有广告,同步服务免费使用7天。


photoprism的槽点

前面说了很多photoprism的优点,现在说说它的槽点:

  • 没有移动端,官网推荐的方案是第三方的photosync,这app免费版是个鸡肋,要同步服务就得付费,虽然定价不高,但immich全终端覆盖啊

  • 使用逻辑不同。immich上手使用没难度,虽然可以设置的参数很少,但胜在精简易用。photoprism有一套自己的交互逻辑,比如:大图显示页面没有exif查看入口,需要点编辑才能看到;删除图片需要先把图片archive然后再去archive目录里操作删除;上传照片和视频的时候必须等索引完了才能关闭上传页面;源文件归档文件夹的时间粒度是月,而且没地方改存储模板,也就是没办法改成以日为单位归档;相册的权重比较高,在上传的时候就有一个显眼的入口用来选择相册(虽然可以留空)。

  • 视频文件,在缩略图界面,鼠标移动去不会开始自动播放

  • 导入新文件和新文件索引是同步进行的,换个说法,就是上转一张照片——系统读取新照片metadata并用图像识别算法处理照片——新照片完成归档,这个任务是同步进行的。这意味着如果装了photoprism的电脑硬件性能比较差的话,导入一张照片会需要4~5秒钟,这种导入速度之下,如果有几万张照片需要导入,那这个过程会非常非常非常的漫长,漫长到这个时间单位是天,而不是秒、分钟、小时。而immich的处理逻辑就很棒,导入、生成缩略图、图像主体标记、读取metadata、人脸识别,这些任务都是异步处理的,导入几万张照片的耗时只和你的硬盘I/O速度、网络带宽有关.


总结

最终一番体验下来,虽然immich有不少槽点,但在immich和photoprism两者中间让我选的话。。。

我选择immich!