☰
树莓派5搭建AI私有照片服务器:Immich部署与性能优化实战
2026/10/19 1:08:47 网站建设 项目流程

1. 为什么要在树莓派5上折腾私有照片服务器

把照片存在别人家的服务器上,这件事我干了快十年,从最早的网盘到后来的各种云相册,说实话便利是真便利,但心里那根刺一直没拔掉。直到去年家里那台老NAS硬盘挂了,丢了两千多张孩子的照片,我才下定决心:照片这东西,必须攥在自己手里。树莓派5出来之后,我第一时间入手了一台8GB版本,折腾了大概三周,终于把一套带AI能力的私有照片服务器跑通了。这套东西能干什么?简单说,它能把你的手机、相机、电脑里的照片自动汇总到一个地方,用AI自动识别照片里的人和物,支持按人脸、地点、场景搜索,还能自动生成相册和回忆视频。最关键的是,所有数据都在你自己的硬盘上,断网也能用,没有任何人能看到你的照片。

这套方案适合谁?如果你手里有几千到几万张照片,对隐私比较在意,又愿意花点时间折腾,那这套方案非常适合你。如果你完全不想碰命令行,那可能成品NAS更适合你。但如果你像我一样,喜欢自己掌控一切,而且想顺便学点AI部署的知识,那树莓派5绝对是个绝佳的练手平台。它的性能比树莓派4强了不止一倍,尤其是PCIe接口和更强的CPU,让本地跑AI模型从“勉强能用”变成了“真的能用”。

我先把整体架构说清楚,免得你跟着做的时候一头雾水。整套系统分三层:最底层是存储层,用外接硬盘或者NVMe SSD存照片原图;中间是服务层,跑照片管理程序和数据库;最上面是AI层,负责人脸识别、物体识别和语义搜索。这三层都跑在树莓派5上,通过Docker容器隔离,互不干扰。你可能会问,为什么不直接装一个现成的照片管理软件?因为现成的软件要么不支持AI,要么AI功能要联网,要么就是收费贵得离谱。自己搭的好处是,每个组件你都能换,都能调,而且完全免费。

2. 硬件选型与系统准备:别在第一步就踩坑

2.1 树莓派5的版本选择和散热方案

树莓派5目前有2GB、4GB、8GB和16GB四个版本。我强烈建议至少上8GB,如果你照片多、想跑大一点的AI模型,直接上16GB。为什么?因为照片管理服务本身吃内存不多,但AI推理的时候,模型加载和图片预处理会吃掉大量内存。我实测下来,8GB版本在同时处理人脸识别和物体识别时,内存占用会到6GB左右,留点余量比较稳妥。2GB和4GB版本不是不能跑,但你得频繁交换内存,体验会差很多。

散热是树莓派5的一个大问题。它的CPU性能上来了,发热也跟着上来了。我试过被动散热片,夏天跑AI推理的时候温度直接飙到85度,然后降频,推理速度掉一半。后来换了主动散热风扇,温度稳定在55度左右。如果你打算7x24小时跑服务,一定要上主动散热,最好是那种带温控的风扇,噪音小。官方那个主动散热器就够用,但如果你想把树莓派塞进小机箱,那就得选个矮一点的散热方案。

电源也不能马虎。树莓派5需要5V 5A的电源,也就是25W。我用过普通的5V 3A电源,结果外接硬盘一启动就掉电重启。后来换了官方27W电源,问题解决。如果你还要接NVMe SSD,那电源余量更要留足。我建议直接上官方电源,别省这几十块钱,稳定性比什么都重要。

2.2 存储方案:NVMe还是外接硬盘

树莓派5最大的升级之一就是有了PCIe接口,可以通过M.2 HAT接NVMe SSD。我强烈建议用NVMe SSD作为系统盘和照片存储盘。为什么?因为照片管理服务需要频繁读写数据库和缩略图,NVMe的随机读写速度比SD卡快几十倍。我实测过,用SD卡跑照片索引,一万张照片要跑将近两个小时,换成NVMe之后只要二十分钟。这个差距在AI推理的时候更明显,模型加载速度完全不是一个级别。

