跳到主要内容

Immich 照片管理:自托管 Google Photos 替代,Docker 30 分钟搞定

Immich 是 GitHub 60K+ Stars 的自托管照片和视频管理方案,支持人脸识别、智能搜索、自动备份、视频转码,完美替代 Google Photos。Docker 一键部署,30 分钟搞定,告别月费订阅,数据 100% 掌控在自己手中。

Google Photos 每月收你 $20 的记忆费。你可以免费拥有它们。

我已经在生产环境跑了 8 个月的 Immich——47,000 张照片、2,100 个视频、180GB 媒体文件。它替换了我全家的 Google Photos。下面是我踩过的所有坑。

Immich 是一个开源的、自托管的照片和视频管理方案,GitHub 60K+ Stars。它提供自动备份、机器学习驱动的人脸识别、物体检测、地图定位,以及一个同步体验和 Google Photos 一样丝滑的移动 App——但每一个字节都存在你自己的硬件上。

一句话总结: 30 分钟部署完,2 小时调好参数,然后你就忘了它的存在——这恰恰是一个备份系统该有的样子。


目录


为什么要自托管照片?

三个原因,按重要性排序:

  1. 隐私。你的照片被云端 AI 扫描——用于广告、用于索引、用于你根本没同意的用途。自托管意味着唯一读取你照片的实体就是你自己。

  2. 成本。Google One 2TB = $100/年。iCloud+ 2TB = $100/年。手机生命周期内就是 $800。一块 $200 的硬盘能跑一辈子。

  3. 没有厂商锁定。Google 砍了 Picasa。Google 砍了 Google Photos 无限存储。等他们砍下一个的时候,你的数据一起没了。


Immich vs Google Photos

功能Google PhotosImmich
存储15GB 免费,之后 $10/月无限(你自己的硬件)
人脸识别有(ML 驱动)
物体搜索有(“给我看狗的照片”)有(CLIP 向量嵌入)
位置/地图有(地图集成)
分享有(链接分享)有(共享库、相册)
手机自动备份有(iOS + Android)
视频播放有(转码支持)
RAW 支持部分有(完整 RAW 处理)
API有限完整 REST API
离线访问有(你的服务器)
数据所有权100% 你的

你会失去什么: Google 的搜索质量仍然更好。它的 AI 能找到”我们十月去的那家餐厅的照片”——Immich 在追赶但还没到那个水平。


Immich vs PhotoPrism

功能ImmichPhotoPrism
存储无限(你自己的硬件)无限(你自己的硬件)
人脸识别有(ML 驱动,InsightFace)有(基础人脸检测)
物体搜索有(CLIP 向量嵌入)无(仅标签搜索)
位置/地图有(地图集成)有(基础地图视图)
分享有(共享库、相册)有(公开链接)
手机自动备份有(iOS + Android 原生 App)无原生 App(仅 WebDAV 同步)
视频播放有(转码支持)有限(无转码)
RAW 支持有(完整 RAW 处理)有(RAW 处理)
API完整 REST API完整 REST API
离线访问有(你的服务器)有(你的服务器)
数据所有权100% 你的100% 你的
部署复杂度中等(4 个容器)简单(1-2 个容器)
资源占用较高(ML 服务需要 4GB+ 内存)较低(2GB 内存够用)

总结:Immich 如果你要 Google Photos 的替代品,需要手机自动备份和智能搜索。选 PhotoPrism 如果你只要一个轻量的照片库管理器,不需要手机自动同步。


Immich vs Lychee

功能ImmichLychee
存储无限(你自己的硬件)无限(你自己的硬件)
人脸识别有(ML 驱动)
物体搜索有(CLIP 向量嵌入)无(基础文本搜索)
位置/地图有(地图集成)有(基础地图)
分享有(共享库、相册)有(公开链接、相册)
手机自动备份有(iOS + Android 原生 App)无原生 App(手动上传)
视频播放有(转码支持)有(基础播放)
RAW 支持有(完整 RAW 处理)有(RAW 支持)
API完整 REST API完整 REST API
离线访问有(你的服务器)有(你的服务器)
数据所有权100% 你的100% 你的
部署复杂度中等(4 个容器)极简(1 个容器 + 数据库)
资源占用较高(ML 需要 4GB+ 内存)极低(512MB 内存)

