Immich 自托管照片备份实战:给个人站搭一套私人云相册,人脸识别、手机自动备份与异地备份全流程

手机里攒了几万张照片,云相册一年比一年贵,免费额度早就不够用;更让人不放心的是,这些照片躺在别人的服务器上,哪天账号出问题、服务涨价、或者公司关门,十几年的回忆说没就没。很多站长手上本来就有一台吃灰的 VPS,或者一台家用小主机,完全可以用 Immich 搭一套属于自己的照片备份系统——不限容量、不按人头收费、人脸识别和地图浏览一个不少。这篇文章从零讲清 Immich 的架构、部署、备份与六个必踩的坑,全部命令都可以直接复制执行。

一、Immich 到底是什么,和网盘相册差在哪

Immich 是一个开源的自托管照片与视频备份方案,定位是「Google Photos 的替代品」。它不是一个简单的文件夹同步工具,而是带 Web 界面、手机 App 自动备份、人脸识别、物体识别、按时间轴和地图浏览的完整相册系统。

它和常见的几类方案定位完全不同,先分清楚再动手:

  • Nextcloud 相册:Nextcloud 本质是网盘,相册只是里面的一个应用,缩略图生成慢、手机自动备份体验一般,主要解决的是「文件同步」。
  • Syncthing:只做文件双向同步,没有相册界面、没有人脸识别、不能按地点聚合,看到的就是一堆文件名。
  • Piwigo / Lychee:偏展示型相册,适合把照片发布出去给别人看,自动备份和去重能力弱。
  • Immich:为「移动端自动备份 + 智能整理」而生,App 后台自动上传、服务端做人脸聚类和缩略图,打开就是时间轴。

换句话说,如果你只是想同步文件,用 Syncthing 就够了;如果你想要一个「拍完就自动进库、还能按人脸和地点找照片」的相册,Immich 才是对的选择。

二、部署前必须想清楚的三个硬指标

Immich 官方明确写过:不建议把 Immich 直接暴露到公网,正确做法是挂在家里的内网,通过 VPN 回家访问。所以先确认三件事。

1. 硬盘容量要留够

原始照片 + 缩略图 + 转码视频,大概需要原始文件体积的 1.3 到 1.5 倍空间。你有 500 GB 照片,至少准备 800 GB 的盘。用 SSD 存缩略图、机械盘存原图是最划算的组合。

2. 内存别抠

内置的机器学习服务(人脸识别、物体识别)很吃内存,跑得动建议 4 GB 起步,2 GB 的小机器要么关了智能搜索,要么单独把机器学习容器停掉。

3. 一定要有公网可达的入口

手机 App 在外网也要能上传,所以需要一条回家的路:家庭宽带可以走 WireGuard 或者 Tailscale,有公网 IP 的 VPS 可以直接用域名 + HTTPS。下一篇同类文章会单独讲组网,这里先假设你已经有一条能回家的隧道。

三、Docker Compose 部署全流程

Immich 官方现在推荐用自带的 docker-compose.yml 和 .env 文件部署,先把它拉下来。

mkdir -p /opt/immich
cd /opt/immich
wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env

然后编辑 .env,几个关键项逐个改掉:

UPLOAD_LOCATION=/mnt/photos/immich
DB_DATA_LOCATION=/opt/immich/postgres
IMMICH_VERSION=release
DB_PASSWORD=换成一串你自己的强密码
TZ=Asia/Shanghai

UPLOAD_LOCATION 指向真正存照片的数据盘,不要留在系统盘,否则照片一多把系统盘写满,机器直接起不来。DB_DATA_LOCATION 是 PostgreSQL 的数据目录,也要放在数据盘上,方便连库一起备份。

改完直接拉起:

docker compose up -d
docker compose ps

第一次启动会自动拉镜像并初始化数据库,等所有容器变成 running 或 healthy 状态即可。默认 Web 端口是 2283,先在本机验证:

curl -I http://127.0.0.1:2283

返回 200 或 301 就说明服务起来了。接下来访问 http://服务器IP:2283,第一阶段会引导你创建管理员账号,这个账号就是最高权限,密码请用密码管理器生成。

四、用 Nginx 反向代理并上 HTTPS

直接开 2283 端口上公网既不安全也不好记,一般用一个子域名反代过去。Nginx 配置要点如下:

server {
    listen 443 ssl http2;
    server_name photos.example.com;

    ssl_certificate     /etc/letsencrypt/live/photos.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/photos.example.com/privkey.pem;

    client_max_body_size 50000M;

    location / {
        proxy_pass http://127.0.0.1:2283;
        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

几个不能省的细节:

  • client_max_body_size 必须调大,手机拍一段 4K 视频动辄几百兆,用 Nginx 默认的 1M 会直接返回 413,App 里表现为「上传失败」但看不到原因。
  • Immich 的移动端上传走分块,Nginx 的 proxy_request_buffering 默认开着也能用,但如果上传大文件总是中断,可以加 proxy_request_buffering off; 让它边传边转。
  • WebSocket 要放行,实时上传进度依赖 WebSocket,如果 Nginx 太老或配置了打断 Upgrade 头的规则,进度条会一直不动。

证书用 certbot 申请即可:certbot --nginx -d photos.example.com。

五、手机 App 自动备份怎么配才靠谱

Immich 官方 App 支持 iOS 和 Android,安装后在登录页把服务器地址填成你的 HTTPS 域名。

备份的关键设置有三处:

  • 只在 Wi-Fi 下备份:默认是开的,别关,不然一个月的流量几天就没了。
  • 前台自动备份 vs 后台备份:iOS 对后台上传限制很严,通常需要打开 App 才会真正传;Android 可以用「后台备份」配合电池优化白名单,效果相对好。
  • 是否删除已备份的本地文件:这一项新手千万不要开,它会在备份完成后删除手机上的原图,一旦服务器端出问题,照片就同时没了两份。等系统稳定跑上几个月、备份也验证过了再考虑。

六、人脸识别、智能搜索与机器学习服务

Immich 默认会跑一个名为 immich-machine-learning 的容器,负责人脸聚类和 CLIP 语义搜索(你搜「海边日落」能找出对应的照片)。它把模型权重缓存在容器卷里,第一次用到时才下载,所以刚部署完搜不出东西是正常的。

如果机器内存小,可以在 .env 里关掉或限制它:

MACHINE_LEARNING_WORKERS=1
MACHINE_LEARNING_WORKER_TIMEOUT=120

更彻底的做法是把智能搜索关掉,照片依然正常备份和浏览,只是没人脸分组和语义搜索。判断要不要开的标准很简单:内存 4 GB 以上开,2 GB 以下关。

七、备份才是这套系统的命根子

自托管的照片系统最怕的不是硬盘坏,而是「以为在备份、其实没备」。Immich 的备份分两部分,缺一不可:

1. 照片原图与缩略图

就是 UPLOAD_LOCATION 指向的目录,用 rsync 或者 rclone 定期同步到另一台机器或对象存储:

rsync -av --delete /mnt/photos/immich/ backup-host:/backup/immich/

注意 --delete 是把双刃剑:它能保证两边一致,但如果源目录被误删,备份会被同步删掉。更稳的做法是目标端保留多个历史版本,比如用快照或者带版本控制的备份工具。

2. 数据库

相册的时间轴、人脸、相册分组、用户配置全在 PostgreSQL 里,只备份照片文件是不够的。导出:

docker exec -t immich_postgres pg_dumpall --clean --if-exists --username=postgres | gzip > /backup/immich-db-$(date +%F).sql.gz

建议写进 crontab 每天凌晨跑一次,同时保留最近 7 份。恢复时顺序是:先停容器,再导入数据库,最后恢复照片目录。

八、六个必踩的坑

  • 直接把 2283 暴露到公网:Immich 官方明确不推荐,公网暴露会被人扫到,注册接口一旦被滥用就是灾难。老老实实挂 VPN 或者加访问控制。
  • 照片存系统盘:跑几个月系统盘写满,PostgreSQL 无法写入,整个相册直接崩溃,而且这时候你连 SSH 都可能进不去。
  • 没有异地备份:本地硬盘坏掉这件事不是概率问题,是时间问题。至少要有一份离开这台机器的副本。
  • 升级前不备份:Immich 迭代很快,偶尔会有数据库结构变更,升级失败回滚很麻烦。每次 docker compose pull 之前都先导一次库。
  • App 里勾了删除本地文件:看起来省手机空间,实际是把风险放大一倍。
  • 把 Nginx 的 client_max_body_size 忘了改:症状是视频永远传不上去,日志里一堆 413,这个坑几乎人人踩一次。

九、小结

Immich 是少数「装上就能用、用起来像商业产品」的自托管方案:Docker Compose 一条命令拉起,手机 App 自动备份,人脸识别和地图浏览一个不缺,数据还完全握在自己手里。真正的门槛不在安装,而在两件事——把照片放在数据盘、把备份做出异地副本。把这两件事做扎实,你就有了一个不限容量、不会被涨价绑架的私人云相册。下次手机提示「存储空间不足」的时候,你可以从容地删掉本地文件,因为你知道它们安全地躺在自己的服务器上。

Last modification:October 13th, 2026 at 07:24 pm

Leave a Comment