如果你照片特别多,比如超过两万张,我建议系统盘用NVMe,照片原图存外接硬盘。外接硬盘选USB 3.0的机械硬盘就行,容量大、便宜。但要注意,树莓派5的USB接口供电能力有限,最好选带独立供电的硬盘盒,或者用带电源的USB Hub。我试过直接接2.5寸移动硬盘,偶尔会掉盘,后来换成带供电的3.5寸硬盘盒,再也没出过问题。

文件系统方面,我建议用ext4,别用NTFS或者exFAT。为什么?因为ext4对Linux权限支持更好,Docker容器挂载的时候不会出现权限混乱的问题。如果你必须和Windows电脑交换数据,可以单独分一个exFAT分区,但照片库本身一定要放在ext4分区上。我踩过这个坑,用NTFS的时候,容器里的服务经常因为权限问题写不进文件,排查了半天才发现是文件系统的问题。

2.3 操作系统的选择和基础配置

树莓派5官方支持64位系统,一定要装64位的。为什么?因为很多AI模型和Docker镜像只有64位版本,32位系统根本跑不起来。我推荐用官方的Raspberry Pi OS Lite 64位版本,不带桌面环境。为什么不用带桌面的版本?因为桌面环境会占用大量内存和CPU,而且你跑服务的时候根本用不到桌面。如果你需要图形界面管理,可以通过Web界面或者SSH端口转发来解决。

系统装好之后,有几件事必须马上做。第一,更新系统到最新版本,命令是sudo apt update && sudo apt full-upgrade -y。第二,配置SSH和VNC,方便远程管理。第三,设置静态IP,不然路由器重启之后IP变了,你的服务就找不到了。第四,把默认密码改掉,虽然是在内网,但安全习惯要养好。第五,配置交换空间,树莓派5默认的交换空间只有100MB,跑AI的时候肯定不够,我建议调到2GB到4GB。具体操作是编辑/etc/dphys-swapfile,把CONF_SWAPSIZE改成2048或者4096,然后重启服务。

还有一点很重要,把Docker和Docker Compose装好。我建议用官方脚本安装Docker,别用apt里的版本,apt里的版本太旧,很多新特性不支持。安装命令是curl -fsSL https://get.docker.com | sh,然后把自己加到docker组里,这样不用sudo就能跑docker命令。Docker Compose现在集成在Docker里了,用docker compose命令就行,不用单独装。

3. 核心服务选型:为什么我选了这套组合

3.1 照片管理服务的选择对比

市面上能自建的照片管理服务不少,我主要对比了三个:PhotoPrism、Immich和LibrePhotos。PhotoPrism是老牌选手,功能全,AI能力强,但界面有点老旧,而且对硬件要求比较高。Immich是后起之秀,界面漂亮,手机App好用,AI功能也在快速迭代。LibrePhotos比较轻量,但功能相对少一些。

我最后选了Immich,原因有几个。第一,它的手机App做得非常好,自动备份体验跟大厂云相册几乎一样,家里老人也能轻松上手。第二,它的AI功能是内置的,人脸识别、物体识别、语义搜索都有,而且模型可以自己换。第三,它的更新非常活跃,社区响应快,遇到问题容易找到解决方案。第四,它支持多用户,可以给家里人每人一个账号,照片互相隔离。PhotoPrism我也试过,AI能力确实强,但手机App体验差一些,而且索引速度慢。LibrePhotos功能太少,不适合我这种照片多、需求杂的用户。

Immich的架构是这样的:它有一个主服务负责API和Web界面,一个机器学习服务负责AI推理,一个PostgreSQL数据库存元数据,一个Redis做缓存,还有一个向量数据库存人脸和语义特征。这些服务都跑在Docker容器里,通过内部网络通信。你可能会问,为什么这么复杂?因为AI推理和主服务分开之后,可以独立升级和扩展。比如你想换一个更强的人脸识别模型,只需要重启机器学习服务,不影响主服务运行。

