1. 为什么要在树莓派5上折腾私有照片服务器把照片放在别人的服务器上这件事我越想越不踏实。前几年各家网盘轮番限速、会员涨价、甚至直接关停服务我身边好几个朋友都经历过“一觉醒来照片全没了”的崩溃。后来大家开始用手机厂商自带的云相册结果免费空间只有5个G超了就得按月交钱而且照片压缩得亲妈都认不出来。更别提那些AI相册功能动不动就要把你的照片上传到云端做识别隐私这东西一旦交出去就收不回来了。所以当我拿到树莓派5的时候第一个念头就是能不能把这玩意儿变成我自己的AI照片服务器答案是不仅能而且体验比我想象中好得多。树莓派5这次升级幅度很大四核Cortex-A76处理器、最高8GB内存、PCIe接口、双4K输出性能已经摸到了入门级x86迷你主机的屁股。用它来跑照片管理、人脸识别、场景分类这些任务完全撑得住。这篇文章我会从零开始把整套方案拆开揉碎讲清楚。包括硬件怎么选、系统怎么装、照片管理平台怎么挑、AI识别模型怎么部署、外网访问怎么搞、备份怎么做。不管你是刚接触树莓派的新手还是已经玩过几块板子的老鸟都能从里面找到能直接抄作业的步骤。我踩过的坑、试过的错、最后跑通的配置都会毫无保留地写出来。提示本文所有操作基于树莓派5 8GB版本系统为64位Lite版。4GB版本也能跑但AI识别部分会吃力一些建议至少上8GB。2. 硬件选型与系统准备别在第一步就翻车2.1 树莓派5到底选哪个版本树莓派5目前有2GB、4GB、8GB、16GB四个内存版本。如果你只是做照片存储和简单的相册浏览4GB够用。但一旦涉及到AI识别——比如人脸聚类、场景分类、OCR文字提取——内存就是硬门槛。我实测下来8GB版本在跑人脸识别模型时内存占用会冲到3.5GB左右4GB版本直接爆内存系统开始疯狂交换识别一张照片要等十几秒。16GB版本当然更宽裕但价格已经接近二手迷你主机了性价比不高。所以我的建议很明确8GB是甜点配置既能满足AI需求又不会让预算失控。存储方面树莓派5终于支持了PCIe接口可以通过M.2 HAT扩展板接NVMe固态硬盘。这个升级太关键了。以前用树莓派4的时候照片库一大机械硬盘的读写速度就成了瓶颈缩略图加载慢得让人想砸键盘。现在用NVMe固态顺序读取能跑到800MB/s以上随机读写更是甩机械盘几条街。我用的是一块1TB的NVMe盘照片库放了将近4万张照片缩略图滚动起来非常流畅。注意树莓派5的PCIe接口默认是PCIe 2.0 x1带宽有限。如果你买的是PCIe 3.0的固态它会降速运行但日常使用完全感觉不出来。别为了追求极限速度多花钱。2.2 系统安装的几个关键选择系统方面我强烈建议用64位Lite版。桌面版虽然方便但会占用大量内存和CPU资源而这些资源留给AI模型更划算。Lite版通过SSH远程管理配合Web界面访问照片库体验反而更清爽。烧录系统的时候有个细节容易被忽略一定要用官方Imager工具里的高级选项预先配置好WiFi、SSH和用户名。我见过太多人烧完系统插上屏幕才发现没配网络又得重新拔卡再来一遍。另外树莓派5的电源要求是5V 5A用树莓派4的电源会供电不足表现为固态硬盘频繁掉盘、系统随机重启。这个坑我踩过换了官方27W电源之后一切正常。系统装好后的第一件事是更新源和固件sudo apt update sudo apt full-upgrade -y sudo rpi-update sudo rebootrpi-update会更新底层固件对PCIe固态的兼容性有提升。更新完之后用lsblk确认NVMe盘被正确识别然后用sudo raspi-config里的Performance Options把PCIe速度设为Gen 2再启用NVMe启动。这样系统就直接跑在固态上了SD卡只作为备用。2.3 文件系统与挂载策略照片库的存储路径我建议单独挂载不要放在系统盘根目录下。这样做的好处是系统重装或者迁移的时候照片库不受影响。我的做法是在NVMe上分两个区一个给系统一个给照片库照片库分区挂载到/mnt/photos。挂载的时候记得在/etc/fstab里加上nofail选项否则万一硬盘出问题系统会卡在启动阶段进不去。这个细节很小但关键时刻能救命。# /etc/fstab 示例 UUID你的分区UUID /mnt/photos ext4 defaults,nofail 0 2权限方面照片库目录的属主设成你的常用用户权限设为755。如果你打算用Docker部署照片管理平台还需要把用户加入docker组并且确保容器内的UID和宿主机的UID一致否则会出现“容器能读但写不进去”的诡异问题。3. 照片管理平台选型为什么我最终选了Immich3.1 主流方案横向对比树莓派上能跑的照片管理方案不少我前后试过五六个每个都用了至少一周。下面这张表是我个人的实测总结方案部署难度AI功能手机自动备份界面体验资源占用Nextcloud中等需插件支持一般较高PhotoPrism中等内置支持良好中等Immich简单内置支持优秀中等偏高LibrePhotos较难内置有限一般中等自建文件目录简单无需同步工具差极低Nextcloud功能最全但它是“什么都能干什么都不精”照片管理只是其中一个模块AI识别要额外装插件配置起来很折腾。PhotoPrism专注照片AI功能也不错但它的界面逻辑我始终用不惯而且手机端备份体验一般。Immich是我最后留下来的方案。它的界面几乎复刻了主流商业相册的体验手机App自动备份做得很顺滑AI功能开箱即用而且更新非常活跃。最重要的是它对ARM64架构的支持很好树莓派5上跑起来没有兼容性问题。3.2 Immich的架构与资源消耗Immich由几个核心组件构成immich-server负责主服务和Web界面immich-machine-learning负责AI推理postgres存元数据redis做缓存还有typesense做搜索。用Docker Compose一键拉起所有组件跑在同一个Docker网络里。资源消耗方面我实测的数据是空闲状态下整套服务占用约1.2GB内存CPU占用5%左右。跑人脸识别的时候内存会冲到3GB以上CPU四核全开温度会升到75度左右。所以散热必须做好我用的是一块带风扇的金属外壳待机温度45度满载不超过80度。如果你用被动散热夏天跑AI任务大概率会触发降频。提示Immich的机器学习容器默认会加载人脸检测、人脸识别、CLIP图像编码等多个模型。如果你只需要人脸功能可以在配置里关掉CLIP能省下不少内存。3.3 部署前的依赖准备在跑Immich之前有几个系统层面的依赖需要先搞定。首先是Docker和Docker Compose用官方脚本安装即可curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER然后安装libvips和ffmpeg这两个是图像和视频处理的核心库sudo apt install -y libvips-dev ffmpeg最后调整一下系统参数。Immich的Postgres对共享内存有要求默认的/dev/shm只有64MB会导致数据库启动失败。需要在/etc/fstab里加一行tmpfs /dev/shm tmpfs defaults,size512M 0 0改完mount -o remount /dev/shm生效。这个坑我卡了整整一个下午报错信息很隐晦只说什么“共享内存不足”查了半天才定位到。4. Immich部署实操从零到跑通的完整记录4.1 目录结构与配置文件我习惯把所有Docker服务的配置放在/opt/docker下面每个服务一个子目录。Immich的目录结构是这样的/opt/docker/immich/ ├── docker-compose.yml ├── .env ├── library/ # 照片原始文件 ├── postgres/ # 数据库数据 └── model-cache/ # AI模型缓存.env文件里需要改几个关键参数。UPLOAD_LOCATION指向照片库路径DB_PASSWORD设一个强密码TZ设成你的时区。还有一个容易被忽略的IMMICH_VERSION建议锁定具体版本号而不是用release否则某天自动更新后可能出兼容问题。# .env 关键配置 UPLOAD_LOCATION/opt/docker/immich/library DB_PASSWORD你的强密码 TZAsia/Shanghai IMMICH_VERSIONv1.119.04.2 docker-compose.yml的定制化调整官方提供的docker-compose.yml可以直接用但针对树莓派5我做了几处调整。第一给immich-machine-learning容器加了内存限制防止它把系统吃光immich-machine-learning: deploy: resources: limits: memory: 4G第二把immich-server的端口从默认的2283改成你喜欢的端口我用的还是2283但如果你有多个服务记得错开。第三给postgres容器加了shm_size: 512mb和前面系统层面的调整对应上。启动命令很简单cd /opt/docker/immich docker compose up -d第一次启动会拉取镜像树莓派5的网口是千兆的但如果你用WiFi拉几个G的镜像会比较慢。建议插网线操作。镜像拉完之后用docker compose ps确认所有容器都是running状态然后浏览器访问http://树莓派IP:2283就能看到登录界面了。4.3 首次配置与手机端备份第一次登录需要注册管理员账号这个账号只存在你的本地数据库里和任何外部服务无关。注册完之后第一件事是去设置里把“外部域名”填上如果你后面要做外网访问这里填你的域名如果只在内网用填树莓派的局域网IP就行。手机端备份是Immich的强项。iOS和Android都有官方App登录后选择要备份的相册它会自动在后台同步。我实测下来局域网内备份速度能跑到30MB/s左右一万张照片大概半小时同步完。备份策略我建议设成“仅在前台备份”或者“充电时备份”否则手机电量掉得很快。注意Immich的手机App默认会备份所有照片包括截图和表情包。建议在“备份相册”设置里只勾选相机胶卷把其他相册排除掉否则你的照片库会被垃圾图片淹没。4.4 AI功能的开启与调优Immich的AI功能默认是开启的但需要手动触发一次全库扫描。在“管理”页面里找到“作业”选项可以看到几个任务人脸检测、人脸识别、智能搜索、重复检测。新上传的照片会自动进入队列但已有的照片需要手动点“全部运行”。人脸检测的速度取决于照片数量和CPU性能。我4万张照片的库全量跑完大概用了6个小时。期间树莓派5的CPU一直满载温度稳定在78度左右。如果你不想让它一直满负荷跑可以在设置里限制并发数比如把机器学习并发数设为1速度会慢一些但温度更可控。智能搜索用的是CLIP模型可以用自然语言搜照片比如输入“海边日落”或者“生日蛋糕”它能找出语义相关的图片。这个功能对中文的支持一般英文关键词的准确率更高。我试过搜“dog on beach”确实能找出我家狗在海边的照片挺神奇的。5. 外网访问与安全加固让照片随时随地能看5.1 内网穿透方案的选择照片服务器搭在内网出门在外想看怎么办最直接的办法是路由器端口映射但这样会把服务直接暴露在公网上风险很大。我不推荐这种做法除非你对自己的安全配置非常有信心。更稳妥的方案是用内网穿透工具把内网服务映射到一个公网地址上。这类工具的原理是在你的树莓派和一台有公网IP的中转服务器之间建立一条加密隧道外部请求先到中转服务器再通过隧道转发到树莓派。这样你的家庭网络不需要开放任何端口安全性高很多。我用的方案是frp配合一台便宜的云服务器做中转。配置分两部分云服务器上跑frps服务端树莓派上跑frpc客户端。frpc的配置文件里指定要映射的本地端口2283和远程端口然后在中转服务器上开放对应的防火墙规则。# frpc.ini 示例 [common] server_addr 你的中转服务器IP server_port 7000 token 你的认证令牌 [immich] type tcp local_ip 127.0.0.1 local_port 2283 remote_port 2283这样配置完之后访问http://中转服务器IP:2283就能打开你的Immich了。但这样是HTTP明文传输密码和照片都会暴露。所以下一步必须上HTTPS。5.2 HTTPS证书与反向代理在中转服务器上装一个Nginx配置反向代理和Lets Encrypt证书。Nginx的配置大概是这样server { listen 443 ssl; server_name photos.你的域名.com; ssl_certificate /etc/letsencrypt/live/photos.你的域名.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/photos.你的域名.com/privkey.pem; location / { proxy_pass http://127.0.0.1:2283; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; client_max_body_size 50000M; } }client_max_body_size这一行很关键默认的1MB限制会导致大视频上传失败。我设成了50GB基本够用。证书用certbot自动申请和续期一条命令搞定。5.3 安全加固的几个必做项外网访问开了之后安全就是头等大事。我做了这几件事第一关闭Immich的公开注册。在管理设置里把“允许新用户注册”关掉只保留管理员手动创建账号。否则任何人都能注册进来翻你的照片。第二启用双因素认证。Immich支持TOTP配合手机上的验证器App使用。多一道验证密码泄露了也不怕。第三限制登录尝试次数。在Nginx层面加一个limit_req规则防止暴力破解limit_req_zone $binary_remote_addr zonelogin:10m rate5r/m; location /api/auth/login { limit_req zonelogin burst3 nodelay; proxy_pass http://127.0.0.1:2283; }第四定期更新。Immich更新很频繁安全补丁也发得快。我设了一个每周提醒看到新版本就抽时间升级。升级前先备份数据库这个习惯救过我一次——有次升级后数据库迁移失败靠备份回滚才没丢数据。6. 备份策略与故障排查别等丢了才后悔6.1 3-2-1备份原则的落地照片这东西丢了就真没了。我遵循的是3-2-1原则3份数据2种介质1份异地。具体到我的配置第一份树莓派上的NVMe固态日常使用第二份外接USB机械硬盘每周自动同步一次第三份加密后上传到对象存储每月同步一次USB硬盘的同步用rsync写一个脚本加到crontab里#!/bin/bash rsync -av --delete /mnt/photos/ /mnt/backup/photos/--delete参数会删除目标端多余的文件保持两边完全一致。但用这个参数要小心万一源目录被误删目标端也会跟着删。所以我额外加了一个快照机制每次同步前先在备份盘上创建一个硬链接快照保留最近4个版本。对象存储那份用rclone做加密同步。rclone支持客户端加密上传前先把文件加密即使存储服务商也看不到内容。配置好之后一条rclone sync命令就能搞定。6.2 常见问题速查表下面这张表是我在实际运维中遇到过的典型问题和解决方法按出现频率排序问题现象可能原因解决方法容器启动后立即退出/dev/shm太小调整到512MB并重启上传大视频失败Nginx body限制设client_max_body_sizeAI识别卡住不动内存不足限制并发数或加内存手机备份断连WiFi休眠关闭树莓派WiFi省电模式缩略图加载慢机械硬盘瓶颈换NVMe固态数据库连接失败密码含特殊字符用引号包裹或换密码外网访问502frp隧道断开检查frpc进程和token照片时间错乱时区配置错误检查.env里的TZ6.3 几个让我印象深刻的坑第一个坑是文件权限。Immich容器默认以1000:1000的UID运行如果你的照片库属主不是这个UID容器就写不进去。表现是上传照片时提示“权限不足”但日志里看不出具体原因。解决办法是在.env里加一行PUID你的UID和PGID你的GID或者在宿主机上把照片库目录的属主改成1000。第二个坑是数据库迁移。Immich版本更新时经常伴随数据库结构变更如果迁移过程中断电或者磁盘满数据库会处于不一致状态。我有一次升级到一半树莓派过热重启结果Postgres起不来了。后来是靠pg_dump的每日备份恢复的。所以升级前手动备份数据库这个步骤千万别省。第三个坑是AI模型下载失败。Immich的机器学习容器第一次启动时会从网上下载模型文件如果网络不稳定下载会中断容器反复重启。解决办法是手动下载模型放到model-cache目录里或者配置一个稳定的镜像源。模型文件加起来大概1GB左右下载一次之后就不用再下了。第四个坑是温度墙。树莓派5的CPU在85度时会触发降频AI识别速度直接腰斩。我一开始用的是一个封闭的塑料外壳跑AI任务十分钟就降频。后来换了带风扇的金属壳温度压在75度以下识别速度稳定了很多。如果你打算长期跑AI任务散热上的投入不能省。7. 性能调优与进阶玩法7.1 让AI识别跑得更快树莓派5的CPU性能虽然不错但跑AI推理还是有点吃力。我试过几种优化手段效果比较明显的有两个。第一个是量化模型。Immich默认用的模型是FP32精度我换成了INT8量化的版本识别速度提升了将近40%准确率只掉了不到2%。具体做法是修改机器学习容器的环境变量指定量化模型路径。不过这个操作需要一定的模型转换知识新手可以先跳过。第二个是限制并发数。听起来反直觉但把并发数从默认的4降到2之后整体吞吐量反而提高了。原因是并发太高会导致CPU频繁切换上下文缓存命中率下降。降到2之后每个任务能独占核心完成时间更短。这个参数在Immich的管理设置里就能改。7.2 用树莓派的GPU加速树莓派5的VideoCore VII GPU支持OpenCL理论上可以用来加速AI推理。Immich的机器学习后端支持ONNX Runtime而ONNX Runtime有ARM64的OpenCL版本。我尝试编译了一个支持OpenCL的ONNX Runtime替换掉容器里的默认版本人脸检测速度提升了约25%。不过这个过程比较折腾需要自己编译ONNX Runtime还要确保OpenCL驱动正确安装。如果你不想折腾CPU版本已经够用了。等Immich官方支持GPU加速之后再跟进也不迟。7.3 照片库的自动化整理Immich本身提供了相册和标签功能但自动化程度有限。我写了一个Python脚本定期扫描照片库根据EXIF信息自动打标签。比如检测到GPS坐标在北京就自动加“北京”标签检测到拍摄设备是某款相机就加对应的设备标签。import exifread import requests def tag_photo(photo_path, immich_api_key): with open(photo_path, rb) as f: tags exifread.process_file(f) # 提取GPS、设备、时间等信息 # 调用Immich API打标签 pass这个脚本配合crontab每天跑一次新照片会自动归类。虽然Immich的AI已经能做人脸和场景识别但基于EXIF的规则打标签更精准两者互补。7.4 多用户与共享相册Immich支持多用户每个用户有自己的照片库互相隔离。我给家里人每人开了一个账号他们各自备份自己的照片互不干扰。同时我建了一个“家庭共享”相册把大家的合照放进去所有人都能看到。共享相册的权限管理做得不错可以设置只读或者可编辑。我建议默认给只读权限避免有人误删照片。如果要做协作编辑再单独开权限。8. 这套方案还能怎么扩展照片服务器跑通之后我陆续加了一些周边功能。比如用rclone把照片同步到电视上通过DLNA在客厅大屏浏览用Home Assistant做了一个自动化检测到有人回家就自动备份手机照片还接了一个旧平板挂在墙上做成电子相册循环播放家庭照片。树莓派5的PCIe接口还空着一个通道我打算后面加一块AI加速卡把大模型推理也跑起来。到时候照片服务器就不只是照片服务器了而是一个完整的家庭AI中枢。这个方向值得持续折腾等有新进展再跟大家分享。提示如果你也想做电子相册Immich有一个“回忆”功能会自动生成“去年今日”之类的合集。配合平板上的浏览器全屏模式效果很不错。最后说一个我个人的小习惯每次折腾完一个新功能我都会在/opt/docker/immich目录下留一个NOTES.md记录这次改了什么、遇到什么问题、怎么解决的。下次再出问题翻笔记比翻日志快得多。这个习惯帮我省了无数时间推荐你也试试。