总结:Immich 如果你要 ML 功能、手机备份和类 Google Photos 体验。选 Lychee 如果你要一个能跑在树莓派上的极简照片管理器。


Immich vs Nextcloud Photos

功能ImmichNextcloud Photos
存储无限(你自己的硬件)无限(你自己的硬件,Nextcloud 的一部分)
人脸识别有(ML 驱动)
物体搜索有(CLIP 向量嵌入)无(仅文件名/标签搜索)
位置/地图有(地图集成)有(照片应用带地图)
分享有(共享库、相册)有(Nextcloud 分享生态)
手机自动备份有(专用 App)有(通过 Nextcloud 移动端)
视频播放有(转码支持)有(基础播放)
RAW 支持有(完整 RAW 处理)有限(取决于查看器)
API完整 REST API完整 Nextcloud API
离线访问有(你的服务器)有(你的服务器)
数据所有权100% 你的100% 你的
部署复杂度中等(4 个容器)中等(Nextcloud 技术栈)
资源占用较高(ML 服务)中等(PHP + 数据库)

总结:Immich 如果照片是你的主要用途,想要最好的 ML 功能。选 Nextcloud Photos 如果你已经在用 Nextcloud 做文件同步,想把照片整合到现有的云存储平台里。


前置要求

  • 系统: Linux(推荐 Ubuntu 22.04+)
  • Docker & Docker Compose(v2)
  • 内存: 最低 4GB,ML 功能推荐 8GB+
  • 存储: 媒体文件大小 + 20% 余量(缩略图和 ML 数据)
  • 网络: 本地访问(局域网同步)或反向代理(远程访问)

还没装 Docker?一条命令搞定:

curl -fsSL https://get.docker.com | sh

安装部署

第一步:创建项目目录

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

第二步:下载环境变量文件

curl -o .env https://raw.githubusercontent.com/immich-app/immich/main/docker/example.env

必须改的配置: 至少把 .env 里这些值改了:

# ponytail: 不改的话后面会后悔
DB_PASSWORD=your-strong-password-here
UPLOAD_LOCATION=/path/to/your/photos  # 你的照片存储路径

第三步:下载 Docker Compose 文件

curl -o docker-compose.yml https://raw.githubusercontent.com/immich-app/immich/main/docker/docker-compose.yml

第四步:启动

docker compose up -d

首次启动需要 2-3 分钟(拉取镜像、初始化数据库)。用这个命令看日志:

docker compose logs -f

访问 http://你的服务器IP:2283——搞定,你已经跑起来了。

完整 docker-compose.yml(逐行注释)

下面是每个变量都解释清楚的 compose 文件:

# 不需要 version 字段——Docker Compose v2+ 已经忽略它了
name: immich

services:
  # 主服务:Web UI、API、照片/视频服务
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:release
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload  # 你的照片/视频存储
      - /etc/localtime:/etc/localtime:ro          # 容器时钟同步到宿主机
    env_file:
      - .env
    ports:
      - 2283:2283                                 # Web UI 端口
    depends_on:
      - database
      - redis
    restart: always

  # ML 模型:人脸检测、CLIP 智能搜索、重复检测
  immich-machine-learning:
    container_name: immich_machine_learning
    image: ghcr.io/immich-app/immich-machine-learning:release
    volumes:
      - model-cache:/cache                        # 持久化模型权重
    env_file:
      - .env
    restart: always

  # Postgres + pgvector,用于 ML 嵌入向量和元数据
  database:
    container_name: immich_postgres
    image: tensorchord/pgvecto-rs:pg14-v0.2.1
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: immich
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_INITDB_ARGS: '--data-checksums'
    volumes:
      - pgdata:/var/lib/postgresql/data           # 数据库文件
    env_file:
      - .env
    restart: always

  # Redis:缓存、任务队列、会话管理
  redis:
    container_name: immich_redis
    image: redis:7-alpine
    healthcheck:
      test: redis-cli ping || exit 1
    restart: always

volumes:
  pgdata:        # postgres 数据
  model-cache:   # ml 模型权重