3.2 AI模型的选择和优化

Immich默认用的是Buffalo_L模型,这个人脸识别模型精度不错,但在树莓派5上跑起来有点吃力。我实测下来,一张照片的人脸检测要3到5秒,如果照片多,索引时间会很长。后来我换成了MobileFaceNet模型,精度稍微降了一点,但速度提升了三倍多,一张照片只要1秒左右。对于家庭照片来说,这个精度完全够用。如果你对精度要求特别高,可以保留Buffalo_L,但建议在晚上或者不用的时候跑批量索引。

物体识别和语义搜索用的是CLIP模型。这个模型可以把图片和文字映射到同一个向量空间,所以你搜“海滩上的狗”就能找到对应的照片。CLIP模型在树莓派5上跑起来比较慢,一张照片要2到3秒。我的优化方法是把图片分辨率降下来,CLIP默认处理224x224的图片,但Immich会先缩放,我把它改成160x160,速度提升了一倍,精度损失很小。另外,可以开启批处理,一次处理多张图片,充分利用CPU。

还有一个重要的优化点是模型量化。原始模型是FP32的,占内存大、速度慢。我换成了INT8量化的版本,内存占用减少了一半,速度提升了40%左右。量化之后的精度损失在可接受范围内,人脸识别准确率大概降了1%到2%,但速度提升非常明显。具体怎么换模型,后面实操部分会详细说。

3.3 数据库和缓存的配置要点

PostgreSQL是Immich的元数据库,存照片的路径、时间、标签、人脸信息等。树莓派5跑PostgreSQL没问题,但默认配置需要调优。我建议把shared_buffers调到512MB,work_mem调到32MB,maintenance_work_mem调到128MB。这些参数在postgresql.conf里改,改完重启数据库。为什么要调?因为默认配置是按小内存设备来的,树莓派5有8GB内存,可以给数据库多分一点,这样查询速度会快很多。

Redis是缓存服务,存一些临时数据和任务队列。默认配置基本够用,但建议把maxmemory设成256MB,maxmemory-policy设成allkeys-lru。这样Redis不会无限增长,内存不够的时候会自动淘汰旧数据。向量数据库我用的是Qdrant,它专门存人脸和语义向量,支持快速相似度搜索。Qdrant在树莓派5上跑起来很轻量,内存占用大概200MB左右,不需要特别调优。

还有一个细节,数据库和缓存的存储目录一定要放在NVMe SSD上,别放在SD卡上。因为数据库频繁读写,SD卡很容易坏。我第一套系统就是数据库放在SD卡上,跑了三个月SD卡就挂了,所有元数据丢失,照片虽然还在但索引全没了,重新索引花了整整两天。这个坑大家一定要避开。

4. 实操部署:从零到跑通的完整流程

4.1 系统初始化和Docker环境搭建

假设你已经装好了Raspberry Pi OS Lite 64位,并且通过SSH连上了树莓派。第一步,更新系统并安装必要工具。命令是sudo apt update && sudo apt full-upgrade -y,然后装一些常用工具:sudo apt install -y git curl wget htop nano。这些工具后面都会用到。第二步,配置交换空间。编辑/etc/dphys-swapfile,把CONF_SWAPSIZE改成4096,然后执行sudo systemctl restart dphys-swapfile。你可以用free -h命令确认交换空间已经生效。

第三步,安装Docker。用官方脚本:curl -fsSL https://get.docker.com | sh。装完之后,把自己加到docker组:sudo usermod -aG docker $USER,然后退出SSH重新登录,这样不用sudo就能跑docker命令。第四步,确认Docker和Docker Compose版本。docker --version和docker compose version,确保Docker版本在24以上,Compose版本在2.20以上。如果版本太低,有些新特性用不了。

