RHEL 9 安装和使用照片管理工具Immich

这篇文章介绍我最近使用的一个照片整理工具Immich 并把它和我以前使用的另一个软件PhotoPrism根据我的个人体验做个比较。

为什么使用照片工具

随着岁数增长,家里积累的照片也越来越多,来源也分多种,早起都是使用数码相机拍摄后传到电脑里保存,现在都是手机为主了,随着手机的更换,照片也越来越多,迫切需要一个地方来保存和整理照片和视频。因为我自己就开设了服务器,所以想着如果能把所有照片和视频都集中在一起就好了。虽然我也使用iCloud用来存储照片,但是总觉着还是要在本地做个本分才安心,毕竟放在云端的东西,你能访问,别人通过一些手段也能访问到,万一遇到什么故障之类的,照片丢了就麻烦了。这些照片对别人可能意义不大,但对于我们自己,这毕竟代表了一段珍贵的家庭生活记忆。所以我对这类软件有如下要求:

  1. 支持self host,这个是必须,所有照片和视频文件都必须保存在本地,我必须对本地资源能有完全控制。
  2. 支持按时间线顺序显示,这样方便查看显示
  3. 支持一处集中显示,用户界面友好,比如通过一个网页或者文件夹来查看所有照片。
  4. 最好支持重复照片自动去重功能,因为历时多年,有些照片可能被备份到了多处,需要去重。
  5. 具备地理位置显示功能,能通过照片里的信息在一个地图上显示(老照片没有地图信息,只有新的手机拍的会带位置信息)
  6. 具备分享功能,可以方便分享给亲朋好友。

Photoprism和Immich

这两个软件我都用过,都是类似的安装部署步骤和使用方法:

  1. 都可以使用docker方式安装。
  2. 都提供了一个网页,按照时间分类,登录后可以上传,浏览或下载照片。
  3. 都提供了人脸识别,地图位置标注等。
  4. 都有手机端app可供使用
    我最开始使用的是PhotoPrism,最近切换到了Immich,主要是有两个原因:
  5. PhotoPrism的地图显示功能收费了,每月要至少2欧,钱倒不多,只是额外支付,并且是向欧洲的公司付钱,还是嫌麻烦。
  6. 它把所有上传的图片都重新命名了,以它能识别的时间格式,比如20220105-123456.jpg,这个我不喜欢,我想保留照片原来的文件名,因为保留原来照片名可以方便我在将来迁移到别的照片工具。iCloud提供了原文件下载功能。
  7. Immich支持一个Node.js版本的CLI工具,使用它可以批量上传照片而不需要通过网页手动上传,这点在我把PhotoPrism里的照片迁移到Immich时特别高效,要知道我可是在操作几百G的文件,手动网页上传得到什么年月才能结束。
  8. Immich备份和还原非常容易,容易迁移到别的电脑

安装Immich

使用docker-compose的方式安装,很简单,只要建1个文件夹,然后它在里面配置一下docker配置文件,接着启动docker运行,就会自动下载所需docker镜像并安装到该文件夹下了,整个过程不会安装任何程序到系统,不会影响现在系统的运行。习惯了docker的方式后,我对那些直接安装到系统的程序现在都是有些顾虑了。因为有过多次使用经历,系统本来运行好好的,新安装了一个程序后,它安装或更新了一些依赖库的版本,从而导致某些依赖不同版本库的软件报错了。

照着官方的安装指导,几步就可以完成了:

  1. 创建1个文件夹以保存docker-compose.yml and .env文件夹。
    1
    2
    mkdir ./immich-app
    cd ./immich-app
  2. 下载模版docker-compose.yml and .env到这个文件夹里:
    1
    2
    3
    4
    5
    6
    # Get docker-compose.yml file
    wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml

    # Get .env file
    wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env
    cd ./immich-app
  3. 修改下载完的两个文件。这个按需配置,可以设置immich的访问端口等。
  4. 启动运行:
    1
    2
    3
    4
    docker compose up -d

    # 停止
    docker compose down
    然后就可以通过网页和配置的端口进行访问了。

升级Immich

1
2
3
# 停止
docker compose down
docker compose pull && docker compose up -d

备份Immich

这个我是我喜欢Immich的一点,它的备份和还原操作比较简单,而且有详细的操作指导页面

备份主要分两块:

  1. 照片资源文件
  2. 照片数据库信息

照片备份这个就是直接把immich-app整个文件夹备份下来就行了。可以使用rsync

1
rsync -a  --progress /path-to-immich-app/ /path-to-destination-folder/

照片数据库使用的是postgres,所以使用传统方式备份数据即可:

1
docker exec -t immich_postgres pg_dumpall --clean --if-exists --username=postgres | gzip > "/path/to/backup/dump.sql.gz"

还原Immich

还原文件很容易,只是注意要路径匹配,我没有试验如果还原到不同文件夹下是否仍然有效(即数据库里照片路径是绝对路径还是相对路径),如果是相对路径那还好办,如果数据库保存的是绝对路径,那么就要求还原后的文件路径必须和备份前的原始路径一直。我是从一台电脑迁移到另一台电脑,我直接创建了相同用户名并在home目录下使用了相同的immich文件夹名,来避免任何可能的路径不一致带来的麻烦。

还原数据库这块有些注意点,原作者写了这个note:

1
Note that for the database restore to proceed properly, it requires a completely fresh install (i.e. the Immich server has never run since creating the Docker containers). If the Immich app has run, Postgres conflicts may be encountered upon database restoration (relation already exists, violated foreign key constraints, multiple primary keys, etc.).

基本就是删掉已使用的data,然后单独启动Postgres docker,导入备份的数据库后,再启动整个Immich app,因为Postgres 数据库的 docker容器早已启动,所以可以直接使用:

1
2
3
4
5
6
7
docker compose down -v  # CAUTION! Deletes all Immich data to start from scratch.
docker compose pull # Update to latest version of Immich (if desired)
docker compose create # Create Docker containers for Immich apps without running them.
docker start immich_postgres # Start Postgres server
sleep 10 # Wait for Postgres server to start up
gunzip < "/path/to/backup/dump.sql.gz" | docker exec -i immich_postgres psql --username=postgres # Restore Backup
docker compose up -d # Start remainder of Immich apps

配置Nginx作为反向代理访问Immich

Immich默认使用3001端口接受网络请求,因此我们可以通过Nginx作为反向代理把它重定向到本机的80和443端口。下面举个例子:

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
# Default server configuration

server {

# Put your domain name in here.
server_name immich.zangchuantao.com ;
listen 80;
listen [::]:80;

# - - - - - - - - -
# Reverse Proxy
# - - - - - - - - -
location / {
auth_basic $authentication;
auth_basic_user_file /etc/nginx/.htpasswd;

proxy_pass http://localhost:3001;
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;

# Additional settings from your existing configuration
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; # Allow protocol switch to WebSocket
proxy_set_header Connection "upgrade"; # Do protocol switch for WebSocket
client_max_body_size 0; # Adjust this value based on your needs for upload size
proxy_max_temp_file_size 16384m;
proxy_buffering off; # Directly stream the request to the upstream server
}

}

RHEL 9 安装和使用照片管理工具Immich
https://pub.zangchuantao.com/20240407/Use-Immich-in-RHEL-9.html
作者
Chuantao
发布于
2024年4月7日
许可协议