diff --git a/backend/.env.example b/backend/.env.example index 086189c..05d6fcf 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -1,28 +1,96 @@ +# ============================================ +# 玩玩云 - 环境配置文件示例 +# ============================================ +# +# 使用说明: +# 1. 复制此文件为 .env +# 2. 根据实际情况修改配置值 +# 3. ⚠️ 生产环境必须修改默认密码和密钥 +# + +# ============================================ # 服务器配置 +# ============================================ + +# 服务端口 PORT=40001 + +# 运行环境(production 或 development) NODE_ENV=production -# JWT安全密钥 (必须设置!使用随机字符串) -# 生成方法: node -e "console.log(require('crypto').randomBytes(32).toString('hex'))" -JWT_SECRET=your-secret-key-change-in-production-PLEASE-CHANGE-THIS +# 公开访问端口(nginx监听的端口,用于生成分享链接) +# 标准端口(80/443)可不配置 +PUBLIC_PORT=80 -# 管理员账号配置 +# ============================================ +# 安全配置 +# ============================================ + +# JWT密钥(必须修改!) +# 生成方法: openssl rand -base64 32 +JWT_SECRET=your-secret-key-PLEASE-CHANGE-THIS-IN-PRODUCTION + +# 管理员账号配置(首次启动时创建) ADMIN_USERNAME=admin ADMIN_PASSWORD=admin123 -# 存储根目录(本地存储模式) -STORAGE_ROOT=/app/storage +# ============================================ +# CORS 跨域配置(重要!) +# ============================================ -# CORS允许的来源(多个用逗号分隔,* 表示允许所有) -# 生产环境建议设置为具体域名,例如: https://yourdomain.com,https://www.yourdomain.com -ALLOWED_ORIGINS=* +# 允许访问的前端域名 +# +# 格式说明: +# - 单个域名: https://yourdomain.com +# - 多个域名: https://domain1.com,https://domain2.com +# - 开发环境: 留空或设置为 * (不安全,仅开发使用) +# +# ⚠️ 生产环境安全要求: +# 1. 必须配置具体的域名,不要使用 * +# 2. 必须包含协议 (http:// 或 https://) +# 3. 如果使用非标准端口,需要包含端口号 +# +# 示例: +# ALLOWED_ORIGINS=https://pan.example.com +# ALLOWED_ORIGINS=https://pan.example.com,https://admin.example.com +# ALLOWED_ORIGINS=http://localhost:8080 # 开发环境 +# +ALLOWED_ORIGINS= -# Cookie安全配置 -# 如果使用HTTPS,设置为true +# Cookie 安全配置 +# 使用 HTTPS 时必须设置为 true +# HTTP 环境设置为 false COOKIE_SECURE=false -# FTP服务器配置(可选,用户可在界面配置) -FTP_HOST=your-ftp-host.com -FTP_PORT=21 -FTP_USER=your-username -FTP_PASSWORD=your-password +# ============================================ +# 存储配置 +# ============================================ + +# 数据库路径 +DATABASE_PATH=./data/database.db + +# 本地存储根目录(本地存储模式使用) +STORAGE_ROOT=./storage + +# ============================================ +# SFTP 配置(可选) +# ============================================ +# +# 说明: 用户可以在 Web 界面配置自己的 SFTP 服务器 +# 此处配置仅作为全局默认值(通常不需要配置) +# + +# FTP_HOST=your-ftp-host.com +# FTP_PORT=22 +# FTP_USER=your-username +# FTP_PASSWORD=your-password + +# ============================================ +# 开发调试配置 +# ============================================ + +# 日志级别 (error, warn, info, debug) +# LOG_LEVEL=info + +# 是否启用调试模式 +# DEBUG=false diff --git a/backend/server.js b/backend/server.js index 118b38a..66a3dd1 100644 --- a/backend/server.js +++ b/backend/server.js @@ -59,6 +59,28 @@ app.use((req, res, next) => { next(); }); +// 获取正确的协议(考虑反向代理) +function getProtocol(req) { + // 1. 检查 X-Forwarded-Proto 头(nginx 代理传递的协议) + const forwardedProto = req.get('X-Forwarded-Proto'); + if (forwardedProto) { + return forwardedProto.split(',')[0].trim(); + } + + // 2. 检查 req.protocol + if (req.protocol) { + return req.protocol; + } + + // 3. 如果配置了SSL,默认使用https + if (req.secure) { + return 'https'; + } + + // 4. 默认使用https(因为生产环境应该都配置了SSL) + return 'https'; +} + // 文件上传配置(临时存储) const upload = multer({ dest: path.join(__dirname, 'uploads'), @@ -1230,7 +1252,7 @@ app.post('/api/share/create', authMiddleware, (req, res) => { db.prepare('UPDATE shares SET storage_type = ? WHERE id = ?') .run(req.user.current_storage_type || 'sftp', result.id); - const shareUrl = `${req.protocol}://${req.get('host')}/s/${result.share_code}`; + const shareUrl = `${getProtocol(req)}://${req.get('host')}/s/${result.share_code}`; res.json({ success: true, @@ -1257,7 +1279,7 @@ app.get('/api/share/my', authMiddleware, (req, res) => { success: true, shares: shares.map(share => ({ ...share, - share_url: `${req.protocol}://${req.get('host')}/s/${share.share_code}` + share_url: `${getProtocol(req)}://${req.get('host')}/s/${share.share_code}` })) }); } catch (error) { diff --git a/frontend/index.html b/frontend/index.html index 3563b19..1ce131b 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -3,125 +3,672 @@ - 玩玩云 - 主页 + 玩玩云 - 现代化云存储管理平台 + +
+
+
+
+
+ + +
-