第五步,创建项目目录。我习惯把服务放在/opt下面,执行sudo mkdir -p /opt/immich,然后sudo chown $USER:$USER /opt/immich。这个目录用来放docker-compose文件和配置文件。第六步,创建照片存储目录。如果你用外接硬盘,先挂载硬盘,比如挂到/mnt/photos。然后创建子目录:mkdir -p /mnt/photos/library /mnt/photos/thumbs /mnt/photos/encoded-video /mnt/photos/profile。这些目录分别存原图、缩略图、转码视频和用户配置。

4.2 Immich的Docker Compose配置详解

Immich官方提供了一个docker-compose.yml模板,但默认配置需要改不少地方。我把我优化过的配置贴出来,然后逐项解释。首先,把immich-server的镜像版本固定,别用latest,因为自动更新有时候会出问题。我用的是ghcr.io/immich-app/immich-server:v1.119.0,这个版本我实测稳定。然后,把immich-machine-learning的镜像也固定,用同一个版本。

数据库配置部分,DB_PASSWORD一定要改成一个强密码,别用默认的。DB_STORAGE_LOCATION指向NVMe上的目录,比如/mnt/nvme/postgres。DB_DATA_LOCATION也一样。Redis的配置比较简单,把REDIS_HOSTNAME设成immich-redis就行。存储卷映射部分,把/mnt/photos/library映射到容器的/usr/src/app/upload,这样照片原图就存在外接硬盘上。

机器学习服务的配置是关键。默认的MACHINE_LEARNING_MODEL_TTL是300秒,意思是模型加载后5分钟不用就卸载。我建议改成0,让模型常驻内存,这样每次推理不用重新加载,速度快很多。但代价是内存占用会一直保持在高位,8GB版本大概会占2GB左右。如果你内存紧张,可以保留默认值。MACHINE_LEARNING_WORKERS设成2,树莓派5有4个核心,留两个给主服务。MACHINE_LEARNING_HTTP_KEEPALIVE_TIMEOUT设成60,避免频繁建立连接。

还有一个重要的环境变量是IMMICH_MACHINE_LEARNING_URL,指向机器学习服务的地址,默认是http://immich-machine-learning:3003。如果你把机器学习服务部署在另一台机器上,可以改这个地址。但树莓派5上跑所有服务,保持默认就行。最后,别忘了设置TZ时区,改成你所在的时区,不然照片时间会乱。

4.3 启动服务和初始化设置

配置文件写好之后,执行docker compose up -d启动所有服务。第一次启动会拉取镜像,大概需要十几分钟,取决于你的网络速度。启动完成后,用docker compose ps查看容器状态,确保所有容器都是running。如果有容器不断重启,用docker compose logs 容器名看日志排查。常见问题是数据库密码不对或者存储目录权限不对。

服务起来之后,打开浏览器访问http://树莓派IP:2283,应该能看到Immich的登录界面。第一次访问会让你创建管理员账号,填好邮箱和密码。然后进入设置页面,配置外部库或者上传照片。我建议先上传一小批照片测试,比如100张,看看索引速度和AI识别效果。如果一切正常,再批量导入所有照片。

批量导入有两种方式。一种是通过Web界面上传,适合照片不多的情况。另一种是直接把照片复制到/mnt/photos/library目录下,然后在Immich设置里触发扫描。我推荐第二种,速度快,而且不受浏览器限制。复制的时候注意目录结构,Immich会按年/月/日的格式组织照片,你可以手动创建这些目录,也可以让Immich自动整理。我建议让Immich自动整理,省事。

导入之后,Immich会自动开始索引。索引分几个阶段:先提取元数据,然后生成缩略图,然后跑人脸识别,最后跑物体识别和语义向量。你可以在“任务”页面看到进度。一万张照片在树莓派5上大概需要4到6小时完成全部索引,具体取决于照片大小和AI模型。建议晚上睡觉前开始,第二天早上就好了。

5. AI功能调优:让人脸识别和语义搜索跑得更快

