添加教程,更新打包文件

删除描述
This commit is contained in:
eoao
2025-04-29 04:49:33 +08:00
parent 55ad9ea71a
commit 4cb850602c
11 changed files with 100 additions and 32 deletions
+57 -6
View File
@@ -19,7 +19,7 @@
👉 https://skymail.ink
| ![](demo/demo1.png) | ![](demo/demo2.png) |
|---------------------|---------------------|
|--------------------------------------------------------|---------------------|
| ![](demo/demo3.png) | ![](demo/demo4.png) |
@@ -54,19 +54,47 @@
- **框架**[Vue3](https://vuejs.org/) + [Element Plus](https://element-plus.org/)
- **Web框架**[Hono](https://hono.dev/)
- **ORM**[Drizzle](https://orm.drizzle.team/)
- **平台:** [Cloudflare workers](https://developers.cloudflare.com/workers/)
- **缓存**[Cloudflare KV](https://developers.cloudflare.com/kv/)
- **数据库**[Cloudflare D1](https://developers.cloudflare.com/d1/)
- **文件存储**[Cloudflare R2](https://developers.cloudflare.com/r2/)
- **ORM**[Drizzle ORM](https://orm.drizzle.team/)
## 使用教程
## 项目配置
[**👉小白保姆教程-界面部署**](https://doc.skymail.ink)
### 环境要求
Nodejs v18.20 +
Cloudflare 账号
**克隆项目到本地**
``` shell
git clone https://github.com/LaziestRen/cloud-mail #拉取代码
cd cloud-mail/mail-worker #进入worker目录
```
**安装依赖**
```shell
npm i
```
**项目配置**
```toml
[[d1_databases]]
@@ -78,6 +106,7 @@ database_id = "" #d1数据库id
binding = "kv" #kv绑定名默认不可修改
id = "" #kv数据库id
#(可选)
[[r2_buckets]]
binding = "r2" #r2对象存储绑定名默认不可修改
bucket_name = "" #r2对象存储桶的名字
@@ -90,13 +119,35 @@ directory = "./dist" #前端vue项目打包的静态资源存放位置,
[vars]
domain = [] #邮件域名可以配置多个 示例: ["example1.com","example2.com"]
admin = "" #管理员的邮箱 示例: admin@example.com
r2_domain = "" #r2对象存储桶的访问域名
jwt_secret = "" #jwt令牌的密钥,随便填一串字符串
site_key = "" #Turnstile人机验证的站点密钥
secret_key = "" #Turnstile人机验证的后端密钥
r2_domain = "" #r2对象存储桶的访问域名(可选)
site_key = "" #Turnstile人机验证的站点密钥(可选)
secret_key = "" #Turnstile人机验证的后端密钥(可选)
```
**本地运行**
本地开发环境,数据库会自动安装,无需创建
```shell
npm run dev
```
**远程部署**
在Cloudflare控制台创建KV和D1数据库,可选:R2对象存储,Turnstile人机验证 (这两个不配置附件和人机验证不可用)
在 wrangler.toml 中配置对应环境变量
```shell
npm run deploy
```
然后进入域名管理->电子邮件->路由规则->Catch-all 地址. 这里选择发送到 worker, 然后选择创建的worker
## 目录结构
+1 -1
View File
@@ -31,7 +31,7 @@
</el-scrollbar>
<div class="github">
<a href="https://github.com/LaziestRen/cloud-mail">
<Icon icon="codicon:github-inverted" width="30" height="30" />
<Icon icon="codicon:github-inverted" width="28" height="28" />
</a>
</div>
</template>
+1 -1
View File
@@ -20,7 +20,7 @@
justify-content: center;
width: 100px;
height: 50px;
margin: 10px;
marngin-bottom: 10px;
text-align: center;
border-radius: 4px;
background: var(--el-color-danger-light-9);
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -6,8 +6,8 @@
<title></title>
<link rel="icon" href="/assets/favicon-C5dAZutX.svg" type="image/svg+xml">
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
<script type="module" crossorigin src="/assets/index-B67-0-m9.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-DVLqv5EF.css">
<script type="module" crossorigin src="/assets/index-BRburrSt.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-CGZvsPhs.css">
</head>
<body>
<div id="app"></div>
@@ -2,6 +2,7 @@ import KvConst from '../const/kv-const';
import setting from '../entity/setting';
import orm from '../entity/orm';
import { settingConst } from '../const/entity-const';
import BizError from "../error/biz-error";
const settingService = {
@@ -21,6 +22,11 @@ const settingService = {
},
async set(c, params) {
if (params.registerVerify === 0 || params.addEmailVerify === 0) {
if (!c.env.site_key || !c.env.secret_key) {
throw new BizError('Turnstile密钥未配置,不能开启人机验证')
}
}
await orm(c).update(setting).set({ ...params }).returning().get();
await this.refresh(c);
},
+12 -8
View File
@@ -11,20 +11,24 @@ ip = "0.0.0.0"
[[d1_databases]]
binding = "db"
database_name = "email"
database_id = ""
database_id = "a1c1a63a-6ef5-4e6d-8e8c-b6d9e8feb810"
[[kv_namespaces]]
binding = "kv"
id = ""
id = "2io01d4b299e481b9de060ece9e7785c"
[[r2_buckets]]
binding = "r2"
bucket_name = "email"
#[[r2_buckets]]
#binding = ""
#bucket_name = ""
[assets]
binding = "assets"
directory = "./dist"
[vars]
domain = ["", ""]
admin = ""
domain = ["example.com", "example2.com"]
admin = "admin@example.com"
jwt_secret = "K8x@r!3XqZ7#bLm$9pV&yTfC1W*sD2Nv%Q@4Zh^gRb6&UsP!m"
r2_domain = ""
jwt_secret = ""
site_key = ""
secret_key = ""
+1 -1
View File
@@ -26,8 +26,8 @@ directory = "./dist"
[vars]
domain = ["", ""]
admin = ""
r2_domain = ""
jwt_secret = ""
r2_domain = ""
site_key = ""
secret_key = ""
+8 -7
View File
@@ -14,6 +14,7 @@ enabled = true
#binding = "kv" #kv绑定名默认不可修改
#id = "" #kv数据库id
#(可选)
#[[r2_buckets]]
#binding = "r2" #r2对象存储绑定名默认不可修改
#bucket_name = "" #r2对象存储桶的名字
@@ -22,10 +23,10 @@ enabled = true
binding = "assets" #静态资源绑定名默认不可修改
directory = "./dist" #前端vue项目打包的静态资源存放位置,默认dist
[vars]
domain = [] #邮件域名可可配置多个 示例: ["example1.com","example2.com"]
admin = "" #管理员的邮箱 示例: admin@example.com
r2_domain = "" #r2对象存储桶的访问域名
jwt_secret = "" #jwt令牌的密钥,随便填一串字符串
site_key = "" #Turnstile人机验证的站点密钥
secret_key = "" #Turnstile人机验证的后端密钥
#[vars]
#domain = [] #邮件域名可可配置多个 示例: ["example1.com","example2.com"]
#admin = "" #管理员的邮箱 示例: admin@example.com
#jwt_secret = "" #jwt令牌的密钥,随便填一串字符串
#r2_domain = "" #r2对象存储桶的访问域名(可选)
#site_key = "" #Turnstile人机验证的站点密钥(可选)
#secret_key = "" #Turnstile人机验证的密钥(可选)
+6
View File
@@ -0,0 +1,6 @@
{
"name": "cloud-mail",
"lockfileVersion": 3,
"requires": true,
"packages": {}
}