自建私人相册 Immich:把 VPS 变成不会删你照片的 Google Photos

怕 Google 相册删图、嫌 iCloud 贵?用 Immich + VPS 自建照片备份,自动备份、人脸相册、全文搜索,数据自己说了算。

这两年"云相册翻车"的新闻没断过:Google 相册误判违规直接删图、iCloud 年年涨价、厂商拿你家人照片训练 AI 的传闻不断。很多人真实的诉求很简单——要一个"像 Google Photos 一样好用,但数据完全在自己手里"的东西。答案就是 Immich:一个开源、自托管的照片和视频管理平台,界面和体验几乎复刻 Google Photos,却安安静静跑在你自己的 VPS 上。本文手把手讲清它的架构、最低配置、Docker 部署、手机自动备份、从 Google 相册迁移,以及最关键的——怎么把照片真正备份到对象存储,避免"VPS 一挂,回忆全没"。先记住一句话:Immich 是管理平台,不是备份方案,真正守住照片安全的是你自己的 3-2-1 备份策略。

延伸阅读

更多相关攻略推荐:Ollama AI系列(2):VPS上的AI推理与API应用Ollama AI系列(2):VPS上的AI推理与API应用ARM / Ampere 席卷 VPS:性价比真香还是兼容陷阱?【VPS 硬件选型指南 (内存 篇) 02】大内存 VPS 能干嘛?2026 独立站 PCI-DSS 自查清单:SAQ A 还是 A-E

一、Immich 到底是什么,能吃满哪些功能

Immich 不是简单的"网盘相册",它是一个完整的照片管理中枢。核心体验包括:手机端 iOS / Android 自动后台备份,支持 HEIC、RAW、Live Photos 和任意大小的视频;AI 人脸识别,把同一个人自动归到一组,你给名字它就能找出此人全部照片;基于 CLIP 模型的语义搜索,直接用"2023 海滩""生日蛋糕""狗 操场"这种大白话出图;时间线按日期浏览、相册共享、合作伙伴双向共享、地图视图按 GPS 标点,还有"那年今日"回忆。官方把它标为 beta,但用于个人日常已经相当成熟。

和 Google Photos 比,Immich 最大的卖点就是隐私:照片全程不经过任何第三方,不会被拿去训练模型,原图原样存放。它同时提供 amd64 和 arm64 两种镜像,无论是常见 x86 VPS 还是 ARM 芯片的机器都能跑,ARM 机型通常更便宜,是低价自托管相册的好选择。一个必须反复强调的前提:Immich 自己不替代备份策略,你仍然需要一份独立于 Immich 的照片副本,否则它若成为唯一副本,等于没备份。

二、最低配置与硬件选型

截至 2026 年 8 月,Immich 最新稳定版是 v3.1.0,走 v3 发布线。官方文档给出的底线是:内存 6GB 最低、8GB 推荐;CPU 2 核最低、4 核推荐。但实践中 4GB 机器也能跑——前提是关掉机器学习;想完整体验人脸识别和语义搜索,至少 8GB 才舒服。一个硬性门槛要留意:amd64 的机器学习容器需要 x86-64-v2 指令集,基本覆盖 2012 年之后出厂的大部分 CPU,太老的 U 会直接起不来而不是变慢。

存储方面有个常被忽略的坑:PostgreSQL 数据库目录必须落在支持 Unix 权限的文件系统上,比如 EXT4、ZFS、BTRFS、XFS 或 APFS。千万不要把数据库放在 NTFS、exFAT 格式的移动硬盘或 Windows 共享盘上,否则数据库会直接起不来。系统盘用 SSD 最佳,因为数据库的随机读写延迟直接决定相册浏览是否卡顿,而原图目录对速度的要求反而没那么高。四个核心容器各吃不同内存:immich-server 负责 Web、API 和后台任务队列;immich-machine-learning 加载人脸与搜索模型,最吃内存,满载约 1.5GB 模型驻留;redis(新版改用 Valkey)最小;PostgreSQL 带向量扩展存全部元数据和搜索向量,官方给的硬性下限是至少 2GB 且必须落在本地 SSD,绝不可挂网络盘,因为向量查询是小随机读,网络盘每次都变成一次往返。

