🧹 清理冗余文档和脚本文件

项目清理:
- 删除重复的部署文档(DEPLOY.md, DEPLOYMENT.md, DOCKER部署指南.md等)
- 删除过时的验证码功能文档(CAPTCHA_*.md)
- 删除临时修复脚本(fix_*.sh)
- 删除旧版本文档(VERSION.txt, UPDATE_SUMMARY_v1.1.0.md)
- 删除重复的部署脚本(deploy.sh)

精简原因:
- README.md 已包含完整的部署和使用说明
- install.sh 提供一键部署功能
- 减少文档冗余,降低维护成本
- 保持项目结构清晰简洁

保留的核心文件:
- README.md(主文档)
- install.sh(一键部署脚本)
- docker-compose.yml(Docker 配置)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-24 21:38:56 +08:00
parent b4d32476e3
commit 98cadb3c8b
16 changed files with 0 additions and 3858 deletions

View File

@@ -1,280 +0,0 @@
# 登录验证码功能说明
## 功能概述
本次更新为"玩玩云"云存储系统添加了登录验证码功能,提高了系统的安全性。该功能会在用户输错密码一定次数后自动显示验证码,要求用户输入验证码才能继续尝试登录。
## 功能特性
### 1. 智能验证码触发
- **自动触发**当用户输错密码2次后系统会自动显示验证码输入框
- **适用范围**:前台用户登录和后台管理员登录均适用
- **双重保护**基于IP地址和用户名两个维度进行失败次数统计
### 2. 验证码特点
- **纯数字验证码**4位数字易于识别和输入
- **彩色显示**:验证码图片使用彩色显示,提高可读性
- **点击刷新**:点击验证码图片即可刷新获取新的验证码
- **有效期限**验证码有效期为5分钟过期后需要刷新
- **安全存储**验证码存储在服务器端session中防止客户端篡改
### 3. 防爆破机制
- **失败限制**15分钟内失败5次将被封锁30分钟
- **渐进式保护**
- 第1-2次失败仅提示密码错误
- 第3-5次失败显示验证码要求输入
- 第5次失败封锁IP和用户名30分钟
## 技术实现
### 后端改动
#### 1. 新增依赖
- `svg-captcha`: 用于生成SVG格式的验证码图片
- `express-session`: 用于管理session存储验证码
#### 2. 新增API端点
```
GET /api/captcha
```
- 功能生成并返回SVG格式的验证码图片
- 返回SVG图片数据
- Session存储验证码文本和生成时间
#### 3. 修改登录API
```
POST /api/login
```
新增参数:
- `captcha` (可选): 验证码输入值
验证逻辑:
1. 检查IP和用户名的失败次数
2. 如果失败次数 >= 2则要求提供验证码
3. 验证验证码的有效性(是否存在、是否过期、是否正确)
4. 验证码错误返回 `needCaptcha: true`
#### 4. RateLimiter增强
- 新增 `getFailureCount()` 方法获取指定key的失败次数
- `recordFailure()` 返回值新增 `needCaptcha` 字段
### 前端改动
#### 1. 数据字段
新增:
```javascript
showCaptcha: false, // 是否显示验证码
captchaUrl: '', // 验证码图片URL
loginForm.captcha: '' // 验证码输入值
```
#### 2. UI组件
在登录表单中添加:
- 验证码输入框(条件显示)
- 验证码图片显示区域
- 点击刷新提示文字
#### 3. 逻辑方法
新增 `refreshCaptcha()` 方法:
```javascript
refreshCaptcha() {
this.captchaUrl = `${this.apiBase}/api/captcha?t=${Date.now()}`;
}
```
修改 `handleLogin()` 方法:
- 登录失败时检查 `response.data.needCaptcha`
- 如果需要验证码,显示验证码并调用 `refreshCaptcha()`
- 登录成功后隐藏验证码并清空输入
## 使用说明
### 用户使用流程
1. **首次登录尝试**
- 输入用户名和密码
- 点击"登录"按钮
- 如果密码错误,会提示"用户名或密码错误"
2. **第三次登录尝试(触发验证码)**
- 输入用户名和密码
- 系统自动显示验证码输入框
- 输入图片中显示的4位数字
- 如果看不清,点击图片刷新验证码
- 点击"登录"按钮
3. **验证码验证**
- 如果验证码错误,会提示"验证码错误",验证码会自动刷新
- 如果验证码过期,会提示"验证码已过期,请刷新验证码"
- 验证码正确且密码正确,登录成功
4. **账号封锁**
- 如果连续失败5次账号将被封锁30分钟
- 封锁期间尝试登录会提示"账号已被封禁"
### 管理员说明
管理员登录时同样受到验证码保护,流程与普通用户完全一致。
## 配置说明
### Session配置
`backend/server.js` 中配置session
```javascript
app.use(session({
secret: process.env.SESSION_SECRET || 'your-session-secret-change-in-production',
resave: false,
saveUninitialized: false,
cookie: {
secure: process.env.COOKIE_SECURE === 'true',
httpOnly: true,
maxAge: 10 * 60 * 1000 // 10分钟
}
}));
```
建议在 `.env` 文件中设置:
```
SESSION_SECRET=你的session密钥
```
### 验证码参数
`backend/server.js` 的验证码生成代码中可调整:
```javascript
const captcha = svgCaptcha.create({
size: 4, // 验证码长度4位数字
noise: 2, // 干扰线条数
color: true, // 使用彩色
background: '#f0f0f0', // 背景色
width: 120, // 宽度
height: 40, // 高度
fontSize: 50, // 字体大小
charPreset: '0123456789' // 只使用数字
});
```
### 防爆破参数
`backend/server.js` 中配置RateLimiter
```javascript
const loginLimiter = new RateLimiter({
maxAttempts: 5, // 最大失败次数
windowMs: 15 * 60 * 1000, // 统计窗口15分钟
blockDuration: 30 * 60 * 1000 // 封锁时长30分钟
});
```
**验证码触发阈值**在登录逻辑中设置:
```javascript
const needCaptcha = ipFailures >= 2 || usernameFailures >= 2;
```
可以修改 `>= 2` 来调整触发次数。
## 安全建议
1. **设置SESSION_SECRET**
- 在生产环境中务必设置强随机的SESSION_SECRET
- 使用 `node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"` 生成
2. **启用HTTPS**
- 在生产环境中设置 `COOKIE_SECURE=true`
- 确保使用HTTPS协议
3. **定期审计**
- 定期检查登录失败日志
- 关注异常的登录尝试
4. **调整参数**
- 根据实际使用情况调整失败次数阈值
- 根据用户反馈调整验证码难度
## 测试方法
### 测试验证码显示
1. 启动服务器:`cd backend && node server.js`
2. 访问登录页面
3. 使用错误的用户名或密码登录2次
4. 第3次尝试时应该看到验证码输入框
### 测试验证码API
```bash
curl "http://localhost:40001/api/captcha" > test.svg
```
查看生成的 test.svg 文件应该显示一个4位数字的验证码。
### 测试登录流程
```bash
# 第一次失败(无验证码)
curl -X POST http://localhost:40001/api/login \
-H "Content-Type: application/json" \
-d '{"username":"test","password":"wrong"}'
# 第二次失败(无验证码)
curl -X POST http://localhost:40001/api/login \
-H "Content-Type: application/json" \
-d '{"username":"test","password":"wrong"}'
# 第三次失败(需要验证码)
curl -X POST http://localhost:40001/api/login \
-H "Content-Type: application/json" \
-d '{"username":"test","password":"wrong"}'
# 返回: {"success":false,"message":"请输入验证码","needCaptcha":true}
```
## 故障排查
### 问题1验证码不显示
**可能原因**
- Session未正确配置
- 前端未正确接收 `needCaptcha` 标志
**解决方法**
- 检查浏览器控制台是否有错误
- 检查后端日志是否有session相关错误
- 确认 `express-session` 依赖已安装
### 问题2验证码一直提示错误
**可能原因**
- Session未持久化
- 验证码大小写不匹配
**解决方法**
- 验证码已统一转换为小写进行比较
- 检查浏览器是否禁用了Cookie
### 问题3验证码图片不加载
**可能原因**
- CORS配置问题
- API路径错误
**解决方法**
- 检查 `ALLOWED_ORIGINS` 环境变量配置
- 确认API基础路径配置正确
## 更新日志
**版本1.1.0**
- 新增登录验证码功能
- 密码错误2次后自动显示验证码
- 支持点击刷新验证码
- 验证码有效期5分钟
- 前台和后台登录均支持
## 技术支持
如有问题,请查看:
- 项目README.md
- GitHub Issues
- 后端日志文件

View File