5.1 人脸识别模型的替换和参数调整

Immich默认的人脸识别模型是Buffalo_L,精度高但速度慢。替换成MobileFaceNet的步骤如下。首先,进入机器学习容器的模型目录,一般在/cache下面。你可以用docker exec -it immich-machine-learning bash进入容器,然后cd /cache。你会看到已经下载的模型文件。把MobileFaceNet的模型文件下载下来,替换掉原来的。模型文件可以从Immich的模型仓库获取,具体地址在官方文档里有。

替换之后,重启机器学习服务:docker compose restart immich-machine-learning。然后进入Immich设置,找到“机器学习”选项,把人脸识别模型改成MobileFaceNet。注意,替换模型之后,之前已经识别的人脸需要重新跑一遍,因为特征向量不兼容。你可以在“任务”页面找到“人脸识别”任务,点击“全部重新运行”。

参数调整方面,MACHINE_LEARNING_FACIAL_RECOGNITION_MODEL设成mobilefacenet。还有一个重要参数是MACHINE_LEARNING_FACIAL_RECOGNITION_MIN_SCORE,默认是0.7,意思是置信度低于0.7的人脸不识别。我建议调到0.6,这样能识别出更多侧脸和模糊人脸,但误识别也会增加。你可以根据自己照片的情况调整。如果发现误识别太多,就调回0.7或者更高。

5.2 语义搜索的优化技巧

语义搜索用的是CLIP模型,它能把文字和图片映射到同一个向量空间。你搜“生日蛋糕”就能找到所有包含蛋糕的照片。这个功能非常强大,但默认配置下速度比较慢。优化方法有几个。第一,降低处理分辨率。在机器学习容器的环境变量里加一个MACHINE_LEARNING_CLIP_IMAGE_SIZE=160,默认是224。降到160之后,速度提升大概40%,精度损失很小。

第二,开启批处理。MACHINE_LEARNING_CLIP_BATCH_SIZE设成4,意思是每次处理4张图片。树莓派5的CPU有4个核心,批处理能充分利用多核性能。但批处理会增加内存占用,8GB版本建议设成4,16GB版本可以设成8。第三,把CLIP模型也换成量化版本。Immich支持ONNX格式的量化模型,你可以从模型仓库下载INT8版本的CLIP模型,替换掉默认的FP32模型。替换之后,内存占用减少一半,速度提升30%左右。

还有一个技巧是限制语义搜索的范围。如果你照片特别多,比如超过五万张,全库搜索会很慢。Immich支持按时间范围、相册、人物筛选后再搜索。你可以先筛选出某个时间段或者某个人物的照片,然后再搜关键词,这样搜索范围小很多,速度自然就快了。这个技巧在实际使用中非常实用,尤其是你只想找某次旅行中的某张照片时。

5.3 索引任务的调度和资源控制

AI索引非常吃资源,如果同时跑人脸识别和物体识别,树莓派5的CPU会满载,温度飙升,其他服务也会变慢。我的做法是错峰调度。在Immich的“任务”页面,可以设置每个任务的并发数。人脸识别设成1,物体识别设成1,缩略图生成设成2。这样同一时间只有一个AI任务在跑,不会互相抢资源。

另外,可以设置任务的时间窗口。比如让AI索引只在凌晨1点到早上7点之间跑,白天不跑,这样不影响你白天使用。Immich本身不支持时间窗口,但你可以用cron定时任务来控制。写一个脚本,凌晨1点启动机器学习容器,早上7点停止。这样白天机器学习服务不运行,不占内存,晚上自动跑索引。这个方案我用了几个月,非常稳定。

还有一个资源控制的技巧是限制容器的CPU和内存。在docker-compose.yml里,给机器学习服务加上deploy.resources.limits,比如cpus: '2.0'和memory: 3G。这样即使AI任务跑满,也不会把整个系统拖垮。主服务可以给cpus: '1.0'和memory: 1G,数据库给cpus: '1.0'和memory: 1G。剩下的资源留给系统和缓存。这个配置在8GB版本上实测很稳。

