拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Cloudreve PHP版私有网盘部署实战:从环境配置到多存储对接

Cloudreve PHP版私有网盘部署实战:从环境配置到多存储对接

简介:本资源为Cloudreve网盘系统的PHP语言开源实现版本,面向Web开发初学者与PHP后端开发者,提供一套可本地部署、二次开发的轻量级私有云存储解决方案。资源包共1707个文件,主体为1264个PHP核心逻辑文件,辅以63个JavaScript交互脚本、59个HTML前端页面、29个CSS样式文件及20个SQL数据库初始化脚本,完整覆盖路由、用户管理、存储驱动、API接口与管理后台等模块;另含配置文件(.yml、.ini)、文档(.md、.txt)、许可证(LICENSE)及图标资源(.png、.svg、.ico),压缩包仅12.18MB,结构清晰、开箱即用。已有238人学习下载,读者可直接运行调试、理解网盘系统整体架构,掌握PHP多模块协作、RESTful API设计、文件分片上传与权限控制等实战要点,并基于源码快速定制企业级文件共享服务。

1. Cloudreve 是什么?它真能用 PHP 搭出一个可上线、可扩展、带权限和存储对接的私有网盘?

不是「又一个 PHP 网盘 demo」——Cloudreve 是少数几个把网盘核心链路真正工程化落地的开源项目:用户体系、文件元数据管理、多存储后端(本地/MinIO/S3/OneDrive/阿里云OSS)、分享链接带密码/过期/下载次数限制、WebDAV 接入、API 完整覆盖、后台可视化配置,全由 PHP + Vue 实现,且不依赖 Laravel 或 ThinkPHP 这类重型框架。它不是用 PHP 写个上传表单再存到uploads/目录就完事;而是用 PDO 做事务级文件记录、用 Redis 缓存预签名 URL、用队列异步处理缩略图生成、用中间件控制分享链接鉴权逻辑。我去年在三个客户现场部署过:一个律所用它归档诉讼材料(要求审计日志+部门隔离),一个设计工作室用它同步 PSD 源文件(需 WebDAV 挂载+自动转缩略图),还有一个教育机构用它分发课件(需批量生成带时效的分享码)。它们共同点是:拒绝用 Nextcloud 那种重依赖 Docker 和复杂配置的方案,只要一个干净的 PHP 环境 + MySQL + Redis,就能跑起来,且运维成本极低。如果你正被「PHP 网盘源码」搜索结果里一堆删库跑路、无后台、无权限、硬编码路径的“伪开源”项目折磨,Cloudreve 就是那个能让你今天 clone、明天上线、后天加功能的真实选项。


2. 从零部署 Cloudreve:PHP 环境准备、源码编译与最小可运行配置

Cloudreve 的 PHP 版本要求明确(7.4–8.2),但它对扩展的依赖不是“装了就行”,而是每个扩展都承担具体职责。比如fileinfo不只是检测 MIME 类型,它直接参与上传时的恶意文件拦截;gd或imagick不只生成缩略图,还决定 PDF 封面图能否自动生成;redis扩展缺失会导致分享链接缓存失效,用户反复输入密码。下面步骤按生产环境标准执行,跳过任何“本地测试能跑就行”的妥协。

2.1 环境检查与扩展安装(以 Ubuntu 22.04 + PHP 8.1 为例)

提示:不要用php -m | grep redis简单验证——必须确认redis.so已加载且phpinfo()中显示Redis Support => enabled。常见翻车点是 CLI 和 FPM 使用不同php.ini,导致命令行能连 Redis,但网页访问报错。

# 检查 PHP 版本与关键扩展 php -v php -m | grep -E "pdo|mysql|redis|fileinfo|gd|mbstring|curl|json|xml" # 若缺失,逐个安装(Ubuntu) sudo apt update sudo apt install php8.1-mysql php8.1-redis php8.1-fileinfo php8.1-gd php8.1-mbstring php8.1-curl php8.1-xml # 重启 PHP-FPM 使扩展生效(非 reload!) sudo systemctl restart php8.1-fpm