坑 #1: pgvecto-rs 镜像在某些 ARM 环境下不兼容。如果你用树莓派或 ARM64,用 tensorchord/pgvecto-rs:pg14-v0.2.1——去 Immich 官方文档查最新的 ARM 兼容镜像。


配置详解

真正重要的环境变量

变量默认值作用我的建议
DB_PASSWORD(必填)Postgres 密码用一个强随机字符串
UPLOAD_LOCATION(必填)照片存储位置专用磁盘或挂载点
JWT_SECRET(自动生成)认证令牌签名不知道在干嘛就别动
IMMICH_MACHINE_LEARNING_URLhttp://immich-machine-learning:3003ML 服务地址不自定义 ML 就别改
UPLOAD_LIMIT300最大上传大小(MB)4K 视频用户改成 10000

存储目录结构

用几周之后,你的上传目录长这样:

/upload/
├── library/          # 原始文件,按用户组织
├── thumbnail/        # 生成的缩略图(多种尺寸)
├── encoded-video/    # 转码后的视频文件
├── upload/           # 上传暂存区
└── sidecar/          # EXIF 元数据文件

经验法则: 总存储预算 = 原始媒体大小 × 1.5(缩略图 + ML 数据 + 原始文件)。


首次设置

  1. 打开 http://你的服务器IP:2283
  2. 创建管理员账号
  3. 开启 ML 功能(设置 → 机器学习):
    • 人脸检测:开启
    • CLIP 嵌入:开启(智能搜索用)
    • 重复检测:开启
  4. 设置存储模板(设置 → 存储模板):
{{y}}/{{MM}}/{{filename}}

这样上传的文件会自动组织成 2026/06/photo.jpg——干净、可预测。


移动端设置

安装

连接

  1. 打开 App → 设置 → 服务器
  2. 输入 http://你的服务器IP:2283(如果用了反向代理就用 https://
  3. 用你的管理员账号登录
  4. 开启 后台备份(设置 → 备份):
    • 选择要备份的相册
    • 设置上传大小限制
    • 开启 仅 WiFi 上传(省流量)

首次同步预期

  • 首次上传 10,000 张照片需要 2-8 小时(取决于网速)
  • 初始同步期间 App 要保持前台运行(iOS 限制)
  • 初始同步完成后,WiFi 下新照片几秒钟就能看到

坑 #2: iOS 后台上传不稳定。Apple 会限制后台 App 刷新频率。最佳实践:每天打开一次 App,让它把积压的传完。


机器学习功能

Immich 使用了多个 ML 模型(官方文档)。下面逐个说:

人脸检测与识别

  • 模型: InsightFace
  • 作用: 找到人脸,按人物分组,支持命名
  • 内存: 处理时约 2GB
  • 准确率: 清晰人脸约 90%,合照/侧脸会低一些

CLIP 嵌入

  • 模型: OpenCLIP
  • 作用: 启用”智能搜索”——用描述找照片,比如”海滩上的日落和一只狗”
  • 内存: 处理时约 4GB
  • 速度: 现代硬件上约 100 张/分钟

重复检测

  • 作用: 找到视觉相似的照片,方便清理
  • 最佳使用场景: 从多个来源导入后

关闭 ML(内存不够时)

# 在 docker-compose.yml 里,移除或禁用:
# immich-machine-learning 服务

或者在 .env 里设置 IMMICH_MACHINE_LEARNING_ENABLED=false。你会失去人脸识别和智能搜索,但其他功能都正常。


性能调优

大型照片库(50K+ 张)

# 增加 Postgres 共享缓冲区
# 在 docker-compose.yml 的 database 服务下加:
command: postgres -c shared_buffers=512MB -c effective_cache_size=2GB

上传慢

# 增加上传限制(在 .env 里)
UPLOAD_LIMIT=10000  # 10GB,4K 视频用