6. 常见问题排查与避坑经验实录

6.1 服务启动失败和容器不断重启

这是最常见的问题,原因通常有三个。第一,数据库密码不对。检查docker-compose.yml里的DB_PASSWORD和Immich服务里的DB_PASSWORD是否一致。如果不一致,数据库连不上,服务就会重启。第二,存储目录权限不对。Docker容器里的服务通常以非root用户运行,如果宿主机目录权限是root,容器写不进去。解决办法是sudo chown -R 1000:1000 /mnt/photos,把目录所有者改成UID 1000。第三,端口冲突。Immich默认用2283端口,如果这个端口被其他服务占了,就起不来。用sudo netstat -tlnp | grep 2283检查,如果被占了就改端口。

还有一个隐蔽的问题是交换空间不够。树莓派5默认交换空间只有100MB,跑AI的时候内存不够,系统会杀进程,导致容器不断重启。解决办法就是前面说的,把交换空间调到4GB。我一开始没调,机器学习服务跑几分钟就挂,日志里全是Out of memory,调了交换空间之后问题解决。

6.2 AI识别速度慢或者不工作

AI识别慢的原因通常是模型太大或者资源不够。先检查机器学习容器的日志:docker compose logs immich-machine-learning。如果看到Model loading反复出现,说明模型被频繁卸载和加载,把MACHINE_LEARNING_MODEL_TTL设成0就能解决。如果看到Timeout,说明推理超时了,需要降低分辨率或者换更小的模型。

如果AI完全不工作,先确认机器学习服务是否正常运行:docker compose ps看状态。然后确认Immich主服务能连上机器学习服务:在Immich设置里点“测试连接”。如果连不上,检查IMMICH_MACHINE_LEARNING_URL环境变量是否正确。还有一个可能是模型文件损坏,删掉/cache目录下的模型文件,重启容器会自动重新下载。

6.3 照片导入后不显示或者缩略图缺失

这个问题通常是文件权限或者路径映射的问题。先检查照片是否真的复制到了/mnt/photos/library目录下。然后检查Immich的存储卷映射是否正确。在docker-compose.yml里,/mnt/photos/library应该映射到/usr/src/app/upload。如果映射错了,Immich找不到照片。

缩略图缺失通常是生成任务没跑完。去“任务”页面看“生成缩略图”任务的进度。如果任务卡住了,可以手动触发:点“全部重新运行”。如果还是不行,检查NVMe SSD的剩余空间,缩略图很占空间,一万张照片大概需要10GB左右。空间不够的话,缩略图生成会失败。

还有一个坑是照片文件名包含特殊字符。Immich对中文文件名支持没问题,但如果文件名里有emoji或者特殊符号,可能会导入失败。解决办法是批量重命名,把特殊字符去掉。我写了一个脚本,用rename命令把所有文件名里的非ASCII字符替换成下划线,导入就顺利了。

6.4 系统运行一段时间后变慢或者卡死

树莓派5跑久了变慢,通常是内存泄漏或者温度过高。先看内存:free -h,如果可用内存很少,交换空间用满,那就是内存不够。解决办法是限制容器内存,或者升级到16GB版本。再看温度:vcgencmd measure_temp,如果超过80度,就是散热问题。检查风扇是否正常运转,散热片是否松动。我遇到过风扇积灰导致散热效率下降,清理之后温度降了10度。

还有一个原因是数据库膨胀。PostgreSQL跑久了,表会变大,查询变慢。定期执行VACUUM FULL可以回收空间。我设置了一个cron任务,每周日凌晨执行一次。命令是docker exec -it immich-postgres psql -U postgres -c "VACUUM FULL;"。执行的时候会锁表,所以要在不用的时候跑。执行完之后,数据库文件会小很多,查询速度也会恢复。

6.5 常见问题速查表

