在群晖里部署Immich

群晖是一个非常不错的NAS系统。自带了Synology Photos, 也是一个非常不错的管理照片的软件。

可是群晖这个Photos的功能,总是有一些不如人意的地方,于是就琢磨能不能在群晖上部署三方的照片管理软件。

关于三方的照片管理软件,这里有一个比较详细的对比,如果有兴趣了解更多的话,可以看看:

Free and OpenSource Photo Libraries

https://meichthys.github.io/foss_photo_libraries/

比较了几个之后,对Immich和Photoprism还比较满意,最后选择Immich。

https://immich.app/

主要原因有几个:

  • 人脸识别的功能格外强大。对比之后,感觉比Google Photos的准确率都高不少,自己也可以自由选择不同的模型来提高精度
  • 功能和界面通Google Photos非常相似,可以无缝切换
  • 带有照片地图的功能,可以通过地图来看各个地方拍摄照片,挺有意思…

下面来说说在群晖里如何部署Immich.

安装Container Manager

Immich支持docker compose的模式来部署。

群晖的Container manager,现在支持“项目”的方式来部署docker了。

创建项目
通过项目仪表板可以使用 Compose 文件创建、操作和管理多容器 Docker 项目。

安装完Container manager之后,群晖会在磁盘里创建两个目录:

  1. /volume1/@docker 系统隐藏目录,Container Manager使用
  2. /volume1/docker 用户来保存docker相关文件的地方

Immich的部署文档

首先阅读Immich的部署文档:

https://immich.app/docs/install/docker-compose

Immich的External Library功能:

https://documentation.immich.app/docs/features/libraries

下面开始部署。

创建Immich需要的数据目录

部署Immich,只需要指定图片上载目录就可以了,这个目录在.env文件里指定。

但是Immich会使用docker系统自动创建的3个volumes:

1
2
3
pgdata:
model-cache:
tsdata:

所以建议把这三个目录也创建好了,直接替换原始YAML里volume, 使得所有的Immich数据都放在一起。

最终的文件目录如下:

  • 4个目录需要手工创建
  • .env文件需要手工上载
  • compose.yaml会由container manager自动创建

设置YAML文件和env文件

YAML文件。修改的地方,主要就是几个service的volumes设置。

immich-server 和 immich-microservices还增加了群晖照片目录的只读挂载,这样就可以在Immich里访问群晖照片里的文件了

  - /volume1/photo:/mnt/media/synology:ro
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
version: "3.8"

services:
immich-server:
container_name: immich_server
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
command: ["start.sh", "immich"]
volumes:
- ${UPLOAD_LOCATION}:/usr/src/app/upload
- /volume1/photo:/mnt/media/synology:ro
- /etc/localtime:/etc/localtime:ro
env_file:
- .env
depends_on:
- redis
- database
- typesense
restart: always

immich-microservices:
container_name: immich_microservices
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
# extends:
# file: hwaccel.yml
# service: hwaccel
command: ["start.sh", "microservices"]
volumes:
- ${UPLOAD_LOCATION}:/usr/src/app/upload
- /volume1/photo:/mnt/media/synology:ro
- /etc/localtime:/etc/localtime:ro
env_file:
- .env
depends_on:
- redis
- database
- typesense
restart: always

immich-machine-learning:
container_name: immich_machine_learning
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
volumes:
- /volume1/docker/immich/mlcache:/cache
env_file:
- .env
restart: always

immich-web:
container_name: immich_web
image: ghcr.io/immich-app/immich-web:${IMMICH_VERSION:-release}
env_file:
- .env
restart: always

typesense:
container_name: immich_typesense
image: typesense/typesense:0.24.1@sha256:9bcff2b829f12074426ca044b56160ca9d777a0c488303469143dd9f8259d4dd
environment:
- TYPESENSE_API_KEY=${TYPESENSE_API_KEY}
- TYPESENSE_DATA_DIR=/data
# remove this to get debug messages
- GLOG_minloglevel=1
volumes:
- /volume1/docker/immich/tsdata:/data
restart: always

redis:
container_name: immich_redis
image: redis:6.2-alpine@sha256:70a7a5b641117670beae0d80658430853896b5ef269ccf00d1827427e3263fa3
restart: always

database:
container_name: immich_postgres
image: postgres:14-alpine@sha256:28407a9961e76f2d285dc6991e8e48893503cc3836a4755bbc2d40bcc272a441
env_file:
- .env
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE_NAME}
volumes:
- /volume1/docker/immich/pgdata:/var/lib/postgresql/data
restart: always

immich-proxy:
container_name: immich_proxy
image: ghcr.io/immich-app/immich-proxy:${IMMICH_VERSION:-release}
environment:
# Make sure these values get passed through from the env file
- IMMICH_SERVER_URL
- IMMICH_WEB_URL
ports:
- 8080:8080
depends_on:
- immich-server
- immich-web
restart: always

volumes:
pgdata:
model-cache:
tsdata:

.env文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables

# The location where your uploaded files are stored
UPLOAD_LOCATION=/volume1/docker/immich/upload

# The Immich version to use. You can pin this to a specific version like "v1.71.0"
IMMICH_VERSION=release

# Connection secrets for postgres and typesense. You should change these to random passwords
TYPESENSE_API_KEY=some-random-text
DB_PASSWORD=postgres

# The values below this line do not need to be changed
###################################################################################
DB_HOSTNAME=immich_postgres
DB_USERNAME=postgres
DB_DATABASE_NAME=immich

REDIS_HOSTNAME=immich_redis

在Immich里允许用户访问外部目录

首先,管理员需要设置用户权限,使得用户可以访问外部目录。

Administration -> Users -> Edit -> External Path

在用户设置里,添加external library

点击右上角的用户图标,然后选择

“Account Settings”

Libraries -> Create External Library

添加external library, 并设置名字和路径(/mnt/media/synology):

因为群晖会在图片目录里创建很多隐藏的文件夹,用来保存缩略图等信息,所以需要把这些目录也都给排除了.

1
Exclusion syntax: **/@eaDir/**

使用Immich

有时候,群晖会提醒安装Web Station, 但是Immich并不需要这个。部署完毕之后,就可以直接访问:8080端口(看你YAML里的设置)来访问Immich了