Immich 部署教程:自托管你的 Google Photos 替代

Google Photos 一直是个”好用但不完全属于你”的产品。把十几年的家庭照片和视频交到第三方手里,账户被封、订阅涨价、隐私政策变动……任何一件事都足以让人警觉。Immich 是一个开源的自托管照片视频管理方案,定位就是做 Google Photos 的本地替代——界面现代、功能完整(人脸识别、对象识别、全局地图、相册分享、CLIP 搜索都齐全),而且代码以 AGPL v3 协议开源,文档和社区都很活跃。

不过在动手之前,需要记住 Immich 官方 README 里那条加粗的警告:

> ⚠️ Always follow 3-2-1 backup plan for your precious photos and videos!

自托管意味着数据备份的责任完全在你头上。下面进入部署流程。

Immich Web 端主界面截图,展示相册时间线、地图视图和人脸聚类侧栏-1
📷 KOBU Agency / Unsplash License / 来源

### 前置准备

Immich 官方推荐用 Docker Compose 部署,因为它由多个容器协同工作。部署前需要确认以下几项:

  • Docker 与 Docker Compose:推荐较新的 Docker Engine,旧版本可能对 compose 语法不兼容。具体要求请参考官方文档。
  • 内存:至少 2 GB 起步。机器学习容器(用于人脸识别、CLIP、对象识别)比较吃内存,4 GB 以上会比较从容;如果机器本身内存紧张,下文会讲如何关闭 ML 功能。
  • 存储空间:取决于你要导入的相册大小。机械硬盘也能跑,但 SSD 体验更好。
  • 域名与公网 IP(可选):如果想在公网访问、给手机 App 当外网备份服务器,建议准备一个域名并配上 HTTPS。
  • 反向代理:Nginx、Caddy、Traefik 任选其一,本文以 Nginx 为例。

准备 docker-compose.yml 和 .env

Immich 把 compose 文件和 env 模板放在官方 GitHub 仓库的 release 资源里。部署前先把它们下载到本地目录,然后编辑 .env

mkdir -p ~/immich && cd ~/immich

# 下载 compose 文件(请以官方仓库 release 页最新链接为准)
wget https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml

# 下载环境变量模板,并改名为 .env
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env

下载完之后,目录里会得到两个文件:docker-compose.yml.env。compose 文件描述了 Immich 的全套服务,包括:

  • immich-server:核心 API 服务
  • immich-web:前端静态资源
  • postgres:元数据存储(用户、相册、标签、人脸聚类等)
  • redis:缓存与任务队列
  • immich-machine-learning:CLIP、人脸、对象识别模型

容器之间通过内部网络通信,对外只暴露 2283 端口(Web UI 与 API 共用)。

配置 .env 关键变量

.env 文件里的项比较多,但真正需要你手动改的只有几个:

变量 含义 建议
UPLOAD_LOCATION 上传的照片和视频存储路径 指向大容量盘,例如 /mnt/data/immich
DB_PASSWORD PostgreSQL 数据库密码 用一个随机字符串,别留默认值
DB_USERNAME 数据库用户名 一般保持 postgres 即可
DB_DATABASE_NAME 数据库名 一般保持 immich 即可
REDIS_PASSWORD Redis 密码(如果有) 同上,随机字符串
IMMICH_VERSION 锁定的镜像版本 tag 留空跟踪 latest,或固定具体版本便于回滚

UPLOAD_LOCATION 是最重要的一个:这是你所有照片视频”物理上”落盘的地方。提前把它指向一块大容量、独立于系统盘的目录,能省去后期迁移的麻烦。

.env 文件在编辑器中的样子,标注出 UPLOAD_LOCATION、DB_PASSWORD 等关键变量-2
📷 Pankaj Patel / Unsplash License / 来源

### 启动服务

配置完成后,在 ~/immich 目录下执行:

docker compose up -d

第一次启动会比较慢,因为要拉取 PostgreSQL、Redis 以及 ML 相关的镜像,其中机器学习镜像体积较大。可以用 docker compose logs -f immich-server 观察启动日志,直到看到 Immich Server is listening 之类的提示,说明服务跑起来了。

浏览器访问 http://服务器IP:2283,应该能看到 Immich 的登录页。

创建管理员账号