@@ -1,268 +0,0 @@
# 验证码快速修复指南
## 🔍 问题诊断
你的验证码API **没有返回Set-Cookie**,说明配置没有正确应用。
测试结果:
```
curl -si https://cs.workyai.cn/api/captcha
HTTP/2 200
❌ 没有 Set-Cookie 响应头
```
## 🎯 解决方案(按顺序检查)
### 步骤1检查Nginx配置文件
```bash
# 在服务器上运行
cd /root/vue-driven-cloud-storage # 或你的项目路径
# 方法1查找配置文件
find /etc/nginx -name "*.conf" -exec grep -l "workyai.cn\|40001" {} \;
# 方法2查看nginx主配置
nginx -T | grep -A 30 "location /api"
```
**检查项**
- [ ] 是否有 `proxy_set_header Cookie $http_cookie;`
- [ ] 是否有 `proxy_pass_header Set-Cookie;`
### 步骤2手动添加Cookie配置
假设你的Nginx配置文件是 `/etc/nginx/conf.d/xxx.conf`
```bash
# 1. 找到配置文件
nginx -T | grep -B 5 "location /api" | grep "# configuration file"
# 2. 编辑配置文件(替换为你的实际路径)
vim /etc/nginx/conf.d/玩玩云.conf
# 3. 在 location /api 块中,找到这一行:
# proxy_set_header X-Forwarded-Proto $scheme;
#
# 在它后面添加3行
# Cookie传递配置验证码session需要
proxy_set_header Cookie $http_cookie;
proxy_pass_header Set-Cookie;
# 4. 保存并测试
nginx -t
# 5. 如果测试通过,重新加载
nginx -s reload
```
### 步骤3验证修改是否生效
```bash
# 测试验证码API是否返回Set-Cookie
curl -si https://cs.workyai.cn/api/captcha | grep -i "set-cookie"
# 应该看到类似:
# Set-Cookie: captcha.sid=s%3A...; Path=/; HttpOnly; SameSite=Lax
```
如果还是没有,继续下一步。
### 步骤4检查后端是否正确启动
```bash
# 检查后端进程
ps aux | grep "node.*server.js"
# 检查后端日志
pm2 logs backend # 如果使用pm2
# 或
tail -f /path/to/backend/logs/error.log
# 重启后端
pm2 restart backend # 如果使用pm2
# 或
pkill -f "node server.js"
cd /path/to/backend
node server.js > /dev/null 2>&1 &
```
### 步骤5检查后端依赖
```bash
cd /path/to/backend
# 检查session依赖是否安装
npm list express-session svg-captcha
# 如果未安装,安装它们
npm install express-session svg-captcha
# 重启后端
pm2 restart backend
```
### 步骤6检查.env配置
```bash
cd /path/to/backend
# 查看.env文件
cat .env
# 确保有这些配置(可选,有默认值)
# SESSION_SECRET=your-random-secret
# COOKIE_SECURE=false # 或true如果是HTTPS
```
## 🔧 完整的修复脚本
在服务器上创建并运行:
```bash
cat > fix_captcha.sh << 'SCRIPT_EOF'
#!/bin/bash
set -e
echo "🔧 验证码快速修复脚本"
echo "================================"
echo ""
# 1. 查找Nginx配置
echo "1. 查找Nginx配置文件..."
NGINX_CONF=$(find /etc/nginx /www/server -name "*.conf" -exec grep -l "location /api" {} \; 2>/dev/null | grep -v backup | head -1)
if [[ -z "$NGINX_CONF" ]]; then
echo "❌ 未找到Nginx配置文件"
exit 1
fi
echo "找到配置: $NGINX_CONF"
echo ""
# 2. 检查是否已有Cookie配置
if grep -q "proxy_set_header Cookie" "$NGINX_CONF"; then
echo "✅ Cookie配置已存在"
else
echo "❌ Cookie配置缺失正在添加..."
# 备份
cp "$NGINX_CONF" "${NGINX_CONF}.backup.$(date +%Y%m%d%H%M%S)"
# 添加Cookie配置
sed -i '/proxy_set_header X-Forwarded-Proto \$scheme;/a\
\
# Cookie传递配置验证码session需要\
proxy_set_header Cookie $http_cookie;\
proxy_pass_header Set-Cookie;' "$NGINX_CONF"
echo "✅ Cookie配置已添加"
fi
echo ""
# 3. 测试Nginx配置
echo "3. 测试Nginx配置..."
if nginx -t; then
echo "✅ Nginx配置测试通过"
else
echo "❌ Nginx配置测试失败"
exit 1
fi
echo ""
# 4. 重新加载Nginx
echo "4. 重新加载Nginx..."
nginx -s reload && echo "✅ Nginx已重新加载" || echo "❌ Nginx重新加载失败"
echo ""
# 5. 验证修复
echo "5. 验证验证码API..."
sleep 2
if curl -si http://localhost:40001/api/captcha 2>&1 | grep -q "Set-Cookie"; then
echo "✅ 验证码API正常返回Set-Cookie"
else
echo "⚠️ 验证码API未返回Set-Cookie可能需要检查后端"
fi
echo ""
echo "================================"
echo "✅ 修复完成!"
echo ""
echo "请清除浏览器缓存后重新测试"
SCRIPT_EOF
chmod +x fix_captcha.sh
sudo bash fix_captcha.sh
```
## 📝 检查清单
执行以下检查:
### Nginx配置
```bash
# 查看location /api配置
nginx -T 2>/dev/null | grep -A 20 "location /api"
# 必须包含:
# ✓ proxy_set_header Cookie $http_cookie;
# ✓ proxy_pass_header Set-Cookie;
```
### 后端配置
```bash
# 检查后端是否运行
curl http://localhost:40001/api/health
# 检查session依赖
cd /path/to/backend && npm list | grep session
# 必须有:
# ✓ express-session@x.x.x
# ✓ svg-captcha@x.x.x
```
### Cookie传递
```bash
# 完整测试
curl -v http://localhost:40001/api/captcha 2>&1 | grep -i "set-cookie"
# 必须看到:
# < Set-Cookie: captcha.sid=...
```
## 🆘 仍然不行?
如果以上步骤都完成了还是不行,请提供:
1. **Nginx配置内容**
```bash
nginx -T 2>/dev/null | grep -A 30 "location /api"
```
2. **后端日志**
```bash
pm2 logs backend --lines 50
```
3. **验证码API响应**
```bash
curl -vi http://localhost:40001/api/captcha
```
4. **完整的curl测试**
```bash
# 生成验证码
curl -vi https://cs.workyai.cn/api/captcha -c cookies.txt
# 查看cookie
cat cookies.txt
# 测试登录
curl -vi https://cs.workyai.cn/api/login \
-b cookies.txt \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"wrong","captcha":"1234"}'
```
## 📞 提供这些信息后我可以进一步帮助你!

View File

