Cloudreve 部署交付文档

举报
yd_272031863 发表于 2026/11/08 23:27:21 2026/11/08
【摘要】 本文是 Cloudreve 部署文档,依赖已备好的 MySQL、Redis、Docker 与 Compose,提供两套方案:手工逐步部署,基于 Compose,全程不用脚本;脚本快速部署,含安装、卸载脚本,支持自动建库、配置备份清理。文档明确端口、密码、网络变更的生效方式,并附带运维命令与部署自检清单。

统一前置约定:所有操作在同一台服务器执行;MySQL、Redis、Docker、Docker Compose 为前置准备,本文档不部署这两者。

Cloudreve 部署交付文档

前置说明
部署本服务需提前准备:MySQL、Redis、Docker、Docker Compose。
全部操作均在同一台服务器上执行。
Docker 外部网络:有现成业务网络就复用;没有则自行创建。
方式一为全手工逐步部署,不使用任何 .sh;方式二为脚本一键快速部署。

方式一:逐步部署(纯手工,不使用任何脚本,基于 Compose)

1. 创建部署目录

mkdir -p /opt/cloudreve/data
cd /opt/cloudreve
chmod -R 755 /opt/cloudreve

2. 编写 docker-compose.yml

vi docker-compose.yml

填入下面内容:

services:
  cloudreve:
    image: cloudreve/cloudreve:latest
    container_name: cloudreve
    restart: unless-stopped
    networks:
      - external-net
    ports:
      - "52120:5212"
      - "6888:6888"
      - "6888:6888/udp"
    volumes:
      - ./data:/cloudreve/data

networks:
  external-net:
    external: true

3. 先拉起一次,生成 conf.ini,然后停止

docker compose up -d
sleep 12
docker compose down

4. 编辑配置文件接入 MySQL、Redis

vi ./data/conf.ini

替换数据库段:

[Database]
Type = mysql
Host = my-mysql
Port = 3306
User = cloudreve
Password = MySQL业务账号密码
Name = cloudreve
Charset = utf8mb4

Redis:

[Redis]
Server = my-redis:6379
Password = Redis密码
DB = 0
  • 如果 Redis 无密码,删除 Password = 这一行;
  • my-mysql、my-redis 需要已经加入 external-net。

5. 准备数据库与账号

进入 MySQL:

docker exec -it my-mysql mysql -uroot -p

执行 SQL:

CREATE DATABASE IF NOT EXISTS cloudreve DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS 'cloudreve'@'%' IDENTIFIED WITH mysql_native_password BY '业务密码';
GRANT ALL PRIVILEGES ON cloudreve.* TO 'cloudreve'@'%';
FLUSH PRIVILEGES;
exit;

6. 确认中间件在外部网络

docker network connect external-net my-mysql
docker network connect external-net my-redis

7. 正式启动

docker compose up -d

8. 访问与初始化

查看日志:

docker logs cloudreve
  • 如果输出初始管理员密码,记下登录;
  • 如果没有初始密码,直接注册第一个账号,自动成为超级管理员。

访问地址:

http://服务器IP:52120

9. 后台 Aria2 设置

