前言

immich服务用docker部署,有一个非常刺挠不舒服的问题,就是文件权限。

docker需要root账户跑(虽然可以通过一些设置实现non-root账户跑),用docker部署的immich默认也就是root权限,导致通过immich上传和归档的照片、视频文件都是root权限。

这说不上什么大的问题,但我觉得很不舒服,就看了官方文档,要怎么设置才能用non-root账户跑。但官网含糊其辞,最后在虚拟机里反复部署、删除、调试,终于搞定了我的三个需求:

  1. 上传和归档的照片、视频,不能是root权限

  2. immich图像算法处理以后生成的内容,不能是root权限

  3. 整体服务和功能要正常可用

这里不得不夸一下photoprism,在docker-compose配置文件里就定义好了用non-root账号运行的参数,取消注释就行了。


步骤

先看下官网给出的用非root账号运行immich的办法

How can I run Immich as a non-root user?
    1. Set the PUID/PGID environment variables (in .env).
    2. Set the corresponding user argument in docker-compose for each service.
    3. Add an additional volume to immich-microservices that mounts internally to /usr/src/app/.reverse-geocoding-dump.
The non-root user/group needs read/write access to the volume mounts, including UPLOAD_LOCATION.

简单英翻中一下:

  1. .env文件中设置PUID/PGID
  2. docker-compose配置文件中给每一个服务(service)配置对应的user参数
  3. immich-microservices服务添加一个额外的卷(volume)用来挂载容器内部的/usr/src/app/.reverse-geocoding-dump目录
  4. 注意各个文件夹的读写权限分配

但实际看完这个官网的步骤也是一头雾水的,说的很模糊,也没有给出示例。

最后在immich项目的github主页的issues列表里,找到了别人贴出的non-root场景的配置信息,反复调试以后,确定了一下方案。

第一步:在.env中配置PUID/PGID

这里假定linux普通账户jack的uid/gid是1000:1000。在.env文件中添加以下内容。

## non-root user
PUID=1000
PGID=1000

## non-root user reverse-geocoding-dump directory
REVERSE_GEOCODING_DUMP=./geocoding

第二步:在docker-compose.yml中添加user参数。

先看我们的两个需求。第一点:上传和归档的照片、视频,不能是root权限。

这需要改的是immich_server,添加user参数。

immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    user: ${PUID}:${PGID}

第二点需求:immich图像算法处理以后生成的内容,不能是root权限。

这需要改的是immich_microservices,添加uservolumes参数。

immich-microservices:
    container_name: immich_microservices
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    user: ${PUID}:${PGID}
    # extends:
    #   file: hwaccel.yml
    #   service: hwaccel
    command: ["start.sh", "microservices"]
    volumes:
        - ${UPLOAD_LOCATION}:/usr/src/app/upload
        - /etc/localtime:/etc/localtime:ro
        - ${REVERSE_GEOCODING_DUMP}:/usr/src/app/.reverse-geocoding-dump

第三步:手动创建${UPLOAD_LOCATION}${REVERSE_GEOCODING_DUMP}两个目录并分配权限。

手动创建这俩目录,是因为用root跑docker,部署immich时自动创建的目录也是root权限,会导致immich的俩non-root services运行出现权限错误。

好了,到这里就配置完了。不需要按照官网的要求,给每一个service都加上user参数。


常用命令

部署运行

docker-compose up -d

停止全部服务

docker-compose stop

清空全部服务(删掉容器&清空数据)

docker-compose down -v

查看指定服务的日志

docker logs [service]

更新版本

docker-compose pull && docker-compose up -d