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 小时调好参数,然后你就忘了它的存在——这恰恰是一个备份系统该有的样子。
目录
- 为什么要自托管照片?
- Immich vs Google Photos
- Immich vs PhotoPrism
- Immich vs Lychee
- Immich vs Nextcloud Photos
- 前置要求
- 安装部署
- 配置详解
- 首次设置
- 移动端设置
- 机器学习功能
- 性能调优
- 常见坑与解决方案
- 备份策略
- FAQ
为什么要自托管照片?
三个原因,按重要性排序:
-
隐私。你的照片被云端 AI 扫描——用于广告、用于索引、用于你根本没同意的用途。自托管意味着唯一读取你照片的实体就是你自己。
-
成本。Google One 2TB = $100/年。iCloud+ 2TB = $100/年。手机生命周期内就是 $800。一块 $200 的硬盘能跑一辈子。
-
没有厂商锁定。Google 砍了 Picasa。Google 砍了 Google Photos 无限存储。等他们砍下一个的时候,你的数据一起没了。
Immich vs Google Photos
| 功能 | Google Photos | Immich |
|---|---|---|
| 存储 | 15GB 免费,之后 $10/月 | 无限(你自己的硬件) |
| 人脸识别 | 有 | 有(ML 驱动) |
| 物体搜索 | 有(“给我看狗的照片”) | 有(CLIP 向量嵌入) |
| 位置/地图 | 有 | 有(地图集成) |
| 分享 | 有(链接分享) | 有(共享库、相册) |
| 手机自动备份 | 有 | 有(iOS + Android) |
| 视频播放 | 有 | 有(转码支持) |
| RAW 支持 | 部分 | 有(完整 RAW 处理) |
| API | 有限 | 完整 REST API |
| 离线访问 | 无 | 有(你的服务器) |
| 数据所有权 | 无 | 100% 你的 |
你会失去什么: Google 的搜索质量仍然更好。它的 AI 能找到”我们十月去的那家餐厅的照片”——Immich 在追赶但还没到那个水平。
Immich vs PhotoPrism
| 功能 | Immich | PhotoPrism |
|---|---|---|
| 存储 | 无限(你自己的硬件) | 无限(你自己的硬件) |
| 人脸识别 | 有(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
| 功能 | Immich | Lychee |
|---|---|---|
| 存储 | 无限(你自己的硬件) | 无限(你自己的硬件) |
| 人脸识别 | 有(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
| 功能 | Immich | Nextcloud 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_URL | http://immich-machine-learning:3003 | ML 服务地址 | 不自定义 ML 就别改 |
UPLOAD_LIMIT | 300 | 最大上传大小(MB) | 4K 视频用户改成 10000 |
存储目录结构
用几周之后,你的上传目录长这样:
/upload/
├── library/ # 原始文件,按用户组织
├── thumbnail/ # 生成的缩略图(多种尺寸)
├── encoded-video/ # 转码后的视频文件
├── upload/ # 上传暂存区
└── sidecar/ # EXIF 元数据文件
经验法则: 总存储预算 = 原始媒体大小 × 1.5(缩略图 + ML 数据 + 原始文件)。
首次设置
- 打开
http://你的服务器IP:2283 - 创建管理员账号
- 开启 ML 功能(设置 → 机器学习):
- 人脸检测:开启
- CLIP 嵌入:开启(智能搜索用)
- 重复检测:开启
- 设置存储模板(设置 → 存储模板):
{{y}}/{{MM}}/{{filename}}
这样上传的文件会自动组织成 2026/06/photo.jpg——干净、可预测。
移动端设置
安装
- iOS: App Store
- Android: Google Play 或 F-Droid
连接
- 打开 App → 设置 → 服务器
- 输入
http://你的服务器IP:2283(如果用了反向代理就用https://) - 用你的管理员账号登录
- 开启 后台备份(设置 → 备份):
- 选择要备份的相册
- 设置上传大小限制
- 开启 仅 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 有什么区别?
| Immich | PhotoPrism | |
|---|---|---|
| 移动端 | 优秀(原生 App) | 不错(PWA) |
| 自动备份 | 有(后台运行) | 无(手动) |
| ML 模型 | 更多(人脸、CLIP、重复检测) | 较少(仅人脸) |
| 界面 | 类 Google Photos | 更偏桌面端 |
| 社区 | 60K+ Stars | 35K+ 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 — 界面干净,元数据工具不错 |
| 已经在用 Nextcloud | Nextcloud Photos — 不用再加一套技术栈 |
| 隐私优先、功能极简 | Lychee — 攻击面最小 |
一句话: Immich 功能最全。PhotoPrism 最均衡。Lychee 最轻。如果你已经有 Nextcloud,先用它的照片应用,别再加一个服务。
下一步
- Coolify:一键自托管 PaaS — 一键部署 Immich 和其他服务
- Tailscale + Headscale:零配置 VPN — 随时随地安全访问你的 Immich 服务器
- Uptime Kuma:监控 — 监控你的 Immich 实例
- Vaultwarden:密码管理器 — 保护你的管理员凭据
从 2025 年 10 月开始跑 Immich。47K 张照片,零数据丢失,$0/月。这就是卖点。