Compare commits

...

92 Commits

Author SHA1 Message Date
xiaojunnuo
afa8155fda v1.25.9 2024-10-02 02:04:55 +08:00
xiaojunnuo
388cb60cbb build: prepare to build 2024-10-02 02:02:12 +08:00
xiaojunnuo
4d9fb9f69f build: prepare to build 2024-10-02 01:58:43 +08:00
xiaojunnuo
3ef0541cc8 perf: 增加等待插件 2024-10-02 01:54:27 +08:00
xiaojunnuo
93fc8dc665 chore: 2024-10-02 01:50:40 +08:00
xiaojunnuo
2ecf1cce5b chore: 2024-10-02 01:24:08 +08:00
xiaojunnuo
551311d3a0 chore: 优化access 2024-10-02 00:55:20 +08:00
xiaojunnuo
b09acfb4dc chore: 2024-10-01 23:52:44 +08:00
xiaojunnuo
f8f3e8b43f fix: 修复西部数码账户级别apikey不可用的bug 2024-10-01 23:34:01 +08:00
xiaojunnuo
f2f56adfd7 chore: basic for publish 2024-10-01 22:54:16 +08:00
xiaojunnuo
19a2d74eed build: publish 2024-09-30 18:07:04 +08:00
xiaojunnuo
af582a489d build: trigger build image 2024-09-30 18:06:43 +08:00
xiaojunnuo
f548fe7011 v1.25.8 2024-09-30 18:06:16 +08:00
xiaojunnuo
17a9beb514 chore: 2024-09-30 18:00:51 +08:00
xiaojunnuo
8d42273665 perf: 群晖获取deviceid优化 2024-09-30 18:00:35 +08:00
xiaojunnuo
251e450fab fix: 修复pfxPassword无效的bug 2024-09-30 13:52:18 +08:00
xiaojunnuo
d3ba3254f1 chore: 宝塔form body querystring 2024-09-30 12:25:44 +08:00
xiaojunnuo
196f9c5fa8 chore: 2024-09-30 11:00:41 +08:00
xiaojunnuo
d00f7ee010 chore: 2024-09-30 11:00:28 +08:00
xiaojunnuo
345571cdff chore: 2024-09-30 10:59:07 +08:00
xiaojunnuo
1bdf7cf439 chore: 忽略证书校验 2024-09-30 10:17:12 +08:00
xiaojunnuo
9c253e8c49 chore: 2024-09-30 09:43:29 +08:00
xiaojunnuo
1c0b040eb0 chore: 2024-09-30 09:41:48 +08:00
xiaojunnuo
939b8d4aa9 Merge remote-tracking branch 'origin/v2' into v2 2024-09-30 09:35:48 +08:00
xiaojunnuo
eec9e2e742 chore: 2024-09-30 09:35:22 +08:00
xiaojunnuo
62f5b18022 build: trigger build image 2024-09-30 02:35:01 +08:00
xiaojunnuo
a7ecda9b36 v1.25.7 2024-09-30 02:34:14 +08:00
xiaojunnuo
aec753a3f8 chore: 2024-09-30 02:32:43 +08:00
xiaojunnuo
9225eeee44 build: trigger build image 2024-09-30 02:30:06 +08:00
xiaojunnuo
d5608c6dab chore: 2024-09-30 02:25:53 +08:00
xiaojunnuo
d668032310 build: trigger build image 2024-09-30 02:16:02 +08:00
xiaojunnuo
f46db508c7 chore: 2024-09-30 02:12:03 +08:00
xiaojunnuo
bf024bdda8 perf: 支持上传到七牛云oss 2024-09-30 02:07:26 +08:00
xiaojunnuo
7532a96085 fix: 修复某些地区被屏蔽无法激活专业版的bug 2024-09-30 00:22:50 +08:00
xiaojunnuo
8e32156aa0 chore: 2024-09-29 17:00:44 +08:00
xiaojunnuo
75ccae3f6b chore: 2024-09-29 15:24:42 +08:00
xiaojunnuo
8d493b7a89 Merge remote-tracking branch 'origin/v2' into v2 2024-09-29 15:24:21 +08:00
xiaojunnuo
c6412674fa chore: 2024-09-29 15:23:58 +08:00
root
feb3fc6eb5 111 2024-09-29 15:20:18 +08:00
xiaojunnuo
0874c03882 chore: 2024-09-29 15:03:05 +08:00
xiaojunnuo
15f44e64f7 chore: 生产环境移除demo plugin 2024-09-29 15:00:17 +08:00
xiaojunnuo
51f29d6093 chore: 2024-09-29 14:57:20 +08:00
xiaojunnuo
7ee9d915fb chore: 2024-09-29 11:53:03 +08:00
xiaojunnuo
d91026dc4f perf: 上传到主机,支持socks代理 2024-09-29 11:50:59 +08:00
xiaojunnuo
df88a936a5 chore: 2024-09-29 10:11:35 +08:00
xiaojunnuo
1939c214cf build: trigger build image 2024-09-29 10:11:08 +08:00
xiaojunnuo
5668a3e222 v1.25.6 2024-09-29 10:10:49 +08:00
xiaojunnuo
47fa419803 chore: 2024-09-29 10:05:22 +08:00
xiaojunnuo
4fcaab5feb chore: 禁止普通用户使用不安全插件,比如复制到本机、自定义js脚本等 2024-09-29 01:14:21 +08:00
xiaojunnuo
5aa06f5b07 chore: 2024-09-29 00:50:32 +08:00
xiaojunnuo
9d9c021819 perf: 增加使用教程 2024-09-29 00:38:17 +08:00
xiaojunnuo
21c09c93b3 docs: 2024-09-28 19:41:54 +08:00
xiaojunnuo
3dc2750d64 docs: 宝塔容器编排部署教程 2024-09-27 17:59:36 +08:00
xiaojunnuo
76e86ea283 fix: 修复中间证书复制错误的bug 2024-09-27 16:25:18 +08:00
xiaojunnuo
a00e96b63b chore: 2024-09-27 14:46:38 +08:00
xiaojunnuo
d047234d98 perf: 部署支持1Panel 2024-09-27 02:15:41 +08:00
xiaojunnuo
3f21a49988 chore: 2024-09-26 15:15:17 +08:00
xiaojunnuo
6a02de35ce chore: 2024-09-26 14:53:00 +08:00
xiaojunnuo
65363b2713 chore: 2024-09-26 14:35:10 +08:00
xiaojunnuo
ec8c06da9b chore: 2024-09-26 14:27:32 +08:00
xiaojunnuo
d0cb0e324e build: trigger build image 2024-09-26 14:27:23 +08:00
xiaojunnuo
be13390b3a v1.25.5 2024-09-26 14:27:04 +08:00
xiaojunnuo
e9fda44bf0 chore: 2024-09-26 14:26:04 +08:00
xiaojunnuo
27f6cf24dd chore: 2024-09-26 14:20:32 +08:00
xiaojunnuo
6ab627ed5a chore: 2024-09-26 13:20:10 +08:00
xiaojunnuo
a350b51cf8 chore: 2024-09-26 10:40:22 +08:00
xiaojunnuo
bbb032344b chore: 2024-09-26 10:24:25 +08:00
xiaojunnuo
3220b87457 chore: 2024-09-25 10:40:57 +08:00
xiaojunnuo
ec1015295e chore: 优化build 2024-09-25 10:35:30 +08:00
xiaojunnuo
a943a41d2e chore: 1 2024-09-25 10:18:43 +08:00
xiaojunnuo
2d86fa254c build: trigger build image 2024-09-25 09:53:14 +08:00
xiaojunnuo
03ce69dbfb v1.25.4 2024-09-25 09:52:23 +08:00
xiaojunnuo
653d8d43a8 chore: 1 2024-09-25 09:49:34 +08:00
xiaojunnuo
ae816e614c chore: 2024-09-25 09:46:13 +08:00
xiaojunnuo
3460d3ddca fix: 修复启动报授权验证失败的bug 2024-09-25 09:41:05 +08:00
xiaojunnuo
f5b423c351 chore: 1 2024-09-25 03:34:56 +08:00
xiaojunnuo
a4652ce7ba build: trigger build image 2024-09-25 03:33:28 +08:00
xiaojunnuo
7417188d36 chore: 1 2024-09-25 03:33:25 +08:00
xiaojunnuo
c2650d308c v1.25.3 2024-09-25 03:32:30 +08:00
xiaojunnuo
a616101ad0 chore: 1 2024-09-25 03:30:50 +08:00
xiaojunnuo
9fdb560528 chore: 1 2024-09-25 03:22:14 +08:00
xiaojunnuo
0f0ddb9c59 fix: 修复upload to host trim错误 2024-09-25 03:20:21 +08:00
xiaojunnuo
50e027ca80 chore: 1 2024-09-25 03:02:37 +08:00
xiaojunnuo
37aa7f5dfc chore: 1 2024-09-25 03:00:07 +08:00
xiaojunnuo
9c3709106b build: trigger build image 2024-09-25 02:56:59 +08:00
xiaojunnuo
66fb689ac5 v1.25.2 2024-09-25 02:56:09 +08:00
xiaojunnuo
8e01360a22 chore: 1 2024-09-25 02:54:30 +08:00
xiaojunnuo
3bbf8f4a03 build: trigger build image 2024-09-25 02:43:14 +08:00
xiaojunnuo
c7f7910fa9 v1.25.1 2024-09-25 02:42:21 +08:00
xiaojunnuo
211548fd53 build: prepare to build 2024-09-25 02:40:51 +08:00
xiaojunnuo
4d4c77129f chore: 1 2024-09-25 02:40:45 +08:00
xiaojunnuo
7500fb3b1c build: prepare to build 2024-09-25 02:39:27 +08:00
147 changed files with 2033 additions and 575 deletions

View File

