Docker-compose运行的Cloudreve 3.8.X升级至4.x版本的方法

前置步骤

首先要求你当前镜像版本处于3.8.x,如果是3.x任意版本,那么修改镜像tag为3.8.3即可,例如:

注意:仅写了针对SQLite的情况,如有外部数据库与此类似

services:
  cloudreve:
    container_name: cloudreve
    image: cloudreve/cloudreve:3.8.3 #修改这里
    restart: unless-stopped
    volumes:
      - /home/cloudreve/data:/data
      - /home/cloudreve/uploads:/cloudreve/uploads
      - /home/cloudreve/downloads:/cloudreve/downloads
      - /home/cloudreve/avatar:/cloudreve/avatar
      - /home/cloudreve/conf.ini:/cloudreve/conf.ini
      - /home/cloudreve/cloudreve.db:/cloudreve/cloudreve.db
      - /xxx/xxx/share:/share	#自己额外映射的数据目录可加
    network_mode: "host"
        #extra_hosts:
        #- "host.docker.internal:host-gateway"

在更新到3.8.x后,请按照v3升级文档说明停止容器和备份你的文件↓

如无特殊声明,以下命令均在docker-compose.yml文件所处的目录运行

文件备份

首先,创建一个新文件夹,例如v3

mkdir v3

并将 conf.ini 以及 cloudreve.db 移动到v3目录,另复制一份conf.inidata目录下

cp conf.ini v3
cp conf.ini data
mv cloudreve.db v3
mv docker-compose.yml v3

修改conf.ini

如果你一开始就像我上面的docker-compose.yml配置且从未自行修改过conf.ini,那么你需要在这时修改conf.ini为以下形式来符合升级程序的要求

[System]
Debug = false
Mode = master
Listen = :5212
SessionSecret = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
HashIDSalt = xxxxxxxxxxxxxxxxxxxxxxxxxxxxx

[Database]
; 数据库类型,目前支持 sqlite/mysql/mssql/postgres
Type = sqlite
; 数据库地址
Host = 127.0.0.1
; 字符集
Charset = utf8mb4
; SQLite 数据库文件路径
DBFile = /cloudreve/v3/cloudreve.db
; 进程退出前安全关闭数据库连接的缓冲时间
GracePeriod = 30
; 使用 Unix Socket 连接到数据库
UnixSocket = false

注意事项:

  1. 如果你的conf.ini中缺失了HashIDSalt,自行填写一个随机字符串即可保证正常升级,但你的分享链接将会当场去世,这是无法解决的。
  2. DBFile的路径非常重要,它应当是你在docker-compose.yml中映射的目标目录,此处增加的v3是我们移动过去的,在v4的docker-compose.yml文件中需要重新映射

创建v4的docker-compose.yml

直接下载仓库内的配置文件即可,或复制我下面的配置文件,注意将映射的目录改成自己先前映射的目录,以及版本号先改为4.0.0

wget https://raw.githubusercontent.com/cloudreve/Cloudreve/refs/heads/master/docker-compose.yml

如下所示,注意如有额外的数据目录,那么目录映射应保持与V3一致

services:
  cloudreve:
    image: cloudreve/cloudreve:4.0.0
    container_name: cloudreve-backend
    depends_on:
      - redis
    restart: unless-stopped
    ports:
      - 5212:5212
    environment:
      - CR_CONF_Database.Type=sqlite
      - CR_CONF_Database.DBFile=/cloudreve/data/cloudreve.db
      - CR_CONF_Redis.Server=redis:6379
    volumes:
      - /home/cloudreve/data:/cloudreve/data
      - /xxx/xxx/share:/share	#自己额外映射的数据目录可加
      #v3upgrade
      - /home/cloudreve/v3:/cloudreve/v3	#此处很重要,方便我们执行升级程序
      - /home/cloudreve/uploads:/cloudreve/uploads	#默认上传路径
      - /home/cloudreve/avatar:/cloudreve/avatar
  redis:
    image: redis:latest
    container_name: redis
    restart: unless-stopped
    volumes:
      - /home/cloudreve/redis:/data