问题现象可能原因排查方法解决方案
容器不断重启数据库密码错误查看容器日志统一docker-compose中的密码
容器不断重启存储目录权限不对ls -la查看目录所有者chown -R 1000:1000
AI识别慢模型频繁加载卸载查看机器学习日志设MODEL_TTL=0
AI不工作服务连接失败测试连接检查MACHINE_LEARNING_URL
缩略图缺失生成任务未完成查看任务进度手动触发重新运行
系统变慢内存不足free -h限制容器内存或加交换空间
系统变慢温度过高vcgencmd measure_temp清理风扇或换散热器
数据库查询慢表膨胀查看数据库大小定期VACUUM FULL

7. 数据备份与安全加固:别等丢了才后悔

7.1 照片和数据库的备份策略

私有服务器的最大风险不是被攻击,而是硬盘坏了。我吃过这个亏,所以现在备份做得非常勤。我的策略是三层备份:第一层,照片原图实时同步到另一块外接硬盘,用rsync每小时同步一次。第二层,数据库每天凌晨导出一次,存到NVMe和SD卡各一份。第三层,每周把重要照片和数据库备份加密后传到另一台设备上。这样即使树莓派彻底挂了,数据也能找回来。

rsync的同步命令是rsync -av --delete /mnt/photos/library/ /mnt/backup/photos/。--delete的意思是删除目标目录里源目录没有的文件,保持完全一致。数据库备份用pg_dump:docker exec -it immich-postgres pg_dump -U postgres immich > /mnt/backup/immich_$(date +%Y%m%d).sql。这个命令导出整个数据库,恢复的时候用psql导入就行。

备份文件一定要加密,尤其是传到外部设备的时候。用gpg加密:gpg -c /mnt/backup/immich_20260101.sql,会提示你输入密码。加密后的文件即使被别人拿到,没有密码也打不开。密码一定要记住,忘了就真的打不开了。我建议把密码写在纸上,锁在抽屉里,别只存在电脑里。

7.2 网络安全和访问控制

虽然是在内网,但安全措施不能少。第一,改掉默认端口。Immich默认用2283,我改成了随机的高位端口,比如34567。这样即使有人扫描你的内网,也不容易发现服务。第二,开启HTTPS。Immich支持HTTPS,你可以用自签名证书,也可以用Let's Encrypt。自签名证书配置简单,但浏览器会报警告。Let's Encrypt需要域名,如果你有域名,建议用Let's Encrypt。

第三,配置防火墙。树莓派5上可以用ufw,只开放必要的端口。比如只开放SSH端口和Immich端口,其他全部关闭。命令是sudo ufw allow 22/tcp和sudo ufw allow 34567/tcp,然后sudo ufw enable。第四,禁用密码登录SSH,改用密钥登录。生成密钥对:ssh-keygen -t ed25519,然后把公钥复制到树莓派的~/.ssh/authorized_keys文件里。编辑/etc/ssh/sshd_config,把PasswordAuthentication改成no,重启SSH服务。

第五,定期更新系统和容器。sudo apt update && sudo apt full-upgrade -y每周跑一次。Docker镜像也要定期更新,docker compose pull拉取最新镜像,然后docker compose up -d重启服务。但注意,更新之前一定要备份数据库,因为新版本有时候会有数据库迁移,迁移失败就麻烦了。

7.3 用户管理和权限隔离

如果你给家里人用,一定要给每人创建独立账号。Immich支持多用户,每个用户的照片互相隔离,看不到别人的。创建用户的步骤:用管理员账号登录,进入“管理”页面,点“创建用户”,填邮箱和密码。然后告诉家里人用这个账号登录手机App,他们的照片就会自动备份到自己的空间里。

权限方面,普通用户只能看自己的照片,不能管理服务。管理员可以看所有用户的状态,但不能看普通用户的照片内容。这个设计很合理,既方便管理,又保护隐私。如果你想让家里人共享某些照片,可以创建共享相册,把特定照片放进去,然后邀请其他用户加入。共享相册里的照片,所有成员都能看。

