家里有一个二十年前的主机,自从改成服务器之后加装了好几块硬盘使用。今天心血来潮想装一下immich相册服务,结果抛弃了cpu满载了,更别说immich的机器学习了。所以改用了自己的macmini主机作为一个服务器使用。折腾了一天,也算是折腾好了,因为好多地方需要运行的时候下载模型文件,所以我选择下载好了,通过映射的方式挂载进去。
docker-compose.yml
name: immich_server
services:
immich-server:
container_name: immich_server
image: ghcr.io/immich-app/immich-server:v2
volumes:
- /Users/mac/Documents/docker/dockge/docker/stacks/immich/data:/data
- /Users/mac/Documents/docker/dockge/docker/stacks/immich/img:/img
- /etc/localtime:/etc/localtime:ro
environment:
- REDIS_HOSTNAME=
- REDIS_PORT=
- REDIS_PASSWORD=
- REDIS_DBINDEX=2
# 如果 Immich Server 本身还需要数据库连接信息(通常需要),请添加
- DB_HOSTNAME=database # 使用内部服务名
- DB_PORT=5432
- DB_USERNAME=
- DB_PASSWORD=
- DB_DATABASE_NAME=
ports:
- 2283:2283
depends_on:
- database
restart: always
healthcheck:
disable: false
immich-machine-learning:
container_name: immich_machine_learning
image: ghcr.io/immich-app/immich-machine-learning:v2
volumes:
- model-cache:/cache
# 将你存放模型的目录挂载到容器的 /cache/clip
- /Users/mac/Documents/docker/dockge/docker/stacks/immich/ViT-B-32__openai:/cache/clip/ViT-B-32__openai
- /Users/mac/Documents/docker/dockge/docker/stacks/immich/XLM-Roberta-Large-Vit-B-16Plus:/cache/clip/XLM-Roberta-Large-Vit-B-16Plus
- /Users/mac/Documents/docker/dockge/docker/stacks/immich/facial-recognition:/cache/facial-recognition
environment:
- REDIS_HOSTNAME=
- REDIS_PORT=
- REDIS_PASSWORD=
- REDIS_DBINDEX=2
# 如果 ML 服务也需要数据库连接信息,请添加
- DB_HOSTNAME=database
- DB_PORT=5432
- DB_USERNAME=
- DB_PASSWORD=
- DB_DATABASE_NAME=
restart: always
healthcheck:
disable: false
database:
container_name: immich_postgres
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23
environment:
POSTGRES_PASSWORD:
POSTGRES_USER:
POSTGRES_DB:
POSTGRES_INITDB_ARGS: --data-checksums
volumes:
- /Users/mac/Documents/docker/dockge/docker/stacks/immich/db:/var/lib/postgresql/data
shm_size: 128mb
restart: always
healthcheck:
disable: false
volumes:
model-cache: null
networks: {}
服务详解 (Services)
- immich-server (主服务器)
作用: 这是 Immich 的核心应用服务器,处理所有主要逻辑,如 API 请求、用户界面、照片上传/下载等。
镜像: ghcr.io/immich-app/immich-server:v2 - 拉取并使用 Immich 官方 v2 版本的服务器镜像。
卷 (Volumes): - /Users/mac/.../data:/data: 将宿主机上的 /Users/mac/.../data 目录挂载到容器内的 /data 路径,用于存储用户上传的原始媒体文件。
- /Users/mac/.../img:/img: 将宿主机上的 /Users/mac/.../img 目录挂载到容器内的 /img 路径,这里是用于机器学习使用的(如缩略图)。
- /etc/localtime:/etc/localtime:ro: 将宿主机的本地时间文件挂载到容器内,并设置为只读 (ro),确保容器内的时间与宿主机同步。
环境变量 (Environment):
REDIS_*: 配置服务器如何连接到外部的 Redis 服务
DB_*: 配置服务器如何连接到内部的 PostgreSQL 数据库(服务名为 database,端口 5432,用户名/密码/数据库名均为 postgres/postgres/immich)。数据库存储元数据、用户信息等。
端口 (Ports): - 2283:2283 - 将宿主机的 2283 端口映射到容器的 2283 端口。这意味着您可以通过 http://localhost:2283 访问 Immich 的 Web 界面。
依赖 (depends_on): depends_on: [database] - 确保在启动 immich-server 之前,database 服务必须先启动并运行。
重启策略 (restart): always - 无论退出状态如何,Docker 总是尝试重启该容器。
健康检查 (healthcheck): disable: false - 启用默认的健康检查机制,以监控容器是否正常运行。 - immich-machine-learning (机器学习服务)
作用: 负责执行图像分析任务,如人脸识别、物体识别、场景分类等。这些任务基于预先训练好的 AI 模型。
镜像: ghcr.io/immich-app/immich-machine-learning:v2 - Immich 官方的 v2 版本机器学习服务镜像。
卷 (Volumes): - model-cache:/cache: 挂载一个名为 model-cache 的命名卷到容器的 /cache 路径,用于存放模型文件。
接下来的三行将宿主机上特定的模型文件夹直接挂载到容器内的对应路径:
ViT-B-32__openai: CLIP 模型,用于图像和文本匹配。
XLM-Roberta-Large-Vit-B-16Plus: 另一个 CLIP 模型,支持多语言。
facial-recognition: 人脸识别模型。
环境变量 (Environment): 与 immich-server 类似,配置了相同的 Redis 和数据库连接信息,以便它能与主服务和数据库交互。 - database (PostgreSQL 数据库)
作用: 存储 Immich 的所有非媒体数据,如用户账户、相册信息、文件元数据、人脸识别结果等。
镜像: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:... - 这是一个经过特殊定制的 PostgreSQL 14 镜像,内置了 vectorchord 和 pgvectors 扩展,专门用于高效处理向量相似性搜索(这是 AI 图像分析功能的关键)。
环境变量 (Environment): 设置了数据库的超级用户密码、用户名和默认数据库名。
卷 (Volumes): - /Users/mac/.../db:/var/lib/postgresql/data - 持久化数据库文件到宿主机,防止容器删除后数据丢失。
共享内存 (shm_size): 设置为 128mb,为数据库提供必要的共享内存空间,提升性能。
重启策略 & 健康检查: 同样设置了 always 重启和启用健康检查。
卷 (Volumes)
model-cache: 这是一个命名卷 (named volume)。它不直接映射到宿主机的特定路径,而是由 Docker 在其管理的目录下创建和维护。在这里,它主要用于给机器学习服务提供一个持久化的空间来缓存模型或中间计算结果,保证容器重启后模型数据依然可用。
网络 (Networks)
networks: {}: 这里没有显式定义任何网络。Docker 会自动为这个 immich_server 项目创建一个默认的桥接网络 (bridge network)。immich-server 和 immich-machine-learning 通过 DB_HOSTNAME=database 这个环境变量,利用 Docker 的内部 DNS 功能,可以直接通过服务名 database 在这个默认网络上找到并连接到 immich_postgres 容器。
总结: 这个 docker-compose.yml 文件定义了一个完整的 Immich 运行环境,包含一个 Web 服务器、一个机器学习分析服务和一个专用的 PostgreSQL 数据库。它通过卷实现了数据持久化,并通过环境变量配置了各组件间的连接信息。