@@ -1,173 +0,0 @@
# 登录验证码功能 - 快速开始
## 功能说明
本次更新为"玩玩云"添加了登录验证码功能,提高系统安全性:
**自动触发**密码输错2次后自动显示验证码
**智能保护**基于IP和用户名双重维度防护
**易于使用**:点击图片即可刷新验证码
**前后通用**:前台用户和后台管理员登录均适用
## 安装依赖
已为后端安装以下依赖:
```bash
cd backend
npm install svg-captcha express-session
```
## 快速启动
### 1. 启动后端服务
```bash
cd backend
node server.js
```
### 2. 访问登录页面
打开浏览器访问:`http://localhost:40001`
### 3. 测试验证码功能
**方法1浏览器手动测试**
1. 输入任意用户名和错误密码
2. 点击"登录"按钮2次
3. 第3次尝试时会自动显示验证码输入框
4. 输入验证码后继续登录
**方法2使用测试脚本**
```bash
# 确保后端服务已启动
./test_captcha.sh
```
## 使用截图流程
### 第1-2次登录失败
![正常登录表单](screenshots/login_normal.png)
- 显示用户名和密码输入框
- 提示"用户名或密码错误"
### 第3次登录失败触发验证码
![验证码登录表单](screenshots/login_captcha.png)
- 自动显示验证码输入框
- 显示4位数字验证码图片
- 可点击图片刷新验证码
### 验证码验证
![验证码输入](screenshots/captcha_input.png)
- 输入图片中的4位数字
- 点击"登录"继续
## 配置说明
### 环境变量配置(可选)
`backend/.env` 文件中添加:
```env
# Session密钥建议生产环境修改
SESSION_SECRET=your-session-secret-here
# Cookie安全HTTPS环境启用
COOKIE_SECURE=false
```
### 调整验证码触发次数
编辑 `backend/server.js`,找到以下代码:
```javascript
// 第683行附近
const needCaptcha = ipFailures >= 2 || usernameFailures >= 2;
```
修改 `>= 2` 为你想要的次数(如 `>= 3` 表示第4次才需要验证码
### 调整防爆破参数
编辑 `backend/server.js`,找到以下代码:
```javascript
// 第394行附近
const loginLimiter = new RateLimiter({
maxAttempts: 5, // 最大失败次数
windowMs: 15 * 60 * 1000, // 15分钟
blockDuration: 30 * 60 * 1000 // 封锁30分钟
});
```
## 文件修改清单
### 后端文件
-`backend/server.js` - 添加验证码生成API和登录验证逻辑
-`backend/package.json` - 添加验证码依赖
### 前端文件
-`frontend/app.html` - 添加验证码输入框和图片显示
-`frontend/app.js` - 添加验证码逻辑和刷新方法
### 新增文件
-`CAPTCHA_FEATURE.md` - 详细功能说明文档
-`CAPTCHA_README.md` - 快速开始指南
-`test_captcha.sh` - 自动化测试脚本
## 功能特点
### 验证码特性
- **纯数字**只使用0-9数字易于识别
- **4位长度**:平衡安全性和用户体验
- **彩色显示**:提高可读性
- **点击刷新**:用户体验友好
- **5分钟有效期**:防止验证码被重复使用
### 安全机制
- **渐进式保护**
- 1-2次失败仅密码验证
- 3-5次失败要求验证码
- 5次失败封锁30分钟
- **双重维度**同时基于IP和用户名统计
- **Session存储**:验证码存储在服务器端,防止篡改
## 故障排查
### 验证码不显示
**检查项**
1. 确认后端服务已启动
2. 检查浏览器控制台是否有错误
3. 确认已输错密码至少2次
### 验证码一直错误
**检查项**
1. 确认输入的是图片中的数字
2. 刷新验证码重新尝试
3. 检查浏览器是否禁用Cookie
### API返回错误
**检查项**
1. 查看后端日志:`tail -f backend/logs/error.log`
2. 确认依赖已安装:`cd backend && npm list svg-captcha express-session`
3. 重启后端服务
## 测试清单
- [ ] 第1次登录失败不显示验证码
- [ ] 第2次登录失败不显示验证码
- [ ] 第3次登录失败显示验证码
- [ ] 验证码图片可以正常加载
- [ ] 点击验证码图片可以刷新
- [ ] 输入正确验证码和正确密码可以登录成功
- [ ] 输入错误验证码提示"验证码错误"
- [ ] 管理员登录也受到验证码保护
- [ ] 登录成功后验证码自动隐藏
## 技术支持
详细技术文档:[CAPTCHA_FEATURE.md](./CAPTCHA_FEATURE.md)
如有问题,请:
1. 查看后端日志
2. 检查浏览器控制台
3. 运行测试脚本 `./test_captcha.sh`
4. 查看详细文档

183
DEPLOY.md
View File

@@ -1,183 +0,0 @@
# 玩玩云 - 部署指南
## 🚀 快速部署3分钟完成
### 第一步:上传项目到服务器
```bash
# 方法1: 使用scp上传
scp -r ftp-web-manager root@服务器IP:/var/www/
# 方法2: 使用FTP工具上传到 /var/www/ 目录
```
### 第二步SSH登录服务器
```bash
ssh root@服务器IP
```
### 第三步:一键部署
```bash
cd /var/www/ftp-web-manager
bash deploy.sh
```
部署脚本会自动:
- ✅ 检查Docker环境
- ✅ 创建必要目录
- ✅ 构建Docker镜像
- ✅ 启动所有服务
- ✅ 显示访问信息
### 第四步:访问系统
打开浏览器访问:
```
http://服务器IP:8080
```
使用默认账号登录:
```
用户名: admin
密码: admin123
```
**⚠️ 重要:首次登录后立即修改密码!**
---
## 📋 环境要求
- Docker 20.10.0+
- Docker Compose 2.0.0+
- 最低 1GB 内存(推荐 2GB+
- Linux 系统Ubuntu/Debian/CentOS
---
## 🔧 手动部署(如果自动脚本失败)
```bash
# 1. 进入项目目录
cd /var/www/ftp-web-manager
# 2. 创建必要目录
mkdir -p certbot/conf certbot/www backend/uploads
# 3. 构建并启动
docker-compose up --build -d
# 4. 查看日志
docker-compose logs -f
```
---
## ✅ 部署验证
检查容器状态:
```bash
docker-compose ps
```
应该看到3个容器都是 "Up" 状态:
- wanwanyun-backend
- wanwanyun-frontend
- wanwanyun-certbot
查看后端日志:
```bash
docker-compose logs backend
```
应该看到:
```
数据库初始化完成
默认管理员账号已创建
玩玩云已启动
```
---
## 🛑 停止服务
```bash
cd /var/www/ftp-web-manager
docker-compose down
```
---
## 🔄 重启服务
```bash
cd /var/www/ftp-web-manager
docker-compose restart
```
---
## 📦 更新代码
```bash
cd /var/www/ftp-web-manager
git pull # 或重新上传文件
docker-compose up --build -d
```
---
## ❓ 常见问题
### Q: 端口8080被占用怎么办
修改 docker-compose.yml 中的端口映射:
```yaml
ports:
- "8081:80" # 改为8081或其他端口
```
### Q: Docker容器启动失败
```bash
# 查看详细日志
docker-compose logs backend
# 重新构建
docker-compose down
docker-compose up --build -d
```
### Q: 忘记管理员密码怎么办?
删除数据库文件重新初始化:
```bash
docker-compose down
rm backend/ftp-manager.db
docker-compose up -d
```
### Q: 如何配置HTTPS
参考主README.md中的SSL配置章节。
---
## 📞 获取帮助
- 查看详细文档: README.md
- 查看部署检查报告: 桌面上的检查报告文件
- 查看对话历史: 桌面上的对话总结文件
---
**部署成功后,记得:**
1. ✅ 修改admin密码
2. ✅ 配置SFTP连接
3. ✅ 设置JWT密钥backend/.env
4. ✅ 配置HTTPS生产环境
5. ✅ 定期备份数据库
祝您使用愉快!☁️

View File

@@ -1,189 +0,0 @@
# 玩玩云部署指南
## 快速部署
### 1. 基础部署Docker Compose
```bash
# 克隆项目
git clone <repository-url>
cd ftp-web-manager
# 启动服务
docker-compose up -d
```
服务将在以下端口运行:
- Frontend (Nginx): 8080 (HTTP), 8443 (HTTPS)
- Backend (Node.js): 40001
### 2. 如果使用宿主机Nginx作为反向代理
如果你在宿主机上使用Nginx作为SSL终止/反向代理推荐用于生产环境需要在Nginx配置中添加大文件上传支持。
#### 2.1 创建Nginx配置文件
创建 `/etc/nginx/sites-available/wanwanyun.conf`(或对应的配置目录):
```nginx
server {
listen 80;
server_name your-domain.com;
# HTTP重定向到HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name your-domain.com;
# SSL证书配置使用Let's Encrypt或其他证书
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# 反向代理到Docker容器
location / {
# ⚠️ 重要设置最大上传文件大小为5GB
client_max_body_size 5G;
# ⚠️ 重要大文件上传超时设置1小时
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 3600s;
# 代理到Docker容器的8080端口
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
```
#### 2.2 应用配置
```bash
# 启用站点配置
ln -s /etc/nginx/sites-available/wanwanyun.conf /etc/nginx/sites-enabled/
# 测试Nginx配置
nginx -t
# 重新加载Nginx
nginx -s reload
```
### 3. 宝塔面板用户
如果使用宝塔面板,配置文件通常在:
- `/www/server/panel/vhost/nginx/your-domain.conf`
在站点的 `location /` 块中添加:
```nginx
location / {
# 设置最大上传文件大小为5GB
client_max_body_size 5G;
# 大文件上传超时设置1小时
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 3600s;
# ... 其他代理配置
}
```
然后重载Nginx
```bash
nginx -s reload
```
## 上传限制说明
系统支持的最大上传文件大小为 **5GB**,需要在以下三个层级进行配置:
### 1. ✅ 容器内Nginx已配置
- 文件:`nginx/nginx.conf`
- 配置:`client_max_body_size 5G;`
### 2. ✅ 后端Multer已配置
- 文件:`backend/server.js`
- 配置:`limits: { fileSize: 5 * 1024 * 1024 * 1024 }`
### 3. ⚠️ 宿主机Nginx需要手动配置
- 如果使用宿主机Nginx作为反向代理
- 必须在 `location /` 块中添加 `client_max_body_size 5G;`
- 否则上传会在64MB时失败Nginx默认限制
## 故障排查
### 上传文件提示413错误
**问题**上传大于64MB的文件时失败浏览器控制台显示 `413 Payload Too Large`
**原因**宿主机Nginx的 `client_max_body_size` 限制默认1MB或64MB
**解决方案**
1. 找到宿主机Nginx配置文件通常是 `/etc/nginx/sites-available/``/www/server/panel/vhost/nginx/`
2.`location /` 块中添加:
```nginx
client_max_body_size 5G;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 3600s;
```
3. 测试并重载Nginx
```bash
nginx -t
nginx -s reload
```
### 上传进度
前端已实现实时上传进度显示使用axios的 `onUploadProgress`),无需额外配置。
## 存储配置
系统支持两种存储方式:
### 本地存储
- 文件存储在:`backend/local-storage/`
- 可设置用户配额限制
- 适合中小型部署
### SFTP存储
- 用户可配置自己的SFTP服务器
- 支持HTTP直接下载配置 `http_download_base_url`
- 适合大规模部署
## 安全建议
1. **使用HTTPS**生产环境务必配置SSL证书
2. **定期备份数据库**`backend/data.db` 包含所有用户数据
3. **限制管理员账号**:定期审查用户权限
4. **配置防火墙**只开放必要的端口80, 443
## 技术支持
如有问题,请查看日志:
```bash
# 后端日志
docker logs wanwanyun-backend
# 前端日志
docker logs wanwanyun-frontend
# Nginx日志
tail -f /www/wwwlogs/your-domain.log
tail -f /www/wwwlogs/your-domain.error.log
```

File diff suppressed because it is too large Load Diff

View File

@@ -1,295 +0,0 @@
# 玩玩云 - 一键部署指南
## 🚀 一键安装命令
在您的服务器上执行以下任意一条命令即可开始安装:
### 方式1: 使用 curl
```bash
curl -fsSL https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh | bash
```
### 方式2: 使用 wget
```bash
wget -qO- https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh | bash
```
---
## 🔄 一键更新命令
如果您已经部署了玩玩云,可以使用以下命令快速更新到最新版本:
### 方式1: 使用 curl (推荐)
```bash
curl -fsSL https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh | bash -s -- --update
```
### 方式2: 使用 wget
```bash
wget -qO- https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh | bash -s -- --update
```
### 方式3: 本地脚本
```bash
wget https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh
bash install.sh --update
```
### 更新说明
更新过程会:
- ✅ 从Gitee拉取最新代码
- ✅ 自动备份数据库和用户文件
- ✅ 更新后端依赖npm install
- ✅ 重启后端服务
- ✅ 保留所有配置和用户数据
更新不会影响:
- ✅ 数据库文件(用户、分享链接等)
- ✅ 用户上传的文件storage目录
- ✅ 配置文件(.env
- ✅ Nginx配置
---
## 📋 系统要求
### 支持的操作系统
- Ubuntu 18.04 / 20.04 / 22.04
- Debian 10 / 11 / 12
- CentOS 7 / 8
- RHEL 7 / 8
### 硬件要求
- **CPU**: 1核心及以上
- **内存**: 最低512MB推荐1GB+
- **磁盘**: 最低2GB可用空间推荐5GB+
- **网络**: 需要能访问外网(下载依赖包)
### 端口要求
- **80**: HTTP访问必须
- **443**: HTTPS访问可选如果使用SSL
- **40001**: 后端服务端口(内部使用)
---
## 🎯 部署流程
执行安装命令后,脚本会自动引导您完成以下步骤:
### 1⃣ 环境检测
自动检测系统信息:
- 操作系统类型和版本
- CPU架构
- 内存和磁盘空间
- 网络连接状态
- 公网IP地址
### 2⃣ 选择软件源
```
请选择软件包安装源:
[1] 官方源 (国外服务器推荐)
[2] 阿里云镜像源 (国内服务器推荐,速度更快)
```
**建议**: 国内服务器选择 [2],国外服务器选择 [1]
### 3⃣ 自动安装依赖
脚本会自动安装以下环境(如果未安装):
- Node.js 18.x
- Nginx
- PM2
- SQLite3
- 其他必要工具
### 4⃣ 选择访问模式
#### 域名模式 (推荐)
```
请选择访问模式:
[1] 域名模式 (推荐支持HTTPS)
[2] IP模式 (仅HTTP适合测试)
```
**如果选择 [1] 域名模式**:
1. 输入您的域名(例如: wwy.example.com
2. 脚本会自动验证域名解析
3. 选择SSL证书部署方式
#### SSL证书方案
```
请选择SSL证书自动部署方式:
【推荐方案】
[1] Certbot (Let's Encrypt官方工具)
- 最稳定可靠,支持自动续期
【备选方案】
[2] acme.sh + Let's Encrypt
- 纯Shell脚本更轻量级
[3] acme.sh + ZeroSSL
- Let's Encrypt的免费替代品
[4] acme.sh + Buypass
- 挪威免费CA有效期180天
【云服务商证书】
[5] 阿里云免费证书 (需提供AccessKey)
[6] 腾讯云免费证书 (需提供SecretKey)
【其他选项】
[7] 使用已有证书 (手动上传证书文件)
[8] 暂不配置HTTPS (可后续配置)
```
**建议**:
- 首选 [1] Certbot
- 如果失败,脚本会自动建议尝试 [2] 或 [3]
- 测试环境可选 [8] 跳过HTTPS
### 5⃣ 配置管理员账号
```
管理员用户名 [默认: admin]:
管理员密码至少6位:
确认密码:
```
### 6⃣ 自动部署
脚本会自动完成:
- ✅ 创建项目目录
- ✅ 从Gitee下载项目代码
- ✅ 安装后端依赖npm install
- ✅ 创建配置文件和数据库
- ✅ 部署SSL证书如果选择
- ✅ 配置Nginx反向代理
- ✅ 启动后端服务PM2管理
- ✅ 健康检查
### 7⃣ 部署完成
```
╔═══════════════════════════════════════════════════════════════╗
║ ║
║ 🎉 部署成功! ║
║ ║
╚═══════════════════════════════════════════════════════════════╝
访问地址: https://wwy.example.com
管理员账号: admin
管理员密码: ********
常用命令:
查看服务状态: pm2 status
查看日志: pm2 logs wanwanyun-backend
重启服务: pm2 restart wanwanyun-backend
停止服务: pm2 stop wanwanyun-backend
```
---
## 🔧 常见问题
### 1. 如何查看部署日志?
```bash
pm2 logs wanwanyun-backend
```
### 2. 如何重启服务?
```bash
pm2 restart wanwanyun-backend
```
### 3. 如何修改配置?
编辑配置文件后重启服务:
```bash
nano /var/www/wanwanyun/backend/.env
pm2 restart wanwanyun-backend
```
### 4. SSL证书过期怎么办
- **Certbot**: 自动续期,无需手动操作
- **acme.sh**: 自动续期,无需手动操作
- **手动证书**: 需要手动更新证书文件并重启Nginx
### 5. 忘记管理员密码怎么办?
修改配置文件并重启:
```bash
nano /var/www/wanwanyun/backend/.env
# 修改 ADMIN_PASSWORD 的值
pm2 restart wanwanyun-backend
```
### 6. 如何卸载?
使用一键卸载命令:
```bash
# 方式1: 在线卸载
curl -fsSL https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh | bash -s -- --uninstall
# 方式2: 在线卸载
wget -qO- https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh | bash -s -- --uninstall
# 方式3: 本地卸载(如果已下载脚本)
bash install.sh --uninstall
```
**卸载特性**:
- 双重确认机制,防止误删
- 可选数据备份到 `/root/wanwanyun-backup-YYYYMMDD-HHMMSS`
- 完整清理:
- PM2 进程: wanwanyun-backend
- 项目目录: /var/www/wanwanyun
- Nginx 配置: /etc/nginx/sites-enabled/wanwanyun.conf
- SSL 证书: /etc/nginx/ssl/*
- 临时文件和缓存
- 保留系统环境:
- Node.js
- Nginx
- PM2
- 编译工具build-essential、gcc-c++等)
- 智能残留检查
**手动卸载**(仅作参考,推荐使用自动卸载):
```bash
# 停止服务
pm2 delete wanwanyun-backend
# 删除项目目录
rm -rf /var/www/wanwanyun
# 删除Nginx配置
rm -f /etc/nginx/sites-enabled/wanwanyun.conf
systemctl reload nginx
```
### 7. 端口被占用怎么办?
检查端口占用:
```bash
netstat -tunlp | grep :80
netstat -tunlp | grep :40001
```
停止占用端口的进程或修改配置文件端口。
### 8. 域名解析未生效怎么办?
- 等待DNS解析生效通常需要几分钟到几小时
- 暂时选择 [8] 跳过HTTPS配置
- 解析生效后可手动配置SSL
---
## 📞 获取帮助
- **项目地址**: https://gitee.com/yu-yon/vue-driven-cloud-storage
- **问题反馈**: 提交Issue到Gitee仓库
- **部署文档**: 查看项目README.md
---
## 📝 注意事项
1. **需要root权限**: 脚本需要使用 `sudo` 或以root用户运行
2. **防火墙设置**: 确保80和443端口已开放
3. **域名解析**: 使用域名模式前请先将域名解析到服务器IP
4. **备份数据**: 升级前请备份数据库和配置文件
5. **网络环境**: 需要能够访问外网下载依赖包
---
**祝您使用愉快!** 🎉

View File

@@ -1,192 +0,0 @@
# install.sh 更新说明 - 验证码Cookie配置
## 需要修改的原因
验证码功能依赖Cookie传递session信息。install.sh生成的Nginx配置中缺少Cookie传递设置导致验证码无法正常工作。
## 需要修改的位置
install.sh文件中有**3处**`location /api`配置需要添加Cookie传递设置。
### 位置1第2372-2387行HTTP配置
`configure_nginx_http_first()` 函数中:
```nginx
location /api {
proxy_pass http://localhost:${BACKEND_PORT};
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# ⬇️ 在这里添加以下3行 ⬇️
# Cookie传递配置验证码session需要
proxy_set_header Cookie $http_cookie;
proxy_pass_header Set-Cookie;
# 上传超时设置
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 300s;
}
```
### 位置2第2650行附近HTTPS配置
`configure_nginx_final()` 函数的HTTPS配置中
```nginx
location /api {
proxy_pass http://localhost:${BACKEND_PORT};
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# ⬇️ 在这里添加以下3行 ⬇️
# Cookie传递配置验证码session需要
proxy_set_header Cookie $http_cookie;
proxy_pass_header Set-Cookie;
# 上传超时设置
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 300s;
}
```
### 位置3第2783行附近虚拟主机配置
在另一个Nginx配置块中
```nginx
location /api {
proxy_pass http://localhost:${BACKEND_PORT};
# ... 其他配置 ...
proxy_set_header X-Forwarded-Proto $scheme;
# ⬇️ 在这里添加以下3行 ⬇️
# Cookie传递配置验证码session需要
proxy_set_header Cookie $http_cookie;
proxy_pass_header Set-Cookie;
# 上传超时设置
# ...
}
```
## 手动修改方法
### 方法1使用vim编辑器
```bash
vim install.sh
# 在vim中
# 1. 按 / 搜索location /api
# 2. 找到 proxy_set_header X-Forwarded-Proto $scheme; 这一行
# 3. 在其后添加3行Cookie配置
# 4. 按 n 继续查找下一个重复步骤2-3
# 5. 共修改3处
# 6. :wq 保存退出
```
### 方法2使用sed批量替换
```bash
cd /home/yuyx/aaaaaa/网盘/vue-driven-cloud-storage
# 备份
cp install.sh install.sh.backup
# 批量替换在所有location /api块中的X-Forwarded-Proto后添加
# 注意:这个命令需要仔细测试
sed -i '/proxy_set_header X-Forwarded-Proto \\$scheme;/a\
\
# Cookie传递配置验证码session需要\
proxy_set_header Cookie $http_cookie;\
proxy_pass_header Set-Cookie;' install.sh
# 验证修改
grep -A 2 "Cookie传递配置" install.sh
```
### 方法3手动复制粘贴
1. 打开install.sh
2. 搜索 `location /api`会找到3处
3. 在每处的 `proxy_set_header X-Forwarded-Proto $scheme;` 后面添加:
```
# Cookie传递配置验证码session需要
proxy_set_header Cookie $http_cookie;
proxy_pass_header Set-Cookie;
```
## 验证修改
```bash
# 检查是否修改了3处
grep -c "Cookie传递配置" install.sh
# 输出应该是: 3
# 查看修改的位置
grep -n "Cookie传递配置" install.sh
```
## 应用修改
### 新部署时
直接运行修改后的install.sh即可它会生成包含Cookie配置的Nginx配置文件。
### 已部署的服务
需要手动更新Nginx配置文件
```bash
# 编辑Nginx配置
vim /etc/nginx/sites-available/玩玩云.conf
# 或
vim /etc/nginx/conf.d/玩玩云.conf
# 在location /api块中添加Cookie配置
# 测试配置
nginx -t
# 重新加载
nginx -s reload
```
## 为什么需要这个配置
1. **proxy_set_header Cookie $http_cookie;**
- 将浏览器发送的Cookie转发给后端
- 后端才能读取验证码session
2. **proxy_pass_header Set-Cookie;**
- 将后端的Set-Cookie响应头传递给浏览器
- 浏览器才能保存验证码session cookie
3. **缺少这两行会导致**
- 验证码session无法建立
- 验证码一直提示"已过期"
- Cookie在Nginx层被过滤掉
## 相关提交
- nginx/nginx.conf 已经修改(提交 5f3fd38
- install.sh 需要同步更新(本文档)
## 注意事项
- 修改install.sh后需要提交到Git
- 已部署的服务需要手动更新Nginx配置
- 修改后记得测试验证码功能

View File

@@ -1,49 +0,0 @@
╔══════════════════════════════════════════════════════════════╗
║ 玩玩云 - 快速开始指南 ║
╚══════════════════════════════════════════════════════════════╝
【最简单的部署方法 - 3步完成】
1⃣ 上传项目到服务器的 /var/www/ 目录
2⃣ SSH登录服务器执行
cd /var/www/ftp-web-manager
bash deploy.sh
3⃣ 打开浏览器访问:
http://服务器IP:8080
默认账号admin
默认密码admin123
✅ 部署完成!
───────────────────────────────────────────────────────────────
【环境要求】
✓ Docker 20.10+
✓ Docker Compose 2.0+
✓ Linux系统
✓ 1GB+ 内存
───────────────────────────────────────────────────────────────
【详细文档】
📖 完整部署指南DEPLOY.md
📖 使用说明README.md
📖 部署检查报告:桌面上的检查报告
───────────────────────────────────────────────────────────────
【重要提示】
⚠️ 首次登录后立即修改admin密码
⚠️ 生产环境请配置HTTPS
⚠️ 定期备份 backend/ftp-manager.db 数据库文件
───────────────────────────────────────────────────────────────
【获取帮助】
💬 查看常见问题DEPLOY.md
💬 查看详细文档README.md
祝您使用愉快!☁️

View File

@@ -1,320 +0,0 @@
# 玩玩云 v1.1.0 更新总结
**发布日期**: 2025-11-13
**版本**: v1.1.0
**提交记录**: ac9f1c7
---
## 🎉 本次更新内容
### 1. 🔐 安全增强 - 防爆破保护系统
#### 登录防爆破保护
- **限制策略**: 5次失败尝试/15分钟
- **封锁时长**: 30分钟
- **保护维度**:
- IP地址维度防止同一IP多次尝试
- 用户名维度(防止针对特定账号的攻击)
- **技术实现**:
- 新增 `RateLimiter`
- 使用内存存储TTL机制
- 自动清理过期记录
#### 分享密码防爆破保护
- **限制策略**: 10次失败尝试/10分钟
- **封锁时长**: 20分钟
- **保护维度**: IP + 分享码组合
- **应用场景**:
- `/api/share/:code/verify` - 密码验证
- 防止暴力破解分享密码
#### 反向代理支持
- 支持读取 `X-Forwarded-For`
- 正确识别真实客户端IP
- 适配 Nginx/Caddy 等反向代理
#### 安全日志
```javascript
[防爆破] 拦截登录尝试 - IP: xxx.xxx.xxx.xxx, 原因: IP被封锁
[防爆破] 封锁Key: login:username:admin, 失败次数: 5, 封锁时长: 30分钟
[防爆破清理] 已清理 12 个过期尝试记录, 3 个过期封锁记录
```
---
### 2. 🔧 部署优化 - 上传工具修复
#### 问题描述
更新脚本执行 `git pull` 时会删除 `upload-tool` 目录,但由于 `.gitignore` 排除了 `dist/*.exe`,导致更新后上传工具丢失。
#### 解决方案
`install.sh` 更新流程中添加检查逻辑:
```bash
# 检查并重新下载上传工具(如果需要)
if [[ ! -f "${PROJECT_DIR}/upload-tool/dist/玩玩云上传工具.exe" ]]; then
print_info "检测到上传工具丢失,正在重新下载..."
build_upload_tool
else
FILE_SIZE=$(stat -c%s "${PROJECT_DIR}/upload-tool/dist/玩玩云上传工具.exe")
if [[ $FILE_SIZE -lt 30000000 ]]; then
print_warning "上传工具文件大小异常,正在重新下载..."
build_upload_tool
fi
fi
```
#### 功能特性
- ✅ 自动检测上传工具是否存在
- ✅ 验证文件大小确保完整性(>30MB
- ✅ 自动从直链下载:`http://a.haory.top/e/e82/玩玩云上传工具.exe`
- ✅ 最多重试3次确保下载成功
---
### 3. 🎨 界面优化
#### 首页更新
- **版本标识**: "v1.0 生产就绪版本" → "版本号 V1.0"
- **功能描述**: 明确说明支持 SFTP 和本地存储双模式
- **统计卡片**:
- 移除 "100%开源免费"
- 移除 "Docker 一键部署"
- 新增 "双模式 - SFTP + 本地存储"
- **页脚简化**: 移除不可点击的导航链接
#### 功能说明优化
- 将 "流式下载" 更名为 "灵活下载"
- 明确说明本地存储模式不是流式中转
---
## 📊 提交记录
### Commit 1: 防爆破保护
```
commit c439966
feat: 添加登录和分享密码防爆破保护
- 新增RateLimiter类实现基于IP和用户名的限流
- 登录接口: 5次失败/15分钟后封锁30分钟
- 分享密码: 10次失败/10分钟后封锁20分钟
- 支持X-Forwarded-For反向代理
- 自动清理过期记录
- 详细的安全日志记录
```
**变更文件**:
- `backend/server.js`: +233行, -1行
### Commit 2: 上传工具修复
```
commit 72063c5
fix: 修复更新脚本导致上传工具丢失的问题
- 在更新流程中添加上传工具完整性检查
- 如果上传工具丢失或文件大小异常,自动重新下载
- 使用已有的build_upload_tool函数从直链下载
- 验证文件大小确保下载完整(>30MB
```
**变更文件**:
- `install.sh`: +16行
### Commit 3: 版本发布
```
commit ac9f1c7
chore: 发布 v1.1.0 版本
新增功能:
- 登录和分享密码防爆破保护
- 更新脚本自动检测和修复上传工具
- 首页界面优化
```
**变更文件**:
- `VERSION.txt`: +46行, -26行
---
## 🧪 测试建议
### 1. 防爆破保护测试
**登录限流测试**:
```bash
# 连续5次错误密码登录
curl -X POST http://localhost:40001/api/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"wrongpass"}'
# 第6次应返回 429 状态码
# 响应: {"success":false,"message":"登录尝试过多,请在 30 分钟后重试","blocked":true}
```
**分享密码限流测试**:
```bash
# 连续10次错误密码
for i in {1..11}; do
curl -X POST http://localhost:40001/api/share/XXXXX/verify \
-H "Content-Type: application/json" \
-d '{"password":"wrongpass"}'
echo ""
done
# 第11次应返回 429 状态码
```
### 2. 上传工具修复测试
```bash
# 1. 备份当前上传工具
mv upload-tool/dist/玩玩云上传工具.exe /tmp/backup.exe
# 2. 执行更新
./install.sh
# 选择选项 7: 更新系统
# 3. 验证上传工具已自动恢复
ls -lh upload-tool/dist/玩玩云上传工具.exe
# 应显示文件大小约 43MB
```
### 3. 反向代理测试
Nginx配置示例:
```nginx
location /api/ {
proxy_pass http://localhost:40001;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
```
验证日志中显示的是真实客户端IP而非代理IP。
---
## 📝 升级指南
### 从 v1.0.0 升级到 v1.1.0
#### 方法一: 使用安装脚本(推荐)
```bash
cd /opt/vue-driven-cloud-storage
./install.sh
# 选择选项 7: 更新系统
```
脚本会自动:
1. 停止现有服务
2. 拉取最新代码
3. 检测并重新下载上传工具(如需要)
4. 更新依赖
5. 重启服务
#### 方法二: 手动更新
```bash
# 1. 停止服务
pm2 stop vue-driven-cloud-storage-backend
# 2. 备份数据
cp -r backend/data /tmp/backup-data
# 3. 拉取代码
git pull origin master
# 4. 检查上传工具
ls -lh upload-tool/dist/玩玩云上传工具.exe
# 如果不存在或小于30MB重新下载:
wget -O upload-tool/dist/玩玩云上传工具.exe \
http://a.haory.top/e/e82/玩玩云上传工具.exe
# 5. 重启服务
pm2 restart vue-driven-cloud-storage-backend
```
---
## 🔍 技术细节
### RateLimiter 实现原理
```javascript
class RateLimiter {
constructor(options) {
this.maxAttempts = options.maxAttempts || 5;
this.windowMs = options.windowMs || 15 * 60 * 1000;
this.blockDuration = options.blockDuration || 30 * 60 * 1000;
this.attempts = new Map(); // 尝试记录
this.blockedKeys = new Map(); // 封锁记录
}
recordFailure(key) {
// 检查是否已封锁
if (this.isBlocked(key)) {
return { blocked: true, ... };
}
// 记录失败尝试
let info = this.attempts.get(key) || { count: 0, windowEnd: ... };
info.count++;
// 达到阈值,进行封锁
if (info.count >= this.maxAttempts) {
this.blockedKeys.set(key, { expiresAt: ... });
return { blocked: true, ... };
}
return { blocked: false, remainingAttempts: ... };
}
recordSuccess(key) {
// 认证成功,清除所有记录
this.attempts.delete(key);
this.blockedKeys.delete(key);
}
}
```
### 中间件应用
```javascript
// 登录接口
app.post('/api/login',
loginRateLimitMiddleware, // 添加限流中间件
[...validators],
async (req, res) => {
// 验证失败
if (!user || !passwordCorrect) {
loginLimiter.recordFailure(req.rateLimitKeys.ipKey);
loginLimiter.recordFailure(req.rateLimitKeys.usernameKey);
return res.status(401).json({...});
}
// 验证成功
loginLimiter.recordSuccess(req.rateLimitKeys.ipKey);
loginLimiter.recordSuccess(req.rateLimitKeys.usernameKey);
return res.json({...});
}
);
```
---
## 🐛 已知问题
无已知问题。
---
## 📧 反馈与支持
如遇到问题,请通过以下方式反馈:
- Gitee Issues: https://gitee.com/yu-yon/vue-driven-cloud-storage/issues
- 查看日志: `pm2 logs vue-driven-cloud-storage-backend`
---
**感谢使用玩玩云!** 🎉

View File

@@ -1,118 +0,0 @@
玩玩云 - 版本信息
═══════════════════════════════════════
版本号: v1.1.0
发布日期: 2025-11-13
状态: 生产就绪 ✅
═══════════════════════════════════════
【v1.1.0 新增功能】
✅ 安全增强
- 登录防爆破保护5次失败封锁30分钟
- 分享密码防爆破保护10次失败封锁20分钟
- 基于IP和用户名的智能限流
- 支持反向代理X-Forwarded-For
- 详细的安全日志记录
✅ 部署优化
- 修复更新脚本导致上传工具丢失的问题
- 自动检测和重新下载上传工具
- 更新流程更加稳定可靠
✅ 界面优化
- 更新首页版本标识
- 优化功能描述更加清晰
- 简化页脚设计
═══════════════════════════════════════
【v1.0.0 核心功能】
✅ 完整的文件管理功能
- SFTP文件浏览、上传、下载
- 服务器本地存储支持
- 文件重命名、删除
- 流式下载,支持进度显示
✅ 文件分享功能
- 生成分享链接
- 支持密码保护
- 支持有效期设置
- 双模式下载HTTP/SFTP
✅ 用户管理系统
- 用户注册、登录
- 密码加密存储
- JWT认证
- 管理员权限管理
✅ 桌面上传工具
- 拖拽上传
- 实时进度显示
- 自动配置
✅ Docker容器化部署
- 一键部署脚本
- 自动环境检查
- 完整的日志记录
═══════════════════════════════════════
【技术栈】
后端:
- Node.js 20
- Express 4.x
- better-sqlite3
- ssh2-sftp-client
- JWT认证
- bcrypt加密
前端:
- Vue.js 3
- Axios
- Font Awesome
部署:
- Docker
- Docker Compose
- Nginx
═══════════════════════════════════════
【安全特性】
✅ 密码bcrypt加密
✅ JWT令牌认证
✅ SFTP密码安全存储
✅ SQL注入防护
✅ XSS防护
✅ CORS配置
✅ 登录防爆破保护 (新增)
✅ 分享密码防爆破保护 (新增)
═══════════════════════════════════════
【已修复的问题】
v1.1.0:
✅ 更新脚本导致上传工具丢失
✅ 缺少登录防爆破保护
✅ 缺少分享密码防爆破保护
v1.0.0:
✅ 数据库初始化语法错误
✅ 分享链接重定向错误
✅ 分享页面下载按钮缺失
✅ 密码验证错误
✅ SFTP连接过早关闭
✅ Docker配置不完整
═══════════════════════════════════════
更新日志: 查看 Git 提交历史
许可证: 仅供学习和个人使用
═══════════════════════════════════════

155
deploy.sh
View File

@@ -1,155 +0,0 @@
#!/bin/bash
# 玩玩云一键部署脚本
# 使用方法: bash deploy.sh
set -e
echo "========================================="
echo " 玩玩云 - 一键部署脚本"
echo "========================================="
echo ""
# 检查Docker
if ! command -v docker &> /dev/null; then
echo "❌ 错误: Docker未安装"
echo "请先安装Docker: https://docs.docker.com/engine/install/"
exit 1
fi
# 检查Docker Compose
if ! command -v docker-compose &> /dev/null; then
echo "❌ 错误: Docker Compose未安装"
echo "请先安装Docker Compose: https://docs.docker.com/compose/install/"
exit 1
fi
echo "✓ Docker版本: $(docker --version)"
echo "✓ Docker Compose版本: $(docker-compose --version)"
echo ""
# 检查必要的目录
echo "📁 检查项目结构..."
REQUIRED_DIRS=("backend" "frontend" "nginx")
for dir in "${REQUIRED_DIRS[@]}"; do
if [ ! -d "$dir" ]; then
echo "❌ 错误: 缺少 $dir 目录"
exit 1
fi
done
echo "✓ 项目结构完整"
echo ""
# 创建必要的目录
echo "📂 创建必要的目录..."
mkdir -p certbot/conf
mkdir -p certbot/www
mkdir -p backend/uploads
mkdir -p storage
echo "✓ 目录创建完成"
echo ""
# 检查.env文件并生成JWT密钥
echo "🔐 配置环境变量..."
if [ ! -f "backend/.env" ]; then
echo "⚠️ backend/.env 文件不存在,正在创建..."
if [ -f "backend/.env.example" ]; then
cp backend/.env.example backend/.env
echo "✓ 已从.env.example创建.env文件"
else
echo "⚠️ .env.example不存在创建基础配置"
cat > backend/.env << 'ENVEOF'
PORT=40001
NODE_ENV=production
ADMIN_USERNAME=admin
ADMIN_PASSWORD=admin123
STORAGE_ROOT=/app/storage
# CORS配置 - 生产环境必须设置!
# 示例: ALLOWED_ORIGINS=https://yourdomain.com
ALLOWED_ORIGINS=
COOKIE_SECURE=false
ENVEOF
echo ""
echo "⚠️ 警告: ALLOWED_ORIGINS未配置"
echo " 生产环境必须在backend/.env中设置ALLOWED_ORIGINS"
echo " 示例: ALLOWED_ORIGINS=https://cs.workyai.cn"
echo ""
fi
# 生成随机JWT密钥
echo "🔑 生成随机JWT密钥..."
JWT_SECRET=$(openssl rand -hex 32 2>/dev/null || cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 64 | head -n 1)
# 替换或添加JWT_SECRET
if grep -q "^JWT_SECRET=" backend/.env; then
sed -i "s|^JWT_SECRET=.*|JWT_SECRET=$JWT_SECRET|" backend/.env
else
echo "JWT_SECRET=$JWT_SECRET" >> backend/.env
fi
echo "✓ JWT密钥已生成并保存"
else
echo "✓ backend/.env 文件已存在"
# 检查JWT_SECRET是否为默认值
if grep -q "^JWT_SECRET=your-secret-key" backend/.env; then
echo "⚠️ 检测到JWT_SECRET使用默认值正在生成新密钥..."
JWT_SECRET=$(openssl rand -hex 32 2>/dev/null || cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 64 | head -n 1)
sed -i "s|^JWT_SECRET=.*|JWT_SECRET=$JWT_SECRET|" backend/.env
echo "✓ JWT密钥已更新"
fi
fi
echo ""
# 停止旧容器
echo "🔄 停止旧容器..."
docker-compose down 2>/dev/null || true
echo "✓ 旧容器已停止"
echo ""
# 构建并启动
echo "🚀 构建并启动服务..."
docker-compose up --build -d
# 等待服务启动
echo ""
echo "⏳ 等待服务启动..."
sleep 5
# 检查容器状态
echo ""
echo "📊 检查容器状态..."
docker-compose ps
# 检查后端日志
echo ""
echo "📝 后端启动日志:"
docker-compose logs --tail=20 backend
# 显示访问信息
echo ""
echo "========================================="
echo " 🎉 部署完成!"
echo "========================================="
echo ""
echo "📍 访问地址:"
echo " 前端: http://localhost:8080"
echo " 后端API: http://localhost:40001"
echo ""
echo "👤 默认管理员账号:"
echo " 用户名: admin"
echo " 密码: admin123"
echo " ⚠️ 请立即登录并修改密码!"
echo ""
echo "🔐 安全提示:"
echo " JWT密钥已自动生成保存在 backend/.env 中"
echo " 请妥善保管该文件!"
echo ""
echo "📚 查看日志:"
echo " docker-compose logs -f"
echo ""
echo "🛑 停止服务:"
echo " docker-compose down"
echo ""
echo "========================================="

View File

@@ -1,130 +0,0 @@
#!/bin/bash
################################################################################
# 玩玩云 - Nginx上传限制快速修复脚本
# 将上传限制从默认值改为10GB超时时间改为1小时
################################################################################
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
echo -e "${BLUE}╔═══════════════════════════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ 玩玩云 - Nginx上传限制快速修复脚本 ║${NC}"
echo -e "${BLUE}╚═══════════════════════════════════════════════════════════════╝${NC}"
echo ""
# 检查root权限
if [[ $EUID -ne 0 ]]; then
echo -e "${RED}✗ 此脚本需要root权限运行${NC}"
echo -e "${YELLOW}请使用: sudo bash fix-nginx-upload-limit.sh${NC}"
exit 1
fi
# 查找Nginx配置文件
NGINX_CONF=""
if [[ -f /etc/nginx/sites-available/wanwanyun.conf ]]; then
NGINX_CONF="/etc/nginx/sites-available/wanwanyun.conf"
elif [[ -f /etc/nginx/conf.d/wanwanyun.conf ]]; then
NGINX_CONF="/etc/nginx/conf.d/wanwanyun.conf"
else
echo -e "${RED}✗ 未找到Nginx配置文件${NC}"
exit 1
fi
echo -e "${GREEN}✓ 找到配置文件: $NGINX_CONF${NC}"
echo ""
# 备份原配置
BACKUP_FILE="${NGINX_CONF}.backup-$(date +%Y%m%d-%H%M%S)"
cp "$NGINX_CONF" "$BACKUP_FILE"
echo -e "${GREEN}✓ 已备份配置到: $BACKUP_FILE${NC}"
echo ""
# 检查是否已经配置过
if grep -q "client_max_body_size 10G" "$NGINX_CONF"; then
echo -e "${YELLOW}⚠ 配置已经是10GB无需修改${NC}"
exit 0
fi
echo -e "${BLUE}正在修改Nginx配置...${NC}"
# 创建临时文件
TEMP_FILE=$(mktemp)
# 处理配置文件
awk '
/^server \{/ { in_server=1 }
in_server && /server_name/ && !added_size {
print
print ""
print " # 文件上传大小限制10GB"
print " client_max_body_size 10G;"
added_size=1
next
}
in_server && /location \/api/ { in_api=1 }
in_api && /proxy_set_header X-Forwarded-Proto/ {
print
print ""
print " # 上传超时设置大文件上传需要更长时间设置为1小时"
print " proxy_read_timeout 3600s;"
print " proxy_send_timeout 3600s;"
print " proxy_connect_timeout 300s;"
in_api=0
next
}
# 删除旧的超时设置
/proxy_read_timeout/ && in_api { next }
/proxy_send_timeout/ && in_api { next }
/proxy_connect_timeout/ && in_api { next }
# 删除旧的 client_max_body_size
/client_max_body_size/ { next }
{ print }
' "$NGINX_CONF" > "$TEMP_FILE"
# 替换原文件
mv "$TEMP_FILE" "$NGINX_CONF"
echo -e "${GREEN}✓ 配置已更新${NC}"
echo ""
# 测试Nginx配置
echo -e "${BLUE}测试Nginx配置...${NC}"
if nginx -t 2>&1 | grep -q "successful"; then
echo -e "${GREEN}✓ Nginx配置测试通过${NC}"
echo ""
# 重载Nginx
echo -e "${BLUE}重载Nginx服务...${NC}"
systemctl reload nginx
if [[ $? -eq 0 ]]; then
echo -e "${GREEN}✓ Nginx已重载${NC}"
echo ""
echo -e "${GREEN}╔═══════════════════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ ✓ 修复完成! ║${NC}"
echo -e "${GREEN}╚═══════════════════════════════════════════════════════════════╝${NC}"
echo ""
echo -e "${BLUE}新的配置:${NC}"
echo " • 上传大小限制: 10GB"
echo " • 读取超时: 3600秒 (1小时)"
echo " • 发送超时: 3600秒 (1小时)"
echo " • 连接超时: 300秒 (5分钟)"
echo ""
echo -e "${YELLOW}注意: 请确保您的磁盘空间足够存储大文件!${NC}"
else
echo -e "${RED}✗ Nginx重载失败${NC}"
echo -e "${YELLOW}正在恢复备份...${NC}"
cp "$BACKUP_FILE" "$NGINX_CONF"
systemctl reload nginx
exit 1
fi
else
echo -e "${RED}✗ Nginx配置测试失败${NC}"
echo -e "${YELLOW}正在恢复备份...${NC}"
cp "$BACKUP_FILE" "$NGINX_CONF"
exit 1
fi

View File

@@ -1,82 +0,0 @@
#!/bin/bash
# 自动修改install.sh添加Cookie配置的脚本
set -e
echo "========================================="
echo "install.sh Cookie配置自动修改脚本"
echo "========================================="
echo ""
# 检查文件是否存在
if [[ ! -f "install.sh" ]]; then
echo "❌ 错误: install.sh文件不存在"
exit 1
fi
# 备份
echo "📦 备份install.sh..."
cp install.sh install.sh.backup.$(date +%Y%m%d%H%M%S)
echo "✅ 备份完成"
echo ""
# 检查是否已经修改过
if grep -q "Cookie传递配置" install.sh; then
echo " 检测到install.sh已经包含Cookie配置"
echo " 跳过修改"
exit 0
fi
echo "🔧 开始修改install.sh..."
echo ""
# 使用perl进行多行匹配和替换
perl -i -pe '
BEGIN {
$cookie_config = "\n" .
" # Cookie传递配置验证码session需要\n" .
" proxy_set_header Cookie \$http_cookie;\n" .
" proxy_pass_header Set-Cookie;";
}
# 在 location /api 块中的 X-Forwarded-Proto 后添加Cookie配置
if (/proxy_set_header X-Forwarded-Proto \\\$scheme;/ && $in_api_block) {
$_ .= $cookie_config . "\n";
$added_count++;
}
$in_api_block = 1 if /location \/api/;
$in_api_block = 0 if /^\s*\}/;
' install.sh
# 验证修改结果
count=$(grep -c "Cookie传递配置" install.sh || echo "0")
echo "========================================="
echo "修改完成"
echo "========================================="
echo ""
echo "📊 修改统计:"
echo " - 添加Cookie配置: $count"
echo ""
if [[ "$count" -eq 3 ]]; then
echo "✅ 成功修改了3处location /api配置"
echo ""
echo "修改位置:"
grep -n "Cookie传递配置" install.sh | sed 's/^/ 行 /'
echo ""
echo "📝 建议:"
echo " 1. 检查修改是否正确: diff install.sh.backup.* install.sh"
echo " 2. 提交到Git: git add install.sh && git commit -m '添加Cookie配置'"
echo " 3. 已部署的服务需要手动更新Nginx配置"
elif [[ "$count" -gt 0 ]]; then
echo "⚠️ 警告: 只修改了 $count预期应该是3处"
echo " 请手动检查install.sh文件"
else
echo "❌ 错误: 修改失败没有添加任何Cookie配置"
echo " 请查看 INSTALL_SH_UPDATE.md 手动修改"
fi
echo ""

View File

@@ -1,21 +0,0 @@
#!/bin/bash
# 修复 isPathWithinShare 函数的路径比较逻辑
# 解决分享路径有无斜杠前缀导致的匹配失败问题
cd "$(dirname "$0")/backend"
echo "开始修复 server.js..."
# 使用sed修复
sed -i '179s/const normalizedRequest/let normalizedRequest/' server.js
sed -i '180s/const normalizedShare/let normalizedShare/' server.js
# 在第180行后添加路径统一处理
sed -i "180a\\
\\
// 统一移除开头的斜杠进行比较\\
normalizedRequest = normalizedRequest.replace(/^\\\\\\/+/, '');\\
normalizedShare = normalizedShare.replace(/^\\\\\\/+/, '');" server.js
echo "修复完成!"
echo "请运行: pm2 restart all"

View File

@@ -1,192 +0,0 @@
╔═══════════════════════════════════════════════════════════════╗
║ ║
║ 🌩️ 玩玩云 - 一键部署命令 ║
║ ║
╚═══════════════════════════════════════════════════════════════╝
📦 项目地址:
https://gitee.com/yu-yon/vue-driven-cloud-storage
🚀 一键安装命令(在服务器上执行):
方式1 (推荐):
curl -fsSL https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh | bash
方式2:
wget -qO- https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh | bash
🔄 一键更新命令(在服务器上执行):
方式1 (推荐):
curl -fsSL https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh | bash -s -- --update
方式2:
wget -qO- https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh | bash -s -- --update
方式3 (如果已下载脚本):
bash install.sh --update
🗑️ 一键卸载命令(在服务器上执行):
方式1:
curl -fsSL https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh | bash -s -- --uninstall
方式2:
wget -qO- https://gitee.com/yu-yon/vue-driven-cloud-storage/raw/master/install.sh | bash -s -- --uninstall
方式3 (如果已下载脚本):
bash install.sh --uninstall
✅ v1.2.6 更新说明:
- 🔄 更新脚本增加数据库迁移功能
- 自动检测并升级旧的100MB上传限制到10GB
- 确保使用更新脚本时数据库配置也会同步更新
- 修复更新后仍然保留旧配置的问题
✅ v1.2.5 更新说明:
- 🔥【严重】修复后端代码硬编码100MB上传限制的问题
- 将 database.js 中的数据库初始化默认值从100MB改为10GB
- 将 server.js 中两处fallback默认值从100MB改为10GB
- 确保新部署的系统默认支持10GB单文件上传
✅ v1.2.4 更新说明:
- 🔥【严重】修复管理员账号密码无法正确设置的问题(再次修复)
- 在 server.js 开头添加 require('dotenv').config()
- 确保环境变量从 .env 文件正确加载
- 之前虽然 .env 写入了正确的值,但 server.js 没有加载导致仍使用默认值
✅ v1.2.3 更新说明:
- 🔥【严重】紧急修复更新脚本数据丢失的问题
- 重写更新逻辑,改为文件级别复制
- 明确排除 data/storage/.env 目录,防止覆盖用户数据
- 添加三层保护:排除列表 + 完整性检查 + 备份恢复
- 新增 restore-data.sh 脚本帮助受影响用户恢复数据
✅ v1.2.2 更新说明:
- 提升上传限制到 10GB之前为 500MB
- 延长超时时间到 1小时之前为 5分钟
- 适配大文件上传场景
- 新增 fix-nginx-upload-limit.sh 快速修复脚本
✅ v1.2.1 更新说明:
- 修复 413 错误Request Entity Too Large
- 为 Nginx 配置添加 client_max_body_size 500M
- 添加上传超时设置proxy_read_timeout 300s
✅ v1.2.0 更新说明:
- 🎉【新功能】一键更新功能
- 自动从Gitee拉取最新代码
- 智能备份数据库和用户文件
- 自动更新依赖并重启服务
- 保留所有用户数据和配置
- 支持命令行和交互式菜单两种方式
✅ v1.1.6 更新说明:
- 🔥【严重】修复管理员账号密码设置无效的问题(首次尝试修复)
- 安装时设置的管理员账号密码现在会正确生效
- 之前版本始终使用默认 admin/admin123现已修复
- 注意此版本修复不完整v1.2.4 为最终修复版本
✅ v1.1.5 更新说明:
- 新增安装/卸载模式交互式选择
- 支持 curl | bash 管道执行时的友好提示
- 优化智能端口检测80/443/40001 被占用时可自定义)
- 允许多个项目共存于同一服务器
✅ v1.1.4 更新说明:
- 智能端口检测和自定义端口配置
- 解决端口冲突问题
- 支持自定义 HTTP/HTTPS/后端端口
✅ v1.1.3 更新说明:
- 集成一键卸载功能到主脚本
- 双重确认机制防止误删
- 可选数据备份功能
- 完整清理项目文件、PM2进程、Nginx配置、SSL证书
- 保留系统环境Node.js、Nginx、PM2、编译工具
- 智能残留检查
✅ v1.1.2 更新说明:
- 修复npm依赖安装失败问题
- 降级better-sqlite3以兼容Node.js 18.x+
- 自动安装C++编译工具gcc-c++, make, python3
- 确保native模块编译成功
✅ v1.1.1 更新说明:
- 升级到 Node.js 20.x LTS长期支持版本
- 解决 Node.js 18.x 即将停止支持的警告问题
- 更长的官方支持周期至2026年4月
- 更好的性能和安全性
✅ v1.1.0 更新说明:
- 新增支持 Rocky Linux、AlmaLinux、Fedora、openSUSE
- 实现统一包管理器检测,自动适配不同系统
- 优化阿里云镜像源配置,支持更多发行版
- 改进系统兼容性,未识别系统可自动检测包管理器
- 全面支持 APT、YUM、DNF、Zypper 包管理器
✨ 支持的操作系统:
- ✅ Ubuntu 18.04 / 20.04 / 22.04 / 24.04
- ✅ Debian 10 / 11 / 12
- ✅ CentOS 7 / 8
- ✅ RHEL 7 / 8 / 9
- ✅ Rocky Linux 8 / 9
- ✅ AlmaLinux 8 / 9
- ✅ Fedora 35+
- ✅ openSUSE Leap
- ✅ 其他基于以上系统的发行版
✨ 脚本特性:
- ✅ 完全自动化部署,无需手动操作
- ✅ 支持 Ubuntu/Debian/CentOS/RHEL/Rocky/AlmaLinux/Fedora/openSUSE
- ✅ 自动检测系统并安装对应依赖
- ✅ 自动安装 Node.js、Nginx、PM2 等依赖
- ✅ 提供官方源和阿里云镜像源选择
- ✅ 支持域名/IP 两种访问模式
- ✅ 6种SSL证书自动部署方案
- ✅ 智能容错和重试机制
- ✅ 健康检查和完整提示
📋 用户只需:
1. 选择软件源(官方/阿里云)
2. 选择访问模式(域名/IP
3. 如果是域名模式选择SSL证书方案
4. 输入管理员账号和密码
5. 等待自动部署完成
💡 使用示例:
1. 登录服务器SSH
2. 复制一键安装命令并执行
3. 按照提示输入选项(例如输入 2 选择阿里云源)
4. 等待部署完成
5. 访问您的域名或IP地址
📖 详细文档:
https://gitee.com/yu-yon/vue-driven-cloud-storage/blob/master/INSTALL_GUIDE.md
🔧 部署后管理:
- 查看服务状态: pm2 status
- 查看日志: pm2 logs wanwanyun-backend
- 重启服务: pm2 restart wanwanyun-backend
- 配置文件: /var/www/wanwanyun/backend/.env
📞 获取帮助:
- 提交Issue: https://gitee.com/yu-yon/vue-driven-cloud-storage/issues
- 查看文档: 项目README.md
═══════════════════════════════════════════════════════════════
祝您使用愉快! 🎉