还有一个细节是存储配额。Immich支持给每个用户设置存储上限,防止某个用户把硬盘塞满。在“管理”页面,编辑用户,设置“存储配额”,比如每人50GB。超过配额之后,该用户不能再上传新照片,但已有的照片不受影响。这个功能在多用户环境下非常实用。

8. 性能实测与扩展玩法

8.1 树莓派5跑AI照片服务器的真实性能数据

我用一万张照片做了完整测试,照片平均大小4MB,格式是JPEG和HEIC混合。测试结果如下:缩略图生成,一万张照片耗时约45分钟,平均每张0.27秒。人脸识别,一万张照片耗时约2小时50分钟,平均每张1.02秒。物体识别和语义向量,一万张照片耗时约3小时20分钟,平均每张1.2秒。全部索引完成总共约7小时,跑了一个晚上。

内存占用方面,空闲时系统占用约1.2GB,跑人脸识别时峰值到4.5GB,跑物体识别时峰值到5.2GB。CPU占用,空闲时5%左右,跑AI时四个核心全部满载,温度稳定在60度左右。功耗方面,空闲时约5W,满载时约12W,一天耗电约0.15度,一个月电费不到3块钱。这个功耗比成品NAS低多了。

搜索响应速度,按人脸搜索,一万张照片里搜一个人,结果返回时间约1.5秒。按语义搜索,搜“海滩日落”,返回时间约2秒。按时间浏览,加载一个月的缩略图,时间约0.8秒。整体体验非常流畅,跟云相册差不多,但数据完全在自己手里。

8.2 后续可以扩展的玩法和功能

这套系统跑通之后,可以扩展很多玩法。第一,接入监控摄像头。用ffmpeg把摄像头的RTSP流截帧,存到Immich的监控相册里,这样家门口的录像也能统一管理。第二,接入无人机照片。大疆无人机拍的照片有GPS信息,Immich能自动按地图归类,你可以在地图上看到每张照片的拍摄位置。第三,接入扫描仪。把老照片扫描成电子版,导入Immich,用AI自动修复和上色。

第四,搭建照片展示墙。用树莓派接一个旧显示器,跑一个幻灯片程序,自动轮播Immich里的照片。我家里就搞了一个,放在客厅,每天自动播放孩子的照片,效果很好。第五,接入智能音箱。用Home Assistant把Immich接入智能家居系统,对着音箱说“播放去年的今天”,电视上就会显示对应的照片。这个玩法需要一点智能家居的基础,但实现起来不难。

第六,做照片自动整理。写一个Python脚本,调用Immich的API,定期把照片按人物、地点、事件自动分类到不同相册。比如把所有包含“孩子”的照片自动放到“成长记录”相册,把所有在海边拍的照片放到“旅行”相册。这个脚本我还在写,跑通之后会分享出来。

8.3 我踩过的坑和最后的建议

最后分享几个我踩过的坑。第一,别用SD卡跑数据库,我坏了三张SD卡才明白这个道理。第二,别用便宜的电源,电压不稳会导致硬盘掉盘,数据损坏。第三,别在白天跑AI索引,CPU满载的时候其他服务会卡,体验很差。第四,别忘记备份,我丢过一次数据,重新索引花了两天,那种感觉不想再体验第二次。

如果你刚开始折腾,我的建议是先跑通基本功能,别一上来就追求完美。先把照片导进去,能看能搜就行。然后慢慢调优AI模型,换更快的模型,调参数。最后再搞备份和安全加固。一步一步来,遇到问题就查日志,Immich的社区很活跃,大部分问题都能找到答案。

这套系统我跑了半年多,稳定性很好,除了偶尔更新容器需要重启,平时基本不用管。家里人也都习惯了用自己的私有相册,手机照片自动备份,再也不用担心云盘限速或者收费。如果你也想把照片的控制权拿回来,树莓派5加Immich这套方案,值得一试。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询