mirror of
https://github.com/schroinerxy/cloud-mail.git
synced 2026-06-21 19:35:50 +08:00
添加教程,更新打包文件
删除描述
This commit is contained in:
@@ -19,7 +19,7 @@
|
||||
👉 https://skymail.ink
|
||||
|
||||
|  |  |
|
||||
|---------------------|---------------------|
|
||||
|--------------------------------------------------------|---------------------|
|
||||
|  |  |
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
## 目录结构
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
|
||||
+5
-5
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+2
-2
@@ -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);
|
||||
},
|
||||
|
||||
@@ -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 = ""
|
||||
|
||||
@@ -26,8 +26,8 @@ directory = "./dist"
|
||||
[vars]
|
||||
domain = ["", ""]
|
||||
admin = ""
|
||||
r2_domain = ""
|
||||
jwt_secret = ""
|
||||
r2_domain = ""
|
||||
site_key = ""
|
||||
secret_key = ""
|
||||
|
||||
|
||||
@@ -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人机验证的密钥(可选)
|
||||
|
||||
Generated
+6
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"name": "cloud-mail",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {}
|
||||
}
|
||||
Reference in New Issue
Block a user