@@ -3,6 +3,72 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.25.9](https://github.com/certd/certd/compare/v1.25.8...v1.25.9) (2024-10-01)
### Bug Fixes
* 修复西部数码账户级别apikey不可用的bug ([f8f3e8b](https://github.com/certd/certd/commit/f8f3e8b43fd5d815887bcb53b95f46dc96424b79))
### Performance Improvements
* 增加等待插件 ([3ef0541](https://github.com/certd/certd/commit/3ef0541cc85ab6abf698ead3b258ae1ac156ef98))
## [1.25.8](https://github.com/certd/certd/compare/v1.25.7...v1.25.8) (2024-09-30)
### Bug Fixes
* 修复pfxPassword无效的bug ([251e450](https://github.com/certd/certd/commit/251e450fabfe62405bac13e39f2153736c081ef0))
### Performance Improvements
* 群晖获取deviceid优化 ([8d42273](https://github.com/certd/certd/commit/8d4227366548eb70f6bc04303829e6933168f906))
## [1.25.7](https://github.com/certd/certd/compare/v1.25.6...v1.25.7) (2024-09-29)
### Bug Fixes
* 修复某些地区被屏蔽无法激活专业版的bug ([7532a96](https://github.com/certd/certd/commit/7532a960851b84d4f2cc3dba02353c5235e1a364))
### Performance Improvements
* 上传到主机支持socks代理 ([d91026d](https://github.com/certd/certd/commit/d91026dc4fbfe5fedc4ee8e43dc0d08f1cf88356))
* 支持上传到七牛云oss ([bf024bd](https://github.com/certd/certd/commit/bf024bdda8bc2a463475be5761acf0da7317a08a))
## [1.25.6](https://github.com/certd/certd/compare/v1.25.5...v1.25.6) (2024-09-29)
### Bug Fixes
* 修复中间证书复制错误的bug ([76e86ea](https://github.com/certd/certd/commit/76e86ea283ecbe4ec76cdc92b98457d0fef544ac))
### Performance Improvements
* 部署支持1Panel ([d047234](https://github.com/certd/certd/commit/d047234d98d31504f2e5a472b66e1b75806af26e))
* 增加使用教程 ([9d9c021](https://github.com/certd/certd/commit/9d9c0218195af5b9896cce7109b26a433480571d))
## [1.25.5](https://github.com/certd/certd/compare/v1.25.4...v1.25.5) (2024-09-26)
**Note:** Version bump only for package root
## [1.25.4](https://github.com/certd/certd/compare/v1.25.3...v1.25.4) (2024-09-25)
### Bug Fixes
* 修复启动报授权验证失败的bug ([3460d3d](https://github.com/certd/certd/commit/3460d3ddca222ea702816ab805909d489eff957f))
## [1.25.3](https://github.com/certd/certd/compare/v1.25.2...v1.25.3) (2024-09-24)
### Bug Fixes
* 修复upload to host trim错误 ([0f0ddb9](https://github.com/certd/certd/commit/0f0ddb9c5963fd643d6d203334efac471c43ec3b))
## [1.25.2](https://github.com/certd/certd/compare/v1.25.1...v1.25.2) (2024-09-24)
**Note:** Version bump only for package root
## [1.25.1](https://github.com/certd/certd/compare/v1.25.0...v1.25.1) (2024-09-24)
**Note:** Version bump only for package root
# [1.25.0](https://github.com/certd/certd/compare/v1.24.4...v1.25.0) (2024-09-24)
### Bug Fixes

View File

@@ -1,4 +1,6 @@
# Certd Open Source License
Certd Open Source License
- This project is licensed under the **GNU Affero General Public License (AGPL)** with the following additional terms.
- 本项目遵循 GNU Affero General Public LicenseAGPL并附加以下条款。

View File

@@ -5,22 +5,6 @@ Certd 是一个免费全自动申请和自动部署更新SSL证书的工具。
关键字:证书自动申请、证书自动更新、证书自动续期、证书自动续签
************************
支持开源,为爱发电,我已入驻爱发电
https://afdian.com/a/greper
发电权益:
1. 可加入发电专属群,可以获得作者一对一技术支持
2. 您的需求我们将优先实现,并且将作为专业版功能提供
3. 一年期专业版激活码
4. 赠送国外免费服务器部署方案0成本使用Certd可能需要翻墙不过现在性能越来越差了
专业版特权
1. 证书流水线条数无限制免费版限制10条
2. 免配置发邮件功能
3. FTP上传、cdnfly、宝塔等部署插件
4. 更多功能增加中...
************************
## 一、特性
本项目不仅支持证书申请过程自动化,还可以自动化部署更新证书,让你的证书永不过期。
@@ -45,11 +29,11 @@ https://certd.handsfree.work/
## 三、使用教程
本案例演示如何配置自动申请证书并部署到阿里云CDN然后快要到期前自动更新证书并重新部署
![演示](./doc/images/5-view.png)
![演示](./doc/images/9-start.png)
![演示](./doc/images/10-1-log.png)
![演示](./doc/images/13-3-download.png)
![演示](./doc/images/13-1-result.png)
![演示](./packages/ui/certd-client/public/doc/images/5-view.png)
![演示](./packages/ui/certd-client/public/doc/images/9-start.png)
![演示](./packages/ui/certd-client/public/doc/images/10-1-log.png)
![演示](./packages/ui/certd-client/public/doc/images/13-3-download.png)
![演示](./packages/ui/certd-client/public/doc/images/13-1-result.png)
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
-------> [点我查看详细使用步骤演示](./step.md) <--------
@@ -62,21 +46,24 @@ https://certd.handsfree.work/
由于证书、授权信息等属于高度敏感数据,请务必私有化部署,保障数据安全
### 4.1 宝塔面板一键部署【推荐】
### 4.1 宝塔面板一键部署
1. 安装宝塔面板,前往 [宝塔面板](https://www.bt.cn/u/CL3JHS) 官网,选择正式版的脚本下载安装
1. 安装宝塔面板,前往 [宝塔面板](https://www.bt.cn/u/CL3JHS) 官网,选择9.2.0以上正式版的脚本下载安装
2. 安装后登录宝塔面板,在菜单栏中点击 Docker首次进入会提示安装Docker服务点击立即安装按提示完成安装
3. 安装完成后在应用商店中找到`certd`,点击安装,配置域名等基本信息即可完成安装
3. 安装完成后在应用商店中找到`certd`(要先点右上角更新应用),点击安装,配置域名等基本信息即可完成安装
### 4.2 Docker部署
### 4.2 宝塔面板容器编排部署
[宝塔面板容器编排部署教程](./doc/deploy/baota/baota.md)
### 4.3 Docker部署
#### 1. 安装docker、docker-compose
1.1 准备一台云服务器
* 【阿里云】云服务器2核2G新老用户同享99元/年,续费同价!【 [立即购买](https://www.aliyun.com/benefit?scm=20140722.M_10244282._.V_1&source=5176.11533457&userCode=qya11txb )】
* 【腾讯云】云服务器2核2G新老用户同享99元/年,续费同价!【 [立即购买](https://cloud.tencent.com/act/cps/redirect?redirect=6094&cps_key=b3ef73330335d7a6efa4a4bbeeb6b2c9&from=console)】
1.2 安装docker
@@ -110,7 +97,7 @@ docker compose up -d
> 如果提示 没有compose命令,请安装docker-compose
> https://docs.docker.com/compose/install/linux/
#### 镜像说明:
#### 3. 镜像说明:
* 国内镜像地址:
* `registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest`
* `registry.cn-shenzhen.aliyuncs.com/handsfree/certd:armv7``[version]-armv7`
@@ -124,13 +111,21 @@ docker compose up -d
![](./doc/images/action-build.jpg)
#### 3. 访问
#### 4. 访问测试
http://your_server_ip:7001
默认账号密码admin/123456
记得修改密码
### 4.4 源码部署
```shell
# 克隆代码
git clone https://github.com/certd/certd
cd certd
# 启动服务
./start.sh
```
如果是windows请先安装`git for windows` ,然后右键,选择`open git bash here`打开终端,再执行`./start.sh`命令
## 五、 升级
@@ -211,23 +206,37 @@ docker compose up -d
</p>
## 十、捐赠
************************
支持开源,为爱发电,我已入驻爱发电
https://afdian.com/a/greper
发电权益:
1. 可加入发电专属群(先加我好友,发送发电截图,我拉你进群)
2. 的需求优先实现
3. 可以获得作者一对一技术支持
4. 更多权益陆续增加中...
1. 可加入发电专属群,可以获得作者一对一技术支持
2. 的需求我们将优先实现,并且将作为专业版功能提供
3. 一年期专业版激活码
4. 赠送国外免费服务器部署方案0成本使用Certd可能需要翻墙不过现在性能越来越差了
专业版特权对比
| 功能 | 免费版 | 专业版 |
|---------|------------------------|-----------------------|
| 免费证书申请 | 免费无限制 | 免费无限制 |
| 自动部署插件 | 阿里云CDN、腾讯云、七牛CDN、主机部署等 | 支持群晖、宝塔、1Panel等持续开发中 |
| 发邮件功能 | 需要配置 | 免配置 |
| 证书流水线条数 | 10条 | 无限制 |
************************
## 十一、贡献代码
1. [贡献插件教程](./plugin.md)
1. 本地开发 [贡献插件教程](./doc/dev/development.md)
2. 作为贡献者,代表您同意您贡献的代码如下许可:
1. 可以调整开源协议以使其更严格或更宽松。
2. 可以用于商业用途。
## 十二、 开源许可
* 本项目遵循 GNU Affero General Public LicenseAGPL开源协议。
* 允许个人和公司使用、复制、修改和分发本项目,禁止任何形式的商业用途

View File

@@ -1 +1 @@
1
18:06

32
doc/deploy/baota/baota.md Normal file
View File

@@ -0,0 +1,32 @@
# 宝塔部署教程
## 编排模版部署
### 创建docker模版
打开docker-compose.yaml
https://gitee.com/certd/certd/raw/v2/docker/run/docker-compose.yaml
整个内容复制下来
然后到宝塔里面进到docker的编排模版新建模版
![](./images/1.png)
### 启动应用
![img.png](./images/2.png)
等待启动完成
### 打开应用
http://ip:7001
## 二、一键应用部署
需要宝塔9.2.0版本
### 应用商店
进入应用商店,更新应用列表
### 搜索certd
点击安装

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -1,4 +1,5 @@
# 贡献插件
# 本地开发
欢迎贡献插件
## 1.本地调试运行
@@ -11,9 +12,6 @@ git clone https://github.com/certd/certd
#进入项目目录
cd certd
# 切换到最新的版本tagv2分支可能不稳定
checkout tags/vx.x.x # x.x.x为最新的版本号
# 安装依赖
npm install -g pnpm@8.15.7
pnpm install

View File

@@ -1,4 +1,4 @@
#version: '3.3'
version: '3.3' # 兼容旧版docker-compose
services:
certd:
# 镜像 # ↓↓↓↓↓ --- 镜像版本号,建议改成固定版本号

View File

@@ -1,3 +1,4 @@
current_pwd=$(pwd)
echo "开始设置git配置"

View File

@@ -9,5 +9,5 @@
}
},
"npmClient": "pnpm",
"version": "1.25.0"
"version": "1.25.9"
}

View File

@@ -12,11 +12,13 @@
"scripts": {
"start": "lerna bootstrap --hoist",
"i-all": "lerna link && lerna exec npm install ",
"publish": "npm run prepublishOnly2 && lerna publish --conventional-commits --create-release github && npm run afterpublishOnly",
"publish": "npm run prepublishOnly2 && lerna publish --force-publish=pro/plus-core --conventional-commits --create-release github && npm run afterpublishOnly && npm run commitAll",
"afterpublishOnly": "time /t >build.trigger && git add ./build.trigger && git commit -m \"build: trigger build image\" && TIMEOUT /T 10 && git push",
"commitAll" : "git add . && git commit -m \"build: publish\" && git push && npm run commitPro",
"commitPro" : "cd ./packages/core/ && git add . && git commit -m \"build: publish\" && git push",
"prepublishOnly1": "npm run check && lerna run build ",
"prepublishOnly2": "npm run check && npm run before-build && lerna run build ",
"before-build": "cd ./packages/core/pipeline && time /t >build.md && git add ./build.md && git commit -m \"build: prepare to build\"",
"before-build": "cd ./packages/core/basic && time /t >build.md && git add ./build.md && git commit -m \"build: prepare to build\"",
"deploy1": "node --experimental-json-modules deploy.js ",
"check": "node --experimental-json-modules publish-check.js",
"init": "lerna run build"
@@ -29,4 +31,4 @@
"workspaces": [
"packages/**"
]
}
}

View File

@@ -3,6 +3,44 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.25.9](https://github.com/publishlab/node-acme-client/compare/v1.25.8...v1.25.9) (2024-10-01)
**Note:** Version bump only for package @certd/acme-client
## [1.25.8](https://github.com/publishlab/node-acme-client/compare/v1.25.7...v1.25.8) (2024-09-30)
**Note:** Version bump only for package @certd/acme-client
## [1.25.7](https://github.com/publishlab/node-acme-client/compare/v1.25.6...v1.25.7) (2024-09-29)
**Note:** Version bump only for package @certd/acme-client
## [1.25.6](https://github.com/publishlab/node-acme-client/compare/v1.25.5...v1.25.6) (2024-09-29)
### Performance Improvements
* 部署支持1Panel ([d047234](https://github.com/publishlab/node-acme-client/commit/d047234d98d31504f2e5a472b66e1b75806af26e))
## [1.25.5](https://github.com/publishlab/node-acme-client/compare/v1.25.4...v1.25.5) (2024-09-26)
**Note:** Version bump only for package @certd/acme-client
## [1.25.4](https://github.com/publishlab/node-acme-client/compare/v1.25.3...v1.25.4) (2024-09-25)
**Note:** Version bump only for package @certd/acme-client
## [1.25.3](https://github.com/publishlab/node-acme-client/compare/v1.25.2...v1.25.3) (2024-09-24)
**Note:** Version bump only for package @certd/acme-client
## [1.25.2](https://github.com/publishlab/node-acme-client/compare/v1.25.1...v1.25.2) (2024-09-24)
**Note:** Version bump only for package @certd/acme-client
## [1.25.1](https://github.com/publishlab/node-acme-client/compare/v1.25.0...v1.25.1) (2024-09-24)
**Note:** Version bump only for package @certd/acme-client
# [1.25.0](https://github.com/publishlab/node-acme-client/compare/v1.24.4...v1.25.0) (2024-09-24)
### Performance Improvements

View File

@@ -3,7 +3,7 @@
"description": "Simple and unopinionated ACME client",
"private": false,
"author": "nmorsman",
"version": "1.25.0",
"version": "1.25.9",
"main": "src/index.js",
"types": "types/index.d.ts",
"license": "MIT",
@@ -34,7 +34,7 @@
"mocha": "^10.6.0",
"nock": "^13.5.4",
"tsd": "^0.31.1",
"typescript": "^4.8.4",
"typescript": "^5.4.2",
"uuid": "^8.3.2"
},
"scripts": {
@@ -59,5 +59,5 @@
"bugs": {
"url": "https://github.com/publishlab/node-acme-client/issues"
},
"gitHead": "6fe2d2c3288b698e9cbdc91725abcbb072278fab"
"gitHead": "f548fe70117c7b56f40c66a3021e63b6cb264fb3"
}

View File

@@ -0,0 +1,10 @@
# Change Log
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.25.9](https://github.com/certd/certd/compare/v1.25.8...v1.25.9) (2024-10-01)
### Bug Fixes
* 修复西部数码账户级别apikey不可用的bug ([f8f3e8b](https://github.com/certd/certd/commit/f8f3e8b43fd5d815887bcb53b95f46dc96424b79))

View File

@@ -0,0 +1 @@
02:02

View File

@@ -0,0 +1,11 @@
{
"name": "@certd/basic",
"version": "1.25.9",
"main": "src/index.js",
"scripts": {
"build": "echo 'basic'"
},
"author": "",
"license": "MIT",
"description": ""
}

View File

View File

View File

@@ -3,6 +3,46 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.25.9](https://github.com/certd/certd/compare/v1.25.8...v1.25.9) (2024-10-01)
**Note:** Version bump only for package @certd/pipeline
## [1.25.8](https://github.com/certd/certd/compare/v1.25.7...v1.25.8) (2024-09-30)
**Note:** Version bump only for package @certd/pipeline
## [1.25.7](https://github.com/certd/certd/compare/v1.25.6...v1.25.7) (2024-09-29)
### Bug Fixes
* 修复某些地区被屏蔽无法激活专业版的bug ([7532a96](https://github.com/certd/certd/commit/7532a960851b84d4f2cc3dba02353c5235e1a364))
## [1.25.6](https://github.com/certd/certd/compare/v1.25.5...v1.25.6) (2024-09-29)
### Performance Improvements
* 部署支持1Panel ([d047234](https://github.com/certd/certd/commit/d047234d98d31504f2e5a472b66e1b75806af26e))
## [1.25.5](https://github.com/certd/certd/compare/v1.25.4...v1.25.5) (2024-09-26)
**Note:** Version bump only for package @certd/pipeline
## [1.25.4](https://github.com/certd/certd/compare/v1.25.3...v1.25.4) (2024-09-25)
**Note:** Version bump only for package @certd/pipeline
## [1.25.3](https://github.com/certd/certd/compare/v1.25.2...v1.25.3) (2024-09-24)
**Note:** Version bump only for package @certd/pipeline
## [1.25.2](https://github.com/certd/certd/compare/v1.25.1...v1.25.2) (2024-09-24)
**Note:** Version bump only for package @certd/pipeline
## [1.25.1](https://github.com/certd/certd/compare/v1.25.0...v1.25.1) (2024-09-24)
**Note:** Version bump only for package @certd/pipeline
# [1.25.0](https://github.com/certd/certd/compare/v1.24.4...v1.25.0) (2024-09-24)
### Bug Fixes

View File

@@ -1 +1 @@
02:35
02:40

View File

@@ -1,25 +1,28 @@
{
"name": "@certd/pipeline",
"private": false,
"version": "1.25.0",
"version": "1.25.9",
"type": "module",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"scripts": {
"dev": "vite",
"build": "tsc --skipLibCheck",
"before-build": "rimraf dist && rimraf tsconfig.tsbuildinfo && rimraf .rollup.cache",
"build": "npm run before-build && tsc --skipLibCheck",
"build3": "rollup -c",
"build2": "vue-tsc --noEmit && vite build",
"preview": "vite preview",
"test": "mocha --loader=ts-node/esm"
},
"dependencies": {
"@certd/plus": "1.22.1",
"@certd/basic": "^1.25.9",
"@certd/plus-core": "^1.25.9",
"axios": "^1.7.2",
"fix-path": "^4.0.0",
"http-proxy-agent": "^7.0.2",
"https-proxy-agent": "^7.0.5",
"lodash-es": "^4.17.21",
"lru-cache": "^10.0.0",
"node-forge": "^1.3.1",
"nodemailer": "^6.9.3",
"proxy-agent": "^6.4.0",
@@ -50,15 +53,16 @@
"mocha": "^10.2.0",
"prettier": "^2.8.8",
"reflect-metadata": "^0.1.13",
"rimraf": "^5.0.5",
"rollup": "^3.7.4",
"rollup-plugin-typescript2": "^0.34.1",
"rollup-plugin-visualizer": "^5.8.2",
"ts-node": "^10.9.1",
"tsc-esm-fix": "^3.0.0",
"tslib": "^2.5.2",
"typescript": "^5.0.4",
"typescript": "^5.4.2",
"vite": "^4.3.8",
"vue-tsc": "^1.6.5"
},
"gitHead": "6fe2d2c3288b698e9cbdc91725abcbb072278fab"
"gitHead": "f548fe70117c7b56f40c66a3021e63b6cb264fb3"
}

View File

@@ -1,5 +1,8 @@
import { Registrable } from "../registry/index.js";
import { FormItemProps } from "../dt/index.js";
import { HttpClient, ILogger, utils } from "../utils/index.js";
import _ from "lodash-es";
import { AccessRequestHandleReq } from "../core";
export type AccessInputDefine = FormItemProps & {
title: string;
@@ -15,5 +18,36 @@ export interface IAccessService {
getById<T = any>(id: any): Promise<T>;
}
// eslint-disable-next-line @typescript-eslint/no-empty-interface
export interface IAccess {}
export interface IAccess {
ctx: AccessContext;
[key: string]: any;
}
export type AccessContext = {
http: HttpClient;
logger: ILogger;
utils: typeof utils;
};
export abstract class BaseAccess implements IAccess {
ctx!: AccessContext;
async onRequest(req: AccessRequestHandleReq) {
if (!req.action) {
throw new Error("action is required");
}
let methodName = req.action;
if (!req.action.startsWith("on")) {
methodName = `on${_.upperFirst(req.action)}`;
}
// @ts-ignore
const method = this[methodName];
if (method) {
// @ts-ignore
return await this[methodName](req.data);
}
throw new Error(`action ${req.action} not found`);
}
}

View File

@@ -1,8 +1,9 @@
// src/decorator/memoryCache.decorator.ts
import { AccessDefine, AccessInputDefine } from "./api.js";
import { AccessContext, AccessDefine, AccessInputDefine } from "./api.js";
import { Decorator } from "../decorator/index.js";
import _ from "lodash-es";
import { accessRegistry } from "./registry.js";
import { http, logger, utils } from "../utils/index.js";
// 提供一个唯一 key
export const ACCESS_CLASS_KEY = "pipeline:access";
@@ -37,3 +38,24 @@ export function AccessInput(input?: AccessInputDefine): PropertyDecorator {
Reflect.defineMetadata(ACCESS_INPUT_KEY, input, target, propertyKey);
};
}
export function newAccess(type: string, input: any, ctx?: AccessContext) {
const register = accessRegistry.get(type);
if (register == null) {
throw new Error(`access ${type} not found`);
}
// @ts-ignore
const access = new register.target();
for (const key in input) {
access[key] = input[key];
}
if (!ctx) {
ctx = {
http,
logger,
utils,
};
}
access.ctx = ctx;
return access;
}

View File

@@ -1,7 +1,7 @@
import { ConcurrencyStrategy, NotificationWhen, Pipeline, ResultType, Runnable, RunStrategy, Stage, Step, Task } from "../dt/index.js";
import _ from "lodash-es";
import { RunHistory, RunnableCollection } from "./run-history.js";
import { AbstractTaskPlugin, PluginDefine, pluginRegistry, TaskInstanceContext } from "../plugin/index.js";
import { AbstractTaskPlugin, PluginDefine, pluginRegistry, TaskInstanceContext, UserInfo } from "../plugin/index.js";
import { ContextFactory, IContext } from "./context.js";
import { IStorage } from "./storage.js";
import { logger } from "../utils/util.log.js";
@@ -16,13 +16,13 @@ import { hashUtils, utils } from "../utils/index.js";
// import { TimeoutPromise } from "../utils/util.promise.js";
export type ExecutorOptions = {
userId: any;
pipeline: Pipeline;
storage: IStorage;
onChanged: (history: RunHistory) => Promise<void>;
accessService: IAccessService;
emailService: IEmailService;
fileRootDir?: string;
user: UserInfo;
};
export class Executor {
@@ -46,7 +46,7 @@ export class Executor {
this.onChanged = async (history: RunHistory) => {
await options.onChanged(history);
};
this.pipeline.userId = options.userId;
this.pipeline.userId = options.user.id;
this.contextFactory = new ContextFactory(options.storage);
this.logger = logger;
this.pipelineContext = this.contextFactory.getContext("pipeline", this.pipeline.id);
@@ -269,7 +269,7 @@ export class Executor {
accessService: this.options.accessService,
emailService: this.options.emailService,
pipelineContext: this.pipelineContext,
userContext: this.contextFactory.getContext("user", this.options.userId),
userContext: this.contextFactory.getContext("user", this.options.user.id),
fileStore: new FileStore({
scope: this.pipeline.id,
parent: this.runtime.id,
@@ -277,6 +277,7 @@ export class Executor {
}),
signal: this.abort.signal,
utils,
user: this.options.user,
};
instance.setCtx(taskCtx);

View File

@@ -1,33 +1,21 @@
import _ from "lodash-es";
import { HttpClient, ILogger } from "../utils";
import { HttpClient, ILogger, utils } from "../utils/index.js";
export type PluginRequest = {
type: "plugin" | "access";
export type PluginRequestHandleReq<T = any> = {
typeName: string;
action: string;
input: any;
input: T;
data: any;
};
export type RequestHandleContext = {
export type AccessRequestHandleReqInput<T = any> = {
id?: number;
title?: string;
access: T;
};
export type AccessRequestHandleContext = {
http: HttpClient;
logger: ILogger;
utils: typeof utils;
};
export class RequestHandler {
async onRequest(req: PluginRequest, ctx: RequestHandleContext) {
if (!req.action) {
throw new Error("action is required");
}
const methodName = `on${_.upperFirst(req.action)}`;
// @ts-ignore
const method = this[methodName];
if (method) {
// @ts-ignore
return await this[methodName](req.data, ctx);
}
throw new Error(`action ${req.action} not found`);
}
}
export type AccessRequestHandleReq<T = any> = PluginRequestHandleReq<AccessRequestHandleReqInput<T>>;

View File

@@ -1,7 +1,7 @@
import { logger } from "../utils/index.js";
import { setLogger, isPlus } from "@certd/plus";
import { setLogger, isPlus } from "@certd/plus-core";
setLogger(logger);
export * from "@certd/plus";
export * from "@certd/plus-core";
export function checkPlus() {
if (!isPlus()) {

View File

@@ -4,11 +4,15 @@ import { FileStore } from "../core/file-store.js";
import { Logger } from "log4js";
import { IAccessService } from "../access/index.js";
import { IEmailService } from "../service/index.js";
import { IContext } from "../core/index.js";
import { ILogger, logger } from "../utils/index.js";
import { HttpClient } from "../utils/util.request";
import { utils } from "../utils/index.js";
import { IContext, PluginRequestHandleReq, RunnableCollection } from "../core/index.js";
import { ILogger, logger, utils } from "../utils/index.js";
import { HttpClient } from "../utils/util.request.js";
import dayjs from "dayjs";
import _ from "lodash-es";
export type UserInfo = {
role: "admin" | "user";
id: any;
};
export enum ContextScope {
global,
pipeline,
@@ -38,18 +42,13 @@ export type PluginDefine = Registrable & {
[key: string]: any;
};
reference?: {
src: string;
dest: string;
type: "computed";
}[];
needPlus?: boolean;
};
export type ITaskPlugin = {
onInstance(): Promise<void>;
execute(): Promise<void>;
onRequest(req: PluginRequestHandleReq<any>): Promise<any>;
[key: string]: any;
};
@@ -85,6 +84,8 @@ export type TaskInstanceContext = {
signal: AbortSignal;
//工具类
utils: typeof utils;
user: UserInfo;
};
export abstract class AbstractTaskPlugin implements ITaskPlugin {
@@ -107,6 +108,17 @@ export abstract class AbstractTaskPlugin implements ITaskPlugin {
this.accessService = ctx.accessService;
}
async getAccess(accessId: string) {
if (accessId == null) {
throw new Error("您还没有配置授权");
}
const res = await this.ctx.accessService.getById(accessId);
if (res == null) {
throw new Error("授权不存在,可能已被删除,请前往任务配置里面重新选择授权");
}
return res;
}
randomFileId() {
return Math.random().toString(36).substring(2, 9);
}
@@ -147,6 +159,44 @@ export abstract class AbstractTaskPlugin implements ITaskPlugin {
}
return name + "_" + dayjs().format("YYYYMMDDHHmmss");
}
async onRequest(req: PluginRequestHandleReq<any>) {
if (!req.action) {
throw new Error("action is required");
}
let methodName = req.action;
if (!req.action.startsWith("on")) {
methodName = `on${_.upperFirst(req.action)}`;
}
// @ts-ignore
const method = this[methodName];
if (method) {
// @ts-ignore
return await this[methodName](req.data);
}
throw new Error(`action ${req.action} not found`);
}
isAdmin() {
return this.ctx.user.role === "admin";
}
getStepFromPipeline(stepId: string) {
let found: any = null;
RunnableCollection.each(this.ctx.pipeline.stages, (step) => {
if (step.id === stepId) {
found = step;
return;
}
});
return found;
}
getStepIdFromRefInput(ref = ".") {
return ref.split(".")[1];
}
}
export type OutputVO = {

View File

@@ -22,5 +22,6 @@ export const pluginGroups = {
tencent: new PluginGroup("tencent", "腾讯云", 4),
host: new PluginGroup("host", "主机", 5),
cdn: new PluginGroup("cdn", "CDN", 6),
other: new PluginGroup("other", "其他", 7),
panel: new PluginGroup("panel", "面板", 7),
other: new PluginGroup("other", "其他", 8),
};

View File

@@ -1,25 +0,0 @@
import { ITaskPlugin } from "../api.js";
import { IsTaskPlugin, TaskInput } from "../decorator.js";
@IsTaskPlugin({
name: "EchoPlugin",
title: "测试插件",
desc: "test",
})
export class EchoPlugin implements ITaskPlugin {
@TaskInput({
title: "测试属性",
component: {
name: "text",
},
})
test?: string;
onInstance(): Promise<void> {
throw new Error("Method not implemented.");
}
async execute(): Promise<void> {
return Promise.resolve(undefined);
}
}

View File

@@ -5,6 +5,7 @@ export type Registrable = {
title: string;
desc?: string;
group?: string;
deprecated?: string;
};
export type RegistryItem<T> = {
@@ -67,6 +68,9 @@ export class Registry<T> {
for (const key in this.storage) {
const define = this.getDefine(key);
if (define) {
if (define?.deprecated) {
continue;
}
list.push({ ...define, key });
}
}

View File

@@ -6,11 +6,15 @@ export * from "./util.file.js";
export * from "./util.sp.js";
export * from "./util.promise.js";
export * from "./util.hash.js";
export * from "./util.merge.js";
export * from "./util.cache.js";
import { mergeUtils } from "./util.merge.js";
import { sp } from "./util.sp.js";
import { hashUtils } from "./util.hash.js";
import { promises } from "./util.promise.js";
import { fileUtils } from "./util.file.js";
import _ from "lodash-es";
import { cache } from "./util.cache.js";
export const utils = {
sleep,
http,
@@ -19,4 +23,6 @@ export const utils = {
promises,
file: fileUtils,
_,
mergeUtils,
cache,
};

View File

@@ -0,0 +1,8 @@
// LRUCache
import { LRUCache } from "lru-cache";
export const cache = new LRUCache<string, any>({
max: 1000,
ttl: 1000 * 60 * 10,
});

View File

@@ -0,0 +1,64 @@
import _ from "lodash-es";
function isUnMergeable(srcValue: any) {
return srcValue != null && srcValue instanceof UnMergeable;
}
function isUnCloneable(value: any) {
return isUnMergeable(value) && !value.cloneable;
}
function merge(target: any, ...sources: any) {
/**
* 如果目标为不可合并对象比如array、unMergeable、ref,则直接覆盖不合并
* @param objValue 被合并对象
* @param srcValue 来源对象
*/
function customizer(objValue: any, srcValue: any) {
if (srcValue == null) {
return;
}
// 如果被合并对象为数组,则直接被覆盖对象覆盖,只要覆盖对象不为空
if (_.isArray(objValue)) {
//原对象如果是数组
return srcValue; //来源对象
}
if (isUnMergeable(srcValue)) {
return srcValue;
}
}
let found: any = null;
for (const item of sources) {
if (isUnMergeable(item)) {
found = item;
}
}
if (found) {
return found;
}
return _.mergeWith(target, ...sources, customizer);
}
function cloneDeep(target: any) {
if (isUnCloneable(target)) {
return target;
}
function customizer(value: any) {
if (isUnCloneable(value)) {
return value;
}
}
return _.cloneDeepWith(target, customizer);
}
export class UnMergeable {
cloneable = false;
setCloneable(cloneable: any) {
this.cloneable = cloneable;
}
}
export const mergeUtils = {
merge,
cloneDeep,
};

View File

@@ -8,7 +8,7 @@ export class HttpError extends Error {
status?: number;
statusText?: string;
code?: string;
request?: { url: string; method: string; params?: any; data?: any };
request?: { baseURL: string; url: string; method: string; params?: any; data?: any };
response?: { data: any };
cause?: any;
constructor(error: any) {
@@ -23,6 +23,7 @@ export class HttpError extends Error {
this.status = error.response?.status;
this.statusText = error.response?.statusText;
this.request = {
baseURL: error.config?.baseURL,
url: error.config?.url,
method: error.config?.method,
params: error.config?.params,
@@ -138,6 +139,7 @@ export const http = createAxiosService({ logger }) as HttpClient;
export type HttpClientResponse<R> = any;
export type HttpRequestConfig<D> = {
skipSslVerify?: boolean;
skipCheckRes?: boolean;
} & AxiosRequestConfig<D>;
export type HttpClient = {
request<D = any, R = any>(config: HttpRequestConfig<D>): Promise<HttpClientResponse<R>>;

View File

@@ -1,27 +0,0 @@
import { Autowire, IsTaskPlugin, ITaskPlugin, TaskInput, TaskOutput } from "../src";
@IsTaskPlugin({
name: "EchoPlugin",
title: "测试插件【echo】",
})
export class EchoPlugin implements ITaskPlugin {
@TaskInput({
title: "cert",
component: {
name: "pi-output-selector",
},
helper: "输出选择",
})
cert!: any;
@TaskOutput({
title: "cert info",
})
certInfo!: any;
// eslint-disable-next-line @typescript-eslint/no-empty-function
async onInstance(): Promise<void> {}
async execute(): Promise<void> {
console.log("input :cert", this.cert);
}
}

View File

@@ -3,6 +3,26 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.25.9](https://github.com/certd/certd/compare/v1.25.8...v1.25.9) (2024-10-01)
**Note:** Version bump only for package @certd/lib-huawei
## [1.25.8](https://github.com/certd/certd/compare/v1.25.7...v1.25.8) (2024-09-30)
**Note:** Version bump only for package @certd/lib-huawei
## [1.25.7](https://github.com/certd/certd/compare/v1.25.6...v1.25.7) (2024-09-29)
**Note:** Version bump only for package @certd/lib-huawei
## [1.25.6](https://github.com/certd/certd/compare/v1.25.5...v1.25.6) (2024-09-29)
**Note:** Version bump only for package @certd/lib-huawei
## [1.25.5](https://github.com/certd/certd/compare/v1.25.4...v1.25.5) (2024-09-26)
**Note:** Version bump only for package @certd/lib-huawei
## [1.24.3](https://github.com/certd/certd/compare/v1.24.2...v1.24.3) (2024-09-06)
**Note:** Version bump only for package @certd/lib-huawei

View File

@@ -1,20 +1,21 @@
{
"name": "@certd/lib-huawei",
"private": false,
"version": "1.24.3",
"version": "1.25.9",
"main": "./dist/bundle.js",
"module": "./dist/bundle.js",
"types": "./dist/d/index.d.ts",
"scripts": {
"dev": "vite",
"build": "rollup -c ",
"before-build": "rimraf dist && rimraf tsconfig.tsbuildinfo && rimraf .rollup.cache",
"build": "npm run before-build && rollup -c ",
"build2": "vue-tsc --noEmit && vite build",
"preview": "vite preview"
},
"dependencies": {
"@certd/pipeline": "1.21.0",
"axios": "^1.7.2",
"rimraf": "^5.0.5",
"rollup": "^3.7.4"
},
"gitHead": "c49ccbde93dbad7062ac39d4f18eca7d561f573f"
"gitHead": "f548fe70117c7b56f40c66a3021e63b6cb264fb3"
}

View File

@@ -3,6 +3,44 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.25.9](https://github.com/certd/certd/compare/v1.25.8...v1.25.9) (2024-10-01)
**Note:** Version bump only for package @certd/lib-iframe
## [1.25.8](https://github.com/certd/certd/compare/v1.25.7...v1.25.8) (2024-09-30)
**Note:** Version bump only for package @certd/lib-iframe
## [1.25.7](https://github.com/certd/certd/compare/v1.25.6...v1.25.7) (2024-09-29)
**Note:** Version bump only for package @certd/lib-iframe
## [1.25.6](https://github.com/certd/certd/compare/v1.25.5...v1.25.6) (2024-09-29)
### Performance Improvements
* 部署支持1Panel ([d047234](https://github.com/certd/certd/commit/d047234d98d31504f2e5a472b66e1b75806af26e))
## [1.25.5](https://github.com/certd/certd/compare/v1.25.4...v1.25.5) (2024-09-26)
**Note:** Version bump only for package @certd/lib-iframe
## [1.25.4](https://github.com/certd/certd/compare/v1.25.3...v1.25.4) (2024-09-25)
**Note:** Version bump only for package @certd/lib-iframe
## [1.25.3](https://github.com/certd/certd/compare/v1.25.2...v1.25.3) (2024-09-24)
**Note:** Version bump only for package @certd/lib-iframe
## [1.25.2](https://github.com/certd/certd/compare/v1.25.1...v1.25.2) (2024-09-24)
**Note:** Version bump only for package @certd/lib-iframe
## [1.25.1](https://github.com/certd/certd/compare/v1.25.0...v1.25.1) (2024-09-24)
**Note:** Version bump only for package @certd/lib-iframe
# [1.25.0](https://github.com/certd/certd/compare/v1.24.4...v1.25.0) (2024-09-24)
### Features

View File

@@ -1,13 +1,14 @@
{
"name": "@certd/lib-iframe",
"private": false,
"version": "1.25.0",
"version": "1.25.9",
"type": "module",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"scripts": {
"dev": "vite",
"build": "tsc --skipLibCheck",
"before-build": "rimraf dist && rimraf tsconfig.tsbuildinfo && rimraf .rollup.cache",
"build": "npm run before-build && tsc --skipLibCheck",
"build3": "rollup -c",
"build2": "vue-tsc --noEmit && vite build",
"preview": "vite preview"
@@ -30,11 +31,12 @@
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-prettier": "^4.2.1",
"prettier": "^2.8.8",
"rimraf": "^5.0.5",
"rollup": "^3.7.4",
"rollup-plugin-visualizer": "^5.8.2",
"ts-node": "^10.9.1",
"tslib": "^2.5.2",
"typescript": "^4.8.4"
"typescript": "^5.4.2"
},
"gitHead": "6fe2d2c3288b698e9cbdc91725abcbb072278fab"
"gitHead": "f548fe70117c7b56f40c66a3021e63b6cb264fb3"
}

View File

@@ -3,6 +3,42 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.25.9](https://github.com/certd/certd/compare/v1.25.8...v1.25.9) (2024-10-01)
**Note:** Version bump only for package @certd/lib-jdcloud
## [1.25.8](https://github.com/certd/certd/compare/v1.25.7...v1.25.8) (2024-09-30)
**Note:** Version bump only for package @certd/lib-jdcloud
## [1.25.7](https://github.com/certd/certd/compare/v1.25.6...v1.25.7) (2024-09-29)
**Note:** Version bump only for package @certd/lib-jdcloud
## [1.25.6](https://github.com/certd/certd/compare/v1.25.5...v1.25.6) (2024-09-29)
**Note:** Version bump only for package @certd/lib-jdcloud
## [1.25.5](https://github.com/certd/certd/compare/v1.25.4...v1.25.5) (2024-09-26)
**Note:** Version bump only for package @certd/lib-jdcloud
## [1.25.4](https://github.com/certd/certd/compare/v1.25.3...v1.25.4) (2024-09-25)
**Note:** Version bump only for package @certd/lib-jdcloud
## [1.25.3](https://github.com/certd/certd/compare/v1.25.2...v1.25.3) (2024-09-24)
**Note:** Version bump only for package @certd/lib-jdcloud
## [1.25.2](https://github.com/certd/certd/compare/v1.25.1...v1.25.2) (2024-09-24)
**Note:** Version bump only for package @certd/lib-jdcloud
## [1.25.1](https://github.com/certd/certd/compare/v1.25.0...v1.25.1) (2024-09-24)
**Note:** Version bump only for package @certd/lib-jdcloud
# [1.25.0](https://github.com/certd/certd/compare/v1.24.4...v1.25.0) (2024-09-24)
**Note:** Version bump only for package @certd/lib-jdcloud

View File

@@ -1,28 +1,31 @@
{
"name": "@certd/lib-jdcloud",
"private": false,
"version": "1.25.0",
"version": "1.25.9",
"main": "./dist/bundle.mjs",
"module": "./dist/bundle.mjs",
"types": "./dist/d/index.d.ts",
"scripts": {
"dev": "vite",
"build": "rollup -c ",
"before-build": "rimraf dist && rimraf tsconfig.tsbuildinfo && rimraf .rollup.cache",
"build": "npm run before-build && rollup -c ",
"build2": "vue-tsc --noEmit && vite build",
"preview": "vite preview"
},
"dependencies": {
"@certd/pipeline": "1.21.0",
"axios": "^1.7.2",
"babel-register": "^6.26.0",
"buffer": "^5.0.8",
"create-hash": "^1.1.3",
"create-hmac": "^1.1.6",
"debug": "^3.1.0",
"node-fetch": "^2.1.2",
"rollup": "^3.7.4",
"url": "^0.11.0",
"uuid": "^3.1.0"
},
"gitHead": "c49ccbde93dbad7062ac39d4f18eca7d561f573f"
"devDependencies": {
"babel-register": "^6.26.0",
"rimraf": "^5.0.5",
"rollup": "^3.7.4"
},
"gitHead": "f548fe70117c7b56f40c66a3021e63b6cb264fb3"
}

View File

@@ -3,6 +3,44 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.25.9](https://github.com/certd/certd/compare/v1.25.8...v1.25.9) (2024-10-01)
**Note:** Version bump only for package @certd/lib-k8s
## [1.25.8](https://github.com/certd/certd/compare/v1.25.7...v1.25.8) (2024-09-30)
**Note:** Version bump only for package @certd/lib-k8s
## [1.25.7](https://github.com/certd/certd/compare/v1.25.6...v1.25.7) (2024-09-29)
**Note:** Version bump only for package @certd/lib-k8s
## [1.25.6](https://github.com/certd/certd/compare/v1.25.5...v1.25.6) (2024-09-29)
### Performance Improvements
* 部署支持1Panel ([d047234](https://github.com/certd/certd/commit/d047234d98d31504f2e5a472b66e1b75806af26e))
## [1.25.5](https://github.com/certd/certd/compare/v1.25.4...v1.25.5) (2024-09-26)
**Note:** Version bump only for package @certd/lib-k8s
## [1.25.4](https://github.com/certd/certd/compare/v1.25.3...v1.25.4) (2024-09-25)
**Note:** Version bump only for package @certd/lib-k8s
## [1.25.3](https://github.com/certd/certd/compare/v1.25.2...v1.25.3) (2024-09-24)
**Note:** Version bump only for package @certd/lib-k8s
## [1.25.2](https://github.com/certd/certd/compare/v1.25.1...v1.25.2) (2024-09-24)
**Note:** Version bump only for package @certd/lib-k8s
## [1.25.1](https://github.com/certd/certd/compare/v1.25.0...v1.25.1) (2024-09-24)
**Note:** Version bump only for package @certd/lib-k8s
# [1.25.0](https://github.com/certd/certd/compare/v1.24.4...v1.25.0) (2024-09-24)
### Performance Improvements

View File

@@ -1,13 +1,14 @@
{
"name": "@certd/lib-k8s",
"private": false,
"version": "1.25.0",
"version": "1.25.9",
"type": "module",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"scripts": {
"dev": "vite",
"build": "tsc --skipLibCheck",
"before-build": "rimraf dist && rimraf tsconfig.tsbuildinfo && rimraf .rollup.cache",
"build": "npm run before-build && tsc --skipLibCheck",
"build3": "rollup -c",
"build2": "vue-tsc --noEmit && vite build",
"preview": "vite preview"
@@ -16,7 +17,7 @@
"@kubernetes/client-node": "0.21.0"
},
"devDependencies": {
"@certd/pipeline": "^1.25.0",
"@certd/pipeline": "^1.25.9",
"@rollup/plugin-commonjs": "^23.0.4",
"@rollup/plugin-json": "^6.0.0",
"@rollup/plugin-node-resolve": "^15.0.1",
@@ -31,11 +32,12 @@
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-prettier": "^4.2.1",
"prettier": "^2.8.8",
"rimraf": "^5.0.5",
"rollup": "^3.7.4",
"rollup-plugin-visualizer": "^5.8.2",
"ts-node": "^10.9.1",
"tslib": "^2.5.2",
"typescript": "^4.8.4"
"typescript": "^5.4.2"
},
"gitHead": "6fe2d2c3288b698e9cbdc91725abcbb072278fab"
"gitHead": "f548fe70117c7b56f40c66a3021e63b6cb264fb3"
}

View File

@@ -3,6 +3,44 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.25.9](https://github.com/certd/certd/compare/v1.25.8...v1.25.9) (2024-10-01)
**Note:** Version bump only for package @certd/midway-flyway-js
## [1.25.8](https://github.com/certd/certd/compare/v1.25.7...v1.25.8) (2024-09-30)
**Note:** Version bump only for package @certd/midway-flyway-js
## [1.25.7](https://github.com/certd/certd/compare/v1.25.6...v1.25.7) (2024-09-29)
**Note:** Version bump only for package @certd/midway-flyway-js
## [1.25.6](https://github.com/certd/certd/compare/v1.25.5...v1.25.6) (2024-09-29)
### Performance Improvements
* 部署支持1Panel ([d047234](https://github.com/certd/certd/commit/d047234d98d31504f2e5a472b66e1b75806af26e))
## [1.25.5](https://github.com/certd/certd/compare/v1.25.4...v1.25.5) (2024-09-26)
**Note:** Version bump only for package @certd/midway-flyway-js
## [1.25.4](https://github.com/certd/certd/compare/v1.25.3...v1.25.4) (2024-09-25)
**Note:** Version bump only for package @certd/midway-flyway-js
## [1.25.3](https://github.com/certd/certd/compare/v1.25.2...v1.25.3) (2024-09-24)
**Note:** Version bump only for package @certd/midway-flyway-js
## [1.25.2](https://github.com/certd/certd/compare/v1.25.1...v1.25.2) (2024-09-24)
**Note:** Version bump only for package @certd/midway-flyway-js
## [1.25.1](https://github.com/certd/certd/compare/v1.25.0...v1.25.1) (2024-09-24)
**Note:** Version bump only for package @certd/midway-flyway-js
# [1.25.0](https://github.com/certd/certd/compare/v1.24.4...v1.25.0) (2024-09-24)
**Note:** Version bump only for package @certd/midway-flyway-js

View File

@@ -1,13 +1,14 @@
{
"name": "@certd/midway-flyway-js",
"version": "1.25.0",
"version": "1.25.9",
"description": "midway with flyway, sql upgrade way ",
"private": false,
"type": "module",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"scripts": {
"build": "tsc --skipLibCheck",
"before-build": "rimraf dist && rimraf tsconfig.tsbuildinfo && rimraf .rollup.cache",
"build": "npm run before-build && tsc --skipLibCheck",
"test": "midway-bin test --ts -V",
"test1": "midway-bin test --ts -V -f test/blank.test.ts -t 'hash-check'",
"cov": "midway-bin cov --ts",
@@ -46,12 +47,13 @@
"mwts": "^1.3.0",
"mwtsc": "^1.4.0",
"prettier": "^2.8.8",
"rimraf": "^5.0.5",
"rollup": "^3.7.4",
"rollup-plugin-visualizer": "^5.8.2",
"ts-node": "^10.9.1",
"tslib": "^2.5.2",
"typeorm": "^0.3.11",
"typescript": "~5.1.0"
"typescript": "^5.4.2"
},
"gitHead": "6fe2d2c3288b698e9cbdc91725abcbb072278fab"
"gitHead": "f548fe70117c7b56f40c66a3021e63b6cb264fb3"
}

View File

@@ -3,6 +3,48 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.25.9](https://github.com/certd/certd/compare/v1.25.8...v1.25.9) (2024-10-01)
### Bug Fixes
* 修复西部数码账户级别apikey不可用的bug ([f8f3e8b](https://github.com/certd/certd/commit/f8f3e8b43fd5d815887bcb53b95f46dc96424b79))
## [1.25.8](https://github.com/certd/certd/compare/v1.25.7...v1.25.8) (2024-09-30)
### Bug Fixes
* 修复pfxPassword无效的bug ([251e450](https://github.com/certd/certd/commit/251e450fabfe62405bac13e39f2153736c081ef0))
## [1.25.7](https://github.com/certd/certd/compare/v1.25.6...v1.25.7) (2024-09-29)
**Note:** Version bump only for package @certd/plugin-cert
## [1.25.6](https://github.com/certd/certd/compare/v1.25.5...v1.25.6) (2024-09-29)
### Performance Improvements
* 部署支持1Panel ([d047234](https://github.com/certd/certd/commit/d047234d98d31504f2e5a472b66e1b75806af26e))
## [1.25.5](https://github.com/certd/certd/compare/v1.25.4...v1.25.5) (2024-09-26)
**Note:** Version bump only for package @certd/plugin-cert
## [1.25.4](https://github.com/certd/certd/compare/v1.25.3...v1.25.4) (2024-09-25)
**Note:** Version bump only for package @certd/plugin-cert
## [1.25.3](https://github.com/certd/certd/compare/v1.25.2...v1.25.3) (2024-09-24)
**Note:** Version bump only for package @certd/plugin-cert
## [1.25.2](https://github.com/certd/certd/compare/v1.25.1...v1.25.2) (2024-09-24)
**Note:** Version bump only for package @certd/plugin-cert
## [1.25.1](https://github.com/certd/certd/compare/v1.25.0...v1.25.1) (2024-09-24)
**Note:** Version bump only for package @certd/plugin-cert
# [1.25.0](https://github.com/certd/certd/compare/v1.24.4...v1.25.0) (2024-09-24)
### Features

View File

@@ -1,23 +1,26 @@
{
"name": "@certd/plugin-cert",
"private": false,
"version": "1.25.0",
"version": "1.25.9",
"type": "module",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"scripts": {
"dev": "vite",
"build": "tsc --skipLibCheck",
"before-build": "rimraf dist && rimraf tsconfig.tsbuildinfo && rimraf .rollup.cache",
"build": "npm run before-build &&tsc --skipLibCheck",
"build3": "rollup -c",
"build2": "vue-tsc --noEmit && vite build",
"preview": "vite preview"
},
"dependencies": {
"@certd/acme-client": "^1.25.0",
"@certd/pipeline": "^1.25.0",
"@certd/acme-client": "^1.25.9",
"@certd/pipeline": "^1.25.9",
"dayjs": "^1.11.7",
"jszip": "^3.10.1",
"node-forge": "^0.10.0",
"psl": "^1.9.0"
"psl": "^1.9.0",
"rimraf": "^5.0.5"
},
"devDependencies": {
"@alicloud/cs20151215": "^3.0.3",
@@ -35,7 +38,6 @@
"@typescript-eslint/eslint-plugin": "^5.38.1",
"@typescript-eslint/parser": "^5.38.1",
"chai": "^4.3.6",
"dayjs": "^1.11.6",
"eslint": "^8.24.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-import": "^2.26.0",
@@ -49,9 +51,9 @@
"rollup-plugin-visualizer": "^5.8.2",
"ts-node": "^10.9.1",
"tslib": "^2.5.2",
"typescript": "^4.8.4",
"typescript": "^5.4.2",
"vite": "^3.1.0",
"vue-tsc": "^0.38.9"
},
"gitHead": "6fe2d2c3288b698e9cbdc91725abcbb072278fab"
"gitHead": "f548fe70117c7b56f40c66a3021e63b6cb264fb3"
}

View File

@@ -1,11 +1,11 @@
import { IsAccess, AccessInput } from "@certd/pipeline";
import { IsAccess, AccessInput, BaseAccess } from "@certd/pipeline";
@IsAccess({
name: "eab",
title: "EAB授权",
desc: "ZeroSSL证书申请需要EAB授权",
})
export class EabAccess {
export class EabAccess extends BaseAccess {
@AccessInput({
title: "KID",
component: {

View File

@@ -1,4 +1,4 @@
import { HttpClient, IAccess, ILogger, Registrable } from "@certd/pipeline";
import { HttpClient, IAccess, ILogger, Registrable, utils } from "@certd/pipeline";
export type DnsProviderDefine = Registrable & {
accessType: string;
@@ -22,6 +22,7 @@ export type DnsProviderContext = {
access: IAccess;
logger: ILogger;
http: HttpClient;
utils: typeof utils;
};
export interface IDnsProvider<T = any> {

View File

@@ -65,6 +65,13 @@ export class CertReader {
return { detail, expires };
}
getAllDomains() {
const { detail } = this.getCrtDetail();
const domains = [detail.domains.commonName];
domains.push(...detail.domains.altNames);
return domains;
}
saveToFile(type: "crt" | "key" | "pfx" | "der" | "ic", filepath?: string) {
if (!this.cert[type]) {
return;

View File

@@ -21,12 +21,12 @@ export class CertConverter {
const certReader = new CertReader(opts.cert);
let pfxPath: string;
let derPath: string;
const handle = async (opts: CertReaderHandleContext) => {
const handle = async (ctx: CertReaderHandleContext) => {
// 调用openssl 转pfx
pfxPath = await this.convertPfx(opts);
pfxPath = await this.convertPfx(ctx, opts.pfxPassword);
// 转der
derPath = await this.convertDer(opts);
derPath = await this.convertDer(ctx);
};
await certReader.readCertFile({ logger: this.logger, handle });
@@ -44,7 +44,7 @@ export class CertConverter {
});
}
private async convertPfx(opts: CertReaderHandleContext, pfxPassword?: string) {
private async convertPfx(opts: CertReaderHandleContext, pfxPassword: string) {
const { tmpCrtPath, tmpKeyPath } = opts;
const pfxPath = path.join(os.tmpdir(), "/certd/tmp/", Math.floor(Math.random() * 1000000) + "", "cert.pfx");

View File

@@ -1,4 +1,4 @@
import { Decorator, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from "@certd/pipeline";
import { Decorator, IsTaskPlugin, pluginGroups, RunStrategy, TaskInput, utils } from "@certd/pipeline";
import type { CertInfo, PrivateKeyType, SSLProvider } from "./acme.js";
import { AcmeService } from "./acme.js";
import _ from "lodash-es";
@@ -174,11 +174,14 @@ export class CertApplyPlugin extends CertApplyBasePlugin {
const dnsProviderPlugin = dnsProviderRegistry.get(dnsProviderType);
const DnsProviderClass = dnsProviderPlugin.target;
const dnsProviderDefine = dnsProviderPlugin.define as DnsProviderDefine;
if (dnsProviderDefine.deprecated) {
throw new Error(dnsProviderDefine.deprecated);
}
const access = await this.accessService.getById(dnsProviderAccessId);
// @ts-ignore
const dnsProvider: IDnsProvider = new DnsProviderClass();
const context: DnsProviderContext = { access, logger: this.logger, http: this.http };
const context: DnsProviderContext = { access, logger: this.logger, http: this.http, utils };
Decorator.inject(dnsProviderDefine.autowire, dnsProvider, context);
dnsProvider.setCtx(context);
await dnsProvider.onInstance();

View File

@@ -3,6 +3,49 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.25.9](https://github.com/certd/certd/compare/v1.25.8...v1.25.9) (2024-10-01)
### Bug Fixes
* 修复西部数码账户级别apikey不可用的bug ([f8f3e8b](https://github.com/certd/certd/commit/f8f3e8b43fd5d815887bcb53b95f46dc96424b79))
## [1.25.8](https://github.com/certd/certd/compare/v1.25.7...v1.25.8) (2024-09-30)
### Performance Improvements
* 群晖获取deviceid优化 ([8d42273](https://github.com/certd/certd/commit/8d4227366548eb70f6bc04303829e6933168f906))
## [1.25.7](https://github.com/certd/certd/compare/v1.25.6...v1.25.7) (2024-09-29)
**Note:** Version bump only for package @certd/ui-client
## [1.25.6](https://github.com/certd/certd/compare/v1.25.5...v1.25.6) (2024-09-29)
### Performance Improvements
* 部署支持1Panel ([d047234](https://github.com/certd/certd/commit/d047234d98d31504f2e5a472b66e1b75806af26e))
* 增加使用教程 ([9d9c021](https://github.com/certd/certd/commit/9d9c0218195af5b9896cce7109b26a433480571d))
## [1.25.5](https://github.com/certd/certd/compare/v1.25.4...v1.25.5) (2024-09-26)
**Note:** Version bump only for package @certd/ui-client
## [1.25.4](https://github.com/certd/certd/compare/v1.25.3...v1.25.4) (2024-09-25)
**Note:** Version bump only for package @certd/ui-client
## [1.25.3](https://github.com/certd/certd/compare/v1.25.2...v1.25.3) (2024-09-24)
**Note:** Version bump only for package @certd/ui-client
## [1.25.2](https://github.com/certd/certd/compare/v1.25.1...v1.25.2) (2024-09-24)
**Note:** Version bump only for package @certd/ui-client
## [1.25.1](https://github.com/certd/certd/compare/v1.25.0...v1.25.1) (2024-09-24)
**Note:** Version bump only for package @certd/ui-client
# [1.25.0](https://github.com/certd/certd/compare/v1.24.4...v1.25.0) (2024-09-24)
### Bug Fixes

View File

@@ -1,6 +1,6 @@
{
"name": "@certd/ui-client",
"version": "1.25.0",
"version": "1.25.9",
"private": true,
"scripts": {
"dev": "vite --open",
@@ -58,8 +58,8 @@
"vuedraggable": "^4.1.0"
},
"devDependencies": {
"@certd/lib-iframe": "^1.25.0",
"@certd/pipeline": "^1.25.0",
"@certd/lib-iframe": "^1.25.9",
"@certd/pipeline": "^1.25.9",
"@rollup/plugin-commonjs": "^25.0.7",
"@rollup/plugin-node-resolve": "^15.2.3",
"@types/chai": "^4.3.12",

View File

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 68 KiB

View File

Before

Width:  |  Height:  |  Size: 124 KiB

After

Width:  |  Height:  |  Size: 124 KiB

View File

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

View File

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 67 KiB

View File

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

View File

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 47 KiB

View File

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 82 KiB

View File

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 46 KiB

View File

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 43 KiB

View File

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 50 KiB

View File

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 44 KiB

View File

Before

Width:  |  Height:  |  Size: 145 KiB

After

Width:  |  Height:  |  Size: 145 KiB

View File

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

View File

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

View File

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 50 KiB

View File

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 72 KiB

View File

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 61 KiB

View File

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 66 KiB

View File

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 76 KiB

View File

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 55 KiB

View File

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View File

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 56 KiB

View File

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

View File

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

View File

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

View File

@@ -9,6 +9,7 @@ import CronEditor from "./cron-editor/index.vue";
import { CronLight } from "@vue-js-cron/light";
import "@vue-js-cron/light/dist/light.css";
import Plugins from "./plugins/index";
export default {
install(app: any) {
app.component("PiContainer", PiContainer);

View File

@@ -0,0 +1,61 @@
<script setup lang="ts">
import { inject, ref, watch } from "vue";
const props = defineProps<{
inputKey?: string;
modelValue?: string[];
}>();
const emit = defineEmits<{
"update:modelValue": any;
}>();
const pipeline: any = inject("pipeline");
function findStepFromPipeline(targetStepId: string) {
for (const stage of pipeline.value.stages) {
for (const task of stage.tasks) {
for (const step of task.steps) {
if (step.id === targetStepId) {
return step;
}
}
}
}
}
const errorRef = ref("");
function getDomainFromPipeline(inputKey: string) {
if (!inputKey) {
errorRef.value = "请先选择域名证书";
return;
}
const targetStepId = inputKey.split(".")[1];
const certStep = findStepFromPipeline(targetStepId);
if (!certStep) {
errorRef.value = "找不到目标步骤,请先选择域名证书";
return;
}
const domain = certStep.input["domains"];
emit("update:modelValue", domain);
}
watch(
() => {
return props.inputKey;
},
(inputKey: string) => {
getDomainFromPipeline(inputKey);
},
{
immediate: true
}
);
</script>
<template>
<a-select mode="tags" readonly :value="modelValue" />
<div>{{ errorRef }}</div>
</template>
<style lang="less"></style>

View File

@@ -0,0 +1,67 @@
<script setup lang="ts">
import { ComponentPropsType, doRequest } from "/@/components/plugins/lib";
import { ref, watch } from "vue";
const props = defineProps<
{
watches: string[];
} & ComponentPropsType
>();
const emit = defineEmits<{
"update:value": any;
}>();
const optionsRef = ref([]);
const getOptions = async () => {
return await doRequest({
type: props.type,
typeName: props.typeName,
action: props.action,
input: props.form
});
};
const filterOption = (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0 || String(option.value).toLowerCase().indexOf(input.toLowerCase());
};
let isFirst = true;
async function onClick() {
if (!isFirst) {
return;
}
isFirst = false;
optionsRef.value = await getOptions();
}
watch(
() => {
const values = [];
for (const item of props.watches) {
values.push(props.form[item]);
}
return {
form: props.form,
watched: values
};
},
async () => {
optionsRef.value = await getOptions();
}
);
</script>
<template>
<a-select
class="remote-select"
show-search
:filter-option="filterOption"
:options="optionsRef"
:value="value"
@click="onClick"
@update:value="emit('update:value', $event)"
/>
</template>
<style lang="less"></style>

View File

@@ -1,6 +1,10 @@
import PiSynologyIdDeviceGetter from "./synology/device-id-getter.vue";
import SynologyIdDeviceGetter from "./synology/device-id-getter.vue";
import RemoteSelect from "./common/remote-select.vue";
import CertDomainsGetter from "./common/cert-domains-getter.vue";
export default {
install(app: any) {
app.component("PiSynologyDeviceIdGetter", PiSynologyIdDeviceGetter);
app.component("SynologyDeviceIdGetter", SynologyIdDeviceGetter);
app.component("RemoteSelect", RemoteSelect);
app.component("CertDomainsGetter", CertDomainsGetter);
}
};

View File

@@ -0,0 +1,31 @@
import { request } from "/@/api/service";
export type ComponentPropsType = {
type: string;
typeName: string;
action: string;
form: any;
value?: any;
};
export type RequestHandleReq<T = any> = {
type: string;
typeName: string;
action: string;
data?: any;
input: T;
};
export async function doRequest(req: RequestHandleReq) {
const url = req.type === "access" ? "/pi/handle/access" : "/pi/handle/plugin";
const { typeName, action, data, input } = req;
const res = await request({
url,
method: "post",
data: {
typeName,
action,
data,
input
}
});
return res;
}

View File

@@ -11,15 +11,10 @@
<script lang="tsx" setup>
import { defineProps, ref, useAttrs } from "vue";
import { request } from "/@/api/service";
import { Modal } from "ant-design-vue";
import { ComponentPropsType, doRequest } from "/@/components/plugins/lib";
const props = defineProps<{
type: string;
typeName: string;
form: any;
value?: any;
}>();
const props = defineProps<ComponentPropsType>();
const emit = defineEmits<{
"update:value": any;
@@ -29,24 +24,15 @@ const attrs = useAttrs();
const otpCodeRef = ref("");
async function doRequest(action: string, data: any) {
const res = await request({
url: "/pi/handle",
method: "post",
data: {
type: props.type,
typeName: props.typeName,
action,
data: data,
input: props.form.access
}
});
return res;
}
async function loginWithOTPCode(otpCode: string) {
return await doRequest("LoginWithOPTCode", {
otpCode
return await doRequest({
type: props.type,
typeName: props.typeName,
action: "LoginWithOPTCode",
data: {
otpCode
},
input: props.form
});
}
@@ -56,6 +42,7 @@ async function getDeviceId() {
modal.confirm({
title: "请输入OTP验证码",
maskClosable: true,
content: () => {
return (
<a-form-item-rest>

View File

@@ -0,0 +1,38 @@
<script setup lang="ts">
import { ref } from "vue";
import TutorialSteps from "/@/components/tutorial/tutorial-steps.vue";
const openedRef = ref(false);
function open() {
openedRef.value = true;
}
function close() {
openedRef.value = false;
}
function prev() {
console.log("prev");
}
function next() {
console.log("next");
}
</script>
<template>
<div class="tutorial-button" @click="open">
<fs-icon icon="mingcute:question-line"></fs-icon>
<div class="ml-5">使用教程</div>
<a-modal v-model:open="openedRef" class="tutorial-modal" width="90%">
<template #title> 使用教程 </template>
<tutorial-steps v-if="openedRef" />
<template #footer></template>
</a-modal>
</div>
</template>
<style lang="less">
.tutorial-modal {
top: 50px;
.ant-modal-body {
height: 80vh;
}
}
</style>

View File

@@ -0,0 +1,330 @@
<template>
<div class="flex-col h-100 tutorial-steps">
<a-steps v-model:current="current" class="mt-10" :percent="percent" size="small" :items="steps" @change="stepChanged"></a-steps>
<div class="step-item overflow-hidden">
<div class="text">
<h3 class="title">{{ number }} {{ currentStepItem.title }}</h3>
<div class="description mt-5">
<div v-for="desc of currentStepItem.descriptions">{{ desc }}</div>
</div>
</div>
<div class="image-box">
<a-image :src="currentStepItem.image" :preview-mask="previewMask" />
</div>
</div>
<div class="flex-center actions">
<fs-button class="m-10" icon="mingcute:arrow-left-fill" @click="prev()">上一步</fs-button>
<fs-button class="m-10" icon-right="mingcute:arrow-right-fill" @click="next()">下一步</fs-button>
</div>
</div>
</template>
<script setup lang="tsx">
type Step = {
title: string;
subTitle?: string;
description?: string;
items: StepItems[];
};
type StepItems = {
image: string;
title: string;
descriptions?: string[];
};
import { computed, nextTick, ref } from "vue";
const steps = ref<Step[]>([
{
title: "创建证书申请流水线",
description: "演示证书申请任务如何配置",
items: [
{
image: "/doc/images/1-add.png",
title: "创建证书流水线",
descriptions: ["点击添加流水线,选择证书申请"]
},
{
image: "/doc/images/2-access-provider.png",
title: "DNS授权",
descriptions: ["证书申请需要给域名添加TXT解析记录来验证域名所有权"]
},
{
image: "/doc/images/3-add-access.png",
title: "第一次使用需要添加DNS授权",
descriptions: ["选择DNS授权确认创建"]
},
// {
// image: "/doc/images/3-add-access.png",
// title: "确定创建流水线",
// descriptions: ["选择DNS授权信息填写无误确认创建"]
// },
{
image: "/doc/images/4-add-success.png",
title: "流水线创建成功",
descriptions: ["此时证书申请任务已经建好,点击手动触发即可测试证书申请", "接下来演示如何添加部署任务"]
}
]
},
{
title: "添加部署证书任务",
description: "演示部署到阿里云CDN和Nginx",
items: [
{
image: "/doc/images/6-1-add-task.png",
title: "添加部署任务",
descriptions: ["演示第一个部署任务部署到阿里云CDN"]
},
{
image: "/doc/images/6-2-add-task.png",
title: "选择任务插件",
descriptions: ["可以搜索插件这里选择阿里云CDN插件"]
},
{
image: "/doc/images/6-3-add-task.png",
title: "配置任务参数",
descriptions: ["填写CDN的域名和证书ID", "任务保存之后阿里云CDN的部署任务就配置好了"]
},
{
image: "/doc/images/7-1-add-host-task.png",
title: "添加主机部署任务",
descriptions: ["接下来演示配置第二个部署任务,部署到主机", "部署到主机分两步: 1. 上传证书到主机 2. 运行主机命令"]
},
{
image: "/doc/images/7-2-add-host-task.png",
title: "配置上传到主机任务",
descriptions: ["填写上传到主机任务参数", "比如证书保存路径"]
},
{
image: "/doc/images/7-3-add-host-task.png",
title: "添加主机ssh登录授权",
descriptions: ["填写主机ip、用户名、密码授权只需添加一次后续其他任务可以复用"]
},
{
image: "/doc/images/8-1-add-host-task.png",
title: "上传到主机任务配置完成",
descriptions: ["接下来配置主机执行脚本,去部署证书"]
},
{
image: "/doc/images/8-2-add-host-task.png",
title: "选择添加主机远程命令任务",
descriptions: ["选择主机远程命令任务"]
},
{
image: "/doc/images/8-4-add-host-task.png",
title: "填写证书部署脚本",
descriptions: ["选择主机授权编写部署脚本这里演示部署到nginx需要重启nginx让证书生效"]
},
{
image: "/doc/images/8-5-add-host-task.png",
title: "上传到主机任务的两个步骤配置完成",
descriptions: ["接下来测试运行"]
}
]
},
{
title: "运行与测试",
description: "演示流水线运行,查看日志,成功后跳过等",
items: [
{
image: "/doc/images/9-start.png",
title: "运行测试一下",
descriptions: ["之前是把证书上传到主机,接下来要运行命令,去部署证书"]
},
{
image: "/doc/images/10-1-log.png",
title: "查看日志",
descriptions: ["点击任务可以查看状态和日志"]
},
{
image: "/doc/images/11-1-error.png",
title: "执行失败如何排查",
descriptions: ["查看错误日志"]
},
{
image: "/doc/images/11-2-error.png",
title: "执行失败如何排查",
descriptions: ["查看错误日志,这里报的是nginx容器不存在修改命令改成正确的nginx容器名称"]
},
{
image: "/doc/images/12-1-log-success.png",
title: "执行成功",
descriptions: ["修改正确后,重新点击手动触发,重新运行一次,执行成功"]
},
{
image: "/doc/images/12-2-skip-log.png",
title: "成功后自动跳过",
descriptions: ["可以看到成功过的将会自动跳过,不会重复执行,只有当参数变更或者证书更新了,才会重新运行"]
},
{
image: "/doc/images/13-1-result.png",
title: "查看证书部署成功",
descriptions: ["访问nginx上的网站可以看到证书已经部署成功"]
},
{
image: "/doc/images/13-2-result.png",
title: "阿里云CDN也部署成功",
descriptions: ["阿里云CDN上已经更新证书证书名称已certd开头"]
},
{
image: "/doc/images/13-3-download.png",
title: "还可以下载证书,手动部署",
descriptions: ["如果还没有好用的部署插件,没办法自动部署,你还可以下载证书,手动部署"]
}
]
},
{
title: "设置定时执行和邮件通知",
description: "自动运行",
items: [
{
image: "/doc/images/14-timer.png",
title: "设置定时执行",
descriptions: [
"流水线测试成功,接下来配置定时触发,以后每天定时执行就不用管了",
"推荐配置每天运行一次在到期前20天才会重新申请新证书并部署没到期前会自动跳过不会重复申请。"
]
},
{
image: "/doc/images/15-1-email.png",
title: "设置邮件通知",
descriptions: ["建议选择监听'错误时'和'错误转成功'两种即可,在意外失败时可以尽快去排查问题,(免费版需要配置邮件服务器)"]
}
]
}
]);
const current = ref(0);
const currentItem = ref(0);
const number = computed(() => {
return `${current.value + 1}-${currentItem.value + 1}. `;
});
const currentStep = computed(() => {
return steps.value[current.value];
});
const currentStepItem = computed(() => {
return currentStep.value.items[currentItem.value];
});
const percent = computed(() => {
return ((currentItem.value + 1) / currentStep.value.items.length) * 100;
});
function stepNext() {
if (current.value < steps.value.length - 1) {
current.value++;
return true;
}
return false;
}
function stepPrev() {
if (current.value > 0) {
current.value--;
return true;
} else {
return false;
}
}
function next() {
if (currentItem.value < currentStep.value.items.length - 1) {
currentItem.value++;
} else {
if (stepNext()) {
currentItem.value = 0;
}
}
}
function prev() {
if (currentItem.value > 0) {
currentItem.value--;
} else {
if (stepPrev()) {
nextTick(() => {
currentItem.value = currentStep.value.items.length - 1;
});
}
}
}
function stepChanged(index: number) {
current.value = index;
currentItem.value = 0;
}
function previewMask() {
return (
<div title="点击放大" class="h-100 w-100">
{" "}
</div>
);
}
</script>
<style lang="less">
.tutorial-steps {
.step-item {
display: flex !important;
flex-direction: row;
align-items: center;
justify-content: center;
flex: 1;
padding: 20px;
.text {
width: 350px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 20px;
}
.image-box {
overflow: hidden;
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background: #eee;
width: 100%;
height: 100%;
.ant-image-mask {
background: rgba(255, 255, 255, 0);
}
.ant-image {
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
img {
width: 100%;
height: 100%;
object-fit: contain;
}
}
}
.desc {
margin-top: 10px;
font-size: 16px;
font-weight: bold;
}
}
.actions {
.fs-icon {
margin-left: 5px;
margin-right: 5px;
}
}
.ant-steps .ant-steps-item-description {
font-size: 12px !important;
color: #999 !important;
}
}
</style>

View File

@@ -135,6 +135,7 @@ function openUpgrade() {
async onOk() {
return await doActive();
},
maskClosable: true,
okText: "激活",
width: 500,
content: () => {

View File

@@ -18,6 +18,7 @@
<MenuFoldOutlined v-else />
</div>
<fs-menu class="header-menu" mode="horizontal" :expand-selected="false" :selectable="false" :menus="frameworkMenus" />
<tutorial-button class="flex-center header-btn" />
<vip-button class="flex-center header-btn" mode="nav" />
</div>
<div class="header-right header-buttons">
@@ -84,10 +85,23 @@ import FsThemeSet from "/@/layout/components/theme/index.vue";
import { env } from "../utils/util.env";
import FsThemeModeSet from "./components/theme/mode-set.vue";
import VipButton from "/@/components/vip-button/index.vue";
import TutorialButton from "/@/components/tutorial/index.vue";
export default {
name: "LayoutFramework",
// eslint-disable-next-line vue/no-unused-components
components: { FsThemeSet, MenuFoldOutlined, MenuUnfoldOutlined, FsMenu, FsLocale, FsSourceLink, FsUserInfo, FsTabs, FsThemeModeSet, VipButton },
components: {
TutorialButton,
FsThemeSet,
MenuFoldOutlined,
MenuUnfoldOutlined,
FsMenu,
FsLocale,
FsSourceLink,
FsUserInfo,
FsTabs,
FsThemeModeSet,
VipButton
},
setup() {
const resourceStore = useResourceStore();
const frameworkMenus = computed(() => {

View File

@@ -68,6 +68,9 @@ function install(app: App, options: any = {}) {
},
conditionalRender: {
match(scope) {
if (scope.key === "__blank__") {
return false;
}
//不能用 !scope.value 否则switch组件设置为关之后就消失了
const { value, key, props } = scope;
return !value && key != "_index" && value != false;
@@ -147,17 +150,18 @@ function install(app: App, options: any = {}) {
}
},
columns: {
// createdAt: {
// title: "创建时间",
// type: "datetime",
// form: {
// show: false
// },
// column: {
// show: false,
// order: 1000
// }
// }
__blank__: {
title: "",
type: "text",
form: {
show: false
},
column: {
show: true,
order: 999999,
width: -1
}
}
}
};

View File

@@ -130,7 +130,7 @@ export const useUserStore = defineStore({
*/
confirmLoginOut() {
const { t } = useI18n();
Modal.config({
Modal.confirm({
iconType: "warning",
title: t("app.login.logoutTip"),
content: t("app.login.logoutMessage"),

View File

@@ -20,6 +20,7 @@ div#app {
h1, h2, h3, h4, h5, h6 {
margin-bottom: 0;
margin-top:0;
}
.fs-desc {
@@ -197,4 +198,4 @@ h1, h2, h3, h4, h5, h6 {
}
.cursor-pointer{
cursor: pointer;
}
}

View File

@@ -1,23 +1,19 @@
import _ from "lodash-es";
import { compute } from "@fast-crud/fast-crud";
import { asyncCompute, compute } from "@fast-crud/fast-crud";
import { computed } from "vue";
export type MergeScriptContext = {
compute: typeof compute;
asyncCompute: typeof asyncCompute;
computed: typeof computed;
};
export function useReference(formItem: any) {
if (formItem.reference) {
for (const reference of formItem.reference) {
_.set(
formItem,
reference.dest,
compute<any>((scope) => {
return _.get(scope, reference.src);
})
);
}
delete formItem.reference;
}
if (formItem.mergeScript) {
const ctx = {
compute
compute,
asyncCompute,
computed
};
const script = formItem.mergeScript;
const func = new Function("ctx", script);

View File

@@ -64,7 +64,7 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat
}
},
rowHandle: {
width: "130px"
width: 200
},
table: {
scroll: {
@@ -102,7 +102,8 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat
},
type: ["text"],
form: {
rules: [{ required: true, message: "请填写名称" }]
rules: [{ required: true, message: "请填写名称" }],
helper: "随便填,当多个相同类型的授权时,便于区分"
},
column: {
width: 200

View File

@@ -42,6 +42,9 @@ export default function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOpti
span: 6
}
},
rowHandle: {
width: 200
},
columns: {
id: {
title: "ID",

View File

@@ -5,7 +5,7 @@ import { useRouter } from "vue-router";
import { AddReq, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, UserPageQuery, UserPageRes, useUi } from "@fast-crud/fast-crud";
import { statusUtil } from "/@/views/certd/pipeline/pipeline/utils/util.status";
import { nanoid } from "nanoid";
import { message, Modal } from "ant-design-vue";
import { message, Modal, notification } from "ant-design-vue";
import { env } from "/@/utils/util.env";
import { useUserStore } from "/@/store/modules/user";
import dayjs from "dayjs";
@@ -181,10 +181,29 @@ export default function ({ crudExpose, context: { certdFormRef } }: CreateCrudOp
}
}
},
table: {
scroll: { x: 1500 }
},
rowHandle: {
minWidth: 200,
width: 300,
fixed: "right",
buttons: {
play: {
order: -999,
title: null,
type: "link",
icon: "ant-design:play-circle-outlined",
click({ row }) {
Modal.confirm({
title: "确认",
content: `确定要触发运行吗?`,
async onOk() {
await api.Trigger(row.id);
notification.success({ message: "管道已经开始运行" });
}
});
}
},
view: {
click({ row }) {
router.push({ path: "/certd/pipeline/detail", query: { id: row.id, editMode: "false" } });
@@ -227,6 +246,7 @@ export default function ({ crudExpose, context: { certdFormRef } }: CreateCrudOp
const files = await api.GetFiles(row.id);
Modal.success({
title: "文件下载",
maskClosable: true,
okText: "↑↑↑ 点击上面链接下载",
content: () => {
const children = [];
@@ -260,7 +280,7 @@ export default function ({ crudExpose, context: { certdFormRef } }: CreateCrudOp
show: true
},
column: {
width: 50
width: 100
},
form: {
show: false
@@ -280,7 +300,8 @@ export default function ({ crudExpose, context: { certdFormRef } }: CreateCrudOp
column: {
show: computed(() => {
return userStore.isAdmin && settingStore.sysPublic.managerOtherUserPipeline;
})
}),
width: 100
}
},
title: {
@@ -293,7 +314,7 @@ export default function ({ crudExpose, context: { certdFormRef } }: CreateCrudOp
}
},
column: {
width: 300,
width: 350,
sorter: true,
component: {
on: {
@@ -306,9 +327,11 @@ export default function ({ crudExpose, context: { certdFormRef } }: CreateCrudOp
}
},
content: {
title: "定时任务数",
title: "定时任务数",
type: "number",
column: {
align: "center",
width: 100,
cellRender({ value }) {
if (value && value.triggers) {
return value.triggers?.length > 0 ? value.triggers.length : "-";
@@ -346,7 +369,7 @@ export default function ({ crudExpose, context: { certdFormRef } }: CreateCrudOp
const percent = (leftDays / 90) * 100;
return <a-progress percent={percent} strokeColor={color} format={(percent: number) => `${leftDays}`} />;
},
width: 110
width: 150
}
},
lastHistoryTime: {
@@ -357,7 +380,7 @@ export default function ({ crudExpose, context: { certdFormRef } }: CreateCrudOp
},
column: {
sorter: true,
width: 120,
width: 150,
align: "center"
}
},
@@ -415,6 +438,7 @@ export default function ({ crudExpose, context: { certdFormRef } }: CreateCrudOp
helper: "历史记录保持条数,多余的会被删除"
},
column: {
width: 130,
show: false
}
},
@@ -438,7 +462,7 @@ export default function ({ crudExpose, context: { certdFormRef } }: CreateCrudOp
},
column: {
sorter: true,
width: 125,
width: 155,
align: "center"
}
},
@@ -449,6 +473,7 @@ export default function ({ crudExpose, context: { certdFormRef } }: CreateCrudOp
show: false
},
column: {
width: 125,
show: false
}
}

View File

@@ -59,7 +59,7 @@
vModel: 'modelValue'
},
helper:
'点击上面的按钮选择每天几点几分定时执行后面的分秒都要选择0。\n 例如0 0 4 * * *每天凌晨4点0分0秒触发\n建议设置为每天触发一次证书未到期之前任务会跳过不会重复执行',
'点击上面的按钮选择每天几点几分定时执行后面的分秒都要选择0。\n例如0 0 4 * * *每天凌晨4点0分0秒触发\n建议设置为每天触发一次证书未到期之前任务会跳过不会重复执行',
rules: [{ required: true, message: '此项必填' }]
}"
/>

Some files were not shown because too many files have changed in this diff Show More