玩玩云管理平台

-

简单、安全、高效的文件管理解决方案
连接你的SFTP服务器,随时随地管理文件

+
+ + v1.0 生产就绪版本 +
+

+ + 玩玩云管理平台 +

+

+ 简单、安全、高效的现代化云存储管理解决方案
+ 连接你的 SFTP 服务器,随时随地管理文件,轻松分享 +

- - 立即开始 + + + 立即开始 - - 已有账号登录 + + + 已有账号
-
-
-
-
连接你的SFTP
-
支持连接任何SFTP服务器,数据存储在你自己的服务器上,更安全可靠
+ +
+
+ 100% + 开源免费
-
-
-
轻松上传下载
-
网盘式界面,拖拽上传,快速下载,文件管理从未如此简单
+
+ 5GB + 单文件上限
-
-
-
一键分享
-
生成分享链接,可设置密码保护,轻松分享文件给朋友
+
+ Docker + 一键部署
-
-
-
安全可靠
-
JWT认证,密码加密存储,保护你的数据安全
-
-
-
-
响应式设计
-
完美支持桌面和移动设备,随时随地访问你的文件
-
-
-
-
分享统计
-
查看分享链接的访问次数和下载统计,了解分享效果
+
+ 24/7 + 随时访问
- + +
+
+

强大的功能特性

+

+ 为现代化文件管理而生,提供完整的文件操作、分享、管理功能 +

+
+ +
+
+
+ +
+

SFTP 连接

+

+ 支持连接任何 SFTP 服务器,数据存储在你自己的服务器上,更安全可靠。支持多用户配置,每个用户独立管理。 +

+ 自主可控 +
+ +
+
+ +
+

文件管理

+

+ 网盘式界面,支持文件浏览、上传、下载、重命名、删除。拖拽上传,实时进度显示,单文件最大 5GB。 +

+ 简单易用 +
+ +
+
+ +
+

文件分享

+

+ 一键生成分享链接,支持密码保护和有效期设置。提供分享统计,查看访问次数和下载次数。 +

+ 安全分享 +
+ +
+
+ +
+

流式下载

+

+ 服务器零存储,纯中转下载。支持 HTTP 直链和 SFTP 流式下载,实时显示下载进度。 +

+ 高效传输 +
+ +
+
+ +
+

多用户系统

+

+ 完整的用户注册、登录、权限管理系统。管理员可以管理所有用户和分享,支持用户封禁。 +

+ 权限管理 +
+ +
+
+ +
+

安全可靠

+

+ JWT 认证,密码 bcrypt 加密存储,SQL 注入防护,XSS 防护。所有数据传输经过加密处理。 +

+ 企业级安全 +
+ +
+
+ +
+

响应式设计

+