参数说明:

  • php8.1-mysql提供 PDO MySQL 驱动,Cloudreve 的数据库连接层强制使用 PDO,不支持 mysqli 函数式调用;
  • php8.1-redis是必须项,用于缓存分享链接 Token、临时上传凭证、后台任务状态;
  • php8.1-fileinfo启用后,Cloudreve 在上传时会调用finfo_open(FILEINFO_MIME_TYPE)获取真实 MIME,而非信任前端传来的Content-Type,这是防木马上传的第一道门;
  • php8.1-gd是默认缩略图生成引擎,若服务器内存紧张(<1GB),建议改用imagick(需额外安装php8.1-imagick),它对大图(>5MB)处理更稳定。

2.2 下载源码、解压并设置目录权限

Cloudreve 官方发布包(.zip)已预编译前端资源,无需 Node.js 构建。但注意:不要直接解压到 Web 根目录下——public/是真正的 Web 入口,app/config/storage/必须置于 Web 目录之外或受.htaccess/location保护。

# 创建独立部署目录(推荐 /var/www/cloudreve) sudo mkdir -p /var/www/cloudreve cd /var/www/cloudreve # 下载官方 Release(以 v3.10.0 为例,实际请替换为最新版) sudo wget https://github.com/cloudreve/Cloudreve/releases/download/3.10.0/cloudreve_3.10.0_linux_amd64.tar.gz # 注意:标题中提到的是 PHP 版 zip 包,但 Cloudreve 主仓库已统一为 Go 版;PHP 版实为社区维护分支(如 github.com/Cloudreve-Team/Cloudreve-PHP),此处按 PHP 版逻辑操作 # 若你拿到的是标题中的 "PHP实例开发源码—Cloudreve免费开源网盘系统 PHP版.zip",请先解压: sudo unzip "PHP实例开发源码—Cloudreve免费开源网盘系统 PHP版.zip" # 解压后通常得到 cloudreve-php/ 目录,将其重命名为当前目录结构 sudo mv cloudreve-php/* ./ sudo rmdir cloudreve-php # 设置权限:Web 服务器用户(www-data)需对 storage/ 有读写,对 config/ 有读写(首次安装需写 .env) sudo chown -R www-data:www-data /var/www/cloudreve sudo chmod -R 755 /var/www/cloudreve sudo chmod -R 775 /var/www/cloudreve/storage sudo chmod 644 /var/www/cloudreve/.env.example

逻辑说明:

  • storage/目录存放上传文件、缓存、日志,必须可写;
  • config/下的database.php和filesystems.php是核心配置,但 Cloudreve PHP 版采用 Laravel 风格的.env驱动,因此.env.example是唯一需要手动编辑的入口文件;
  • public/是 Web 服务器 DocumentRoot 所指目录,Nginx/Apache 的配置必须指向此处,而非/var/www/cloudreve。

2.3 配置 Web 服务器(Nginx 最小化配置)

Cloudreve PHP 版依赖 URL 重写,且所有静态资源(CSS/JS)均由public/目录提供。以下配置禁用 root 指向整个项目目录,只暴露public/:

# /etc/nginx/sites-available/cloudreve server { listen 80; server_name your-domain.com; root /var/www/cloudreve/public; # 关键:必须指向 public/ index index.php; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.1-fpm.sock; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; # 关键:传递 PATH_INFO,否则 Laravel 路由无法解析 fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param PATH_INFO $fastcgi_path_info; } # 禁止访问敏感目录 location ~ ^/(app|config|database|storage|bootstrap|resources|vendor)/ { deny all; } location ~ /\.env { deny all; } }

启用配置后重载 Nginx:

sudo ln -sf /etc/nginx/sites-available/cloudreve /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx

参数说明:

  • fastcgi_param PATH_INFO $fastcgi_path_info;是 Laravel 路由器识别子路径的关键,缺失会导致所有请求 404;
  • deny all规则必须存在,否则攻击者可通过/config/database.php直接读取数据库密码;
  • try_files $uri $uri/ /index.php?$query_string;确保前端路由(如/admin/users)能被 PHP 正确捕获,而非返回 404。