原图之外 Immich 还会生成缩略图和转码视频,整体比原图大约多 10% 到 20%。更具体的"存储账"是这样的:iPhone HEIC 单张约 2–4MB、安卓 JPEG 约 3–6MB、微单 JPEG 约 8–15MB、微单 RAW 约 20–50MB;手机 1080p 视频约 120MB/分钟、4K 约 350MB/分钟。经验值是 5 千张≈25–50GB、2 万张≈100–200GB、5 万张≈250–500GB、10 万张以上建议 1TB 起步。一个 iPhone 用户 5 年的照片库通常 150–300GB,四口之家共享轻易突破 500GB,所以选 VPS 务必挑盘能扩的套餐。

预算 VPS 怎么选:瓶颈通常是"存储"而非"算力",逻辑和建站相反——要大硬盘加够用内存。想要物美价廉的大存储,Contabo 的 Storage VPS 很对口(4 核/8GB/400GB 约 8.49 美元/月、8GB/800GB 约 13.99 美元/月);想便宜练手,RackNerd 年付特价内存给得大方(8GB/6 核/150GB 年付约 62.49 美元),但它系统盘只有 150GB,更适合挂大存储当计算节点或先低成本试水。照片已在 200GB 以上、准备长期当家庭相册中心,直接上 Contabo;只是想先跑通流程,RackNerd 更香。两者都支持 Docker、都能加挂块存储。

三、部署前准备与 Docker Compose 部署

先准备一台 Ubuntu 22.04/24.04 或 Debian 12 的 VPS,一个解析到这台机器的域名(如 photos.example.com),以及够大的磁盘。第一步更新系统并开防火墙,只放行必要端口:

apt update && apt full-upgrade -y
apt install -y ca-certificates curl wget ufw
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw --force enable

第二步装 Docker(务必用 Docker 官方仓库版本,系统源里的旧版 Compose 语法可能不兼容):

curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
docker compose version

注意命令是空格分隔的 docker compose(v2 插件),不是老旧的连字符 docker-compose,后者 Immich 已不支持。官方直接提供一份 docker-compose.yml 和 example.env,下载就能用,不必从零拼:

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

然后改 .env 几处关键项:UPLOAD_LOCATION 指向一块空间充裕的目录(照片视频真正落盘的位置);DB_DATA_LOCATION 是数据库目录,必须放在前面说的 Unix 文件系统本机 SSD 上;DB_PASSWORD 改成强密码,可用 openssl rand -base64 24 | tr -dc 'A-Za-z0-9' | head -c 24 生成;TZ=Asia/Shanghai 设时区;IMMICH_VERSION 设成 release 用最新稳定版(想受控升级就写死具体版本号)。最后拉起:

mkdir -p /opt/immich/library /opt/immich/postgres
cd /opt/immich
docker compose up -d
docker compose logs -f --tail=100

首次启动会拉取约 3GB 镜像(Postgres、Redis、server、ML),3–6 分钟。看到 "Immich Server is listening on port 2283" 说明 API 起来了,浏览器临时打开 http://服务器IP:2283 创建管理员账号即可。测试阶段裸 IP 访问没问题,但长期公网暴露 2283 既不方便也不安全,下一步要收到反代后面。

四、反向代理 + HTTPS:让公网安全访问

对外暴露一定要走反向代理,否则照片是明文传输、管理入口直接裸露公网。推荐用 Caddy 最简单,一份 Caddyfile 把 photos.example.com 反代到 127.0.0.1:2283 并自动申请续期 Let's Encrypt 证书,之后在手机 App 里把服务器地址改成 https 域名。更稳妥的做法是把 compose 里的端口改成只监听本机 127.0.0.1:2283,这样外部只能走域名访问。如果你更习惯 Nginx,配置稍多但可控;照片视频很大,务必放大上传体量和超时:

server {
    listen 80;
    server_name photos.example.com;
    client_max_body_size 5G;
    proxy_read_timeout 600s;
    proxy_send_timeout 600s;
    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;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

启用后 nginx -t && systemctl reload nginx,再用 certbot --nginx -d photos.example.com 申请证书即可。重点是"不要让 2283 裸露在公网",而不是纠结用哪个反代。

五、机器学习内存调优:4GB 也能跑的窍门

immich-machine-learning 默认在 CPU 上跑,不需要 GPU,但首次调用会加载约 1.5–2GB 模型进内存,CLIP 语义搜索比人脸识别更费内存;模型空闲 5 分钟会自动卸载(由 MACHINE_LEARNING_MODEL_TTL 控制,默认 300 秒,可下调到 60 让内存更快释放)。内存紧张的 VPS 有三个立竿见影的省内存办法:

  • 直接关掉 ML:在 docker-compose 里注释掉 immich-machine-learning 服务块,或在 .env 设 IMMICH_MACHINE_LEARNING_ENABLED=false。代价只是失去人脸识别和语义搜索,照片浏览、共享、相册管理照常,2GB 机器也能轻松跑。
  • 换小模型:不彻底关,只是把人脸模型从默认的 buffalo_l 换成更小的 buffalo_s,精度略降但更快更省。
  • 限核限资源:在 compose 的 ML 段加 deploy.resources.limits.cpus: '2.0' 限核,并在 .env 调小 TTL、给各容器加 cpus: 1.00, memory: 1G 上限(内存限制过低会触发容器被杀,要谨慎)。初次扫描是能耗高峰,建议把 ML 并发调到 1、转码线程调低,必要时加 2–4GB swap 救命。

参考一台 8GB 与一台 4GB VPS 的组件内存分布:immich-server 约 500MB;immich-machine-learning 约 1.5–2GB(关掉则为 0);PostgreSQL 约 500MB–1GB;Redis(Valkey) 约 50MB;系统+Docker 开销约 1GB。4GB 机器关掉 ML 后还剩约 2GB 余量日常够用;开着 ML 基本贴着上限。ML 是一次性成本,扫完之后新照片都是秒级处理。

六、手机客户端自动备份

在 App Store、Google Play 或 F-Droid 搜 Immich 装上,填服务器地址(内网友好用 IP,外网用 https 域名)加管理员账号登录,进设置打开"自动备份",建议勾选"仅 WiFi 时备份"省流量。第一次会把整库上传,几万张照片可能要跑一整夜,耐心等它跑完。上传完成后,机器学习流水线在后台做人脸聚类和语义索引,耗时几小时到几天,取决于库大小。人脸识别跑完给每个人命名,之后搜"狗 操场""日落"都能直接出图。需要提醒的是 HEIC 和 Live Photos 都能备份,但跨平台预览依赖服务端转码,会比较吃 CPU;如果只在同生态设备看,可以关掉转码省资源。

两个平台差异的坑要注意:安卓后台上传相对可靠,但必须到系统设置把 Immich 加入"电池优化"白名单,否则系统会杀掉后台进程;iOS 受苹果限制,后台上传只能尽力而为,通常要每天打开 App 一次把队列冲掉,没有根治办法。首传别一上来就推几万张,先挑一个小测试相册,确认 Web 端能看到、磁盘增长符合预期,再逐步放开全部相册。Immich 的"外部相册"功能还能直接把服务器上已有的照片目录挂载进来做索引,不必先上传一遍,老照片归档特别方便。

七、从 Google 相册迁移过来

如果你是从 Google Photos 迁出,流程很顺:先到 takeout.google.com 只导出 Google 相册,下载后用 immich-go 这类 CLI 工具导入,可保留原始时间戳、GPS 和相册结构,约每 50GB 源数据耗时 1 小时。关键原则:别急着删云端原库。先在 Immich 把整库备份完、确认人脸和搜索都跑通,再保留 Google Takeout 的导出包作为额外的一份冷备,double check 无误后再决定要不要退订。这样迁移全程零风险。

八、存储扩展与备份到对象存储

Immich 的数据分两块:原图 / 视频躺在 UPLOAD_LOCATION,数据库元数据(含搜索向量)在 PostgreSQL 里。Immich 自带的定时库备份只存元数据、不含原图,路径在 UPLOAD_LOCATION/backups,不能完全依赖。所以真正的"照片保险"要另做:用 rclone 把整个 UPLOAD_LOCATION 同步到 S3 兼容的对象存储,比如 Backblaze B2、Wasabi 或自建 MinIO。先交互式建一个 remote:

rclone config
# 选 b2,填 Application Key ID 和 Application Key
[b2]
type = b2
account = 你的应用密钥ID
key = 你的应用密钥

然后增量同步原图目录:

rclone sync /mnt/photos/immich-library b2:你的桶名 -P --transfers 10 --fast-list

数据库单独用 PostgreSQL 自己的工具导出再传(绝不要直接拷贝运行中的数据库文件,否则极易得到损坏、无法恢复的备份;备份前可先停掉 immich-server 容器,数据库容器不停,pg_dump 在它运行时也能用,这样能保证数据库和媒体文件在同一时刻一致):

docker exec -t immich_postgres pg_dumpall --clean --if-exists --username=postgres | gzip > immich_dump.sql.gz
rclone sync immich_dump.sql.gz b2:你的桶名

把同步做成定时任务才真正省心。在 crontab 里加两行,让机器每天自己增量同步:

# 每天凌晨 3 点把原图增量同步到对象存储
0 3 * * * rclone sync /mnt/photos/immich-library b2:你的桶名 --fast-list >> /var/log/immich-bak.log 2>&1
# 每天凌晨 4 点单独备份数据库元数据
0 4 * * * docker exec -t immich_postgres pg_dumpall --clean --if-exists --username=postgres | gzip > /mnt/photos/immich_dump.sql.gz && rclone sync /mnt/photos/immich_dump.sql.gz b2:你的桶名

遵循 3-2-1 原则:原图在 VPS 一份、数据库 dump 在对象存储一份、关键回忆再加一份本地冷备或另一家云。如果追求加密去重,restic 是 rclone 之外的好选择——单文件二进制默认 AES-256 加密、支持去重,能直接备份到 B2/Wasabi/S3,首备后每天只传变化的块,100–200GB 不可再生数据云账单往往只要每月 1–2 美元。顺手把 .env 和反向代理配置也一起备份,灾难恢复能省下几天重建时间。最重要的一条:定期真的去还原一次。没还原过的备份只能叫"希望",不是备份;可借 Healthchecks.io 这类免费服务监控备份任务,哪天静默失败能立刻收到告警。

九、升级与运维避坑

Immich 迭代很快,别无脑自动升级——它不支持降级,升挂了只能靠备份回滚。升级前先读 release notes、备份 .env 和 compose、导一份数据库,再拉新镜像:

cd /opt/immich
cp .env .env.bak.$(date +%F)
docker compose pull
docker compose up -d

长期运维要点:监控上传目录剩余空间(df -hdocker system df),磁盘满了新上传会失败但服务还在跑,容易被忽略;数据库必须留在本机 SSD,别图省事挂网络盘;多用户家庭场景可在 Administration 里建多个账号、设配额、开共享相册。如果你的照片已超过 1TB 还在每天涨,小 VPS 可能不是最佳归宿——块存储扩容、出站流量、异地备份、恢复时间都得算账,那时家用 NAS 或混合方案更合适。照片库这种长期增长的数据,最终瓶颈是存储和备份,不是安装命令。

延伸阅读:想把 Immich 和别的自托管服务一起编排,参考 VPS 自托管全家桶编排;照片备份本质上也是数据保护,系统化的策略看 VPS 快照与备份策略;想要大硬盘来装照片,对比一下 Contabo 大存储机型评测