修改完成后,关闭此文件备用

修改v4的conf.ini

先前我们复制了一份conf.inidata目录下,此时我们修改它如以下样式

这里仍然最需要注意的是HashIDSaltDBFileDBFile路径应当为容器内映射的目录

vi data/conf.ini

[System]
Debug = false
Mode = master
Listen = :5212

[System]
; 运行模式,可选值为 master/slave
Mode = master
; HTTP 监听端口,默认为 5212
Listen = :5212
; 是否开启 Debug 模式,默认为 false
Debug = false
; 呈递客户端 IP 时使用的 Header,默认为空。如果该 Header 由多个使用 `,` 分隔的 IP 构成,Cloudreve 会取用首个作为客户端 IP
; 对于配置反向代理的部署,可以取值为 X-Forwarded-For。但是,请注意,由于潜在的 XFF 注入问题,仅在确认可信的情况下使用
ProxyHeader =
; 进程安全退出的最长缓冲时间,默认为 0,不限制
GracePeriod = 0
; 日志级别,可选值为 debug/info/warning/error,默认为 info
LogLevel = info

SessionSecret = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

HashIDSalt = xxxxxxxxxxxxxxxxxxxxxxxxxxxxx

; 启用 Unix Socket 监听
[UnixSocket]
; Unix Socket 监听路径,默认为空
; Listen = /run/cloudreve/cloudreve.sock
; 设置产生的 socket 文件的权限,默认为空
Perm = 0666

; 数据库相关,如果你只想使用内置的 SQLite 数据库,这一部分直接删去即可
[Database]
; 数据库类型,目前支持 sqlite/mysql/postgres/mariadb,默认为 sqlite
Type = sqlite
; 数据库端口,默认为 3306
Port = 3306
; 用户名,默认为空
User =
; 密码,默认为空
Password =
; 数据库地址,默认为空
Host = 127.0.0.1
; 数据库名称,默认为空
Name = cloudreve
; 连接字符集,默认为 utf8mb4
Charset = utf8mb4
; SQLite 数据库文件路径,默认为 data/cloudreve.db
DBFile = /cloudreve/data/cloudreve.db
; 使用 Unix Socket 连接到数据库,默认为 false,如需开启,请在 Host 中指定 Unix Socket 路径
UnixSocket = false
; 数据库连接字符串,如果设置,其他数据库配置将忽略,但 Type 仍需设置。
; 例如:root:123456@tcp(127.0.0.1:3306)/cloudreve?charset=utf8mb4&parseTime=True&loc=Local 用于 MySQL。
DatabaseURL =

; 跨域配置
[CORS]
AllowOrigins = *
AllowMethods = OPTIONS,GET,POST
AllowHeaders = *
AllowCredentials = false

; Redis 相关
[Redis]
; 连接类型,默认为 tcp
Network = tcp
; 服务器地址,默认为空,不启用
Server = 127.0.0.1:6379
; 密码,默认为空
Password =
; 数据库,默认为 0
DB = 0
; 用户名,默认为空
User =
; 是否使用 TLS 连接到 Redis,默认为 false
UseTLS = false
; 是否跳过 TLS 验证,默认为 false
TLSSkipVerify = false

修改完成后,保存备用

执行升级(主要内容)

这里是重点,如果你按我的路径去写,那么直接运行即可;如果你自己做了修改,那么请以你修改的为准。

这里需要注意的是,目录必须是容器内部的路径!!!必须是容器内部的路径!!!必须是容器内部的路径!!!

docker compose run --rm --entrypoint ./cloudreve cloudreve migrate --v3-conf v3/conf.ini -c data/conf.ini

运行后将直接开始执行数据库升级,运行完成后将自动退出并删除容器。

在这之后你就可以修改v4的docker-compose.yml,将image tag修改为latest,并执行以下命令更新并启动镜像

docker compose pull
docker compose up -d