低内存系统(4GB)

  • 关闭机器学习(IMMICH_MACHINE_LEARNING_ENABLED=false
  • 只用缩略图生成(关闭 CLIP)
  • Postgres 设置为 256MB shared_buffers

监控

# 查看资源占用
docker stats

# 查看日志
docker compose logs -f immich_server
docker compose logs -f immich_machine_learning

常见坑与解决方案

1. 手机端”上传失败”

原因: 默认上传限制是 300MB。4K 视频超了。

解决:.env 里设置 UPLOAD_LIMIT=10000,然后 docker compose restart

2. 人脸没检测到

原因: ML 容器没跑起来或内存不够。

解决:

docker compose ps  # 检查 ML 容器状态
docker compose logs immich_machine_learning  # 看有没有 OOM 错误

如果是 OOM:加内存或暂时关掉 ML。

3. 外部库不显示

原因: 卷挂载路径不对。

解决: 确保 docker-compose.yml 里的路径和你实际的存储位置一致:

volumes:
  - /mnt/photos:/usr/src/app/upload

而且这个路径要让容器用户有访问权限。

4. PostgreSQL 连接被拒绝

原因: 数据库容器没启动成功(通常是密码不匹配)。

解决: 检查 .env 和 Postgres 期望的是否一致。如果搞乱了:

docker compose down -v  # 警告:会删除数据库
docker compose up -d    # 重新来过

5. 缩略图看起来模糊

原因: 低质量缩略图生成。

解决: 不是 bug——Immich 会生成多种尺寸。“模糊”的预览先加载,完整质量的稍后加载。去设置 → 缩略图配置检查。


备份策略

3-2-1 原则: 3 份副本,2 种不同介质,1 份异地。

# 简单的 rsync 备份到外部硬盘
rsync -av --progress /path/to/immich/upload/ /mnt/backup/immich/

# 用 cron 自动化(每天凌晨 3 点)
0 3 * * * rsync -av /path/to/immich/upload/ /mnt/backup/immich/

数据库备份:

# $DB_USERNAME 来自你的 .env(默认:postgres)
docker exec immich_postgres pg_dump -U "$DB_USERNAME" immich > immich_db_backup.sql

坑 #3: 别只备份数据库——/upload 目录也要备份。数据库存的是元数据,你的实际照片在 /upload 里。


FAQ

能从 Google Photos 迁移到 Immich 吗?

能。用 Immich CLI 通过 API 上传,或者用手机 App 重新上传(你的手机里本来就有照片)。没有自动的 Google Photos 导入——你需要先从 Google Takeout 导出。

Immich 支持 RAW 照片吗?

支持。它能处理 RAW 文件并生成预览。Lightroom DNG、Canon CR2/CR3、Sony ARW、Nikon NEF——全支持。

能和非 Immich 用户分享相册吗?

能。公开分享链接,可选密码保护。查看不需要账号。

Immich 和 PhotoPrism 有什么区别?

ImmichPhotoPrism
移动端优秀(原生 App)不错(PWA)
自动备份有(后台运行)无(手动)
ML 模型更多(人脸、CLIP、重复检测)较少(仅人脸)
界面类 Google Photos更偏桌面端
社区60K+ Stars35K+ Stars

我的看法: 要 Google Photos 替代品就选 Immich。要照片库管理器就选 PhotoPrism。

我到底需要多少内存?

  • 4GB: 关掉 ML,存储和查看体验依然很好
  • 8GB: 完整 ML 功能,50K+ 张照片流畅运行
  • 16GB+: 除非你跑 100K+ 张照片且全开 ML,否则用不上

能在反向代理后面用 Immich 吗?

能。看官方反向代理文档。Nginx、Caddy、Traefik、Coolify 都支持。

不想折腾反向代理?用 Tailscale + Headscale 搭零配置 VPN,手机和电脑直接访问 Immich,无需暴露端口到公网。

该选哪个:Immich vs PhotoPrism vs Lychee?

使用场景推荐
Google Photos 替代品Immich — 原生手机备份、智能搜索、人脸识别
低资源硬件上的照片库Lychee — 512MB 内存就能跑,极简
桌面端照片库管理器PhotoPrism — 界面干净,元数据工具不错
已经在用 NextcloudNextcloud Photos — 不用再加一套技术栈
隐私优先、功能极简Lychee — 攻击面最小

一句话: Immich 功能最全。PhotoPrism 最均衡。Lychee 最轻。如果你已经有 Nextcloud,先用它的照片应用,别再加一个服务。


下一步


从 2025 年 10 月开始跑 Immich。47K 张照片,零数据丢失,$0/月。这就是卖点。

阅读模式: 文章
机场节点
稳定高速
多节点覆盖
性价比高