后台 → Aria2:

  • RPC 地址:[http://127.0.0.1:6888/jsonrpc](http://127.0.0.1:6888/jsonrpc)
  • RPC Secret:自行设置

常用手工运维命令

# 查看实时日志
docker logs -f cloudreve

# 重启
docker compose restart

# 停止
docker compose down

# 更新镜像
docker pull cloudreve/cloudreve:latest
docker compose up -d

方式二:快速部署方案(两个脚本)

脚本内置:参数校验、网络判断、自动建库建账号、自动备份 + 清理旧 [Database] / [Redis] 配置段。
⚠️ 使用前务必编辑两个脚本顶部参数,保持两边参数一致。

根据mysql、redis进行修改 install-cloudreve .sh、uninstall-cloudreve.sh中的参数;

脚本部署操作:

mkdir -p /opt/my-app/external/cloudreve
cd /opt/my-app/external/cloudreve

# 上传两个脚本
vi install-cloudreve.sh
vi uninstall-cloudreve.sh

chmod +x install-cloudreve.sh
chmod +x uninstall-cloudreve.sh

bash install-cloudreve.sh

install-cloudreve .sh

#!/usr/bin/env bash
set -e

# ====================== 可修改参数 ======================
# Cloudreve 部署根目录
BASE_DIR="/opt/my-app/external/cloudreve"
# 容器名称
CONTAINER_NAME="cloudreve"
# 宿主机对外暴露端口
PORT_OUT="52120"
# 容器内部监听端口(固定,一般不用改)
PORT_IN="5212"
# Aria2 离线下载端口
ARIA2_PORT="6888"

# MySQL 配置(依赖已部署好的 my-mysql)
# MySQL 容器名/主机名(在 external-net 内可解析)
MYSQL_HOST="my-mysql"
# MySQL 服务端口
MYSQL_PORT="3306"
# Cloudreve 使用的数据库名称
MYSQL_DB="cloudreve"
# Cloudreve 程序连接 MySQL 的账号
MYSQL_USER="cloudreve"
# Cloudreve 程序连接 MySQL 的密码
MYSQL_PASS="Cloudreve@123456"
# MySQL root 账号(用于建库、建程序账号)
MYSQL_ROOT_USER="root"
# MySQL root 密码
MYSQL_ROOT_PASS="root"

# Redis 配置(依赖已部署好的 my-redis)
# Redis 容器名/主机名
REDIS_HOST="my-redis"
# Redis 端口
REDIS_PORT="6379"
# Redis 访问密码,如果无密码填空:REDIS_PASS=""
REDIS_PASS="123456"
# 使用的 Redis DB 编号
REDIS_DB="0"

# Docker 外部网络
DOCKER_NET="external-net"

# 如果 MySQL 用户已经存在:true = 重置密码;false = 跳过,保留原有密码
RESET_USER_IF_EXISTS=false
# ======================================================

# 自动获取本机内网 IP(跳过 lo)
get_ip() {
    ip route get 1.1.1.1 | awk '{print $7}' | head -n1
}
LOCAL_IP=$(get_ip)

# 判断容器是否正在运行
check_container_running() {
    local ctn="$1"
    if ! docker ps --format '{{.Names}}' | grep -q "^${ctn}$"; then
        return 1
    fi
    return 0
}

# 判断容器是否在指定 Docker 网络内,优先 jq,失败回退 grep
container_in_network() {
    local ctn="$1"
    local net="$2"
    if command -v jq &>/dev/null; then
        docker network inspect "${net}" | jq -r '.[0].Containers | keys[] as $k | .[$k].Name' 2>/dev/null | grep -q "^${ctn}$"
    else
        docker network inspect "${net}" | grep -q "\"Name\": \"${ctn}\""
    fi
}

# 在 MySQL 容器内部执行 SQL
mysql_exec() {
    docker exec -i "${MYSQL_HOST}" mysql -u"${MYSQL_ROOT_USER}" -p"${MYSQL_ROOT_PASS}" "$@"
}

echo "============================================="
echo "        [前置校验] 正在检查 Docker 网络与中间件"
echo "============================================="

# 如果公共网络不存在,则创建并退出,提示接入中间件
if ! docker network inspect "${DOCKER_NET}" >/dev/null 2>&1; then
    echo ">> 网络 ${DOCKER_NET} 不存在,自动创建..."
    docker network create "${DOCKER_NET}"
    echo
    echo "✅ ${DOCKER_NET} 创建成功!"
    echo "请执行下面两条命令,将中间件接入该网络:"
    echo "    docker network connect ${DOCKER_NET} ${MYSQL_HOST}"
    echo "    docker network connect ${DOCKER_NET} ${REDIS_HOST}"
    echo
    echo "执行完成后,再重新运行本脚本。退出。"
    exit 1
fi

ERROR_FLAG=0

echo ">> 检查 ${MYSQL_HOST} 状态..."
if ! check_container_running "${MYSQL_HOST}"; then
    echo "❌ ${MYSQL_HOST} 没有启动!请先启动它"
    ERROR_FLAG=1
else
    if ! container_in_network "${MYSQL_HOST}" "${DOCKER_NET}"; then
        echo "❌ ${MYSQL_HOST} 不在 ${DOCKER_NET}"
        echo "   执行:docker network connect ${DOCKER_NET} ${MYSQL_HOST}"
        ERROR_FLAG=1
    else
        echo "✅ ${MYSQL_HOST}:正在运行,且在 ${DOCKER_NET}"
    fi
fi

echo ">> 检查 ${REDIS_HOST} 状态..."
if ! check_container_running "${REDIS_HOST}"; then
    echo "❌ ${REDIS_HOST} 没有启动!请先启动它"
    ERROR_FLAG=1
else
    if ! container_in_network "${REDIS_HOST}" "${DOCKER_NET}"; then
        echo "❌ ${REDIS_HOST} 不在 ${DOCKER_NET}"
        echo "   执行:docker network connect ${DOCKER_NET} ${REDIS_HOST}"
        ERROR_FLAG=1
    else
        echo "✅ ${REDIS_HOST}:正在运行,且在 ${DOCKER_NET}"
    fi
fi

if [ "${ERROR_FLAG}" -ne 0 ]; then
    echo
    echo "前置校验失败,请修复上面问题后重新运行脚本。退出。"
    exit 1
fi

echo
echo "✅ 所有前置校验通过,开始部署 Cloudreve"
echo "============================================="

echo "准备创建数据库与数据库账号(容器内执行)"
echo "目标库:${MYSQL_DB}"
echo "目标账号:${MYSQL_USER}@%"
echo "============================================="

# 创建数据库,不存在才创建
mysql_exec -e "CREATE DATABASE IF NOT EXISTS ${MYSQL_DB} DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"

if ${RESET_USER_IF_EXISTS}; then
    echo ">> 策略:账号存在则重置密码"
    mysql_exec -e "
CREATE USER IF NOT EXISTS '${MYSQL_USER}'@'%' IDENTIFIED WITH mysql_native_password BY '${MYSQL_PASS}';
ALTER USER '${MYSQL_USER}'@'%' IDENTIFIED WITH mysql_native_password BY '${MYSQL_PASS}';
GRANT ALL PRIVILEGES ON ${MYSQL_DB}.* TO '${MYSQL_USER}'@'%';
FLUSH PRIVILEGES;
"
else
    echo ">> 策略:账号存在则跳过,不修改密码"
    mysql_exec -e "
CREATE USER IF NOT EXISTS '${MYSQL_USER}'@'%' IDENTIFIED WITH mysql_native_password BY '${MYSQL_PASS}';
GRANT ALL PRIVILEGES ON ${MYSQL_DB}.* TO '${MYSQL_USER}'@'%';
FLUSH PRIVILEGES;
"
fi

echo "数据库、账号处理完成"

echo "==> 创建工作目录:${BASE_DIR}"
mkdir -p "${BASE_DIR}/data"
cd "${BASE_DIR}"

echo "==> 写入 docker-compose.yml"
cat > docker-compose.yml <<EOF
services:
  ${CONTAINER_NAME}:
    image: cloudreve/cloudreve:latest
    container_name: ${CONTAINER_NAME}
    restart: unless-stopped
    networks:
      - ${DOCKER_NET}
    ports:
      - "${PORT_OUT}:${PORT_IN}"
      - "${ARIA2_PORT}:${ARIA2_PORT}"
      - "${ARIA2_PORT}:${ARIA2_PORT}/udp"
    volumes:
      - ./data:/cloudreve/data

networks:
  ${DOCKER_NET}:
    external: true
EOF

echo "==> 首次拉起,生成初始 conf.ini 模板"
docker compose up -d
sleep 12
docker compose down

CONF="${BASE_DIR}/data/conf.ini"

# ============ 自动备份并清理旧 [Database] / [Redis] 配置段 ============
# 说明:本脚本采用追加写入方式,重复执行会产生重复配置段。
#      这里在每次执行前自动备份,并清空旧的这两个配置段,保证可安全重跑。
if [[ -f "${CONF}" ]]; then
    BAK="${CONF}.bak.$(date +%Y%m%d_%H%M%S)"
    cp "${CONF}" "${BAK}"
    echo "==> 已备份旧配置:${BAK}"

    awk '
        /^\[/ { sec=$0; gsub(/[\[\]]/, "", sec) }
        (sec=="Database" || sec=="Redis") { next }
        { print }
    ' "${CONF}" > "${CONF}.tmp"
    mv "${CONF}.tmp" "${CONF}"
    echo "==> 已清理旧 [Database] / [Redis] 配置段"
else
    echo ">> 未找到 ${CONF},跳过清理"
fi

echo "==> 将数据库、Redis 配置追加写入 ${CONF}"
cat >> "${CONF}" <<INI

[Database]
Type = mysql
Host = ${MYSQL_HOST}
Port = ${MYSQL_PORT}
User = ${MYSQL_USER}
Password = ${MYSQL_PASS}
Name = ${MYSQL_DB}
Charset = utf8mb4
INI

# 如果 Redis 无密码,则不写入 Password
if [[ -z "${REDIS_PASS}" ]]; then
    cat >> "${CONF}" <<INI

[Redis]
Server = ${REDIS_HOST}:${REDIS_PORT}
DB = ${REDIS_DB}
INI
else
    cat >> "${CONF}" <<INI

[Redis]
Server = ${REDIS_HOST}:${REDIS_PORT}
Password = ${REDIS_PASS}
DB = ${REDIS_DB}
INI
fi

echo ""
echo "===================== 部署准备完成 ====================="
echo "工作目录:        ${BASE_DIR}"
echo "配置文件路径:    ${CONF}"
echo ""
echo "启动命令:"
echo "    cd ${BASE_DIR} && docker compose up -d"
echo ""
echo "查看实时日志:"
echo "    docker logs -f ${CONTAINER_NAME}"
echo ""

if [[ -n "${LOCAL_IP}" ]]; then
    echo "访问地址:http://${LOCAL_IP}:${PORT_OUT}"
    echo "后台地址:http://${LOCAL_IP}:${PORT_OUT}/admin"
else
    echo "访问地址:http://<服务器IP>:${PORT_OUT}"
    echo "后台地址:http://<服务器IP>:${PORT_OUT}/admin"
    echo "⚠️ 未能自动识别本机 IP,请手动替换为服务器实际地址"
fi

echo ""
echo "重要提醒:"
echo "  1. 如果 RESET_USER_IF_EXISTS=false,账号已存在时不会改动原有密码;"
echo "  2. 如果后续手动修改数据库账号密码,必须同步修改 conf.ini;"
echo "  3. 进入后台务必修改【站点地址】,否则下载会跳转 localhost;"
echo "  4. 第一个注册的邮箱账号自动为超级管理员,邮箱仅校验格式;"
echo "========================================================"

# 部署完直接启动
echo "==> 正式启动 Cloudreve"
docker compose up -d

uninstall-cloudreve .sh

#!/usr/bin/env bash
set -e

# ====================== 可修改参数 ======================
# Cloudreve 部署根目录(和安装脚本保持一致)
BASE_DIR="/opt/my-app/external/cloudreve"
# 容器名称
CONTAINER_NAME="cloudreve"

# MySQL 相关(用于删除库、账号,不需要就关闭下面开关)
MYSQL_HOST="my-mysql"
MYSQL_ROOT_USER="root"
MYSQL_ROOT_PASS="root"
MYSQL_DB="cloudreve"
MYSQL_USER="cloudreve"

# Redis:本脚本不删除 redis 实例,仅清理 Cloudreve 使用的 key(可选)
REDIS_HOST="my-redis"
REDIS_PORT="6379"
REDIS_PASS="123456"
REDIS_DB="0"

# 是否删除宿主机上全部数据目录(上传文件、配置、缓存)
# true:删除;false:保留 data
RM_DATA_DIR=false

# 是否删除 MySQL 的数据库 cloudreve
RM_MYSQL_DB=false

# 是否删除 MySQL 的 cloudreve 用户
RM_MYSQL_USER=false

# 是否清空该 Redis DB
FLUSH_REDIS_DB=false
# ======================================================

echo "====================================================="
echo "⚠️  提示:请确认本脚本参数与安装脚本保持一致!"
echo "    如果尚未核对,请按 Ctrl+C 退出。"
echo "====================================================="
sleep 2

mysql_exec() {
    docker exec -i "${MYSQL_HOST}" mysql -u"${MYSQL_ROOT_USER}" -p"${MYSQL_ROOT_PASS}" "$@"
}

redis_exec() {
    if [[ -n "${REDIS_PASS}" ]]; then
        docker exec -i "${REDIS_HOST}" redis-cli -a "${REDIS_PASS}" -n "${REDIS_DB}" "$@"
    else
        docker exec -i "${REDIS_HOST}" redis-cli -n "${REDIS_DB}" "$@"
    fi
}

echo "====================================================="
echo "                Cloudreve 卸载脚本"
echo "工作目录:${BASE_DIR}"
echo "容器名:${CONTAINER_NAME}"
echo "====================================================="
echo "【当前配置】"
echo " - 删除本地数据目录:${RM_DATA_DIR}"
echo " - 删除 MySQL 数据库:${RM_MYSQL_DB}"
echo " - 删除 MySQL 用户:${RM_MYSQL_USER}"
echo " - 清空 Redis DB:${FLUSH_REDIS_DB}"
echo
read -r -p "确认继续卸载?输入 YES 确认,其他退出:" confirm
if [[ "${confirm}" != "YES" ]]; then
    echo "已取消卸载"
    exit 0
fi

echo
echo "==> 停止并删除容器"
if [[ -f "${BASE_DIR}/docker-compose.yml" ]]; then
    cd "${BASE_DIR}"
    docker compose down
else
    echo "找不到 compose 文件,尝试直接删除容器"
    docker rm -f "${CONTAINER_NAME}" || true
fi

# 如果需要顺带删除镜像,打开下面这一行
# docker rmi cloudreve/cloudreve:latest || true

if ${RM_DATA_DIR}; then
    echo "==> 删除本地数据目录 ${BASE_DIR}"
    rm -rf "${BASE_DIR}"
else
    echo "==> 保留本地数据目录:${BASE_DIR}"
fi

if ${RM_MYSQL_DB}; then
    echo "==> 删除数据库 ${MYSQL_DB}"
    mysql_exec -e "DROP DATABASE IF EXISTS ${MYSQL_DB};"
fi

if ${RM_MYSQL_USER}; then
    echo "==> 删除数据库用户 ${MYSQL_USER}@%"
    mysql_exec -e "DROP USER IF EXISTS '${MYSQL_USER}'@'%'; FLUSH PRIVILEGES;"
fi

if ${FLUSH_REDIS_DB}; then
    echo "==> 清空 Redis DB ${REDIS_DB}"
    redis_exec FLUSHDB
fi

echo
echo "==================== 卸载完成 ====================="
if ${RM_DATA_DIR}; then
    echo "✅ 本地文件、容器已清除"
else
    echo "✅ 容器已移除;上传文件与配置保留在:${BASE_DIR}"
fi
if ${RM_MYSQL_DB} || ${RM_MYSQL_USER}; then
    echo "⚠️ MySQL 库/账号已按配置清除"
fi
if ${FLUSH_REDIS_DB}; then
    echo "⚠️ Redis 指定库已清空"
fi
echo "==================================================="

注意事项:参数变更之后的生效规则

核心原则:脚本顶部参数只在下次跑安装脚本时生效;正在运行的服务读取的是 docker-compose.yml 和 conf.ini。

  1. 修改端口(宿主机映射端口)
    • 修改:docker-compose.yml 里的 ports;同步修改脚本里的 PORT_OUT;
    • 生效:docker compose up -d;
    • 配套:防火墙、云安全组、后台站点地址、Nginx 反代地址同步更新。
  2. 修改 MySQL / Redis 密码
    • 顺序:先在 MySQL / Redis 修改真实密码 → 修改 conf.ini → 如果打算以后用脚本重跑,则同步修改脚本参数;
    • 生效:重启容器 docker compose restart;
    • 如果直接重跑安装脚本:脚本会自动备份、清理旧段、写入新配置,无需手动清理。
  3. 更换 Docker 网络
    • 将 Cloudreve、MySQL、Redis 全部接入新网络;
    • 修改 docker-compose.yml 里的外部网络名称,同步修改脚本中 DOCKER_NET;
    • docker compose up -d;
    • 验证:进入容器,使用容器名 ping MySQL / Redis。
  4. 修改数据库名、账号名、容器名、部署目录
    • 如果只是改配置:修改 conf.ini + compose,重建容器;
    • 如果希望脚本后续能一致管理:同步更新两个脚本顶部参数。
  5. 关于备份文件
    • 备份文件名:conf.ini.bak.20261108_153045;
    • 格式:conf.ini.bak.%Y%m%d_%H%M%S,也就是:年月日_时分秒;
    • 每次执行安装脚本,只要 conf.ini 存在,就生成一份独立备份;
    • 长期跑脚本会堆积大量备份文件,建议定期清理旧的 .bak.*。
  6. 重跑安装脚本说明
    • 脚本内置备份 + 清理逻辑,安全重复执行;
    • 只会删掉 [Database]、[Redis],其余配置(站点、跨域、存储策略等)全部保留;
    • 如果某次部署异常,可以直接把对应时间戳的 bak 文件恢复回去。

运维与卸载

# 查看日志
docker logs -f cloudreve

# 重启
cd /opt/my-app/external/cloudreve
docker compose restart

# 卸载
bash uninstall-cloudreve.sh

附录:部署自检清单

  • MySQL、Redis 容器正常运行
  • MySQL、Redis 和 Cloudreve 在同一个外部 Docker 网络
  • conf.ini 的数据库、Redis 连接信息正确
  • 防火墙 / 安全组放行访问端口
  • 后台站点地址已修改为公网或内网访问地址
  • Aria2 RPC 设置正确
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。