+ 完美支持桌面和移动设备,自适应各种屏幕尺寸。随时随地访问你的文件,移动办公更便捷。 +

+ 跨平台 +
+ +
+
+ +
+

桌面工具

+

+ 提供桌面端上传工具,支持拖拽上传,实时显示进度。自动配置连接,让大文件上传更简单。 +

+ 效率工具 +
+ +
+
+ +
+

Docker 部署

+

+ 完整的 Docker 容器化部署方案,一键部署脚本,自动环境检查。易于维护,快速升级。 +

+ 开箱即用 +
+
+
+ + +
+
+

现代化技术栈

+

+ 基于最新技术构建,保证性能和可扩展性 +

+
+ +
+
+
+
Node.js 20
+
+
+
+
Vue.js 3
+
+
+
+
SQLite
+
+
+
+
Docker
+
+
+
+
Express
+
+
+
+
JWT
+
+
+
+
bcrypt
+
+
+
+
Nginx
+
+
+
+ + +
+
+

准备好开始了吗?

+

+ 立即注册,开始使用玩玩云管理你的文件。
+ 完全免费,开源透明,数据完全由你掌控。 +

+ +
+
+ + + + + diff --git a/install.sh b/install.sh index 867e06b..e6e38ee 100644 --- a/install.sh +++ b/install.sh @@ -2111,6 +2111,40 @@ create_env_file() { # 生成随机JWT密钥 JWT_SECRET=$(openssl rand -base64 32) + # ========== CORS 安全配置自动生成 ========== + # 根据部署模式自动配置 ALLOWED_ORIGINS 和 COOKIE_SECURE + + if [[ "$USE_DOMAIN" == "true" ]]; then + # 域名模式 + if [[ "$SSL_METHOD" == "8" || -z "$SSL_METHOD" ]]; then + # HTTP 模式 + PROTOCOL="http" + COOKIE_SECURE_VALUE="false" + PORT_VALUE=${HTTP_PORT:-80} + else + # HTTPS 模式 + PROTOCOL="https" + COOKIE_SECURE_VALUE="true" + PORT_VALUE=${HTTPS_PORT:-443} + fi + + # 生成 ALLOWED_ORIGINS (标准端口不需要显示端口号) + if [[ "$PORT_VALUE" == "80" ]] || [[ "$PORT_VALUE" == "443" ]]; then + ALLOWED_ORIGINS_VALUE="${PROTOCOL}://${DOMAIN}" + else + ALLOWED_ORIGINS_VALUE="${PROTOCOL}://${DOMAIN}:${PORT_VALUE}" + fi + + print_info "CORS 配置: ${ALLOWED_ORIGINS_VALUE}" + else + # IP 模式(开发/测试环境) + # 留空,后端默认允许所有来源(适合开发环境) + ALLOWED_ORIGINS_VALUE="" + COOKIE_SECURE_VALUE="false" + print_warning "IP 模式下 CORS 将允许所有来源(仅适合开发环境)" + print_info "生产环境建议使用域名模式" + fi + cat > "${PROJECT_DIR}/backend/.env" << EOF # 管理员账号 ADMIN_USERNAME=${ADMIN_USERNAME} @@ -2131,12 +2165,31 @@ PORT=${BACKEND_PORT} # 环境 NODE_ENV=production +# CORS 跨域配置 +# 允许访问的前端域名(多个用逗号分隔) +# 生产环境必须配置具体域名,开发环境可留空 +ALLOWED_ORIGINS=${ALLOWED_ORIGINS_VALUE} + +# Cookie 安全配置 +# HTTPS 环境必须设置为 true +COOKIE_SECURE=${COOKIE_SECURE_VALUE} + # 公开端口(nginx监听的端口,用于生成分享链接) # 如果使用标准端口(80/443)或未配置,分享链接将不包含端口号 PUBLIC_PORT=${HTTP_PORT} EOF print_success "配置文件创建完成" + + # 显示安全提示 + if [[ -z "$ALLOWED_ORIGINS_VALUE" ]]; then + echo "" + print_warning "⚠️ 安全提示:" + print_info " 当前配置允许所有域名访问(CORS: *)" + print_info " 这仅适合开发环境,生产环境存在安全风险" + print_info " 建议在生产环境使用域名模式部署" + echo "" + fi echo "" }