添加教程,更新打包文件
删除描述
This commit is contained in:
63
README.md
63
README.md
@@ -19,7 +19,7 @@
|
|||||||
👉 https://skymail.ink
|
👉 https://skymail.ink
|
||||||
|
|
||||||
|  |  |
|
|  |  |
|
||||||
|---------------------|---------------------|
|
|--------------------------------------------------------|---------------------|
|
||||||
|  |  |
|
|  |  |
|
||||||
|
|
||||||
|
|
||||||
@@ -54,19 +54,47 @@
|
|||||||
|
|
||||||
- **框架**:[Vue3](https://vuejs.org/) + [Element Plus](https://element-plus.org/)
|
- **框架**:[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 KV](https://developers.cloudflare.com/kv/)
|
||||||
|
|
||||||
- **数据库**:[Cloudflare D1](https://developers.cloudflare.com/d1/)
|
- **数据库**:[Cloudflare D1](https://developers.cloudflare.com/d1/)
|
||||||
|
|
||||||
- **文件存储**:[Cloudflare R2](https://developers.cloudflare.com/r2/)
|
- **文件存储**:[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
|
```toml
|
||||||
[[d1_databases]]
|
[[d1_databases]]
|
||||||
@@ -78,6 +106,7 @@ database_id = "" #d1数据库id
|
|||||||
binding = "kv" #kv绑定名默认不可修改
|
binding = "kv" #kv绑定名默认不可修改
|
||||||
id = "" #kv数据库id
|
id = "" #kv数据库id
|
||||||
|
|
||||||
|
#(可选)
|
||||||
[[r2_buckets]]
|
[[r2_buckets]]
|
||||||
binding = "r2" #r2对象存储绑定名默认不可修改
|
binding = "r2" #r2对象存储绑定名默认不可修改
|
||||||
bucket_name = "" #r2对象存储桶的名字
|
bucket_name = "" #r2对象存储桶的名字
|
||||||
@@ -90,13 +119,35 @@ directory = "./dist" #前端vue项目打包的静态资源存放位置,
|
|||||||
[vars]
|
[vars]
|
||||||
domain = [] #邮件域名可以配置多个 示例: ["example1.com","example2.com"]
|
domain = [] #邮件域名可以配置多个 示例: ["example1.com","example2.com"]
|
||||||
admin = "" #管理员的邮箱 示例: admin@example.com
|
admin = "" #管理员的邮箱 示例: admin@example.com
|
||||||
r2_domain = "" #r2对象存储桶的访问域名
|
|
||||||
jwt_secret = "" #jwt令牌的密钥,随便填一串字符串
|
jwt_secret = "" #jwt令牌的密钥,随便填一串字符串
|
||||||
site_key = "" #Turnstile人机验证的站点密钥
|
r2_domain = "" #r2对象存储桶的访问域名(可选)
|
||||||
secret_key = "" #Turnstile人机验证的后端密钥
|
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>
|
</el-scrollbar>
|
||||||
<div class="github">
|
<div class="github">
|
||||||
<a href="https://github.com/LaziestRen/cloud-mail">
|
<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>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
width: 100px;
|
width: 100px;
|
||||||
height: 50px;
|
height: 50px;
|
||||||
margin: 10px;
|
marngin-bottom: 10px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
background: var(--el-color-danger-light-9);
|
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
4
mail-worker/dist/index.html
vendored
4
mail-worker/dist/index.html
vendored
@@ -6,8 +6,8 @@
|
|||||||
<title></title>
|
<title></title>
|
||||||
<link rel="icon" href="/assets/favicon-C5dAZutX.svg" type="image/svg+xml">
|
<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 src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
|
||||||
<script type="module" crossorigin src="/assets/index-B67-0-m9.js"></script>
|
<script type="module" crossorigin src="/assets/index-BRburrSt.js"></script>
|
||||||
<link rel="stylesheet" crossorigin href="/assets/index-DVLqv5EF.css">
|
<link rel="stylesheet" crossorigin href="/assets/index-CGZvsPhs.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="app"></div>
|
<div id="app"></div>
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import KvConst from '../const/kv-const';
|
|||||||
import setting from '../entity/setting';
|
import setting from '../entity/setting';
|
||||||
import orm from '../entity/orm';
|
import orm from '../entity/orm';
|
||||||
import { settingConst } from '../const/entity-const';
|
import { settingConst } from '../const/entity-const';
|
||||||
|
import BizError from "../error/biz-error";
|
||||||
|
|
||||||
const settingService = {
|
const settingService = {
|
||||||
|
|
||||||
@@ -21,6 +22,11 @@ const settingService = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
async set(c, params) {
|
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 orm(c).update(setting).set({ ...params }).returning().get();
|
||||||
await this.refresh(c);
|
await this.refresh(c);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -11,20 +11,24 @@ ip = "0.0.0.0"
|
|||||||
[[d1_databases]]
|
[[d1_databases]]
|
||||||
binding = "db"
|
binding = "db"
|
||||||
database_name = "email"
|
database_name = "email"
|
||||||
database_id = ""
|
database_id = "a1c1a63a-6ef5-4e6d-8e8c-b6d9e8feb810"
|
||||||
|
|
||||||
[[kv_namespaces]]
|
[[kv_namespaces]]
|
||||||
binding = "kv"
|
binding = "kv"
|
||||||
id = ""
|
id = "2io01d4b299e481b9de060ece9e7785c"
|
||||||
|
|
||||||
[[r2_buckets]]
|
#[[r2_buckets]]
|
||||||
binding = "r2"
|
#binding = ""
|
||||||
bucket_name = "email"
|
#bucket_name = ""
|
||||||
|
|
||||||
|
[assets]
|
||||||
|
binding = "assets"
|
||||||
|
directory = "./dist"
|
||||||
|
|
||||||
[vars]
|
[vars]
|
||||||
domain = ["", ""]
|
domain = ["example.com", "example2.com"]
|
||||||
admin = ""
|
admin = "admin@example.com"
|
||||||
|
jwt_secret = "K8x@r!3XqZ7#bLm$9pV&yTfC1W*sD2Nv%Q@4Zh^gRb6&UsP!m"
|
||||||
r2_domain = ""
|
r2_domain = ""
|
||||||
jwt_secret = ""
|
|
||||||
site_key = ""
|
site_key = ""
|
||||||
secret_key = ""
|
secret_key = ""
|
||||||
|
|||||||
@@ -26,8 +26,8 @@ directory = "./dist"
|
|||||||
[vars]
|
[vars]
|
||||||
domain = ["", ""]
|
domain = ["", ""]
|
||||||
admin = ""
|
admin = ""
|
||||||
r2_domain = ""
|
|
||||||
jwt_secret = ""
|
jwt_secret = ""
|
||||||
|
r2_domain = ""
|
||||||
site_key = ""
|
site_key = ""
|
||||||
secret_key = ""
|
secret_key = ""
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ enabled = true
|
|||||||
#binding = "kv" #kv绑定名默认不可修改
|
#binding = "kv" #kv绑定名默认不可修改
|
||||||
#id = "" #kv数据库id
|
#id = "" #kv数据库id
|
||||||
|
|
||||||
|
#(可选)
|
||||||
#[[r2_buckets]]
|
#[[r2_buckets]]
|
||||||
#binding = "r2" #r2对象存储绑定名默认不可修改
|
#binding = "r2" #r2对象存储绑定名默认不可修改
|
||||||
#bucket_name = "" #r2对象存储桶的名字
|
#bucket_name = "" #r2对象存储桶的名字
|
||||||
@@ -22,10 +23,10 @@ enabled = true
|
|||||||
binding = "assets" #静态资源绑定名默认不可修改
|
binding = "assets" #静态资源绑定名默认不可修改
|
||||||
directory = "./dist" #前端vue项目打包的静态资源存放位置,默认dist
|
directory = "./dist" #前端vue项目打包的静态资源存放位置,默认dist
|
||||||
|
|
||||||
[vars]
|
#[vars]
|
||||||
domain = [] #邮件域名可可配置多个 示例: ["example1.com","example2.com"]
|
#domain = [] #邮件域名可可配置多个 示例: ["example1.com","example2.com"]
|
||||||
admin = "" #管理员的邮箱 示例: admin@example.com
|
#admin = "" #管理员的邮箱 示例: admin@example.com
|
||||||
r2_domain = "" #r2对象存储桶的访问域名
|
#jwt_secret = "" #jwt令牌的密钥,随便填一串字符串
|
||||||
jwt_secret = "" #jwt令牌的密钥,随便填一串字符串
|
#r2_domain = "" #r2对象存储桶的访问域名(可选)
|
||||||
site_key = "" #Turnstile人机验证的站点密钥
|
#site_key = "" #Turnstile人机验证的站点密钥(可选)
|
||||||
secret_key = "" #Turnstile人机验证的后端密钥
|
#secret_key = "" #Turnstile人机验证的密钥(可选)
|
||||||
|
|||||||
6
package-lock.json
generated
Normal file
6
package-lock.json
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"name": "cloud-mail",
|
||||||
|
"lockfileVersion": 3,
|
||||||
|
"requires": true,
|
||||||
|
"packages": {}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user