打开 Web UI 后,会让你注册第一个账号。首个注册的用户会自动获得管理员权限,后续注册的用户则是普通用户。创建完成后,建议立即:

  • 在管理后台把”开放注册”关掉,避免被人随便注册
  • 给自己的账号设置强密码或接入 OAuth
  • 确认管理员的存储配额策略

移动端连接与自动备份

Immich 提供 iOS 和 Android 客户端,是真正意义上的”原生 App”,不是 PWA。在应用商店或 GitHub Release 里下载安装。

首次打开 App,会让你填 Server Endpoint URL

  • 如果只是局域网内用,填 http://服务器局域网IP:2283
  • 如果是公网访问,填你配置好的域名,比如 https://photos.example.com

登录成功后,进入设置开启 Auto Backup,可以选择备份哪些相册、是否包含视频、是否在仅 Wi-Fi 下备份等。手机端的体验和 Google Photos 已经很接近:时间线、人脸、地图、相册一应俱全。

### 数据持久化与备份策略

Immich 的数据分布在以下几处,备份时一个都不能漏:

  1. UPLOAD_LOCATION:照片和视频本体,最重要
  2. PostgreSQL 数据卷:元数据、人脸聚类、标签、收藏、相册结构
  3. Redis 数据卷:缓存与临时任务
  4. 机器学习缓存卷:模型推理的中间结果

最容易犯的错是”只备份了照片文件夹,忘了数据库”。如果只备份了 UPLOAD_LOCATION,数据库里的相册、标签、人脸聚类全没了,下次导入时 Immich 会把同一批照片当成新内容入库,体验直接归零。

Immich 自身也提供了”External Library”(外部库)和”Upload Library”(上传库)两种导入方式。External Library 是只读挂载你已有的目录结构,Immich 不会动原文件;Upload Library 则是 Immich 自己管理上传目录。建议把历史照片用 External Library 导入,把日常手机备份走 Upload Library,两者职责分明。

备份策略严格遵循 3-2-1:至少 3 份副本、2 种介质、1 份异地。rsync + 加密云盘(如 Backblaze B2、S3、加密的网盘)是比较常见的组合。

反向代理与 HTTPS

如果要在公网访问,必须套一层反向代理并启用 HTTPS。以 Nginx 为例,一个最小可用的 server 配置:

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; # 关键:Immich 上传视频经常很大

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";
}
}

其中 client_max_body_size 必须调大,否则上传稍大的视频就会被 Nginx 直接拒绝,返回 413 错误。Immich 官方推荐给到 50000M 甚至更高,具体上限根据你打算上传的单文件大小决定。

 

机器学习容器:内存吃紧怎么办

immich-machine-learning 是吃内存大户。它要在内存里加载 CLIP、人脸识别、对象识别模型,常驻占用相当可观。在小内存机器(比如 2 GB 的 VPS)上,很容易出现 OOM(Out of Memory)被系统杀掉。

几种应对方案:

  • 在 .env 里关掉 ML 容器:compose 文件中可以把 immich-machine-learning 服务整体注释掉,对应的搜索/智能功能会降级,但照片视频管理主体功能不受影响。
  • 关闭部分智能功能:在管理员设置里禁用面部识别、对象识别、CLIP 搜索中的某几项,能让 ML 容器内存压力降低。
  • 换更小的模型:Immich 支持切换到量化版或更小的模型变体,具体配置请参考官方文档关于 ML 的章节。

升级与数据库迁移

Immich 更新很快,新版本经常会带数据库结构变更。直接拉 latest 镜像重启可能会出问题。官方建议的升级流程大致是:

  1. 查看 release notes,确认是否有 breaking change
  2. 拉取新版 compose 文件和 .env 模板,对照合并自定义项
  3. docker compose pull && docker compose up -d
  4. 观察日志,确认数据库 migration 成功执行
  5. 再观察一段时间,确认功能正常再删掉旧镜像

跳过 migration 步骤是 Immich 升级最常见的坑。

收尾

部署完 Immich 之后,建议至少花一个晚上验证一遍:手机 App 自动备份是否成功、Web 端能否正常浏览、人脸聚类是否跑出结果、相册分享链接是否可用。任何一个环节出问题,都比”等真出事再修”要好得多。

如果想了解 Immich 在功能完整度、性能、易用性上和其他自托管相册方案的横向对比,可以看这篇详细的 Immich 评测

记住官方那句警告:自托管的代价是”备份是你自己的事”。把 3-2-1 跑通,再谈替代 Google Photos。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。