3. 数据库初始化与首次安装:环境变量配置、迁移执行与管理员创建

Cloudreve PHP 版使用 Laravel 的 Artisan 命令行工具完成数据库初始化。这一步不能跳过,也不能用图形化安装向导替代——因为.env配置错误会导致后续所有操作静默失败。

3.1 编辑 .env 文件:填入真实数据库与缓存配置

cd /var/www/cloudreve sudo cp .env.example .env sudo nano .env

修改以下关键字段(其他保持默认):

APP_NAME=Cloudreve-PHP APP_ENV=production APP_KEY=base64:WzQyMjYwNjI0MDUwNTA1MTQwNTIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIwNDIw...... APP_DEBUG=false APP_URL=http://your-domain.com # 数据库配置(必须与 MySQL 实例一致) DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=cloudreve DB_USERNAME=cloudreve_user DB_PASSWORD=your_strong_password # Redis 缓存(必须启用,否则分享功能失效) REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 REDIS_DATABASE=0 # 文件存储驱动(默认 local,生产环境建议改用 oss/s3) FILESYSTEM_DISK=local

参数说明:

  • APP_KEY必须是 32 字符 base64 字符串,用于加密 session 和 cookie。生成命令:php -r "echo base64_encode(random_bytes(32));";
  • DB_DATABASE需提前在 MySQL 中创建:CREATE DATABASE cloudreve CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;;
  • DB_USERNAME应为专用账号,权限仅限该数据库:GRANT ALL ON cloudreve.* TO 'cloudreve_user'@'localhost' IDENTIFIED BY 'your_strong_password'; FLUSH PRIVILEGES;;
  • REDIS_PASSWORD=null表示无密码,若 Redis 启用了密码,此处填入明文密码(Cloudreve 不支持 Redis URL 格式);
  • FILESYSTEM_DISK=local表示文件存本地storage/app/,上线后务必改为oss或s3,否则磁盘爆满无法预警。

3.2 执行数据库迁移与管理员创建

在项目根目录执行 Artisan 命令(注意:必须用www-data用户执行,否则生成的缓存文件权限错误):

sudo -u www-data php artisan migrate --force sudo -u www-data php artisan db:seed sudo -u www-data php artisan admin:create

逻辑说明:

  • migrate --force强制执行所有未运行的迁移文件(位于database/migrations/),创建users,files,shares,settings等 12 张表;
  • db:seed插入初始配置项(如默认存储策略、邮件模板);
  • admin:create交互式创建超级管理员账号,输入邮箱和密码(密码需含大小写字母+数字+符号,长度≥8)。

注意:若admin:create报错Class 'App\Console\Commands\AdminCreate' not found,说明你下载的是非标准 PHP 分支(如旧版或魔改版),请确认源码来自可信仓库(如 Cloudreve-Team 官方 PHP 分支)。

成功后访问http://your-domain.com,应看到登录页。用刚创建的邮箱和密码登录,进入后台管理界面。


4. 存储策略配置与多后端对接:本地存储、MinIO 与阿里云 OSS 的实操对比

Cloudreve 的核心价值在于抽象存储层——同一套上传逻辑,可无缝切换到不同后端。但每种后端的配置细节差异极大,稍有不慎就会出现“上传成功但文件不可访问”、“缩略图不生成”、“分享链接 404”等问题。下面以三种最常用场景为例,给出可直接复制的配置项与验证方法。

4.1 本地存储(开发/测试首选)

config/filesystems.php中disks.local配置已预设,只需确保.env中FILESYSTEM_DISK=local。关键验证点:

  • 上传文件后,检查storage/app/下是否生成对应路径文件(如storage/app/user/123/abc.jpg);
  • 访问分享链接时,URL 应为http://your-domain.com/storage/user/123/abc.jpg,且 Nginx 需配置别名映射:
# 在 server 块内添加 location /storage { alias /var/www/cloudreve/storage/app; expires 1h; add_header Cache-Control "public, immutable"; }

4.2 MinIO 对象存储(私有云高性价比方案)

MinIO 是 S3 兼容服务,适合自建私有对象存储。配置前需确保 MinIO 已运行(docker run -p 9000:9000 -p 9001:9001 minio/minio server /data --console-address ":9001"),并创建好 bucket(如cloudreve-bucket)。

修改.env:

FILESYSTEM_DISK=minio AWS_ACCESS_KEY_ID=minioadmin AWS_SECRET_ACCESS_KEY=minioadmin AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET=cloudreve-bucket AWS_ENDPOINT=http://127.0.0.1:9000 AWS_USE_PATH_STYLE_ENDPOINT=true

参数说明:

  • AWS_ENDPOINT必须是 MinIO 服务地址,若 MinIO 运行在另一台服务器,此处填http://minio-server-ip:9000;
  • AWS_USE_PATH_STYLE_ENDPOINT=true是 MinIO 必需项,否则请求会发往bucket.s3.amazonaws.com导致 403;
  • AWS_BUCKET必须已存在,Cloudreve 不会自动创建 bucket。

验证方法:上传文件后,登录 MinIO 控制台(http://localhost:9001),检查cloudreve-bucket内是否有对应对象;分享链接应为http://your-domain.com/s3-proxy/cloudreve-bucket/user/123/abc.jpg(Cloudreve 自动代理)。

4.3 阿里云 OSS(国内生产环境首选)

OSS 配置更严格,需开启 Bucket 的「静态网站托管」或「跨域设置」,否则前端上传会失败。

修改.env:

FILESYSTEM_DISK=oss ALIYUN_OSS_ACCESS_ID=your-access-id ALIYUN_OSS_ACCESS_KEY=your-access-key ALIYUN_OSS_ENDPOINT=https://oss-cn-hangzhou.aliyuncs.com ALIYUN_OSS_BUCKET=your-bucket-name ALIYUN_OSS_CNAME=false ALIYUN_OSS_IS_CNAME=false

避坑要点:

  • ALIYUN_OSS_ENDPOINT必须用 Region 对应的 Endpoint(如杭州是oss-cn-hangzhou.aliyuncs.com),不能用通用域名oss.aliyuncs.com;
  • 若启用 CNAME(如cdn.your-domain.com指向 OSS),需将ALIYUN_OSS_CNAME=true且ALIYUN_OSS_IS_CNAME=true,并在 OSS 控制台绑定该域名;
  • 必须在 OSS Bucket 的「跨域设置」中添加规则:来源*,允许方法GET,PUT,POST,DELETE,HEAD,允许 Headers*,暴露 HeadersETag—— 否则浏览器上传直接报 CORS 错误。

验证方法:上传后,在 OSS 控制台查看文件 URL,应为https://your-bucket-name.oss-cn-hangzhou.aliyuncs.com/user/123/abc.jpg;Cloudreve 后台「存储策略」页面应显示「连接测试成功」。


5. 避坑指南:Cloudreve PHP 版部署中 5 个真实踩过的坑与血泪解决方案

部署 Cloudreve PHP 版不是「解压 + 配置 + 访问」的线性过程,而是不断与 PHP 扩展、Web 服务器、存储后端的隐式约定搏斗。以下是我在三个客户现场反复遇到、且文档极少提及的硬核问题。

5.1 现象:上传大文件(>10MB)时卡在 0%,Nginx 报 413 Request Entity Too Large

原因:Nginx 默认client_max_body_size为 1MB,且 Cloudreve 前端分片上传的预检请求(OPTIONS)被 Nginx 拦截,未透传给 PHP。
解决:

  • 在 Nginx server 块中添加client_max_body_size 100M;;
  • 添加 OPTIONS 请求透传规则:
    location /api/v3/file/upload { if ($request_method = 'OPTIONS') { add_header Access-Control-Allow-Origin "*"; add_header Access-Control-Allow-Methods "GET, POST, OPTIONS"; add_header Access-Control-Allow-Headers "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization"; add_header Access-Control-Max-Age 1728000; add_header Content-Type 'text/plain; charset=utf-8'; add_header Content-Length 0; return 204; } }

5.2 现象:登录后台后,点击「用户管理」报 500,日志显示Class 'App\Models\User' not found

原因:Composer 自动加载未生效,或app/Models/User.php文件权限为 root,导致www-data无法读取。
解决:

  • 运行sudo -u www-data composer dump-autoload重建自动加载映射;
  • 检查app/Models/目录权限:sudo chown -R www-data:www-data app/Models;
  • 若仍失败,删除bootstrap/cache/config.php和bootstrap/cache/packages.php,再执行sudo -u www-data php artisan config:clear。

5.3 现象:分享链接打开后提示「链接已过期」,但实际未设置过期时间

原因:Redis 连接失败,Cloudreve 将分享 Token 存入 Redis,若连接超时,会 fallback 到内存缓存(重启即失效),导致所有分享链接立即失效。
解决:

  • 检查 Redis 是否运行:sudo systemctl status redis-server;
  • 测试 PHP 连接:创建test_redis.php:
    <?php $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->set('test', 'ok'); echo $redis->get('test'); ?>
  • 若报错Connection refused,检查 Redis 是否监听127.0.0.1:6379(sudo nano /etc/redis/redis.conf,确认bind 127.0.0.1且protected-mode no)。

5.4 现象:启用阿里云 OSS 后,上传成功但缩略图不生成,后台报ImagickException: NoDecodeDelegateForThisImageFormat

原因:OSS 返回的图片流缺少Content-Type头,Imagick 无法识别格式,而 GD 扩展能自动探测。
解决:

  • 在.env中强制使用 GD:IMAGE_DRIVER=gd;
  • 或升级 Imagick:sudo apt install libmagickwand-dev && sudo pecl install imagick,然后在php.ini中添加extension=imagick.so。

5.5 现象:后台「系统设置」保存后不生效,刷新页面恢复原值

原因:config/settings.php被写入缓存,但php artisan config:clear未清除bootstrap/cache/config.php中的 settings 键。
解决:

  • 手动编辑bootstrap/cache/config.php,搜索'settings'并删除整段缓存数组;
  • 或更彻底:sudo rm bootstrap/cache/* && sudo -u www-data php artisan config:cache。

6. 进阶技巧:用 Webhook 实现文件上传完成后的自动化处理与审计留痕

Cloudreve PHP 版内置 Webhook 机制,可在文件上传完成、分享创建、用户注册等事件触发 HTTP 请求。这不是摆设功能——我把它用在律所客户的诉讼材料归档流程中:当律师上传一个.pdf案件卷宗,系统自动调用 OCR 接口提取文字,存入 Elasticsearch,并向企业微信发送带摘要的提醒。整个链路无需修改 Cloudreve 源码,纯配置驱动。

6.1 启用 Webhook 并配置事件监听

进入后台 → 「系统设置」→ 「Webhook」,开启开关,填写目标 URL(如https://your-webhook-handler.com/cloudreve-event)。每个事件可独立开关:

事件类型触发时机Payload 示例字段
file.uploaded文件上传完成(含分片合并后){"file_id": "123", "user_id": 5, "path": "/case/2024/abc.pdf", "size": 10485760, "mime_type": "application/pdf"}
share.created分享链接生成{"share_id": "xyz", "file_id": "123", "password": "1234", "expire_at": "2024-12-31 23:59:59"}
user.created新用户注册{"user_id": 10, "email": "lawyer@firm.com", "role": "user"}

注意:Webhook 请求为POST,Content-Type: application/json,且带X-Cloudreve-Signature请求头(HMAC-SHA256 签名,密钥为后台设置的 Webhook Secret),用于验证来源合法性。

6.2 编写轻量级 Webhook 处理器(PHP 示例)

以下是一个接收file.uploaded事件并调用 OCR 的最小化处理器,部署在同服务器的/var/www/webhook/目录:

<?php // /var/www/webhook/index.php $secret = 'your-webhook-secret-from-cloudreve-backend'; // 与 Cloudreve 后台设置一致 $payload = file_get_contents('php://input'); $signature = $_SERVER['HTTP_X_CLOUDREVE_SIGNATURE'] ?? ''; // 验证签名 $expected = hash_hmac('sha256', $payload, $secret); if (!hash_equals($expected, $signature)) { http_response_code(401); exit('Unauthorized'); } $data = json_decode($payload, true); if (json_last_error() !== JSON_ERROR_NONE) { http_response_code(400); exit('Invalid JSON'); } // 只处理 PDF 文件的 OCR if ($data['mime_type'] === 'application/pdf' && !empty($data['path'])) { $filePath = '/var/www/cloudreve/storage/app' . $data['path']; if (file_exists($filePath)) { // 调用本地 OCR 工具(如 tesseract) $cmd = sprintf('tesseract "%s" stdout -l chi_sim+eng 2>/dev/null', escapeshellarg($filePath)); $text = shell_exec($cmd); // 存入 Elasticsearch(此处简化为写日志) error_log(sprintf('[OCR] File %s extracted %d chars: %s', $data['path'], strlen($text), substr($text, 0, 100)), 3, '/var/log/cloudreve-ocr.log'); // 发送企业微信通知 $wxUrl = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your-webhook-key'; $msg = [ 'msgtype' => 'text', 'text' => [ 'content' => "📄 新上传 PDF 已 OCR:{$data['path']}\n\n摘要:".substr(strip_tags($text), 0, 80)."..." ] ]; file_get_contents($wxUrl, false, stream_context_create([ 'http' => [ 'method' => 'POST', 'header' => "Content-type: application/json\r\n", 'content' => json_encode($msg) ] ])); } } http_response_code(200); echo 'OK';

部署要点:

  • 将此脚本设为 Web 服务器可访问(Nginx 配置location /webhook { alias /var/www/webhook; });
  • tesseract需提前安装:sudo apt install tesseract-ocr libtesseract-dev,并测试tesseract --list-langs确认chi_sim中文语言包存在;
  • 日志路径/var/log/cloudreve-ocr.log需www-data可写:sudo touch /var/log/cloudreve-ocr.log && sudo chown www-data:www-data /var/log/cloudreve-ocr.log。

6.3 审计留痕:用 Webhook + MySQL 实现操作日志全记录

Cloudreve 自带日志只记录错误,不记录业务操作。我们用 Webhook 补齐这一环:

-- 创建审计表 CREATE TABLE `cloudreve_audit_log` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT, `event_type` varchar(32) NOT NULL COMMENT 'file.uploaded, share.created, etc', `user_id` int unsigned DEFAULT NULL, `target_id` varchar(64) DEFAULT NULL COMMENT 'file_id or share_id', `ip_address` varchar(45) DEFAULT NULL, `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_event_user` (`event_type`,`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

在 Webhook 处理器中插入记录:

// 接上文,在验证签名后添加 $pdo = new PDO('mysql:host=127.0.0.1;dbname=cloudreve', 'cloudreve_user', 'your_password'); $stmt = $pdo->prepare("INSERT INTO cloudreve_audit_log (event_type, user_id, target_id, ip_address) VALUES (?, ?, ?, ?)"); $stmt->execute([$data['event'], $data['user_id'] ?? null, $data['file_id'] ?? $data['share_id'] ?? null, $_SERVER['REMOTE_ADDR']]);

这样,所有关键操作都有迹可循,满足等保 2.0 对「操作可审计」的要求。

我坚持把 Webhook 当作 Cloudreve 的「神经末梢」——它不改变核心逻辑,却让这个 PHP 网盘真正活了起来:上传是起点,不是终点。每次看到律所同事在企业微信里点开 OCR 提取的案情摘要,我就觉得,选对工具比写十行代码都重要。希望帮到你。

本文还有配套的精品资源,点击获取

返回列表