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