diff --git a/content/docs/developer/cloud-storag-zh.mdx b/content/docs/developer/cloud-storag-zh.mdx new file mode 100644 index 0000000..625bbe1 --- /dev/null +++ b/content/docs/developer/cloud-storag-zh.mdx @@ -0,0 +1,259 @@ +--- +title: 云存储配置 +description: 如何配置多平台云存储 +--- + + + +## 概览 + +管理员可以在 `/admin/system` 管理 S3 配置,包括添加、删除和修改云存储的 S3 配置。 + +WR.DO 目前支持多种云存储提供商: + +- Cloudflare R2 +- AWS S3 +- 腾讯云 COS +- 阿里云 OSS +- 自定义提供商 (兼容 S3 API) + +> 一个提供商可以添加多个存储桶 + +## Cloudflare R2 + +### 1. 创建 R2 存储桶 + +1. 登录您的 [Cloudflare 仪表板](https://dash.cloudflare.com/) +2. 从左侧边栏导航到 **R2 对象存储** +3. 点击 **创建存储桶** +4. 输入您的存储桶名称(例如:`wrdo`) +5. 选择位置(建议选择自动) +6. 点击 **创建存储桶** + +### 2. 获取 API 凭证 + +1. 在您的 Cloudflare 仪表板中,前往 **我的个人资料** > **API 令牌** +2. 点击 **创建令牌** +3. 使用 **R2 令牌** 模板或创建自定义令牌,包含: + - **权限**: `R2:Edit` + - **账户资源**: 包含您的账户 + - **区域资源**: 包含所有区域(如果需要) +4. 点击 **继续摘要**,然后 **创建令牌** +5. 复制并保存令牌(这是您的 **访问密钥 ID** 和 **秘密访问密钥**) + +### 3. 获取账户 ID + +1. 在您的 Cloudflare 仪表板中,前往右侧边栏 +2. 复制您的 **账户 ID** + +### 4. 获取公共 URL + +1. 在您的 Cloudflare 仪表板中,前往 **R2 对象存储** > **存储桶详情** > **公共开发 URL** + +如果您已配置自定义域名,请使用该域名。 + +### 5. 配置 CORS + +1. 在您的 Cloudflare 仪表板中,前往 **R2 对象存储** > **存储桶设置** -> **CORS 策略** + +填入以下内容: + +```json +[ + { + "AllowedOrigins": [ + "http://localhost:3000", + "https://wr.do" // 替换为您的域名 + ], + "AllowedMethods": [ + "GET", + "PUT", + "POST", + "DELETE", + "HEAD" + ], + "AllowedHeaders": [ + "*" + ], + "ExposeHeaders": [ + "ETag" + ], + "MaxAgeSeconds": 3600 + } +] +``` + +### 6. 在 WR.DO 中配置 + +访问 `localhost:3000/admin/system`,填写配置表单: + +- **提供渠道**: cloudflare (r2) +- **渠道名称**: Cloudflare R2(或任何自定义名称) +- **S3 端点**: `https://<账户ID>.r2.cloudflarestorage.com`(替换为您的账户端点) +- **访问密钥 ID**: 第 2 步中的 API 令牌 +- **机密访问密钥**: 第 2 步中的 API 令牌 +- **启用**: 开启 +- **存储桶名称**: 您的存储桶名称 +- **公开域名或自定义域名**: 参考第 4 步 +- **存储桶区域**: auto +- **前缀**: 可选 +- **公开**: 如果您想要公共访问,请启用 + +## 腾讯云 COS + +### 1. 创建 COS 存储桶 + +1. 登录 [腾讯云控制台](https://console.cloud.tencent.com/cos) +2. 点击 **存储桶列表** > **创建存储桶** +3. 输入存储桶名称(例如:`wrdo-1303456836`) +4. 选择地域(例如:`ap-chengdu`) +5. 配置访问权限 +6. 点击 **创建** + +### 2. 获取 API 密钥 + +1. 前往 [CAM 控制台](https://console.cloud.tencent.com/cam/capi) +2. 点击 **新建密钥** 或使用现有密钥 +3. 保存您的 **SecretId** 和 **SecretKey** + +### 3. CORS 设置 + +1. 前往 [COS 控制台](https://console.cloud.tencent.com/cos) +2. 点击 **存储桶列表** > **选择存储桶** -> 安全管理 -> 跨域访问 CORS 设置 +3. 填入下列规则: + +![](/_static/docs/cos-cors.png) + +### 4. 在 WR.DO 中配置 + +填写配置表单: + +- **提供渠道**: tencent (cos) +- **渠道名称**: 腾讯云 COS(或任何自定义名称) +- **S3 端点**: `https://cos.ap-chengdu.myqcloud.com`(替换为您的地域) +- **访问密钥 ID**: 您的 SecretId +- **机密访问密钥**: 您的 SecretKey +- **启用**: 开启 +- **存储桶名称**: 您的存储桶名称(例如:`wrdo-1303456836`) +- **公开域名或自定义域名**: `https://wrdo-1303456836.cos.ap-chengdu.myqcloud.com`(您的存储桶公共 URL) +- **存储桶区域**: 您的 COS 地域(例如:`ap-chengdu`) +- **前缀**: 可选日期前缀 +- **公开**: 如果您想要公共访问,请启用 + +## 阿里云 OSS + +### 1. 创建 OSS 存储桶 + +1. 登录 [阿里云控制台](https://oss.console.aliyun.com/) +2. 点击 **创建 Bucket** +3. 输入存储桶名称 +4. 选择地域(例如:`oss-cn-hangzhou`) +5. 配置 ACL 和其他设置 +6. 点击 **确定** + +### 2. 获取 AccessKey + +1. 前往 [RAM 控制台](https://ram.console.aliyun.com/manage/ak) +2. 点击 **创建 AccessKey** 或使用现有密钥 +3. 保存您的 **AccessKeyId** 和 **AccessKeySecret** + +### 3. 在 WR.DO 中配置 + +填写配置表单: + +- **提供渠道**: ali (oss) +- **渠道名称**: 阿里云 OSS(或任何自定义名称) +- **S3 端点**: `https://oss-cn-hangzhou.aliyuncs.com`(替换为您的地域) +- **访问密钥 ID**: 您的 AccessKeyId +- **机密访问密钥**: 您的 AccessKeySecret +- **启用**: 开启 +- **存储桶名称**: 您的存储桶名称 +- **公开域名或自定义域名**: `https://your-bucket.oss-cn-hangzhou.aliyuncs.com`(您的存储桶公共 URL) +- **存储桶区域**: 您的 OSS 地域(例如:`oss-cn-hangzhou`) +- **前缀**: 可选日期前缀 +- **公开**: 如果您想要公共访问,请启用 + +## AWS S3 + +### 1. 创建 S3 存储桶 + +1. 登录 [AWS 控制台](https://console.aws.amazon.com/s3/) +2. 点击 **创建存储桶** +3. 输入存储桶名称(全球唯一) +4. 选择 AWS 区域 +5. 根据需要配置存储桶设置 +6. 点击 **创建存储桶** + +### 2. 创建 IAM 用户 + +1. 前往 [IAM 控制台](https://console.aws.amazon.com/iam/) +2. 点击 **用户** > **添加用户** +3. 输入用户名并选择 **编程访问** +4. 附加现有策略或创建具有 S3 权限的自定义策略: + ```json + { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "s3:GetObject", + "s3:PutObject", + "s3:DeleteObject", + "s3:ListBucket" + ], + "Resource": [ + "arn:aws:s3:::your-bucket-name", + "arn:aws:s3:::your-bucket-name/*" + ] + } + ] + } + ``` +5. 完成用户创建并保存 **访问密钥 ID** 和 **秘密访问密钥** + +### 3. 在 WR.DO 中配置 + +填写配置表单: + +- **提供渠道**: aws (s3) +- **渠道名称**: AWS S3(或任何自定义名称) +- **S3 端点**: `https://s3.amazonaws.com`(或特定区域端点) +- **访问密钥 ID**: 您的 IAM 用户访问密钥 ID +- **机密访问密钥**: 您的 IAM 用户秘密访问密钥 +- **启用**: 开启 +- **存储桶名称**: 您的 S3 存储桶名称 +- **公开域名或自定义域名**: 您的存储桶公共 URL 或 CloudFront 分发 +- **存储桶区域**: 您的 S3 区域(例如:`us-east-1`) +- **前缀**: 可选日期前缀 +- **公开**: 如果您想要公共访问,请启用 + +## 通用配置选项 + +### 前缀设置 +- 使用基于日期的前缀(例如:`2025/08/08`)按日期组织文件 +- 如果您喜欢扁平文件结构,请留空 + +### 公共访问 +- 如果您希望文件可以通过直接 URL 访问,请启用 **公开** +- 对于私有文件存储,请禁用 + +### 自定义域名 +- 配置自定义域名以获得更好的品牌体验 +- 确保为您的域名进行正确的 DNS 配置 + +## 故障排除 + +### 常见问题 + +1. **访问被拒绝**: 检查您的 API 凭证和权限 +2. **存储桶未找到**: 验证存储桶名称和区域设置 +3. **CORS 问题**: 如果需要,在您的存储桶中配置 CORS 设置 +4. **端点错误**: 确保您的提供商端点格式正确 + +### 测试配置 + +保存配置后,您可以通过以下方式测试: +1. 通过管理界面上传测试文件 +2. 检查文件是否出现在您的云存储桶中 +3. 验证公共访问(如果启用)是否可以通过文件 URL 访问 \ No newline at end of file diff --git a/content/docs/developer/cloud-storage.mdx b/content/docs/developer/cloud-storage.mdx new file mode 100644 index 0000000..0f579b9 --- /dev/null +++ b/content/docs/developer/cloud-storage.mdx @@ -0,0 +1,262 @@ +--- +title: Cloud Storage +description: How to config the cloud storage api +--- + + + +## Overview + +Administrators can manage s3 configurations at `/admin/system`, +including adding, deleting, and modifying s3 configurations for cloud storage. + +WR.DO now supports multiple cloud storage providers: + +- Cloudflare R2 +- AWS S3 +- Tencent COS +- Ali OSS +- Custom Provider (Support any S3 compatible provider) + +> One provider can configure multiple buckets. + +## Cloudflare R2 + +### 1. Create R2 Bucket + +1. Log in to your [Cloudflare dashboard](https://dash.cloudflare.com/) +2. Navigate to **R2 Object Storage** from the left sidebar +3. Click **Create bucket** +4. Enter your bucket name (e.g., `wrdo`) +5. Select the location (auto is recommended) +6. Click **Create bucket** + +### 2. Get API Credentials + +1. In your Cloudflare dashboard, go to **My Profile** > **API Tokens** +2. Click **Create Token** +3. Use the **R2 Token** template or create a custom token with: + - **Permissions**: `R2:Edit` + - **Account Resources**: Include your account + - **Zone Resources**: Include all zones (if needed) +4. Click **Continue to summary** and then **Create Token** +5. Copy and save the token (this is your **Access Key ID** and **Secret Access Key**) + +### 3. Get Account ID + +1. In your Cloudflare dashboard, go to the right sidebar +2. Copy your **Account ID** + +### 4. Get Public URL + +1. In your Cloudflare dashboard, go to **R2 Object Storage** > **Bucket Details** > **Public Development URL** + +if you have configured a custom domain, use that instead. + +### 5. Config CORS + +1. In your Cloudflare dashboard, go to **R2 Object Storage** > **Bucket Settings** -> **CORS Policy** + +Fill in the following: + +```json +[ + { + "AllowedOrigins": [ + "http://localhost:3000", + "https://wr.do" // Replace with your domain + ], + "AllowedMethods": [ + "GET", + "PUT", + "POST", + "DELETE", + "HEAD" + ], + "AllowedHeaders": [ + "*" + ], + "ExposeHeaders": [ + "ETag" + ], + "MaxAgeSeconds": 3600 + } +] +``` + +### 6. Configuration in WR.DO + +Follow `localhost:3000/admin/system`, fill in the configuration form with: + +- **Provider**: cloudflare (r2) +- **Channel Name**: Cloudflare R2 (or any custom name) +- **S3 Endpoint**: `https://.r2.cloudflarestorage.com` (replace with your account's endpoint) +- **Access Key ID**: Your API token from step 2 +- **Secret Access Key**: Your API token from step 2 +- **Enable**: Toggle ON +- **Bucket Name**: Your bucket name +- **Public Domain**: follow step 4 +- **Storage Region**: auto +- **Prefix**: Optional +- **Public**: Enable if you want public access + + +## Tencent COS + +### 1. Create COS Bucket + +1. Log in to [Tencent Cloud Console](https://console.cloud.tencent.com/cos) +2. Click **Bucket List** > **Create Bucket** +3. Enter bucket name (e.g., `wrdo-1303456836`) +4. Select region (e.g., `ap-chengdu`) +5. Configure access permissions +6. Click **Create** + +### 2. Get API Keys + +1. Go to [CAM Console](https://console.cloud.tencent.com/cam/capi) +2. Click **Create Key** or use existing keys +3. Save your **SecretId** and **SecretKey** + +### 3. CORS 设置 + +1. Follow [COS Console](https://console.cloud.tencent.com/cos) +2. Click **Bucket List** > **Select a Bucket** -> 安全管理 -> 跨域访问 CORS 设置 +3. Fill in the following rules: + +![](/_static/docs/cos-cors.png) + +### 4. Configuration in WR.DO + +Fill in the configuration form with: + +- **Provider**: tencent (cos) +- **Channel Name**: 腾讯云 COS (or any custom name) +- **S3 Endpoint**: `https://cos.ap-chengdu.myqcloud.com` (replace with your region) +- **Access Key ID**: Your SecretId +- **Secret Access Key**: Your SecretKey +- **Enable**: Toggle ON +- **Bucket Name**: Your bucket name (e.g., `wrdo-1303456836`) +- **Public Domain**: `https://wrdo-1303456836.cos.ap-chengdu.myqcloud.com` (your bucket's public URL) +- **Storage Region**: Your COS region (e.g., `ap-chengdu`) +- **Prefix**: Optional date prefix +- **Public**: Enable if you want public access + +## Ali OSS + +### 1. Create OSS Bucket + +1. Log in to [Alibaba Cloud Console](https://oss.console.aliyun.com/) +2. Click **Create Bucket** +3. Enter bucket name +4. Select region (e.g., `oss-cn-hangzhou`) +5. Configure ACL and other settings +6. Click **OK** + +### 2. Get AccessKey + +1. Go to [RAM Console](https://ram.console.aliyun.com/manage/ak) +2. Click **Create AccessKey** or use existing keys +3. Save your **AccessKeyId** and **AccessKeySecret** + +### 3. Configuration in WR.DO + +Fill in the configuration form with: + +- **Provider**: ali (oss) +- **Channel Name**: 阿里云 OSS (or any custom name) +- **S3 Endpoint**: `https://oss-cn-hangzhou.aliyuncs.com` (replace with your region) +- **Access Key ID**: Your AccessKeyId +- **Secret Access Key**: Your AccessKeySecret +- **Enable**: Toggle ON +- **Bucket Name**: Your bucket name +- **Public Domain**: `https://your-bucket.oss-cn-hangzhou.aliyuncs.com` (your bucket's public URL) +- **Storage Region**: Your OSS region (e.g., `oss-cn-hangzhou`) +- **Prefix**: Optional date prefix +- **Public**: Enable if you want public access + +## AWS S3 + +### 1. Create S3 Bucket + +1. Log in to [AWS Console](https://console.aws.amazon.com/s3/) +2. Click **Create bucket** +3. Enter bucket name (globally unique) +4. Select AWS region +5. Configure bucket settings as needed +6. Click **Create bucket** + +### 2. Create IAM User + +1. Go to [IAM Console](https://console.aws.amazon.com/iam/) +2. Click **Users** > **Add user** +3. Enter username and select **Programmatic access** +4. Attach existing policies or create custom policy with S3 permissions: + ```json + { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "s3:GetObject", + "s3:PutObject", + "s3:DeleteObject", + "s3:ListBucket" + ], + "Resource": [ + "arn:aws:s3:::your-bucket-name", + "arn:aws:s3:::your-bucket-name/*" + ] + } + ] + } + ``` +5. Complete user creation and save **Access Key ID** and **Secret Access Key** + +### 3. Configuration in WR.DO + +Fill in the configuration form with: + +- **Provider**: aws (s3) +- **Channel Name**: AWS S3 (or any custom name) +- **S3 Endpoint**: `https://s3.amazonaws.com` (or region-specific endpoint) +- **Access Key ID**: Your IAM user's Access Key ID +- **Secret Access Key**: Your IAM user's Secret Access Key +- **Enable**: Toggle ON +- **Bucket Name**: Your S3 bucket name +- **Public Domain**: Your bucket's public URL or CloudFront distribution +- **Storage Region**: Your S3 region (e.g., `us-east-1`) +- **Prefix**: Optional date prefix +- **Public**: Enable if you want public access + + +## Common Configuration Options + +### Prefix Settings +- Use date-based prefixes (e.g., `2025/08/08`) to organize files by date +- Leave empty if you prefer flat file structure + +### Public Access +- Enable **Public** if you want files to be accessible via direct URLs +- Disable for private file storage + +### Custom Domains +- Configure custom domains for better branding +- Ensure proper DNS configuration for your domain + +## Troubleshooting + +### Common Issues + +1. **Access Denied**: Check your API credentials and permissions +2. **Bucket Not Found**: Verify bucket name and region settings +3. **CORS Issues**: Configure CORS settings in your bucket if needed +4. **Endpoint Errors**: Ensure correct endpoint format for your provider + +### Testing Configuration + +After saving your configuration, you can test it by: +1. Uploading a test file through the admin interface +2. Checking if the file appears in your cloud storage bucket +3. Verifying public access (if enabled) by accessing the file URL diff --git a/content/docs/developer/s3.mdx b/content/docs/developer/s3.mdx deleted file mode 100644 index 3b08cc4..0000000 --- a/content/docs/developer/s3.mdx +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: S3 Configs -description: How to config the s3 api. ---- - -## Overview - -Administrators can manage s3 configurations at `/admin/system`, including adding, deleting, and modifying s3 configurations. - -## Cloudflare R2 \ No newline at end of file diff --git a/lib/dto/files.ts b/lib/dto/files.ts index cc20470..a093ad7 100644 --- a/lib/dto/files.ts +++ b/lib/dto/files.ts @@ -158,9 +158,8 @@ export async function getUserFiles(options: QueryUserFileOptions = {}) { }), prisma.userFile.count({ where }), prisma.userFile.aggregate({ - // All provider's file size where: { - userId, + ...(userId && { userId }), status: 1, }, _sum: { size: true }, diff --git a/public/_static/docs/cos-cors.png b/public/_static/docs/cos-cors.png new file mode 100644 index 0000000..2daf819 Binary files /dev/null and b/public/_static/docs/cos-cors.png differ diff --git a/public/sw.js.map b/public/sw.js.map index 6110b66..54c1284 100644 --- a/public/sw.js.map +++ b/public/sw.js.map @@ -1 +1 @@ -{"version":3,"file":"sw.js","sources":["../../../../../../private/var/folders/9b/3qmyp8zd2xvdspdrp149fyg00000gn/T/bf4c8ec428159b5c3ebe0be7863842cb/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/registerRoute.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {NetworkOnly as workbox_strategies_NetworkOnly} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkOnly.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/clientsClaim.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\nimportScripts(\n \n);\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n\nworkbox_routing_registerRoute(\"/\", new workbox_strategies_NetworkFirst({ \"cacheName\":\"start-url\", plugins: [{ cacheWillUpdate: async ({ request, response, event, state }) => { if (response && response.type === 'opaqueredirect') { return new Response(response.body, { status: 200, statusText: 'OK', headers: response.headers }) } return response } }] }), 'GET');\nworkbox_routing_registerRoute(/.*/i, new workbox_strategies_NetworkOnly({ \"cacheName\":\"dev\", plugins: [] }), 'GET');\n\n\n\n\n"],"names":["importScripts","self","skipWaiting","workbox_core_clientsClaim","workbox_routing_registerRoute","workbox_strategies_NetworkFirst","plugins","cacheWillUpdate","request","response","event","state","type","Response","body","status","statusText","headers","workbox_strategies_NetworkOnly"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sw.js","sources":["../../../../../../private/var/folders/9b/3qmyp8zd2xvdspdrp149fyg00000gn/T/d668bd1078ac655e5218181d0eff41b9/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/registerRoute.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {NetworkOnly as workbox_strategies_NetworkOnly} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkOnly.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from '/Users/songjunxi/Desktop/repos/wrdo-app/wr.do/node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/clientsClaim.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\nimportScripts(\n \n);\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n\nworkbox_routing_registerRoute(\"/\", new workbox_strategies_NetworkFirst({ \"cacheName\":\"start-url\", plugins: [{ cacheWillUpdate: async ({ request, response, event, state }) => { if (response && response.type === 'opaqueredirect') { return new Response(response.body, { status: 200, statusText: 'OK', headers: response.headers }) } return response } }] }), 'GET');\nworkbox_routing_registerRoute(/.*/i, new workbox_strategies_NetworkOnly({ \"cacheName\":\"dev\", plugins: [] }), 'GET');\n\n\n\n\n"],"names":["importScripts","self","skipWaiting","workbox_core_clientsClaim","workbox_routing_registerRoute","workbox_strategies_NetworkFirst","plugins","cacheWillUpdate","request","response","event","state","type","Response","body","status","statusText","headers","workbox_strategies_NetworkOnly"],"mappings":"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"} \ No newline at end of file