mirror of
https://github.com/certd/certd.git
synced 2026-04-14 20:40:53 +08:00
Compare commits
183 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0725c663c4 | ||
|
|
ce82239c8b | ||
|
|
2523008cb6 | ||
|
|
69212b9ad1 | ||
|
|
636cb3399b | ||
|
|
86ca35ce33 | ||
|
|
675ab31305 | ||
|
|
83c2d743bc | ||
|
|
2c87b3d906 | ||
|
|
05b6159802 | ||
|
|
c56f48c1e3 | ||
|
|
e18e399ce6 | ||
|
|
d66ade4e47 | ||
|
|
90b045af6d | ||
|
|
5cccb21175 | ||
|
|
1a71969403 | ||
|
|
389a1fbd04 | ||
|
|
ca02ae6183 | ||
|
|
92446cb048 | ||
|
|
954ce4533f | ||
|
|
f7b88f9e3b | ||
|
|
736fe038eb | ||
|
|
abcd257db0 | ||
|
|
c38b5f3cdc | ||
|
|
b649617e04 | ||
|
|
a4e2287101 | ||
|
|
fbb66f3c43 | ||
|
|
fedf90ea78 | ||
|
|
d558d50102 | ||
|
|
656cb89fe8 | ||
|
|
1e6ddd250e | ||
|
|
1de8eee6ea | ||
|
|
425bba67c5 | ||
|
|
8b0daf7200 | ||
|
|
589a373142 | ||
|
|
0cfc71e4bf | ||
|
|
92dabe6276 | ||
|
|
d1b61b6bf9 | ||
|
|
873f2b618b | ||
|
|
4453070060 | ||
|
|
de40be430b | ||
|
|
29a6a992f0 | ||
|
|
0a7d2d6264 | ||
|
|
e09f92f9ee | ||
|
|
9be1ecc8aa | ||
|
|
729b19c8da | ||
|
|
a9fffa5180 | ||
|
|
0069c0e399 | ||
|
|
b6fd38e293 | ||
|
|
36aa7f82b0 | ||
|
|
d01004d530 | ||
|
|
d85a02feeb | ||
|
|
b82e1dcd62 | ||
|
|
74c6a2266f | ||
|
|
9754223f31 | ||
|
|
cfbbac9796 | ||
|
|
fece8955cf | ||
|
|
170b2afb0e | ||
|
|
ee8af18d0a | ||
|
|
27386ea04d | ||
|
|
0d71a8ee50 | ||
|
|
82a72e0b49 | ||
|
|
5035c123f0 | ||
|
|
474b3372d8 | ||
|
|
be87124ada | ||
|
|
aa3032db35 | ||
|
|
a4ead79888 | ||
|
|
98445afd3e | ||
|
|
3eb9671640 | ||
|
|
95fb4e3e8b | ||
|
|
818015d24a | ||
|
|
e11bd3e813 | ||
|
|
2a4d64af95 | ||
|
|
d73cb4be2b | ||
|
|
82752040f8 | ||
|
|
1bde6d8b9c | ||
|
|
be55d36f67 | ||
|
|
f07724372d | ||
|
|
5b8d5dd975 | ||
|
|
e36aa065e9 | ||
|
|
45486ef399 | ||
|
|
4fedf6f452 | ||
|
|
702b80ef75 | ||
|
|
a5c7789dbc | ||
|
|
bddef199ff | ||
|
|
fa6fc07009 | ||
|
|
8d9b44528b | ||
|
|
1d108d775c | ||
|
|
7af111ac57 | ||
|
|
6451f00639 | ||
|
|
31718d1a4a | ||
|
|
832b74b66b | ||
|
|
082802e119 | ||
|
|
efa9c748c5 | ||
|
|
fc8bef5aae | ||
|
|
441b15ed2f | ||
|
|
11d1f6e141 | ||
|
|
0f5b9564c6 | ||
|
|
0c8a84656a | ||
|
|
330f91e15b | ||
|
|
490141a920 | ||
|
|
1e288b14d0 | ||
|
|
81df96bf45 | ||
|
|
d1ab5f74a6 | ||
|
|
e43dd03132 | ||
|
|
2c6d64976f | ||
|
|
065713cdb6 | ||
|
|
746d3c97c3 | ||
|
|
9557fc799e | ||
|
|
8fcabc5e9f | ||
|
|
2b4b15f558 | ||
|
|
057b0b4565 | ||
|
|
70a2402521 | ||
|
|
de34db3394 | ||
|
|
0c2ae792ec | ||
|
|
a4c0b92777 | ||
|
|
b9d78135e0 | ||
|
|
5641c19502 | ||
|
|
0110dfdb70 | ||
|
|
140606744b | ||
|
|
335d175d57 | ||
|
|
779db9da70 | ||
|
|
5d29a08ab7 | ||
|
|
1fe3365e10 | ||
|
|
f0584c88e8 | ||
|
|
c7620dfc48 | ||
|
|
5d6a945763 | ||
|
|
4fe5939d0b | ||
|
|
bcaf54d4cb | ||
|
|
44d43f45cb | ||
|
|
de26ee9383 | ||
|
|
d442462952 | ||
|
|
558fc9f306 | ||
|
|
9f0ee219d0 | ||
|
|
5164116bde | ||
|
|
02404bc97e | ||
|
|
0ebdb037b5 | ||
|
|
a8b60c32b3 | ||
|
|
416621d503 | ||
|
|
b917eb447c | ||
|
|
2ce3c71b88 | ||
|
|
ca13bfa5f8 | ||
|
|
d8812196f3 | ||
|
|
4e750bdbe1 | ||
|
|
f59a37b77c | ||
|
|
ea3db93db9 | ||
|
|
26f2c9fea2 | ||
|
|
290cc0d1bb | ||
|
|
78044c062e | ||
|
|
3a2f653229 | ||
|
|
bbe22e6f36 | ||
|
|
2eebb3388a | ||
|
|
fe4367c580 | ||
|
|
e70732c9ac | ||
|
|
42ad04cabd | ||
|
|
7f5e89d489 | ||
|
|
c504f33b1f | ||
|
|
ed6a18dae7 | ||
|
|
844c4bf983 | ||
|
|
43961c1c18 | ||
|
|
7b42d7252e | ||
|
|
4aa136189a | ||
|
|
c66802af2d | ||
|
|
49e65c611f | ||
|
|
abf29bc164 | ||
|
|
08854e0ab9 | ||
|
|
575416a16d | ||
|
|
3dd0783510 | ||
|
|
fadb1d35b3 | ||
|
|
27a9fc32a6 | ||
|
|
7008a408ca | ||
|
|
b928bb46c7 | ||
|
|
18c9c4a166 | ||
|
|
49fa01f209 | ||
|
|
fe9d443100 | ||
|
|
3dec43d8d4 | ||
|
|
5ab2943c3a | ||
|
|
6e8b0eeca9 | ||
|
|
d0c4dfca97 | ||
|
|
f4a11ed328 | ||
|
|
b2971cf5fb | ||
|
|
f97827ec76 | ||
|
|
f230a2a94d |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -21,7 +21,7 @@ gen
|
|||||||
/packages/ui/*/.idea
|
/packages/ui/*/.idea
|
||||||
/packages/ui/*/node_modules
|
/packages/ui/*/node_modules
|
||||||
/packages/*/node_modules
|
/packages/*/node_modules
|
||||||
/pnpm-lock.yaml
|
#/pnpm-lock.yaml
|
||||||
|
|
||||||
|
|
||||||
tsconfig.tsbuildinfo
|
tsconfig.tsbuildinfo
|
||||||
|
|||||||
111
CHANGELOG.md
111
CHANGELOG.md
@@ -3,6 +3,117 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 增加服务器时间警告 ([d66ade4](https://github.com/certd/certd/commit/d66ade4e4783850b6c7625c6f164a5a0fc0aa509))
|
||||||
|
* 支持部署到lucky ([e18e399](https://github.com/certd/certd/commit/e18e399ce6529e8c7e36b56c5f674cfdbbd3d3d1))
|
||||||
|
|
||||||
|
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复dns.la无法申请证书的bug ([90b045a](https://github.com/certd/certd/commit/90b045af6d1a4f46986e4b118885c1f050df067c))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 上传到主机支持scp方式 ([05b6159](https://github.com/certd/certd/commit/05b6159802b9e85b6a410361b60b5c28875b48e7))
|
||||||
|
* 优化图标 ([c56f48c](https://github.com/certd/certd/commit/c56f48c1e3c54c4e203fafb380d9091d75681b7e))
|
||||||
|
|
||||||
|
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复通知选择器无法选择的bug ([f7b88f9](https://github.com/certd/certd/commit/f7b88f9e3b7d9d9122e4fd2003a20c555bd50c7d))
|
||||||
|
* 修复证书流水线创建失败的bug ([736fe03](https://github.com/certd/certd/commit/736fe038ebda56648bcc4c12884a700341d2c049))
|
||||||
|
|
||||||
|
## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复站点监控通知通过webhook发送失败的bug ([9be1ecc](https://github.com/certd/certd/commit/9be1ecc8aab3ea23dd0dc2dab3688f4edb90ef2c))
|
||||||
|
* 修复dns.la域名申请失败的bug ([1de8eee](https://github.com/certd/certd/commit/1de8eee6ea8307f3c11626af75303d3cc104bb95))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 宝塔支持doker站点证书部署 ([589a373](https://github.com/certd/certd/commit/589a373142ef7f50d64d3aa767a90b1f4b64da93))
|
||||||
|
* 保存调整后的列宽 ([873f2b6](https://github.com/certd/certd/commit/873f2b618b9d7320045baf69d6da83afe48a780f))
|
||||||
|
* 创建证书流水线时,支持更多参数展开 ([36aa7f8](https://github.com/certd/certd/commit/36aa7f82b078a053a102331b3c6f132fb9d492f9))
|
||||||
|
* 流水线页面可以鼠标按住左右拖动 ([d85a02f](https://github.com/certd/certd/commit/d85a02feeb3183c5abd6c1ea790d5923a32d7271))
|
||||||
|
* 流水线增加上传证书快捷方式 ([425bba6](https://github.com/certd/certd/commit/425bba67c539b734e2a85a83a4f9ecc9b2434fb4))
|
||||||
|
* 手动上传证书部署流水线 ([fbb66f3](https://github.com/certd/certd/commit/fbb66f3c4389489aa8a43b194d82bc8cf391607b))
|
||||||
|
* 优化选择任务时手机版展示效果 ([d01004d](https://github.com/certd/certd/commit/d01004d53071a75ac91ee21cc96bde9369f77ff3))
|
||||||
|
* 站点监控,手动测试也发通知 ([729b19c](https://github.com/certd/certd/commit/729b19c8da60d5efb5baef7cf8df0518e7f6b471))
|
||||||
|
* 站点证书监控支持模糊查询 ([0069c0e](https://github.com/certd/certd/commit/0069c0e3992946a8dd6410f299d4fc974ef0e76b))
|
||||||
|
* 支持飞书通知 ([b82e1dc](https://github.com/certd/certd/commit/b82e1dcd6217b09a7d7e21cd648bb31de320cadf))
|
||||||
|
* 支持手动上传证书并部署 ([a9fffa5](https://github.com/certd/certd/commit/a9fffa5180c83da27b35886aa2e858a92a2c5f94))
|
||||||
|
|
||||||
|
## [1.31.3](https://github.com/certd/certd/compare/v1.31.2...v1.31.3) (2025-03-13)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复阿里云fc获取不到列表的bug ([474b337](https://github.com/certd/certd/commit/474b3372d8ce98e6d45900bf8046bc0b3f220686))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 1panel支持 apikey方式授权 ([170b2af](https://github.com/certd/certd/commit/170b2afb0e3b125e4ed057f633fe895b5ac3ac22))
|
||||||
|
* 套餐支持3天7天等选项 ([0d71a8e](https://github.com/certd/certd/commit/0d71a8ee501a0e5bb69decf07e8729026e9d85bf))
|
||||||
|
* 证书仓库增加有效期显示 ([be87124](https://github.com/certd/certd/commit/be87124ada7a093f281ca29a45c86b4ea4644ead))
|
||||||
|
* 支持部署到天翼云CDN ([82a72e0](https://github.com/certd/certd/commit/82a72e0b497efa043d342ad0e33c083a2de79a05))
|
||||||
|
* 支持dns.la ([ee8af18](https://github.com/certd/certd/commit/ee8af18d0ac0af82544d6dda1e4b4c678b733041))
|
||||||
|
* cf授权支持配置http代理 ([27386ea](https://github.com/certd/certd/commit/27386ea04d3c1a5aebe3cfdd7ac48185eaa76629))
|
||||||
|
|
||||||
|
## [1.31.2](https://github.com/certd/certd/compare/v1.31.1...v1.31.2) (2025-03-12)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复cname记录查找bug ([95fb4e3](https://github.com/certd/certd/commit/95fb4e3e8be6ca13cc43b451f6141d62190ba453))
|
||||||
|
|
||||||
|
## [1.31.1](https://github.com/certd/certd/compare/v1.31.0...v1.31.1) (2025-03-11)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 一些手机端适配优化 ([5b8d5dd](https://github.com/certd/certd/commit/5b8d5dd97536456a9d5d1384216eac1093b2dc3d))
|
||||||
|
|
||||||
|
# [1.31.0](https://github.com/certd/certd/compare/v1.30.6...v1.31.0) (2025-03-10)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复CDN插件我爱云因更换接口导致部署失败的问题 ([5641c19](https://github.com/certd/certd/commit/5641c19502970f67af19709bddf8c781b1a25bdc))
|
||||||
|
* 修复CDN插件我爱云因更换接口导致部署失败的问题 ([0110dfd](https://github.com/certd/certd/commit/0110dfdb70b12dfb0a7a067717f3773ed75aae7c))
|
||||||
|
* 修复webhook headers value中带等号是解析错误的bug ([1fe3365](https://github.com/certd/certd/commit/1fe3365e10c464c4c60c82f424cf74fe35b883e0))
|
||||||
|
* ProxmoxUploadCert 增加强制部署证书 ([441b15e](https://github.com/certd/certd/commit/441b15ed2fe5a143a5bd5508613b3816ddbff596))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 历史记录查看详情,可以切换到对应的历史记录日志上去 ([082802e](https://github.com/certd/certd/commit/082802e1197156837800f814728ee0f6b300b18c))
|
||||||
|
* 流水线同一个阶段任务优化为并行执行 ([efa9c74](https://github.com/certd/certd/commit/efa9c748c5c07fc950af3db742ef9310f1ac9a4b))
|
||||||
|
* 升级midwayjs版本 ([057b0b4](https://github.com/certd/certd/commit/057b0b4565e19bb93195633f767b2942e8e40e59))
|
||||||
|
* 是否允许爬虫爬取增加ui设置选项 ([779db9d](https://github.com/certd/certd/commit/779db9da705d2dfef36fec21f52bd38af9fc5f2e))
|
||||||
|
* 通知支持钉钉群聊机器人 ([fc8bef5](https://github.com/certd/certd/commit/fc8bef5aae522d75d408d8c3aa74543269da5398))
|
||||||
|
* 易支付支持固定支付方式,适合没有收银台版本使用 ([81df96b](https://github.com/certd/certd/commit/81df96bf4542ce8d8ef4a428a4460dd554e4719a))
|
||||||
|
* 支持易盾RCDN部署 ([065713c](https://github.com/certd/certd/commit/065713cdb6953d16df08585c316c1a7a8eaec437))
|
||||||
|
|
||||||
|
## [1.30.6](https://github.com/certd/certd/compare/v1.30.5...v1.30.6) (2025-02-24)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 禁止爬虫爬取本网站 ([5164116](https://github.com/certd/certd/commit/5164116bde60dabac774cdf94f5317ff386e95ca))
|
||||||
|
* 上传到阿里云证书名称后缀增加毫秒时间戳 ([9f0ee21](https://github.com/certd/certd/commit/9f0ee219d02907ffe128a5cf10173397d934ccd7))
|
||||||
|
* 支持部署到阿里云FC3.0 ([bcaf54d](https://github.com/certd/certd/commit/bcaf54d4cb7bc469486aae6cdb127ae017eb3abb))
|
||||||
|
* 支持新版本LeCDN ([44d43f4](https://github.com/certd/certd/commit/44d43f45cb9094619df7494c2a64a51ba77ad116))
|
||||||
|
|
||||||
|
## [1.30.5](https://github.com/certd/certd/compare/v1.30.4...v1.30.5) (2025-02-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package root
|
||||||
|
|
||||||
|
## [1.30.4](https://github.com/certd/certd/compare/v1.30.3...v1.30.4) (2025-02-14)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 适配最新版1panel密码编码方式 ([78044c0](https://github.com/certd/certd/commit/78044c062e20cdd04f08baef9fb6745bf25eddcf))
|
||||||
|
|
||||||
## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)
|
## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ Certd 是一个免费全自动申请和自动部署更新SSL证书的管理系
|
|||||||
本项目不仅支持证书申请过程自动化,还可以自动化部署更新证书,让你的证书永不过期。
|
本项目不仅支持证书申请过程自动化,还可以自动化部署更新证书,让你的证书永不过期。
|
||||||
|
|
||||||
* 全自动申请证书(支持所有注册商注册的域名)
|
* 全自动申请证书(支持所有注册商注册的域名)
|
||||||
* 全自动部署更新证书(目前支持部署到主机、阿里云、腾讯云等,目前已支持40+部署插件)
|
* 全自动部署更新证书(目前支持部署到主机、阿里云、腾讯云等,目前已支持60+部署插件)
|
||||||
* 支持DNS-01、HTTP-01、CNAME代理等多种域名验证方式
|
* 支持DNS-01、HTTP-01、CNAME代理等多种域名验证方式
|
||||||
* 支持通配符域名/泛域名,支持多个域名打到一个证书上,支持pem、pfx、der、jks等多种证书格式
|
* 支持通配符域名/泛域名,支持多个域名打到一个证书上,支持pem、pfx、der、jks等多种证书格式
|
||||||
* 邮件通知、webhook通知
|
* 邮件通知、webhook通知
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
16:12
|
23:52
|
||||||
|
|||||||
@@ -7,9 +7,10 @@ services:
|
|||||||
restart: unless-stopped # 自动重启
|
restart: unless-stopped # 自动重启
|
||||||
volumes:
|
volumes:
|
||||||
# ↓↓↓↓↓ -------------------------------------------------------- 数据库以及证书存储路径,默认存在宿主机的/data/certd/目录下,【您需要定时备份此目录,以保障数据容灾】
|
# ↓↓↓↓↓ -------------------------------------------------------- 数据库以及证书存储路径,默认存在宿主机的/data/certd/目录下,【您需要定时备份此目录,以保障数据容灾】
|
||||||
|
# 只要修改冒号前面的,冒号后面的/app/data不要动
|
||||||
- /data/certd:/app/data
|
- /data/certd:/app/data
|
||||||
ports: # 端口映射
|
ports: # 端口映射
|
||||||
# ↓↓↓↓ ---------------------------------------------------------- 如果端口有冲突,可以修改第一个7001为其他不冲突的端口号
|
# ↓↓↓↓ ---------------------------------------------------------- 如果端口有冲突,可以修改第一个7001为其他不冲突的端口号,第二个7001不要动
|
||||||
- "7001:7001"
|
- "7001:7001"
|
||||||
# ↓↓↓↓ ---------------------------------------------------------- https端口,可以根据实际情况,是否暴露该端口
|
# ↓↓↓↓ ---------------------------------------------------------- https端口,可以根据实际情况,是否暴露该端口
|
||||||
- "7002:7002"
|
- "7002:7002"
|
||||||
@@ -26,6 +27,8 @@ services:
|
|||||||
# extra_hosts:
|
# extra_hosts:
|
||||||
# # ↓↓↓↓ -------------------------------------------------------- 这里可以配置自定义hosts,外网域名可以指向本地局域网ip地址
|
# # ↓↓↓↓ -------------------------------------------------------- 这里可以配置自定义hosts,外网域名可以指向本地局域网ip地址
|
||||||
# - "localdomain.com:192.168.1.3"
|
# - "localdomain.com:192.168.1.3"
|
||||||
|
# # ↓↓↓↓ ------------------------------------------------ 直接使用主机的网络,如果网络问题实在找不到原因,可以尝试打开此参数
|
||||||
|
# network_mode: host
|
||||||
labels:
|
labels:
|
||||||
com.centurylinklabs.watchtower.enable: "true"
|
com.centurylinklabs.watchtower.enable: "true"
|
||||||
# ↓↓↓↓ -------------------------------------------------------------- 启用ipv6网络,还需要把下面networks的注释放开
|
# ↓↓↓↓ -------------------------------------------------------------- 启用ipv6网络,还需要把下面networks的注释放开
|
||||||
|
|||||||
@@ -12,6 +12,9 @@ export default defineConfig({
|
|||||||
md.use(lightbox, {});
|
md.use(lightbox, {});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
sitemap: {
|
||||||
|
hostname: 'https://certd.docmirror.cn'
|
||||||
|
},
|
||||||
head: [
|
head: [
|
||||||
// [
|
// [
|
||||||
// 'meta',
|
// 'meta',
|
||||||
@@ -25,9 +28,9 @@ export default defineConfig({
|
|||||||
name: "keywords",
|
name: "keywords",
|
||||||
content: "证书自动申请、证书自动更新、证书自动续期、证书自动续签、证书管理工具、Certd、SSL证书自动部署、证书自动化,https证书,pfx证书,der证书,TLS证书,nginx证书自动续签自动部署,SSL平台,证书管理平台,证书流水线"
|
content: "证书自动申请、证书自动更新、证书自动续期、证书自动续签、证书管理工具、Certd、SSL证书自动部署、证书自动化,https证书,pfx证书,der证书,TLS证书,nginx证书自动续签自动部署,SSL平台,证书管理平台,证书流水线"
|
||||||
}],
|
}],
|
||||||
["meta", { name: "google-site-verification",content: "V5XLTSnXoT15uQotwpxJoQolUo2d5UbSL-TacsyOsC0"}],
|
// ["meta", { name: "google-site-verification",content: "V5XLTSnXoT15uQotwpxJoQolUo2d5UbSL-TacsyOsC0"}],
|
||||||
//<meta name="baidu-site-verification" content="codeva-MiWN8Y07Ua" />
|
//<meta name="baidu-site-verification" content="codeva-MiWN8Y07Ua" />
|
||||||
["meta", {name: "baidu-site-verification",content: "codeva-MiWN8Y07Ua"}],
|
// ["meta", {name: "baidu-site-verification",content: "codeva-MiWN8Y07Ua"}],
|
||||||
["link", { rel: "icon", href: "/static/logo/logo.svg" }]
|
["link", { rel: "icon", href: "/static/logo/logo.svg" }]
|
||||||
],
|
],
|
||||||
themeConfig: {
|
themeConfig: {
|
||||||
@@ -78,15 +81,16 @@ export default defineConfig({
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{ text: "演示教程", link: "/guide/tutorial.md" },
|
{ text: "演示教程", link: "/guide/tutorial.md" },
|
||||||
{ text: "版本升级", link: "/guide/install/upgrade.md" },
|
{ text: "版本升级", link: "/guide/install/upgrade.md" }
|
||||||
{ text: "切换数据库", link: "/guide/install/database.md" }
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: "特性",
|
text: "特性",
|
||||||
items: [
|
items: [
|
||||||
{ text: "CNAME代理校验", link: "/guide/feature/cname/index.md" },
|
{ text: "CNAME代理校验", link: "/guide/feature/cname/index.md" },
|
||||||
{ text: "插件列表", link: "/guide/plugins.md" }
|
{ text: "插件列表", link: "/guide/plugins.md" },
|
||||||
|
{ text: "多数据库支持", link: "/guide/install/database.md" },
|
||||||
|
{ text: "开放接口", link: "/guide/open/index.md" }
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3,6 +3,117 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复dns.la无法申请证书的bug ([90b045a](https://github.com/certd/certd/commit/90b045af6d1a4f46986e4b118885c1f050df067c))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 上传到主机支持scp方式 ([05b6159](https://github.com/certd/certd/commit/05b6159802b9e85b6a410361b60b5c28875b48e7))
|
||||||
|
* 优化图标 ([c56f48c](https://github.com/certd/certd/commit/c56f48c1e3c54c4e203fafb380d9091d75681b7e))
|
||||||
|
|
||||||
|
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复通知选择器无法选择的bug ([f7b88f9](https://github.com/certd/certd/commit/f7b88f9e3b7d9d9122e4fd2003a20c555bd50c7d))
|
||||||
|
* 修复证书流水线创建失败的bug ([736fe03](https://github.com/certd/certd/commit/736fe038ebda56648bcc4c12884a700341d2c049))
|
||||||
|
|
||||||
|
## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复站点监控通知通过webhook发送失败的bug ([9be1ecc](https://github.com/certd/certd/commit/9be1ecc8aab3ea23dd0dc2dab3688f4edb90ef2c))
|
||||||
|
* 修复dns.la域名申请失败的bug ([1de8eee](https://github.com/certd/certd/commit/1de8eee6ea8307f3c11626af75303d3cc104bb95))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 宝塔支持doker站点证书部署 ([589a373](https://github.com/certd/certd/commit/589a373142ef7f50d64d3aa767a90b1f4b64da93))
|
||||||
|
* 保存调整后的列宽 ([873f2b6](https://github.com/certd/certd/commit/873f2b618b9d7320045baf69d6da83afe48a780f))
|
||||||
|
* 创建证书流水线时,支持更多参数展开 ([36aa7f8](https://github.com/certd/certd/commit/36aa7f82b078a053a102331b3c6f132fb9d492f9))
|
||||||
|
* 流水线页面可以鼠标按住左右拖动 ([d85a02f](https://github.com/certd/certd/commit/d85a02feeb3183c5abd6c1ea790d5923a32d7271))
|
||||||
|
* 流水线增加上传证书快捷方式 ([425bba6](https://github.com/certd/certd/commit/425bba67c539b734e2a85a83a4f9ecc9b2434fb4))
|
||||||
|
* 手动上传证书部署流水线 ([fbb66f3](https://github.com/certd/certd/commit/fbb66f3c4389489aa8a43b194d82bc8cf391607b))
|
||||||
|
* 优化选择任务时手机版展示效果 ([d01004d](https://github.com/certd/certd/commit/d01004d53071a75ac91ee21cc96bde9369f77ff3))
|
||||||
|
* 站点监控,手动测试也发通知 ([729b19c](https://github.com/certd/certd/commit/729b19c8da60d5efb5baef7cf8df0518e7f6b471))
|
||||||
|
* 站点证书监控支持模糊查询 ([0069c0e](https://github.com/certd/certd/commit/0069c0e3992946a8dd6410f299d4fc974ef0e76b))
|
||||||
|
* 支持飞书通知 ([b82e1dc](https://github.com/certd/certd/commit/b82e1dcd6217b09a7d7e21cd648bb31de320cadf))
|
||||||
|
* 支持手动上传证书并部署 ([a9fffa5](https://github.com/certd/certd/commit/a9fffa5180c83da27b35886aa2e858a92a2c5f94))
|
||||||
|
|
||||||
|
## [1.31.3](https://github.com/certd/certd/compare/v1.31.2...v1.31.3) (2025-03-13)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复阿里云fc获取不到列表的bug ([474b337](https://github.com/certd/certd/commit/474b3372d8ce98e6d45900bf8046bc0b3f220686))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 1panel支持 apikey方式授权 ([170b2af](https://github.com/certd/certd/commit/170b2afb0e3b125e4ed057f633fe895b5ac3ac22))
|
||||||
|
* 套餐支持3天7天等选项 ([0d71a8e](https://github.com/certd/certd/commit/0d71a8ee501a0e5bb69decf07e8729026e9d85bf))
|
||||||
|
* 证书仓库增加有效期显示 ([be87124](https://github.com/certd/certd/commit/be87124ada7a093f281ca29a45c86b4ea4644ead))
|
||||||
|
* 支持部署到天翼云CDN ([82a72e0](https://github.com/certd/certd/commit/82a72e0b497efa043d342ad0e33c083a2de79a05))
|
||||||
|
* 支持dns.la ([ee8af18](https://github.com/certd/certd/commit/ee8af18d0ac0af82544d6dda1e4b4c678b733041))
|
||||||
|
* cf授权支持配置http代理 ([27386ea](https://github.com/certd/certd/commit/27386ea04d3c1a5aebe3cfdd7ac48185eaa76629))
|
||||||
|
|
||||||
|
## [1.31.2](https://github.com/certd/certd/compare/v1.31.1...v1.31.2) (2025-03-12)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复cname记录查找bug ([95fb4e3](https://github.com/certd/certd/commit/95fb4e3e8be6ca13cc43b451f6141d62190ba453))
|
||||||
|
|
||||||
|
## [1.31.1](https://github.com/certd/certd/compare/v1.31.0...v1.31.1) (2025-03-11)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 一些手机端适配优化 ([5b8d5dd](https://github.com/certd/certd/commit/5b8d5dd97536456a9d5d1384216eac1093b2dc3d))
|
||||||
|
|
||||||
|
# [1.31.0](https://github.com/certd/certd/compare/v1.30.6...v1.31.0) (2025-03-10)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复CDN插件我爱云因更换接口导致部署失败的问题 ([5641c19](https://github.com/certd/certd/commit/5641c19502970f67af19709bddf8c781b1a25bdc))
|
||||||
|
* 修复CDN插件我爱云因更换接口导致部署失败的问题 ([0110dfd](https://github.com/certd/certd/commit/0110dfdb70b12dfb0a7a067717f3773ed75aae7c))
|
||||||
|
* 修复webhook headers value中带等号是解析错误的bug ([1fe3365](https://github.com/certd/certd/commit/1fe3365e10c464c4c60c82f424cf74fe35b883e0))
|
||||||
|
* ProxmoxUploadCert 增加强制部署证书 ([441b15e](https://github.com/certd/certd/commit/441b15ed2fe5a143a5bd5508613b3816ddbff596))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 历史记录查看详情,可以切换到对应的历史记录日志上去 ([082802e](https://github.com/certd/certd/commit/082802e1197156837800f814728ee0f6b300b18c))
|
||||||
|
* 流水线同一个阶段任务优化为并行执行 ([efa9c74](https://github.com/certd/certd/commit/efa9c748c5c07fc950af3db742ef9310f1ac9a4b))
|
||||||
|
* 升级midwayjs版本 ([057b0b4](https://github.com/certd/certd/commit/057b0b4565e19bb93195633f767b2942e8e40e59))
|
||||||
|
* 是否允许爬虫爬取增加ui设置选项 ([779db9d](https://github.com/certd/certd/commit/779db9da705d2dfef36fec21f52bd38af9fc5f2e))
|
||||||
|
* 通知支持钉钉群聊机器人 ([fc8bef5](https://github.com/certd/certd/commit/fc8bef5aae522d75d408d8c3aa74543269da5398))
|
||||||
|
* 易支付支持固定支付方式,适合没有收银台版本使用 ([81df96b](https://github.com/certd/certd/commit/81df96bf4542ce8d8ef4a428a4460dd554e4719a))
|
||||||
|
* 支持易盾RCDN部署 ([065713c](https://github.com/certd/certd/commit/065713cdb6953d16df08585c316c1a7a8eaec437))
|
||||||
|
|
||||||
|
## [1.30.6](https://github.com/certd/certd/compare/v1.30.5...v1.30.6) (2025-02-24)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 禁止爬虫爬取本网站 ([5164116](https://github.com/certd/certd/commit/5164116bde60dabac774cdf94f5317ff386e95ca))
|
||||||
|
* 上传到阿里云证书名称后缀增加毫秒时间戳 ([9f0ee21](https://github.com/certd/certd/commit/9f0ee219d02907ffe128a5cf10173397d934ccd7))
|
||||||
|
* 支持部署到阿里云FC3.0 ([bcaf54d](https://github.com/certd/certd/commit/bcaf54d4cb7bc469486aae6cdb127ae017eb3abb))
|
||||||
|
* 支持新版本LeCDN ([44d43f4](https://github.com/certd/certd/commit/44d43f45cb9094619df7494c2a64a51ba77ad116))
|
||||||
|
|
||||||
|
## [1.30.5](https://github.com/certd/certd/compare/v1.30.4...v1.30.5) (2025-02-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package root
|
||||||
|
|
||||||
|
## [1.30.4](https://github.com/certd/certd/compare/v1.30.3...v1.30.4) (2025-02-14)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 适配最新版1panel密码编码方式 ([78044c0](https://github.com/certd/certd/commit/78044c062e20cdd04f08baef9fb6745bf25eddcf))
|
||||||
|
|
||||||
|
## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复腾讯云CLB多域名同证书部署报错的bug ([c3a5542](https://github.com/certd/certd/commit/c3a55429357e78f4b78c9592d3e5897db2d4d549))
|
||||||
|
* 修复新版本1panel密码需要加密,无法登录的问题 ([ada0b71](https://github.com/certd/certd/commit/ada0b7106e97e551783829e4e719f76793a7123d))
|
||||||
|
|
||||||
## [1.30.2](https://github.com/certd/certd/compare/v1.30.1...v1.30.2) (2025-02-09)
|
## [1.30.2](https://github.com/certd/certd/compare/v1.30.1...v1.30.2) (2025-02-09)
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ packages:
|
|||||||
### 安装依赖和初始化:
|
### 安装依赖和初始化:
|
||||||
```shell
|
```shell
|
||||||
# 安装pnpm,如果提示npm命令不存在,就需要先安装nodejs
|
# 安装pnpm,如果提示npm命令不存在,就需要先安装nodejs
|
||||||
npm install -g pnpm@8.15.7 --registry=https://registry.npmmirror.com
|
npm install -g pnpm--registry=https://registry.npmmirror.com
|
||||||
|
|
||||||
# 使用国内镜像源,如果有代理,就不需要
|
# 使用国内镜像源,如果有代理,就不需要
|
||||||
pnpm config set registry https://registry.npmmirror.com
|
pnpm config set registry https://registry.npmmirror.com
|
||||||
@@ -36,19 +36,19 @@ pnpm config set registry https://registry.npmmirror.com
|
|||||||
pnpm install
|
pnpm install
|
||||||
|
|
||||||
# 初始化构建
|
# 初始化构建
|
||||||
npm run init
|
pnpm init
|
||||||
```
|
```
|
||||||
|
|
||||||
### 启动 server:
|
### 启动 server:
|
||||||
```shell
|
```shell
|
||||||
cd packages/ui/certd-server
|
cd packages/ui/certd-server
|
||||||
npm run dev
|
pnpm dev
|
||||||
```
|
```
|
||||||
|
|
||||||
### 启动 client:
|
### 启动 client:
|
||||||
```shell
|
```shell
|
||||||
cd packages/ui/certd-client
|
cd packages/ui/certd-client
|
||||||
npm run dev
|
pnpm dev
|
||||||
|
|
||||||
# 会自动打开浏览器,确认正常运行
|
# 会自动打开浏览器,确认正常运行
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ Certd 是一款开源、免费、全自动申请和部署更新SSL证书的工
|
|||||||
本项目不仅支持证书申请过程自动化,还可以自动化部署更新证书,让你的证书永不过期。
|
本项目不仅支持证书申请过程自动化,还可以自动化部署更新证书,让你的证书永不过期。
|
||||||
|
|
||||||
* 全自动申请证书(支持所有注册商注册的域名)
|
* 全自动申请证书(支持所有注册商注册的域名)
|
||||||
* 全自动部署更新证书(目前支持部署到主机、部署到阿里云、腾讯云等,目前已支持30+部署插件)
|
* 全自动部署更新证书(目前支持部署到主机、部署到阿里云、腾讯云等,目前已支持60+部署插件)
|
||||||
* 支持通配符域名/泛域名,支持多个域名打到一个证书上
|
* 支持通配符域名/泛域名,支持多个域名打到一个证书上
|
||||||
* 邮件通知
|
* 邮件通知
|
||||||
* 私有化部署,保障数据安全
|
* 私有化部署,保障数据安全
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ https://1panel.cn/docs/installation/online_installation/
|
|||||||

|

|
||||||
|
|
||||||
> 默认使用sqlite数据库,数据保存在`/data/certd`目录下,您可以手动备份该目录
|
> 默认使用sqlite数据库,数据保存在`/data/certd`目录下,您可以手动备份该目录
|
||||||
> certd还支持`mysql`和`postgresql`数据库,[点我了解如何切换其他数据库](../../database/)
|
> certd还支持`mysql`和`postgresql`数据库,[点我了解如何切换其他数据库](../database)
|
||||||
|
|
||||||
3. 访问测试
|
3. 访问测试
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
点击确定,等待启动完成
|
点击确定,等待启动完成
|
||||||

|

|
||||||
|
|
||||||
> certd默认使用sqlite数据库,另外支持`mysql`和`postgresql`数据库,[点我了解如何切换其他数据库](../../database/)
|
> certd默认使用sqlite数据库,另外支持`mysql`和`postgresql`数据库,[点我了解如何切换其他数据库](../database)
|
||||||
|
|
||||||
|
|
||||||
## 二、访问应用
|
## 二、访问应用
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ docker compose up -d
|
|||||||
> 如果提示 没有docker compose命令,请安装docker-compose
|
> 如果提示 没有docker compose命令,请安装docker-compose
|
||||||
> https://docs.docker.com/compose/install/linux/
|
> https://docs.docker.com/compose/install/linux/
|
||||||
|
|
||||||
> certd默认使用sqlite数据库,另外还支持`mysql`和`postgresql`数据库,[点我了解如何切换其他数据库](../../database/)
|
> certd默认使用sqlite数据库,另外还支持`mysql`和`postgresql`数据库,[点我了解如何切换其他数据库](../database)
|
||||||
|
|
||||||
|
|
||||||
### 3. 访问测试
|
### 3. 访问测试
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# 源码部署
|
# 源码部署
|
||||||
不推荐
|
如果没有`git`和`nodejs`基础,则不推荐
|
||||||
## 一、源码安装
|
## 一、源码安装
|
||||||
|
|
||||||
### 环境要求
|
### 环境要求
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
### 源码启动
|
### 源码启动
|
||||||
```shell
|
```shell
|
||||||
# 克隆代码
|
# 克隆代码
|
||||||
git clone https://github.com/certd/certd
|
git clone https://github.com/certd/certd --depth=1
|
||||||
# git checkout v1.x.x # 当v2主干分支代码无法正常启动时,可以尝试此命令,1.x.x换成最新版本号
|
# git checkout v1.x.x # 当v2主干分支代码无法正常启动时,可以尝试此命令,1.x.x换成最新版本号
|
||||||
cd certd
|
cd certd
|
||||||
# 启动服务
|
# 启动服务
|
||||||
|
|||||||
BIN
docs/guide/open/images/1.png
Normal file
BIN
docs/guide/open/images/1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 54 KiB |
21
docs/guide/open/index.md
Normal file
21
docs/guide/open/index.md
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# 开放接口
|
||||||
|
被动方式对第三方提供证书, 支持根据域名或证书id获取证书。
|
||||||
|
|
||||||
|
## 获取keyId和KeySecret
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 接口文档
|
||||||
|
|
||||||
|
https://apifox.com/apidoc/shared-2e76f8c4-7c58-413b-a32d-a1316529af44/254949529e0
|
||||||
|
|
||||||
|
## Token生成方法
|
||||||
|
|
||||||
|
header中传入x-certd-token即可调用开放接口
|
||||||
|
1、首先从OpenKey页面生成keyId,keySecret;
|
||||||
|
2、准备一个content( json字符串): content={"keyId":keyId, t:时间戳秒数, encrypt:false, signType:"md5"} `// encrypt返回结果是否加密`
|
||||||
|
3、将content加上keySecret进行签名: sign = md5(content + keySecret)
|
||||||
|
4、然后将content和sign分别base64后用.号连接: x-certd-token = base64(content) +"."+base64(sign)
|
||||||
|
|
||||||
|
## SDK
|
||||||
|
待开发
|
||||||
@@ -6,6 +6,10 @@
|
|||||||
|
|
||||||
## 2. 使用示例
|
## 2. 使用示例
|
||||||
```js
|
```js
|
||||||
|
|
||||||
|
// 如果需要引用第三方库,必须使用import语法
|
||||||
|
// const thirdSdk = await import("third-sdk-name")
|
||||||
|
|
||||||
const certPem = ctx.self.cert.crt
|
const certPem = ctx.self.cert.crt
|
||||||
const certKey = ctx.self.cert.key
|
const certKey = ctx.self.cert.key
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 51 KiB |
@@ -24,7 +24,7 @@ features:
|
|||||||
- title: 全自动申请证书
|
- title: 全自动申请证书
|
||||||
details: 支持所有注册商注册的域名
|
details: 支持所有注册商注册的域名
|
||||||
- title: 全自动部署证书
|
- title: 全自动部署证书
|
||||||
details: 支持部署到主机、阿里云、腾讯云等,目前已支持30+部署插件
|
details: 支持部署到主机、阿里云、腾讯云等,目前已支持60+部署插件
|
||||||
- title: 多域名、泛域名打到一个证书上
|
- title: 多域名、泛域名打到一个证书上
|
||||||
details: 支持通配符域名/泛域名,支持多个域名打到一个证书上
|
details: 支持通配符域名/泛域名,支持多个域名打到一个证书上
|
||||||
- title: 多证书格式支持
|
- title: 多证书格式支持
|
||||||
|
|||||||
@@ -9,5 +9,5 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"npmClient": "pnpm",
|
"npmClient": "pnpm",
|
||||||
"version": "1.30.3"
|
"version": "1.31.7"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"@lerna-lite/run": "^3.9.3",
|
"@lerna-lite/run": "^3.9.3",
|
||||||
"@lerna-lite/version": "^3.9.3",
|
"@lerna-lite/version": "^3.9.3",
|
||||||
"medium-zoom": "^1.1.0",
|
"medium-zoom": "^1.1.0",
|
||||||
"vitepress": "^1.4.1",
|
"vitepress": "^2.0.0-alpha.4",
|
||||||
"vitepress-plugin-lightbox": "^1.0.2"
|
"vitepress-plugin-lightbox": "^1.0.2"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -41,5 +41,8 @@
|
|||||||
},
|
},
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"packages/**"
|
"packages/**"
|
||||||
]
|
],
|
||||||
|
"pnpm": {
|
||||||
|
"neverBuiltDependencies": []
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
7
packages/core/acme-client/.prettierrc
Normal file
7
packages/core/acme-client/.prettierrc
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"printWidth": 220,
|
||||||
|
"bracketSpacing": true,
|
||||||
|
"singleQuote": false,
|
||||||
|
"trailingComma": "es5",
|
||||||
|
"arrowParens": "avoid"
|
||||||
|
}
|
||||||
@@ -3,6 +3,50 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.31.7](https://github.com/publishlab/node-acme-client/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/acme-client
|
||||||
|
|
||||||
|
## [1.31.6](https://github.com/publishlab/node-acme-client/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/acme-client
|
||||||
|
|
||||||
|
## [1.31.5](https://github.com/publishlab/node-acme-client/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/acme-client
|
||||||
|
|
||||||
|
## [1.31.4](https://github.com/publishlab/node-acme-client/compare/v1.31.3...v1.31.4) (2025-03-21)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/acme-client
|
||||||
|
|
||||||
|
## [1.31.3](https://github.com/publishlab/node-acme-client/compare/v1.31.2...v1.31.3) (2025-03-13)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/acme-client
|
||||||
|
|
||||||
|
## [1.31.2](https://github.com/publishlab/node-acme-client/compare/v1.31.1...v1.31.2) (2025-03-12)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/acme-client
|
||||||
|
|
||||||
|
## [1.31.1](https://github.com/publishlab/node-acme-client/compare/v1.31.0...v1.31.1) (2025-03-11)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/acme-client
|
||||||
|
|
||||||
|
# [1.31.0](https://github.com/publishlab/node-acme-client/compare/v1.30.6...v1.31.0) (2025-03-10)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/acme-client
|
||||||
|
|
||||||
|
## [1.30.6](https://github.com/publishlab/node-acme-client/compare/v1.30.5...v1.30.6) (2025-02-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/acme-client
|
||||||
|
|
||||||
|
## [1.30.5](https://github.com/publishlab/node-acme-client/compare/v1.30.4...v1.30.5) (2025-02-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/acme-client
|
||||||
|
|
||||||
|
## [1.30.4](https://github.com/publishlab/node-acme-client/compare/v1.30.3...v1.30.4) (2025-02-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/acme-client
|
||||||
|
|
||||||
## [1.30.3](https://github.com/publishlab/node-acme-client/compare/v1.30.2...v1.30.3) (2025-02-13)
|
## [1.30.3](https://github.com/publishlab/node-acme-client/compare/v1.30.2...v1.30.3) (2025-02-13)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/acme-client
|
**Note:** Version bump only for package @certd/acme-client
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"description": "Simple and unopinionated ACME client",
|
"description": "Simple and unopinionated ACME client",
|
||||||
"private": false,
|
"private": false,
|
||||||
"author": "nmorsman",
|
"author": "nmorsman",
|
||||||
"version": "1.30.3",
|
"version": "1.31.7",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"module": "scr/index.js",
|
"module": "scr/index.js",
|
||||||
"main": "src/index.js",
|
"main": "src/index.js",
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
"types"
|
"types"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certd/basic": "^1.30.3",
|
"@certd/basic": "^1.31.7",
|
||||||
"@peculiar/x509": "^1.11.0",
|
"@peculiar/x509": "^1.11.0",
|
||||||
"asn1js": "^3.0.5",
|
"asn1js": "^3.0.5",
|
||||||
"axios": "^1.7.2",
|
"axios": "^1.7.2",
|
||||||
@@ -30,6 +30,8 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "^20.14.10",
|
"@types/node": "^20.14.10",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^8.26.1",
|
||||||
|
"@typescript-eslint/parser": "^8.26.1",
|
||||||
"chai": "^4.4.1",
|
"chai": "^4.4.1",
|
||||||
"chai-as-promised": "^7.1.2",
|
"chai-as-promised": "^7.1.2",
|
||||||
"eslint": "^8.57.0",
|
"eslint": "^8.57.0",
|
||||||
@@ -65,5 +67,5 @@
|
|||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/publishlab/node-acme-client/issues"
|
"url": "https://github.com/publishlab/node-acme-client/issues"
|
||||||
},
|
},
|
||||||
"gitHead": "bcacafeb84cf2798a6733ee58b48ecc9bffdafb9"
|
"gitHead": "86ca35ce3381b98b455538b11219d9856be5d0d6"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,10 +53,10 @@ export default async (client, userOpts) => {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
client.getAccountUrl();
|
client.getAccountUrl();
|
||||||
log('[auto] Account URL already exists, skipping account registration');
|
log('[auto] Account URL already exists, skipping account registration( 证书申请账户已存在,跳过注册 )');
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
log('[auto] Registering account');
|
log('[auto] Registering account (注册证书申请账户)');
|
||||||
await client.createAccount(accountPayload);
|
await client.createAccount(accountPayload);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,7 +64,7 @@ export default async (client, userOpts) => {
|
|||||||
* Parse domains from CSR
|
* Parse domains from CSR
|
||||||
*/
|
*/
|
||||||
|
|
||||||
log('[auto] Parsing domains from Certificate Signing Request');
|
log('[auto] Parsing domains from Certificate Signing Request ');
|
||||||
const { commonName, altNames } = readCsrDomains(opts.csr);
|
const { commonName, altNames } = readCsrDomains(opts.csr);
|
||||||
const uniqueDomains = Array.from(new Set([commonName].concat(altNames).filter((d) => d)));
|
const uniqueDomains = Array.from(new Set([commonName].concat(altNames).filter((d) => d)));
|
||||||
|
|
||||||
@@ -120,20 +120,20 @@ export default async (client, userOpts) => {
|
|||||||
// throw new Error('测试异常');
|
// throw new Error('测试异常');
|
||||||
/* Challenge verification */
|
/* Challenge verification */
|
||||||
if (opts.skipChallengeVerification === true) {
|
if (opts.skipChallengeVerification === true) {
|
||||||
log(`[auto] [${d}] Skipping challenge verification since skipChallengeVerification=true,wait 60s`);
|
log(`[auto] [${d}] 跳过本地验证(skipChallengeVerification=true),等待 60s`);
|
||||||
await wait(60 * 1000);
|
await wait(60 * 1000);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
log(`[auto] [${d}] Running challenge verification, type = ${challenge.type}`);
|
log(`[auto] [${d}] 开始本地验证, type = ${challenge.type}`);
|
||||||
try {
|
try {
|
||||||
await client.verifyChallenge(authz, challenge);
|
await client.verifyChallenge(authz, challenge);
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
log(`[auto] [${d}] challenge verification threw error: ${e.message}`);
|
log(`[auto] [${d}] 本地验证失败,尝试请求ACME提供商获取状态: ${e.message}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Complete challenge and wait for valid status */
|
/* Complete challenge and wait for valid status */
|
||||||
log(`[auto] [${d}] Completing challenge with ACME provider and waiting for valid status`);
|
log(`[auto] [${d}] 请求ACME提供商完成验证,等待返回valid状态`);
|
||||||
await client.completeChallenge(challenge);
|
await client.completeChallenge(challenge);
|
||||||
challengeCompleted = true;
|
challengeCompleted = true;
|
||||||
|
|
||||||
|
|||||||
@@ -500,7 +500,7 @@ class AcmeClient {
|
|||||||
await verify[challenge.type](authz, challenge, keyAuthorization);
|
await verify[challenge.type](authz, challenge, keyAuthorization);
|
||||||
};
|
};
|
||||||
|
|
||||||
log('Waiting for ACME challenge verification', this.backoffOpts);
|
log('Waiting for ACME challenge verification(等待ACME挑战验证)', this.backoffOpts);
|
||||||
return util.retry(verifyFn, this.backoffOpts);
|
return util.retry(verifyFn, this.backoffOpts);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -568,14 +568,14 @@ class AcmeClient {
|
|||||||
const resp = await this.api.apiRequest(item.url, null, [200]);
|
const resp = await this.api.apiRequest(item.url, null, [200]);
|
||||||
|
|
||||||
/* Verify status */
|
/* Verify status */
|
||||||
log(`Item has status: ${resp.data.status}`);
|
log(`Item has status(挑战状态): ${resp.data.status}`);
|
||||||
|
|
||||||
if (invalidStates.includes(resp.data.status)) {
|
if (invalidStates.includes(resp.data.status)) {
|
||||||
abort();
|
abort();
|
||||||
throw new Error(util.formatResponseError(resp));
|
throw new Error(util.formatResponseError(resp));
|
||||||
}
|
}
|
||||||
else if (pendingStates.includes(resp.data.status)) {
|
else if (pendingStates.includes(resp.data.status)) {
|
||||||
throw new Error('Operation is pending or processing');
|
throw new Error('Operation is pending or processing(当前仍然在等待状态)');
|
||||||
}
|
}
|
||||||
else if (validStates.includes(resp.data.status)) {
|
else if (validStates.includes(resp.data.status)) {
|
||||||
return resp.data;
|
return resp.data;
|
||||||
@@ -584,7 +584,7 @@ class AcmeClient {
|
|||||||
throw new Error(`Unexpected item status: ${resp.data.status}`);
|
throw new Error(`Unexpected item status: ${resp.data.status}`);
|
||||||
};
|
};
|
||||||
|
|
||||||
log(`Waiting for valid status from: ${item.url}`, this.backoffOpts);
|
log(`Waiting for valid status (等待valid状态): ${item.url}`, this.backoffOpts);
|
||||||
return util.retry(verifyFn, this.backoffOpts);
|
return util.retry(verifyFn, this.backoffOpts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -60,8 +60,9 @@ async function retryPromise(fn, attempts, backoff) {
|
|||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log(`Promise rejected: ${e.message}`);
|
||||||
const duration = backoff.duration();
|
const duration = backoff.duration();
|
||||||
log(`Promise rejected attempt #${backoff.attempts}, retrying in ${duration}ms: ${e.message}`);
|
log(`attempt #${backoff.attempts}, ${duration}ms 后重试: ${e.message}`);
|
||||||
|
|
||||||
await new Promise((resolve) => { setTimeout(resolve, duration); });
|
await new Promise((resolve) => { setTimeout(resolve, duration); });
|
||||||
return retryPromise(fn, attempts, backoff);
|
return retryPromise(fn, attempts, backoff);
|
||||||
@@ -241,7 +242,7 @@ async function resolveDomainBySoaRecord(recordName) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
async function getAuthoritativeDnsResolver(recordName) {
|
async function getAuthoritativeDnsResolver(recordName) {
|
||||||
log(`Locating authoritative NS records for name: ${recordName}`);
|
log(`Locating authoritative NS records for name: ${recordName} (获取域名的权威NS服务器)`);
|
||||||
const resolver = new dns.Resolver();
|
const resolver = new dns.Resolver();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -249,13 +250,14 @@ async function getAuthoritativeDnsResolver(recordName) {
|
|||||||
const domain = await resolveDomainBySoaRecord(recordName);
|
const domain = await resolveDomainBySoaRecord(recordName);
|
||||||
|
|
||||||
/* Resolve authoritative NS addresses */
|
/* Resolve authoritative NS addresses */
|
||||||
log(`Looking up authoritative NS records for domain: ${domain}`);
|
log(`Looking up authoritative NS records for domain(获取域名的权威NS服务器): ${domain}`);
|
||||||
const nsRecords = await dns.resolveNs(domain);
|
const nsRecords = await dns.resolveNs(domain);
|
||||||
|
log(`域名权威NS服务器:${nsRecords}`);
|
||||||
const nsAddrArray = await Promise.all(nsRecords.map(async (r) => dns.resolve4(r)));
|
const nsAddrArray = await Promise.all(nsRecords.map(async (r) => dns.resolve4(r)));
|
||||||
const nsAddresses = [].concat(...nsAddrArray).filter((a) => a);
|
const nsAddresses = [].concat(...nsAddrArray).filter((a) => a);
|
||||||
|
|
||||||
if (!nsAddresses.length) {
|
if (!nsAddresses.length) {
|
||||||
throw new Error(`Unable to locate any valid authoritative NS addresses for domain: ${domain}`);
|
throw new Error(`Unable to locate any valid authoritative NS addresses for domain(获取权威服务器IP失败): ${domain}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Authoritative NS success */
|
/* Authoritative NS success */
|
||||||
@@ -263,12 +265,12 @@ async function getAuthoritativeDnsResolver(recordName) {
|
|||||||
resolver.setServers(nsAddresses);
|
resolver.setServers(nsAddresses);
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
log(`Authoritative NS lookup error: ${e.message}`);
|
log(`Authoritative NS lookup error(获取权威NS服务器地址失败): ${e.message}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return resolver */
|
/* Return resolver */
|
||||||
const addresses = resolver.getServers();
|
const addresses = resolver.getServers();
|
||||||
log(`DNS resolver addresses: ${addresses.join(', ')}`);
|
log(`DNS resolver addresses(域名的权威NS服务器地址): ${addresses.join(', ')}`);
|
||||||
|
|
||||||
return resolver;
|
return resolver;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -113,14 +113,14 @@ export async function walkTxtRecord(recordName) {
|
|||||||
|
|
||||||
async function verifyDnsChallenge(authz, challenge, keyAuthorization, prefix = '_acme-challenge.') {
|
async function verifyDnsChallenge(authz, challenge, keyAuthorization, prefix = '_acme-challenge.') {
|
||||||
const recordName = `${prefix}${authz.identifier.value}`;
|
const recordName = `${prefix}${authz.identifier.value}`;
|
||||||
log(`Resolving DNS TXT from record: ${recordName}`);
|
log(`Resolving DNS TXT from record(解析DNS TXT记录): ${recordName}`);
|
||||||
const recordValues = await walkTxtRecord(recordName);
|
const recordValues = await walkTxtRecord(recordName);
|
||||||
log(`DNS query finished successfully, found ${recordValues.length} TXT records`);
|
log(`DNS query finished successfully(DNS查询成功), found ${recordValues.length} TXT records`);
|
||||||
if (!recordValues.length || !recordValues.includes(keyAuthorization)) {
|
if (!recordValues.length || !recordValues.includes(keyAuthorization)) {
|
||||||
throw new Error(`Authorization not found in DNS TXT record: ${recordName},need:${keyAuthorization},found:${recordValues}`);
|
throw new Error(`Authorization not found in DNS TXT record(没有找到需要的DNS TXT记录): ${recordName},need:${keyAuthorization},found:${recordValues}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
log(`Key authorization match for ${challenge.type}/${recordName}, ACME challenge verified`);
|
log(`Key authorization match for ${challenge.type}/${recordName}, ACME challenge verified(域名所有权校验成功)`);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
"@typescript-eslint/ban-ts-comment": "off",
|
"@typescript-eslint/ban-ts-comment": "off",
|
||||||
"@typescript-eslint/ban-ts-ignore": "off",
|
"@typescript-eslint/ban-ts-ignore": "off",
|
||||||
"@typescript-eslint/no-explicit-any": "off",
|
"@typescript-eslint/no-explicit-any": "off",
|
||||||
// "no-unused-expressions": "off",
|
"@typescript-eslint/no-empty-function": "off",
|
||||||
"max-len": [0, 160, 2, { "ignoreUrls": true }]
|
"@typescript-eslint/no-unused-vars": "off"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
7
packages/core/basic/.prettierrc
Normal file
7
packages/core/basic/.prettierrc
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"printWidth": 220,
|
||||||
|
"bracketSpacing": true,
|
||||||
|
"singleQuote": false,
|
||||||
|
"trailingComma": "es5",
|
||||||
|
"arrowParens": "avoid"
|
||||||
|
}
|
||||||
@@ -3,6 +3,57 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/basic
|
||||||
|
|
||||||
|
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/basic
|
||||||
|
|
||||||
|
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/basic
|
||||||
|
|
||||||
|
## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/basic
|
||||||
|
|
||||||
|
## [1.31.3](https://github.com/certd/certd/compare/v1.31.2...v1.31.3) (2025-03-13)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 支持部署到天翼云CDN ([82a72e0](https://github.com/certd/certd/commit/82a72e0b497efa043d342ad0e33c083a2de79a05))
|
||||||
|
|
||||||
|
## [1.31.2](https://github.com/certd/certd/compare/v1.31.1...v1.31.2) (2025-03-12)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/basic
|
||||||
|
|
||||||
|
## [1.31.1](https://github.com/certd/certd/compare/v1.31.0...v1.31.1) (2025-03-11)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/basic
|
||||||
|
|
||||||
|
# [1.31.0](https://github.com/certd/certd/compare/v1.30.6...v1.31.0) (2025-03-10)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 流水线同一个阶段任务优化为并行执行 ([efa9c74](https://github.com/certd/certd/commit/efa9c748c5c07fc950af3db742ef9310f1ac9a4b))
|
||||||
|
* 支持易盾RCDN部署 ([065713c](https://github.com/certd/certd/commit/065713cdb6953d16df08585c316c1a7a8eaec437))
|
||||||
|
|
||||||
|
## [1.30.6](https://github.com/certd/certd/compare/v1.30.5...v1.30.6) (2025-02-24)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 支持新版本LeCDN ([44d43f4](https://github.com/certd/certd/commit/44d43f45cb9094619df7494c2a64a51ba77ad116))
|
||||||
|
|
||||||
|
## [1.30.5](https://github.com/certd/certd/compare/v1.30.4...v1.30.5) (2025-02-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/basic
|
||||||
|
|
||||||
|
## [1.30.4](https://github.com/certd/certd/compare/v1.30.3...v1.30.4) (2025-02-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/basic
|
||||||
|
|
||||||
## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)
|
## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/basic
|
**Note:** Version bump only for package @certd/basic
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
01:44
|
00:01
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/basic",
|
"name": "@certd/basic",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.30.3",
|
"version": "1.31.7",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"module": "./dist/index.js",
|
"module": "./dist/index.js",
|
||||||
@@ -33,8 +33,8 @@
|
|||||||
"@types/lodash-es": "^4.17.12",
|
"@types/lodash-es": "^4.17.12",
|
||||||
"@types/mocha": "^10.0.1",
|
"@types/mocha": "^10.0.1",
|
||||||
"@types/node-forge": "^1.3.2",
|
"@types/node-forge": "^1.3.2",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.59.7",
|
"@typescript-eslint/eslint-plugin": "^8.26.1",
|
||||||
"@typescript-eslint/parser": "^5.59.7",
|
"@typescript-eslint/parser": "^8.26.1",
|
||||||
"chai": "4.3.10",
|
"chai": "4.3.10",
|
||||||
"eslint": "^8.41.0",
|
"eslint": "^8.41.0",
|
||||||
"eslint-config-prettier": "^8.8.0",
|
"eslint-config-prettier": "^8.8.0",
|
||||||
@@ -44,5 +44,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "bcacafeb84cf2798a6733ee58b48ecc9bffdafb9"
|
"gitHead": "86ca35ce3381b98b455538b11219d9856be5d0d6"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,6 +32,8 @@ import { nanoid } from 'nanoid';
|
|||||||
import * as id from './util.id.js';
|
import * as id from './util.id.js';
|
||||||
import { locker } from './util.lock.js';
|
import { locker } from './util.lock.js';
|
||||||
import { mitter } from './util.mitter.js';
|
import { mitter } from './util.mitter.js';
|
||||||
|
|
||||||
|
import * as request from './util.request.js';
|
||||||
export const utils = {
|
export const utils = {
|
||||||
sleep,
|
sleep,
|
||||||
http,
|
http,
|
||||||
@@ -52,4 +54,5 @@ export const utils = {
|
|||||||
locker,
|
locker,
|
||||||
mitter,
|
mitter,
|
||||||
amount: amountUtils,
|
amount: amountUtils,
|
||||||
|
request,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,12 +1,22 @@
|
|||||||
import crypto from 'crypto';
|
import crypto, { BinaryToTextEncoding } from 'crypto';
|
||||||
|
|
||||||
function md5(data: string) {
|
function md5(data: string, digest: BinaryToTextEncoding = 'hex') {
|
||||||
return crypto.createHash('md5').update(data).digest('hex');
|
return crypto.createHash('md5').update(data).digest(digest);
|
||||||
}
|
}
|
||||||
function sha256(data: string) {
|
function sha256(data: string, digest: BinaryToTextEncoding = 'hex') {
|
||||||
return crypto.createHash('sha256').update(data).digest('hex');
|
return crypto.createHash('sha256').update(data).digest(digest);
|
||||||
|
}
|
||||||
|
|
||||||
|
function hmacSha256(data: string, digest: BinaryToTextEncoding = 'base64') {
|
||||||
|
return crypto.createHmac('sha256', data).update(Buffer.alloc(0)).digest(digest);
|
||||||
|
}
|
||||||
|
|
||||||
|
function base64(data: string) {
|
||||||
|
return Buffer.from(data).toString('base64');
|
||||||
}
|
}
|
||||||
export const hashUtils = {
|
export const hashUtils = {
|
||||||
md5,
|
md5,
|
||||||
sha256,
|
sha256,
|
||||||
|
base64,
|
||||||
|
hmacSha256,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -310,3 +310,14 @@ export async function download(req: { http: HttpClient; config: HttpRequestConfi
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getCookie(response: any, name: string) {
|
||||||
|
const cookies = response.headers['set-cookie'];
|
||||||
|
//根据name 返回对应的cookie
|
||||||
|
const found = cookies.find((cookie: any) => cookie.includes(name));
|
||||||
|
if (!found) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const cookie = found.split(';')[0];
|
||||||
|
return cookie.substring(cookie.indexOf('=') + 1);
|
||||||
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
"@typescript-eslint/ban-ts-comment": "off",
|
"@typescript-eslint/ban-ts-comment": "off",
|
||||||
"@typescript-eslint/ban-ts-ignore": "off",
|
"@typescript-eslint/ban-ts-ignore": "off",
|
||||||
"@typescript-eslint/no-explicit-any": "off",
|
"@typescript-eslint/no-explicit-any": "off",
|
||||||
// "no-unused-expressions": "off",
|
"@typescript-eslint/no-empty-function": "off",
|
||||||
"max-len": [0, 160, 2, { "ignoreUrls": true }]
|
"@typescript-eslint/no-unused-vars": "off"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
{
|
{
|
||||||
"printWidth": 160
|
"printWidth": 220,
|
||||||
|
"bracketSpacing": true,
|
||||||
|
"singleQuote": false,
|
||||||
|
"trailingComma": "es5",
|
||||||
|
"arrowParens": "avoid"
|
||||||
}
|
}
|
||||||
@@ -3,6 +3,62 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/pipeline
|
||||||
|
|
||||||
|
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/pipeline
|
||||||
|
|
||||||
|
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/pipeline
|
||||||
|
|
||||||
|
## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复站点监控通知通过webhook发送失败的bug ([9be1ecc](https://github.com/certd/certd/commit/9be1ecc8aab3ea23dd0dc2dab3688f4edb90ef2c))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 流水线增加上传证书快捷方式 ([425bba6](https://github.com/certd/certd/commit/425bba67c539b734e2a85a83a4f9ecc9b2434fb4))
|
||||||
|
* 支持飞书通知 ([b82e1dc](https://github.com/certd/certd/commit/b82e1dcd6217b09a7d7e21cd648bb31de320cadf))
|
||||||
|
* 支持手动上传证书并部署 ([a9fffa5](https://github.com/certd/certd/commit/a9fffa5180c83da27b35886aa2e858a92a2c5f94))
|
||||||
|
|
||||||
|
## [1.31.3](https://github.com/certd/certd/compare/v1.31.2...v1.31.3) (2025-03-13)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/pipeline
|
||||||
|
|
||||||
|
## [1.31.2](https://github.com/certd/certd/compare/v1.31.1...v1.31.2) (2025-03-12)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/pipeline
|
||||||
|
|
||||||
|
## [1.31.1](https://github.com/certd/certd/compare/v1.31.0...v1.31.1) (2025-03-11)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/pipeline
|
||||||
|
|
||||||
|
# [1.31.0](https://github.com/certd/certd/compare/v1.30.6...v1.31.0) (2025-03-10)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 流水线同一个阶段任务优化为并行执行 ([efa9c74](https://github.com/certd/certd/commit/efa9c748c5c07fc950af3db742ef9310f1ac9a4b))
|
||||||
|
|
||||||
|
## [1.30.6](https://github.com/certd/certd/compare/v1.30.5...v1.30.6) (2025-02-24)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 上传到阿里云证书名称后缀增加毫秒时间戳 ([9f0ee21](https://github.com/certd/certd/commit/9f0ee219d02907ffe128a5cf10173397d934ccd7))
|
||||||
|
|
||||||
|
## [1.30.5](https://github.com/certd/certd/compare/v1.30.4...v1.30.5) (2025-02-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/pipeline
|
||||||
|
|
||||||
|
## [1.30.4](https://github.com/certd/certd/compare/v1.30.3...v1.30.4) (2025-02-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/pipeline
|
||||||
|
|
||||||
## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)
|
## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/pipeline
|
**Note:** Version bump only for package @certd/pipeline
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/pipeline",
|
"name": "@certd/pipeline",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.30.3",
|
"version": "1.31.7",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"module": "./dist/index.js",
|
"module": "./dist/index.js",
|
||||||
@@ -16,8 +16,8 @@
|
|||||||
"test": "mocha --loader=ts-node/esm"
|
"test": "mocha --loader=ts-node/esm"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certd/basic": "^1.30.3",
|
"@certd/basic": "^1.31.7",
|
||||||
"@certd/plus-core": "^1.30.3",
|
"@certd/plus-core": "^1.31.7",
|
||||||
"dayjs": "^1.11.7",
|
"dayjs": "^1.11.7",
|
||||||
"lodash-es": "^4.17.21",
|
"lodash-es": "^4.17.21",
|
||||||
"reflect-metadata": "^0.1.13"
|
"reflect-metadata": "^0.1.13"
|
||||||
@@ -31,8 +31,8 @@
|
|||||||
"@types/chai": "^4.3.10",
|
"@types/chai": "^4.3.10",
|
||||||
"@types/lodash-es": "^4.17.12",
|
"@types/lodash-es": "^4.17.12",
|
||||||
"@types/mocha": "^10.0.1",
|
"@types/mocha": "^10.0.1",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.59.7",
|
"@typescript-eslint/eslint-plugin": "^8.26.1",
|
||||||
"@typescript-eslint/parser": "^5.59.7",
|
"@typescript-eslint/parser": "^8.26.1",
|
||||||
"chai": "4.3.10",
|
"chai": "4.3.10",
|
||||||
"eslint": "^8.41.0",
|
"eslint": "^8.41.0",
|
||||||
"eslint-config-prettier": "^8.8.0",
|
"eslint-config-prettier": "^8.8.0",
|
||||||
@@ -43,5 +43,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "bcacafeb84cf2798a6733ee58b48ecc9bffdafb9"
|
"gitHead": "86ca35ce3381b98b455538b11219d9856be5d0d6"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,15 @@
|
|||||||
|
import type { ResultError } from "../dt/index.js";
|
||||||
|
|
||||||
export class CancelError extends Error {
|
export class CancelError extends Error {
|
||||||
constructor(message: string) {
|
constructor(message: string) {
|
||||||
super(message);
|
super(message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class RunnableError extends Error {
|
||||||
|
errors: ResultError[];
|
||||||
|
constructor(message: string, errors: ResultError[]) {
|
||||||
|
super(message);
|
||||||
|
this.errors = errors;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { ConcurrencyStrategy, NotificationWhen, Pipeline, ResultType, Runnable, RunStrategy, Stage, Step, Task } from "../dt/index.js";
|
import { ConcurrencyStrategy, NotificationWhen, Pipeline, ResultType, Runnable, RunStrategy, Stage, Step, Task, ResultError } from "../dt/index.js";
|
||||||
import { RunHistory, RunnableCollection } from "./run-history.js";
|
import { RunHistory, RunnableCollection } from "./run-history.js";
|
||||||
import { AbstractTaskPlugin, PluginDefine, pluginRegistry, TaskInstanceContext, UserInfo } from "../plugin/index.js";
|
import { AbstractTaskPlugin, PluginDefine, pluginRegistry, TaskInstanceContext, UserInfo } from "../plugin/index.js";
|
||||||
import { ContextFactory, IContext } from "./context.js";
|
import { ContextFactory, IContext } from "./context.js";
|
||||||
@@ -7,11 +7,12 @@ import { createAxiosService, hashUtils, HttpRequestConfig, ILogger, logger, util
|
|||||||
import { IAccessService } from "../access/index.js";
|
import { IAccessService } from "../access/index.js";
|
||||||
import { RegistryItem } from "../registry/index.js";
|
import { RegistryItem } from "../registry/index.js";
|
||||||
import { Decorator } from "../decorator/index.js";
|
import { Decorator } from "../decorator/index.js";
|
||||||
import { ICnameProxyService, IEmailService, IPluginConfigService, IUrlService } from "../service/index.js";
|
import { ICnameProxyService, IEmailService, IPluginConfigService, IServiceGetter, IUrlService } from "../service/index.js";
|
||||||
import { FileStore } from "./file-store.js";
|
import { FileStore } from "./file-store.js";
|
||||||
import { cloneDeep, forEach, merge } from "lodash-es";
|
import { cloneDeep, forEach, merge } from "lodash-es";
|
||||||
import { INotificationService } from "../notification/index.js";
|
import { INotificationService } from "../notification/index.js";
|
||||||
import { taskEmitterCreate } from "../service/emit.js";
|
import { taskEmitterCreate } from "../service/emit.js";
|
||||||
|
import { RunnableError } from "./exceptions.js";
|
||||||
|
|
||||||
export type SysInfo = {
|
export type SysInfo = {
|
||||||
//系统标题
|
//系统标题
|
||||||
@@ -32,6 +33,7 @@ export type ExecutorOptions = {
|
|||||||
user: UserInfo;
|
user: UserInfo;
|
||||||
baseURL?: string;
|
baseURL?: string;
|
||||||
sysInfo?: SysInfo;
|
sysInfo?: SysInfo;
|
||||||
|
serviceGetter: IServiceGetter;
|
||||||
};
|
};
|
||||||
|
|
||||||
export class Executor {
|
export class Executor {
|
||||||
@@ -192,6 +194,8 @@ export class Executor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let resList: ResultType[] = [];
|
let resList: ResultType[] = [];
|
||||||
|
const errorList: ResultError[] = [];
|
||||||
|
let errorMessage = "";
|
||||||
if (stage.concurrency === ConcurrencyStrategy.Parallel) {
|
if (stage.concurrency === ConcurrencyStrategy.Parallel) {
|
||||||
//并行
|
//并行
|
||||||
const pList = [];
|
const pList = [];
|
||||||
@@ -200,10 +204,25 @@ export class Executor {
|
|||||||
}
|
}
|
||||||
resList = await Promise.all(pList);
|
resList = await Promise.all(pList);
|
||||||
} else {
|
} else {
|
||||||
//串行
|
//串行且报错继续
|
||||||
for (let i = 0; i < runnerList.length; i++) {
|
for (let i = 0; i < runnerList.length; i++) {
|
||||||
const runner = runnerList[i];
|
const runner = runnerList[i];
|
||||||
resList[i] = await runner();
|
try {
|
||||||
|
resList[i] = await runner();
|
||||||
|
} catch (e: any) {
|
||||||
|
const t = stage.tasks[i];
|
||||||
|
this.logger.error(`任务 ${t.title} 执行异常:`, e.message);
|
||||||
|
resList[i] = ResultType.error;
|
||||||
|
errorList.push({
|
||||||
|
e,
|
||||||
|
returnType: ResultType.error,
|
||||||
|
runnable: t,
|
||||||
|
});
|
||||||
|
errorMessage += `任务${t.title}执行失败,错误详情:${e.message};`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (errorList.length > 0) {
|
||||||
|
throw new RunnableError(errorMessage, errorList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return this.compositionResultType(resList);
|
return this.compositionResultType(resList);
|
||||||
@@ -347,6 +366,7 @@ export class Executor {
|
|||||||
step,
|
step,
|
||||||
pipeline: this.pipeline,
|
pipeline: this.pipeline,
|
||||||
}),
|
}),
|
||||||
|
serviceGetter: this.options.serviceGetter,
|
||||||
};
|
};
|
||||||
instance.setCtx(taskCtx);
|
instance.setCtx(taskCtx);
|
||||||
|
|
||||||
@@ -402,7 +422,16 @@ export class Executor {
|
|||||||
content = `流水线ID:${this.pipeline.id},运行ID:${this.runtime.id}`;
|
content = `流水线ID:${this.pipeline.id},运行ID:${this.runtime.id}`;
|
||||||
} else if (when === "error") {
|
} else if (when === "error") {
|
||||||
subject = `执行失败,${this.pipeline.title}【${this.pipeline.id}】`;
|
subject = `执行失败,${this.pipeline.title}【${this.pipeline.id}】`;
|
||||||
content = `流水线ID:${this.pipeline.id},运行ID:${this.runtime.id}\n\n${this.currentStatusMap?.currentStep?.title} 执行失败\n\n错误详情:${error.message}`;
|
|
||||||
|
if (error instanceof RunnableError) {
|
||||||
|
const runnableError = error as RunnableError;
|
||||||
|
content = `流水线ID:${this.pipeline.id},运行ID:${this.runtime.id}\n\n`;
|
||||||
|
for (const re of runnableError.errors) {
|
||||||
|
content += ` - ${re.runnable.title} 执行失败\n 错误详情:${re.e.message}\n\n`;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
content = `流水线ID:${this.pipeline.id},运行ID:${this.runtime.id}\n\n${this.currentStatusMap?.currentStep?.title} 执行失败\n\n错误详情:${error.message}`;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,11 +11,13 @@ function attachProperty(target: any, propertyKey: string | symbol) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getClassProperties(target: any) {
|
function getClassProperties(target: any) {
|
||||||
//获取父类
|
//获取父类, 向上追溯三层
|
||||||
const parent = Object.getPrototypeOf(target);
|
const parent = Object.getPrototypeOf(target);
|
||||||
|
const pParent = Object.getPrototypeOf(parent);
|
||||||
|
const pParentMap = propertyMap[pParent] || {};
|
||||||
const parentMap = propertyMap[parent] || {};
|
const parentMap = propertyMap[parent] || {};
|
||||||
const current = propertyMap[target] || {};
|
const current = propertyMap[target] || {};
|
||||||
return _.merge({}, parentMap, current);
|
return _.merge({}, pParentMap, parentMap, current);
|
||||||
}
|
}
|
||||||
|
|
||||||
function target(target: any, propertyKey?: string | symbol) {
|
function target(target: any, propertyKey?: string | symbol) {
|
||||||
|
|||||||
@@ -107,6 +107,12 @@ export type Log = {
|
|||||||
text: string;
|
text: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type ResultError = {
|
||||||
|
e: any;
|
||||||
|
returnType: ResultType;
|
||||||
|
runnable: Runnable;
|
||||||
|
};
|
||||||
|
|
||||||
export enum ResultType {
|
export enum ResultType {
|
||||||
start = "start",
|
start = "start",
|
||||||
success = "success",
|
success = "success",
|
||||||
|
|||||||
@@ -119,10 +119,12 @@ export abstract class BaseNotification implements INotification {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async onTestRequest() {
|
async onTestRequest() {
|
||||||
await this.doSend({
|
return await this.doSend({
|
||||||
userId: 0,
|
userId: 0,
|
||||||
title: "【Certd】测试通知【*.foo.com】,标题长度测试、测试、测试",
|
title: "【Certd】测试通知【*.foo.com】,标题长度测试、测试、测试",
|
||||||
content: "测试通知,*.foo.com",
|
content: `测试通知,*.foo.com
|
||||||
|
换行测试
|
||||||
|
`,
|
||||||
pipeline: {
|
pipeline: {
|
||||||
id: 1,
|
id: 1,
|
||||||
title: "证书申请成功【测试流水线】",
|
title: "证书申请成功【测试流水线】",
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { Registrable } from "../registry/index.js";
|
|||||||
import { FileItem, FormItemProps, Pipeline, Runnable, Step } from "../dt/index.js";
|
import { FileItem, FormItemProps, Pipeline, Runnable, Step } from "../dt/index.js";
|
||||||
import { FileStore } from "../core/file-store.js";
|
import { FileStore } from "../core/file-store.js";
|
||||||
import { IAccessService } from "../access/index.js";
|
import { IAccessService } from "../access/index.js";
|
||||||
import { ICnameProxyService, IEmailService, IUrlService } from "../service/index.js";
|
import { ICnameProxyService, IEmailService, IServiceGetter, IUrlService } from "../service/index.js";
|
||||||
import { CancelError, IContext, RunHistory, RunnableCollection } from "../core/index.js";
|
import { CancelError, IContext, RunHistory, RunnableCollection } from "../core/index.js";
|
||||||
import { HttpRequestConfig, ILogger, logger, utils } from "@certd/basic";
|
import { HttpRequestConfig, ILogger, logger, utils } from "@certd/basic";
|
||||||
import { HttpClient } from "@certd/basic";
|
import { HttpClient } from "@certd/basic";
|
||||||
@@ -55,6 +55,14 @@ export type PluginDefine = Registrable & {
|
|||||||
[key: string]: any;
|
[key: string]: any;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
shortcut?: {
|
||||||
|
[key: string]: {
|
||||||
|
title: string;
|
||||||
|
icon: string;
|
||||||
|
action: string;
|
||||||
|
form: any;
|
||||||
|
};
|
||||||
|
};
|
||||||
needPlus?: boolean;
|
needPlus?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -114,6 +122,9 @@ export type TaskInstanceContext = {
|
|||||||
user: UserInfo;
|
user: UserInfo;
|
||||||
|
|
||||||
emitter: TaskEmitter;
|
emitter: TaskEmitter;
|
||||||
|
|
||||||
|
//service 容器
|
||||||
|
serviceGetter?: IServiceGetter;
|
||||||
};
|
};
|
||||||
|
|
||||||
export abstract class AbstractTaskPlugin implements ITaskPlugin {
|
export abstract class AbstractTaskPlugin implements ITaskPlugin {
|
||||||
@@ -193,7 +204,7 @@ export abstract class AbstractTaskPlugin implements ITaskPlugin {
|
|||||||
if (name == null) {
|
if (name == null) {
|
||||||
name = "certd";
|
name = "certd";
|
||||||
}
|
}
|
||||||
return name + "_" + dayjs().format("YYYYMMDDHHmmss");
|
return name + "_" + dayjs().format("YYYYMMDDHHmmssSSS");
|
||||||
}
|
}
|
||||||
|
|
||||||
async onRequest(req: PluginRequestHandleReq<any>) {
|
async onRequest(req: PluginRequestHandleReq<any>) {
|
||||||
@@ -221,7 +232,7 @@ export abstract class AbstractTaskPlugin implements ITaskPlugin {
|
|||||||
|
|
||||||
getStepFromPipeline(stepId: string) {
|
getStepFromPipeline(stepId: string) {
|
||||||
let found: any = null;
|
let found: any = null;
|
||||||
RunnableCollection.each(this.ctx.pipeline.stages, (step) => {
|
RunnableCollection.each(this.ctx.pipeline.stages, step => {
|
||||||
if (step.id === stepId) {
|
if (step.id === stepId) {
|
||||||
found = step;
|
found = step;
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -3,3 +3,6 @@ export * from "./cname.js";
|
|||||||
export * from "./config.js";
|
export * from "./config.js";
|
||||||
export * from "./url.js";
|
export * from "./url.js";
|
||||||
export * from "./emit.js";
|
export * from "./emit.js";
|
||||||
|
export type IServiceGetter = {
|
||||||
|
get: (name: string) => Promise<any>;
|
||||||
|
};
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
"@typescript-eslint/ban-ts-ignore": "off",
|
"@typescript-eslint/ban-ts-ignore": "off",
|
||||||
"@typescript-eslint/no-explicit-any": "off",
|
"@typescript-eslint/no-explicit-any": "off",
|
||||||
"@typescript-eslint/no-empty-function": "off",
|
"@typescript-eslint/no-empty-function": "off",
|
||||||
// "no-unused-expressions": "off",
|
"@typescript-eslint/no-unused-vars": "off"
|
||||||
"max-len": [0, 160, 2, { "ignoreUrls": true }]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
{
|
{
|
||||||
"printWidth": 160
|
"printWidth": 220,
|
||||||
|
"bracketSpacing": true,
|
||||||
|
"singleQuote": false,
|
||||||
|
"trailingComma": "es5",
|
||||||
|
"arrowParens": "avoid"
|
||||||
}
|
}
|
||||||
@@ -3,6 +3,50 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-huawei
|
||||||
|
|
||||||
|
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-huawei
|
||||||
|
|
||||||
|
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-huawei
|
||||||
|
|
||||||
|
## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-huawei
|
||||||
|
|
||||||
|
## [1.31.3](https://github.com/certd/certd/compare/v1.31.2...v1.31.3) (2025-03-13)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-huawei
|
||||||
|
|
||||||
|
## [1.31.2](https://github.com/certd/certd/compare/v1.31.1...v1.31.2) (2025-03-12)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-huawei
|
||||||
|
|
||||||
|
## [1.31.1](https://github.com/certd/certd/compare/v1.31.0...v1.31.1) (2025-03-11)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-huawei
|
||||||
|
|
||||||
|
# [1.31.0](https://github.com/certd/certd/compare/v1.30.6...v1.31.0) (2025-03-10)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-huawei
|
||||||
|
|
||||||
|
## [1.30.6](https://github.com/certd/certd/compare/v1.30.5...v1.30.6) (2025-02-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-huawei
|
||||||
|
|
||||||
|
## [1.30.5](https://github.com/certd/certd/compare/v1.30.4...v1.30.5) (2025-02-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-huawei
|
||||||
|
|
||||||
|
## [1.30.4](https://github.com/certd/certd/compare/v1.30.3...v1.30.4) (2025-02-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-huawei
|
||||||
|
|
||||||
## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)
|
## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/lib-huawei
|
**Note:** Version bump only for package @certd/lib-huawei
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/lib-huawei",
|
"name": "@certd/lib-huawei",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.30.3",
|
"version": "1.31.7",
|
||||||
"main": "./dist/bundle.js",
|
"main": "./dist/bundle.js",
|
||||||
"module": "./dist/bundle.js",
|
"module": "./dist/bundle.js",
|
||||||
"types": "./dist/d/index.d.ts",
|
"types": "./dist/d/index.d.ts",
|
||||||
@@ -18,8 +18,10 @@
|
|||||||
"rollup": "^3.7.4"
|
"rollup": "^3.7.4"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@typescript-eslint/eslint-plugin": "^8.26.1",
|
||||||
|
"@typescript-eslint/parser": "^8.26.1",
|
||||||
"prettier": "^2.8.8",
|
"prettier": "^2.8.8",
|
||||||
"tslib": "^2.8.1"
|
"tslib": "^2.8.1"
|
||||||
},
|
},
|
||||||
"gitHead": "bcacafeb84cf2798a6733ee58b48ecc9bffdafb9"
|
"gitHead": "86ca35ce3381b98b455538b11219d9856be5d0d6"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
"@typescript-eslint/ban-ts-ignore": "off",
|
"@typescript-eslint/ban-ts-ignore": "off",
|
||||||
"@typescript-eslint/no-explicit-any": "off",
|
"@typescript-eslint/no-explicit-any": "off",
|
||||||
"@typescript-eslint/no-empty-function": "off",
|
"@typescript-eslint/no-empty-function": "off",
|
||||||
// "no-unused-expressions": "off",
|
"@typescript-eslint/no-unused-vars": "off"
|
||||||
"max-len": [0, 160, 2, { "ignoreUrls": true }]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"printWidth": 160,
|
"printWidth": 220,
|
||||||
"bracketSpacing": true,
|
"bracketSpacing": true,
|
||||||
"singleQuote": true,
|
"singleQuote": false,
|
||||||
"trailingComma": "es5",
|
"trailingComma": "es5",
|
||||||
"arrowParens": "avoid"
|
"arrowParens": "avoid"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,50 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-iframe
|
||||||
|
|
||||||
|
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-iframe
|
||||||
|
|
||||||
|
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-iframe
|
||||||
|
|
||||||
|
## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-iframe
|
||||||
|
|
||||||
|
## [1.31.3](https://github.com/certd/certd/compare/v1.31.2...v1.31.3) (2025-03-13)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-iframe
|
||||||
|
|
||||||
|
## [1.31.2](https://github.com/certd/certd/compare/v1.31.1...v1.31.2) (2025-03-12)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-iframe
|
||||||
|
|
||||||
|
## [1.31.1](https://github.com/certd/certd/compare/v1.31.0...v1.31.1) (2025-03-11)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-iframe
|
||||||
|
|
||||||
|
# [1.31.0](https://github.com/certd/certd/compare/v1.30.6...v1.31.0) (2025-03-10)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-iframe
|
||||||
|
|
||||||
|
## [1.30.6](https://github.com/certd/certd/compare/v1.30.5...v1.30.6) (2025-02-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-iframe
|
||||||
|
|
||||||
|
## [1.30.5](https://github.com/certd/certd/compare/v1.30.4...v1.30.5) (2025-02-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-iframe
|
||||||
|
|
||||||
|
## [1.30.4](https://github.com/certd/certd/compare/v1.30.3...v1.30.4) (2025-02-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-iframe
|
||||||
|
|
||||||
## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)
|
## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/lib-iframe
|
**Note:** Version bump only for package @certd/lib-iframe
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/lib-iframe",
|
"name": "@certd/lib-iframe",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.30.3",
|
"version": "1.31.7",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"module": "./dist/index.js",
|
"module": "./dist/index.js",
|
||||||
@@ -20,8 +20,8 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/chai": "^4.3.3",
|
"@types/chai": "^4.3.3",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.38.1",
|
"@typescript-eslint/eslint-plugin": "^8.26.1",
|
||||||
"@typescript-eslint/parser": "^5.38.1",
|
"@typescript-eslint/parser": "^8.26.1",
|
||||||
"eslint": "^8.24.0",
|
"eslint": "^8.24.0",
|
||||||
"eslint-config-prettier": "^8.5.0",
|
"eslint-config-prettier": "^8.5.0",
|
||||||
"eslint-plugin-prettier": "^4.2.1",
|
"eslint-plugin-prettier": "^4.2.1",
|
||||||
@@ -30,5 +30,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "bcacafeb84cf2798a6733ee58b48ecc9bffdafb9"
|
"gitHead": "86ca35ce3381b98b455538b11219d9856be5d0d6"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"printWidth": 160,
|
"printWidth": 220,
|
||||||
"bracketSpacing": true,
|
"bracketSpacing": true,
|
||||||
"singleQuote": true,
|
"singleQuote": false,
|
||||||
"trailingComma": "es5",
|
"trailingComma": "es5",
|
||||||
"arrowParens": "avoid"
|
"arrowParens": "avoid"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,50 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-k8s
|
||||||
|
|
||||||
|
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-k8s
|
||||||
|
|
||||||
|
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-k8s
|
||||||
|
|
||||||
|
## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-k8s
|
||||||
|
|
||||||
|
## [1.31.3](https://github.com/certd/certd/compare/v1.31.2...v1.31.3) (2025-03-13)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-k8s
|
||||||
|
|
||||||
|
## [1.31.2](https://github.com/certd/certd/compare/v1.31.1...v1.31.2) (2025-03-12)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-k8s
|
||||||
|
|
||||||
|
## [1.31.1](https://github.com/certd/certd/compare/v1.31.0...v1.31.1) (2025-03-11)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-k8s
|
||||||
|
|
||||||
|
# [1.31.0](https://github.com/certd/certd/compare/v1.30.6...v1.31.0) (2025-03-10)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-k8s
|
||||||
|
|
||||||
|
## [1.30.6](https://github.com/certd/certd/compare/v1.30.5...v1.30.6) (2025-02-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-k8s
|
||||||
|
|
||||||
|
## [1.30.5](https://github.com/certd/certd/compare/v1.30.4...v1.30.5) (2025-02-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-k8s
|
||||||
|
|
||||||
|
## [1.30.4](https://github.com/certd/certd/compare/v1.30.3...v1.30.4) (2025-02-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-k8s
|
||||||
|
|
||||||
## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)
|
## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/lib-k8s
|
**Note:** Version bump only for package @certd/lib-k8s
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/lib-k8s",
|
"name": "@certd/lib-k8s",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.30.3",
|
"version": "1.31.7",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"module": "./dist/index.js",
|
"module": "./dist/index.js",
|
||||||
@@ -16,13 +16,13 @@
|
|||||||
"preview": "vite preview"
|
"preview": "vite preview"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certd/basic": "^1.30.3",
|
"@certd/basic": "^1.31.7",
|
||||||
"@kubernetes/client-node": "0.21.0"
|
"@kubernetes/client-node": "0.21.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/chai": "^4.3.3",
|
"@types/chai": "^4.3.3",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.38.1",
|
"@typescript-eslint/eslint-plugin": "^8.26.1",
|
||||||
"@typescript-eslint/parser": "^5.38.1",
|
"@typescript-eslint/parser": "^8.26.1",
|
||||||
"eslint": "^8.24.0",
|
"eslint": "^8.24.0",
|
||||||
"eslint-config-prettier": "^8.5.0",
|
"eslint-config-prettier": "^8.5.0",
|
||||||
"eslint-plugin-prettier": "^4.2.1",
|
"eslint-plugin-prettier": "^4.2.1",
|
||||||
@@ -31,5 +31,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "bcacafeb84cf2798a6733ee58b48ecc9bffdafb9"
|
"gitHead": "86ca35ce3381b98b455538b11219d9856be5d0d6"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"printWidth": 160,
|
"printWidth": 220,
|
||||||
"bracketSpacing": true,
|
"bracketSpacing": true,
|
||||||
"singleQuote": true,
|
"singleQuote": false,
|
||||||
"trailingComma": "es5",
|
"trailingComma": "es5",
|
||||||
"arrowParens": "avoid"
|
"arrowParens": "avoid"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,53 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-server
|
||||||
|
|
||||||
|
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-server
|
||||||
|
|
||||||
|
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-server
|
||||||
|
|
||||||
|
## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-server
|
||||||
|
|
||||||
|
## [1.31.3](https://github.com/certd/certd/compare/v1.31.2...v1.31.3) (2025-03-13)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-server
|
||||||
|
|
||||||
|
## [1.31.2](https://github.com/certd/certd/compare/v1.31.1...v1.31.2) (2025-03-12)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-server
|
||||||
|
|
||||||
|
## [1.31.1](https://github.com/certd/certd/compare/v1.31.0...v1.31.1) (2025-03-11)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-server
|
||||||
|
|
||||||
|
# [1.31.0](https://github.com/certd/certd/compare/v1.30.6...v1.31.0) (2025-03-10)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 升级midwayjs版本 ([057b0b4](https://github.com/certd/certd/commit/057b0b4565e19bb93195633f767b2942e8e40e59))
|
||||||
|
* 是否允许爬虫爬取增加ui设置选项 ([779db9d](https://github.com/certd/certd/commit/779db9da705d2dfef36fec21f52bd38af9fc5f2e))
|
||||||
|
|
||||||
|
## [1.30.6](https://github.com/certd/certd/compare/v1.30.5...v1.30.6) (2025-02-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-server
|
||||||
|
|
||||||
|
## [1.30.5](https://github.com/certd/certd/compare/v1.30.4...v1.30.5) (2025-02-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-server
|
||||||
|
|
||||||
|
## [1.30.4](https://github.com/certd/certd/compare/v1.30.3...v1.30.4) (2025-02-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-server
|
||||||
|
|
||||||
## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)
|
## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/lib-server
|
**Note:** Version bump only for package @certd/lib-server
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/lib-server",
|
"name": "@certd/lib-server",
|
||||||
"version": "1.30.3",
|
"version": "1.31.7",
|
||||||
"description": "midway with flyway, sql upgrade way ",
|
"description": "midway with flyway, sql upgrade way ",
|
||||||
"private": false,
|
"private": false,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@@ -27,18 +27,18 @@
|
|||||||
],
|
],
|
||||||
"license": "AGPL",
|
"license": "AGPL",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certd/acme-client": "^1.30.3",
|
"@certd/acme-client": "^1.31.7",
|
||||||
"@certd/basic": "^1.30.3",
|
"@certd/basic": "^1.31.7",
|
||||||
"@certd/pipeline": "^1.30.3",
|
"@certd/pipeline": "^1.31.7",
|
||||||
"@certd/plus-core": "^1.30.3",
|
"@certd/plus-core": "^1.31.7",
|
||||||
"@midwayjs/cache": "~3.14.0",
|
"@midwayjs/cache": "~3.14.0",
|
||||||
"@midwayjs/core": "~3.17.1",
|
"@midwayjs/core": "~3.20.3",
|
||||||
"@midwayjs/i18n": "~3.17.3",
|
"@midwayjs/i18n": "~3.20.3",
|
||||||
"@midwayjs/info": "~3.17.3",
|
"@midwayjs/info": "~3.20.3",
|
||||||
"@midwayjs/koa": "~3.17.1",
|
"@midwayjs/koa": "~3.20.3",
|
||||||
"@midwayjs/logger": "~3.4.2",
|
"@midwayjs/logger": "~3.4.2",
|
||||||
"@midwayjs/typeorm": "~3.17.1",
|
"@midwayjs/typeorm": "~3.20.3",
|
||||||
"@midwayjs/upload": "^3.17.3",
|
"@midwayjs/upload": "^3.20.3",
|
||||||
"better-sqlite3": "^11.1.2",
|
"better-sqlite3": "^11.1.2",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"dayjs": "^1.11.7",
|
"dayjs": "^1.11.7",
|
||||||
@@ -50,8 +50,8 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/chai": "^4.3.3",
|
"@types/chai": "^4.3.3",
|
||||||
"@types/node": "^18",
|
"@types/node": "^18",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.38.1",
|
"@typescript-eslint/eslint-plugin": "^8.26.1",
|
||||||
"@typescript-eslint/parser": "^5.38.1",
|
"@typescript-eslint/parser": "^8.26.1",
|
||||||
"eslint": "^8.24.0",
|
"eslint": "^8.24.0",
|
||||||
"eslint-config-prettier": "^8.5.0",
|
"eslint-config-prettier": "^8.5.0",
|
||||||
"eslint-plugin-prettier": "^4.2.1",
|
"eslint-plugin-prettier": "^4.2.1",
|
||||||
@@ -61,5 +61,5 @@
|
|||||||
"typeorm": "^0.3.11",
|
"typeorm": "^0.3.11",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "bcacafeb84cf2798a6733ee58b48ecc9bffdafb9"
|
"gitHead": "86ca35ce3381b98b455538b11219d9856be5d0d6"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ export abstract class BaseService<T> {
|
|||||||
|
|
||||||
async transaction(callback: (entityManager: EntityManager) => Promise<any>) {
|
async transaction(callback: (entityManager: EntityManager) => Promise<any>) {
|
||||||
const dataSource = this.dataSourceManager.getDataSource('default');
|
const dataSource = this.dataSourceManager.getDataSource('default');
|
||||||
await dataSource.transaction(callback as any);
|
return await dataSource.transaction(callback as any);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ export class SysPublicSettings extends BaseSettings {
|
|||||||
limitUserPipelineCount = 0;
|
limitUserPipelineCount = 0;
|
||||||
managerOtherUserPipeline = false;
|
managerOtherUserPipeline = false;
|
||||||
icpNo?: string;
|
icpNo?: string;
|
||||||
|
robots?: boolean = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class SysPrivateSettings extends BaseSettings {
|
export class SysPrivateSettings extends BaseSettings {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"printWidth": 160,
|
"printWidth": 220,
|
||||||
"bracketSpacing": true,
|
"bracketSpacing": true,
|
||||||
"singleQuote": true,
|
"singleQuote": false,
|
||||||
"trailingComma": "es5",
|
"trailingComma": "es5",
|
||||||
"arrowParens": "avoid"
|
"arrowParens": "avoid"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,52 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/midway-flyway-js
|
||||||
|
|
||||||
|
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/midway-flyway-js
|
||||||
|
|
||||||
|
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/midway-flyway-js
|
||||||
|
|
||||||
|
## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/midway-flyway-js
|
||||||
|
|
||||||
|
## [1.31.3](https://github.com/certd/certd/compare/v1.31.2...v1.31.3) (2025-03-13)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/midway-flyway-js
|
||||||
|
|
||||||
|
## [1.31.2](https://github.com/certd/certd/compare/v1.31.1...v1.31.2) (2025-03-12)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/midway-flyway-js
|
||||||
|
|
||||||
|
## [1.31.1](https://github.com/certd/certd/compare/v1.31.0...v1.31.1) (2025-03-11)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/midway-flyway-js
|
||||||
|
|
||||||
|
# [1.31.0](https://github.com/certd/certd/compare/v1.30.6...v1.31.0) (2025-03-10)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 升级midwayjs版本 ([057b0b4](https://github.com/certd/certd/commit/057b0b4565e19bb93195633f767b2942e8e40e59))
|
||||||
|
|
||||||
|
## [1.30.6](https://github.com/certd/certd/compare/v1.30.5...v1.30.6) (2025-02-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/midway-flyway-js
|
||||||
|
|
||||||
|
## [1.30.5](https://github.com/certd/certd/compare/v1.30.4...v1.30.5) (2025-02-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/midway-flyway-js
|
||||||
|
|
||||||
|
## [1.30.4](https://github.com/certd/certd/compare/v1.30.3...v1.30.4) (2025-02-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/midway-flyway-js
|
||||||
|
|
||||||
## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)
|
## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/midway-flyway-js
|
**Note:** Version bump only for package @certd/midway-flyway-js
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/midway-flyway-js",
|
"name": "@certd/midway-flyway-js",
|
||||||
"version": "1.30.3",
|
"version": "1.31.7",
|
||||||
"description": "midway with flyway, sql upgrade way ",
|
"description": "midway with flyway, sql upgrade way ",
|
||||||
"private": false,
|
"private": false,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@@ -25,16 +25,16 @@
|
|||||||
],
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@midwayjs/core": "~3.17.1",
|
"@midwayjs/core": "~3.20.3",
|
||||||
"@midwayjs/logger": "~3.4.2",
|
"@midwayjs/logger": "~3.4.2",
|
||||||
"@midwayjs/typeorm": "~3.17.1",
|
"@midwayjs/typeorm": "~3.20.3",
|
||||||
"better-sqlite3": "^11.1.2"
|
"better-sqlite3": "^11.1.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/chai": "^4.3.3",
|
"@types/chai": "^4.3.3",
|
||||||
"@types/node": "^18",
|
"@types/node": "^18",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.38.1",
|
"@typescript-eslint/eslint-plugin": "^8.26.1",
|
||||||
"@typescript-eslint/parser": "^5.38.1",
|
"@typescript-eslint/parser": "^8.26.1",
|
||||||
"eslint": "^8.24.0",
|
"eslint": "^8.24.0",
|
||||||
"eslint-config-prettier": "^8.5.0",
|
"eslint-config-prettier": "^8.5.0",
|
||||||
"eslint-plugin-import": "^2.26.0",
|
"eslint-plugin-import": "^2.26.0",
|
||||||
@@ -46,5 +46,5 @@
|
|||||||
"typeorm": "^0.3.11",
|
"typeorm": "^0.3.11",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "bcacafeb84cf2798a6733ee58b48ecc9bffdafb9"
|
"gitHead": "86ca35ce3381b98b455538b11219d9856be5d0d6"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
"@typescript-eslint/ban-ts-ignore": "off",
|
"@typescript-eslint/ban-ts-ignore": "off",
|
||||||
"@typescript-eslint/no-explicit-any": "off",
|
"@typescript-eslint/no-explicit-any": "off",
|
||||||
"@typescript-eslint/no-empty-function": "off",
|
"@typescript-eslint/no-empty-function": "off",
|
||||||
// "no-unused-expressions": "off",
|
"@typescript-eslint/no-unused-vars": "off"
|
||||||
"max-len": [0, 160, 2, { "ignoreUrls": true }]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
{
|
{
|
||||||
"printWidth": 160
|
"printWidth": 220,
|
||||||
|
"bracketSpacing": true,
|
||||||
|
"singleQuote": false,
|
||||||
|
"trailingComma": "es5",
|
||||||
|
"arrowParens": "avoid"
|
||||||
}
|
}
|
||||||
@@ -3,6 +3,62 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-cert
|
||||||
|
|
||||||
|
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-cert
|
||||||
|
|
||||||
|
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-cert
|
||||||
|
|
||||||
|
## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复dns.la域名申请失败的bug ([1de8eee](https://github.com/certd/certd/commit/1de8eee6ea8307f3c11626af75303d3cc104bb95))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 流水线增加上传证书快捷方式 ([425bba6](https://github.com/certd/certd/commit/425bba67c539b734e2a85a83a4f9ecc9b2434fb4))
|
||||||
|
* 手动上传证书部署流水线 ([fbb66f3](https://github.com/certd/certd/commit/fbb66f3c4389489aa8a43b194d82bc8cf391607b))
|
||||||
|
* 支持手动上传证书并部署 ([a9fffa5](https://github.com/certd/certd/commit/a9fffa5180c83da27b35886aa2e858a92a2c5f94))
|
||||||
|
|
||||||
|
## [1.31.3](https://github.com/certd/certd/compare/v1.31.2...v1.31.3) (2025-03-13)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 1panel支持 apikey方式授权 ([170b2af](https://github.com/certd/certd/commit/170b2afb0e3b125e4ed057f633fe895b5ac3ac22))
|
||||||
|
|
||||||
|
## [1.31.2](https://github.com/certd/certd/compare/v1.31.1...v1.31.2) (2025-03-12)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复cname记录查找bug ([95fb4e3](https://github.com/certd/certd/commit/95fb4e3e8be6ca13cc43b451f6141d62190ba453))
|
||||||
|
|
||||||
|
## [1.31.1](https://github.com/certd/certd/compare/v1.31.0...v1.31.1) (2025-03-11)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-cert
|
||||||
|
|
||||||
|
# [1.31.0](https://github.com/certd/certd/compare/v1.30.6...v1.31.0) (2025-03-10)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-cert
|
||||||
|
|
||||||
|
## [1.30.6](https://github.com/certd/certd/compare/v1.30.5...v1.30.6) (2025-02-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-cert
|
||||||
|
|
||||||
|
## [1.30.5](https://github.com/certd/certd/compare/v1.30.4...v1.30.5) (2025-02-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-cert
|
||||||
|
|
||||||
|
## [1.30.4](https://github.com/certd/certd/compare/v1.30.3...v1.30.4) (2025-02-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-cert
|
||||||
|
|
||||||
## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)
|
## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/plugin-cert
|
**Note:** Version bump only for package @certd/plugin-cert
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/plugin-cert",
|
"name": "@certd/plugin-cert",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.30.3",
|
"version": "1.31.7",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"types": "./dist/index.d.ts",
|
"types": "./dist/index.d.ts",
|
||||||
@@ -15,10 +15,10 @@
|
|||||||
"preview": "vite preview"
|
"preview": "vite preview"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certd/acme-client": "^1.30.3",
|
"@certd/acme-client": "^1.31.7",
|
||||||
"@certd/basic": "^1.30.3",
|
"@certd/basic": "^1.31.7",
|
||||||
"@certd/pipeline": "^1.30.3",
|
"@certd/pipeline": "^1.31.7",
|
||||||
"@certd/plugin-lib": "^1.30.3",
|
"@certd/plugin-lib": "^1.31.7",
|
||||||
"@google-cloud/publicca": "^1.3.0",
|
"@google-cloud/publicca": "^1.3.0",
|
||||||
"dayjs": "^1.11.7",
|
"dayjs": "^1.11.7",
|
||||||
"jszip": "^3.10.1",
|
"jszip": "^3.10.1",
|
||||||
@@ -30,8 +30,8 @@
|
|||||||
"@types/chai": "^4.3.3",
|
"@types/chai": "^4.3.3",
|
||||||
"@types/mocha": "^10.0.0",
|
"@types/mocha": "^10.0.0",
|
||||||
"@types/psl": "^1.1.3",
|
"@types/psl": "^1.1.3",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.38.1",
|
"@typescript-eslint/eslint-plugin": "^8.26.1",
|
||||||
"@typescript-eslint/parser": "^5.38.1",
|
"@typescript-eslint/parser": "^8.26.1",
|
||||||
"chai": "^4.3.6",
|
"chai": "^4.3.6",
|
||||||
"eslint": "^8.24.0",
|
"eslint": "^8.24.0",
|
||||||
"eslint-config-prettier": "^8.5.0",
|
"eslint-config-prettier": "^8.5.0",
|
||||||
@@ -41,5 +41,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "bcacafeb84cf2798a6733ee58b48ecc9bffdafb9"
|
"gitHead": "86ca35ce3381b98b455538b11219d9856be5d0d6"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { CreateRecordOptions, DnsProviderContext, DnsProviderDefine, IDnsProvider, RemoveRecordOptions } from "./api.js";
|
import { CreateRecordOptions, DnsProviderContext, DnsProviderDefine, IDnsProvider, RemoveRecordOptions } from "./api.js";
|
||||||
|
//@ts-ignore
|
||||||
import psl from "psl";
|
import psl from "psl";
|
||||||
import { dnsProviderRegistry } from "./registry.js";
|
import { dnsProviderRegistry } from "./registry.js";
|
||||||
import { Decorator } from "@certd/pipeline";
|
import { Decorator } from "@certd/pipeline";
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ type AcmeServiceOptions = {
|
|||||||
reverseProxy?: string;
|
reverseProxy?: string;
|
||||||
privateKeyType?: PrivateKeyType;
|
privateKeyType?: PrivateKeyType;
|
||||||
signal?: AbortSignal;
|
signal?: AbortSignal;
|
||||||
|
maxCheckRetryCount?: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
export class AcmeService {
|
export class AcmeService {
|
||||||
@@ -144,7 +145,7 @@ export class AcmeService {
|
|||||||
accountKey: conf.key,
|
accountKey: conf.key,
|
||||||
accountUrl: conf.accountUrl,
|
accountUrl: conf.accountUrl,
|
||||||
externalAccountBinding: this.eab,
|
externalAccountBinding: this.eab,
|
||||||
backoffAttempts: 15,
|
backoffAttempts: this.options.maxCheckRetryCount || 20,
|
||||||
backoffMin: 5000,
|
backoffMin: 5000,
|
||||||
backoffMax: 10000,
|
backoffMax: 10000,
|
||||||
urlMapping,
|
urlMapping,
|
||||||
@@ -282,15 +283,7 @@ export class AcmeService {
|
|||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
async challengeRemoveFn(
|
async challengeRemoveFn(authz: any, challenge: any, keyAuthorization: string, recordReq: any, recordRes: any, dnsProvider?: IDnsProvider, httpUploader?: HttpChallengeUploader) {
|
||||||
authz: any,
|
|
||||||
challenge: any,
|
|
||||||
keyAuthorization: string,
|
|
||||||
recordReq: any,
|
|
||||||
recordRes: any,
|
|
||||||
dnsProvider?: IDnsProvider,
|
|
||||||
httpUploader?: HttpChallengeUploader
|
|
||||||
) {
|
|
||||||
this.logger.info("执行清理");
|
this.logger.info("执行清理");
|
||||||
|
|
||||||
/* http-01 */
|
/* http-01 */
|
||||||
@@ -387,14 +380,7 @@ export class AcmeService {
|
|||||||
): Promise<{ recordReq?: any; recordRes?: any; dnsProvider?: any; challenge: Challenge; keyAuthorization: string }> => {
|
): Promise<{ recordReq?: any; recordRes?: any; dnsProvider?: any; challenge: Challenge; keyAuthorization: string }> => {
|
||||||
return await this.challengeCreateFn(authz, keyAuthorizationGetter, providers);
|
return await this.challengeCreateFn(authz, keyAuthorizationGetter, providers);
|
||||||
},
|
},
|
||||||
challengeRemoveFn: async (
|
challengeRemoveFn: async (authz: acme.Authorization, challenge: Challenge, keyAuthorization: string, recordReq: any, recordRes: any, dnsProvider: IDnsProvider): Promise<any> => {
|
||||||
authz: acme.Authorization,
|
|
||||||
challenge: Challenge,
|
|
||||||
keyAuthorization: string,
|
|
||||||
recordReq: any,
|
|
||||||
recordRes: any,
|
|
||||||
dnsProvider: IDnsProvider
|
|
||||||
): Promise<any> => {
|
|
||||||
return await this.challengeRemoveFn(authz, challenge, keyAuthorization, recordReq, recordRes, dnsProvider, httpUploader);
|
return await this.challengeRemoveFn(authz, challenge, keyAuthorization, recordReq, recordRes, dnsProvider, httpUploader);
|
||||||
},
|
},
|
||||||
signal: this.options.signal,
|
signal: this.options.signal,
|
||||||
|
|||||||
@@ -0,0 +1,188 @@
|
|||||||
|
import { AbstractTaskPlugin, IContext, Step, TaskInput, TaskOutput } from "@certd/pipeline";
|
||||||
|
import dayjs from "dayjs";
|
||||||
|
import type { CertInfo } from "./acme.js";
|
||||||
|
import { CertReader } from "./cert-reader.js";
|
||||||
|
import JSZip from "jszip";
|
||||||
|
import { CertConverter } from "./convert.js";
|
||||||
|
export const EVENT_CERT_APPLY_SUCCESS = "CertApply.success";
|
||||||
|
|
||||||
|
export abstract class CertApplyBaseConvertPlugin extends AbstractTaskPlugin {
|
||||||
|
@TaskInput({
|
||||||
|
title: "域名",
|
||||||
|
component: {
|
||||||
|
name: "a-select",
|
||||||
|
vModel: "value",
|
||||||
|
mode: "tags",
|
||||||
|
open: false,
|
||||||
|
placeholder: "foo.com / *.foo.com / *.bar.com",
|
||||||
|
tokenSeparators: [",", " ", ",", "、", "|"],
|
||||||
|
},
|
||||||
|
rules: [{ type: "domains" }],
|
||||||
|
required: true,
|
||||||
|
col: {
|
||||||
|
span: 24,
|
||||||
|
},
|
||||||
|
order: -999,
|
||||||
|
helper:
|
||||||
|
"1、支持多个域名打到一个证书上,例如: foo.com,*.foo.com,*.bar.com\n" +
|
||||||
|
"2、子域名被通配符包含的不要填写,例如:www.foo.com已经被*.foo.com包含,不要填写www.foo.com\n" +
|
||||||
|
"3、泛域名只能通配*号那一级(*.foo.com的证书不能用于xxx.yyy.foo.com、不能用于foo.com)\n" +
|
||||||
|
"4、输入一个,空格之后,再输入下一个",
|
||||||
|
})
|
||||||
|
domains!: string[];
|
||||||
|
|
||||||
|
@TaskInput({
|
||||||
|
title: "证书加密密码",
|
||||||
|
component: {
|
||||||
|
name: "input-password",
|
||||||
|
vModel: "value",
|
||||||
|
},
|
||||||
|
required: false,
|
||||||
|
order: 100,
|
||||||
|
helper: "转换成PFX、jks格式证书是否需要加密\njks必须设置密码,不传则默认123456\npfx不传则为空密码",
|
||||||
|
})
|
||||||
|
pfxPassword!: string;
|
||||||
|
|
||||||
|
@TaskInput({
|
||||||
|
title: "PFX证书转换参数",
|
||||||
|
value: "-macalg SHA1 -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES",
|
||||||
|
component: {
|
||||||
|
name: "a-auto-complete",
|
||||||
|
vModel: "value",
|
||||||
|
options: [
|
||||||
|
{ value: "", label: "兼容 Windows Server 最新" },
|
||||||
|
{ value: "-macalg SHA1 -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES", label: "兼容 Windows Server 2016" },
|
||||||
|
{ value: "-nomac -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES", label: "兼容 Windows Server 2008" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
required: false,
|
||||||
|
order: 100,
|
||||||
|
helper: "兼容Windows Server各个版本",
|
||||||
|
})
|
||||||
|
pfxArgs = "-macalg SHA1 -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES";
|
||||||
|
|
||||||
|
userContext!: IContext;
|
||||||
|
lastStatus!: Step;
|
||||||
|
|
||||||
|
@TaskOutput({
|
||||||
|
title: "域名证书",
|
||||||
|
})
|
||||||
|
cert?: CertInfo;
|
||||||
|
|
||||||
|
async onInstance() {
|
||||||
|
this.userContext = this.ctx.userContext;
|
||||||
|
this.lastStatus = this.ctx.lastStatus as Step;
|
||||||
|
await this.onInit();
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract onInit(): Promise<void>;
|
||||||
|
|
||||||
|
//必须output之后执行
|
||||||
|
async emitCertApplySuccess() {
|
||||||
|
const emitter = this.ctx.emitter;
|
||||||
|
const value = {
|
||||||
|
cert: this.cert,
|
||||||
|
file: this._result.files[0].path,
|
||||||
|
};
|
||||||
|
await emitter.emit(EVENT_CERT_APPLY_SUCCESS, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
async output(certReader: CertReader, isNew: boolean) {
|
||||||
|
const cert: CertInfo = certReader.toCertInfo();
|
||||||
|
this.cert = cert;
|
||||||
|
|
||||||
|
this._result.pipelineVars.certExpiresTime = dayjs(certReader.detail.notAfter).valueOf();
|
||||||
|
if (!this._result.pipelinePrivateVars) {
|
||||||
|
this._result.pipelinePrivateVars = {};
|
||||||
|
}
|
||||||
|
this._result.pipelinePrivateVars.cert = cert;
|
||||||
|
|
||||||
|
if (isNew) {
|
||||||
|
try {
|
||||||
|
const converter = new CertConverter({ logger: this.logger });
|
||||||
|
const res = await converter.convert({
|
||||||
|
cert,
|
||||||
|
pfxPassword: this.pfxPassword,
|
||||||
|
pfxArgs: this.pfxArgs,
|
||||||
|
});
|
||||||
|
if (cert.pfx == null && res.pfx) {
|
||||||
|
cert.pfx = res.pfx;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cert.der == null && res.der) {
|
||||||
|
cert.der = res.der;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cert.jks == null && res.jks) {
|
||||||
|
cert.jks = res.jks;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.logger.info("转换证书格式成功");
|
||||||
|
} catch (e) {
|
||||||
|
this.logger.error("转换证书格式失败", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isNew) {
|
||||||
|
const zipFileName = certReader.buildCertFileName("zip", certReader.detail.notBefore);
|
||||||
|
await this.zipCert(cert, zipFileName);
|
||||||
|
} else {
|
||||||
|
this.extendsFiles();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async zipCert(cert: CertInfo, filename: string) {
|
||||||
|
const zip = new JSZip();
|
||||||
|
zip.file("证书.pem", cert.crt);
|
||||||
|
zip.file("私钥.pem", cert.key);
|
||||||
|
zip.file("中间证书.pem", cert.ic);
|
||||||
|
zip.file("cert.crt", cert.crt);
|
||||||
|
zip.file("cert.key", cert.key);
|
||||||
|
zip.file("intermediate.crt", cert.ic);
|
||||||
|
zip.file("origin.crt", cert.oc);
|
||||||
|
zip.file("one.pem", cert.one);
|
||||||
|
if (cert.pfx) {
|
||||||
|
zip.file("cert.pfx", Buffer.from(cert.pfx, "base64"));
|
||||||
|
}
|
||||||
|
if (cert.der) {
|
||||||
|
zip.file("cert.der", Buffer.from(cert.der, "base64"));
|
||||||
|
}
|
||||||
|
if (cert.jks) {
|
||||||
|
zip.file("cert.jks", Buffer.from(cert.jks, "base64"));
|
||||||
|
}
|
||||||
|
|
||||||
|
zip.file(
|
||||||
|
"说明.txt",
|
||||||
|
`证书文件说明
|
||||||
|
cert.crt:证书文件,包含证书链,pem格式
|
||||||
|
cert.key:私钥文件,pem格式
|
||||||
|
intermediate.crt:中间证书文件,pem格式
|
||||||
|
origin.crt:原始证书文件,不含证书链,pem格式
|
||||||
|
one.pem: 证书和私钥简单合并成一个文件,pem格式,crt正文+key正文
|
||||||
|
cert.pfx:pfx格式证书文件,iis服务器使用
|
||||||
|
cert.der:der格式证书文件
|
||||||
|
cert.jks:jks格式证书文件,java服务器使用
|
||||||
|
`
|
||||||
|
);
|
||||||
|
|
||||||
|
const content = await zip.generateAsync({ type: "nodebuffer" });
|
||||||
|
this.saveFile(filename, content);
|
||||||
|
this.logger.info(`已保存文件:${filename}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
formatCert(pem: string) {
|
||||||
|
pem = pem.replace(/\r/g, "");
|
||||||
|
pem = pem.replace(/\n\n/g, "\n");
|
||||||
|
pem = pem.replace(/\n$/g, "");
|
||||||
|
return pem;
|
||||||
|
}
|
||||||
|
|
||||||
|
formatCerts(cert: { crt: string; key: string; csr: string }) {
|
||||||
|
const newCert: CertInfo = {
|
||||||
|
crt: this.formatCert(cert.crt),
|
||||||
|
key: this.formatCert(cert.key),
|
||||||
|
csr: this.formatCert(cert.csr),
|
||||||
|
};
|
||||||
|
return newCert;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,42 +1,10 @@
|
|||||||
import { AbstractTaskPlugin, IContext, NotificationBody, Step, TaskEmitter, TaskInput, TaskOutput } from "@certd/pipeline";
|
import { NotificationBody, Step, TaskInput } from "@certd/pipeline";
|
||||||
import dayjs from "dayjs";
|
import dayjs from "dayjs";
|
||||||
import type { CertInfo } from "./acme.js";
|
|
||||||
import { CertReader } from "./cert-reader.js";
|
import { CertReader } from "./cert-reader.js";
|
||||||
import JSZip from "jszip";
|
|
||||||
import { CertConverter } from "./convert.js";
|
|
||||||
import { pick } from "lodash-es";
|
import { pick } from "lodash-es";
|
||||||
|
import { CertApplyBaseConvertPlugin } from "./base-convert.js";
|
||||||
|
|
||||||
export const EVENT_CERT_APPLY_SUCCESS = "CertApply.success";
|
export abstract class CertApplyBasePlugin extends CertApplyBaseConvertPlugin {
|
||||||
|
|
||||||
export async function emitCertApplySuccess(emitter: TaskEmitter, cert: CertReader) {
|
|
||||||
await emitter.emit(EVENT_CERT_APPLY_SUCCESS, cert);
|
|
||||||
}
|
|
||||||
|
|
||||||
export abstract class CertApplyBasePlugin extends AbstractTaskPlugin {
|
|
||||||
@TaskInput({
|
|
||||||
title: "域名",
|
|
||||||
component: {
|
|
||||||
name: "a-select",
|
|
||||||
vModel: "value",
|
|
||||||
mode: "tags",
|
|
||||||
open: false,
|
|
||||||
placeholder: "foo.com / *.foo.com / *.bar.com",
|
|
||||||
tokenSeparators: [",", " ", ",", "、", "|"],
|
|
||||||
},
|
|
||||||
rules: [{ type: "domains" }],
|
|
||||||
required: true,
|
|
||||||
col: {
|
|
||||||
span: 24,
|
|
||||||
},
|
|
||||||
order: -999,
|
|
||||||
helper:
|
|
||||||
"1、支持多个域名打到一个证书上,例如: foo.com,*.foo.com,*.bar.com\n" +
|
|
||||||
"2、子域名被通配符包含的不要填写,例如:www.foo.com已经被*.foo.com包含,不要填写www.foo.com\n" +
|
|
||||||
"3、泛域名只能通配*号那一级(*.foo.com的证书不能用于xxx.yyy.foo.com、不能用于foo.com)\n" +
|
|
||||||
"4、输入一个,空格之后,再输入下一个",
|
|
||||||
})
|
|
||||||
domains!: string[];
|
|
||||||
|
|
||||||
@TaskInput({
|
@TaskInput({
|
||||||
title: "邮箱",
|
title: "邮箱",
|
||||||
component: {
|
component: {
|
||||||
@@ -50,36 +18,6 @@ export abstract class CertApplyBasePlugin extends AbstractTaskPlugin {
|
|||||||
})
|
})
|
||||||
email!: string;
|
email!: string;
|
||||||
|
|
||||||
@TaskInput({
|
|
||||||
title: "证书密码",
|
|
||||||
component: {
|
|
||||||
name: "input-password",
|
|
||||||
vModel: "value",
|
|
||||||
},
|
|
||||||
required: false,
|
|
||||||
order: 100,
|
|
||||||
helper: "PFX、jks格式证书是否加密\njks必须设置密码,不传则默认123456",
|
|
||||||
})
|
|
||||||
pfxPassword!: string;
|
|
||||||
|
|
||||||
@TaskInput({
|
|
||||||
title: "PFX证书转换参数",
|
|
||||||
value: "-macalg SHA1 -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES",
|
|
||||||
component: {
|
|
||||||
name: "a-auto-complete",
|
|
||||||
vModel: "value",
|
|
||||||
options: [
|
|
||||||
{ value: "", label: "兼容 Windows Server 最新" },
|
|
||||||
{ value: "-macalg SHA1 -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES", label: "兼容 Windows Server 2016" },
|
|
||||||
{ value: "-nomac -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES", label: "兼容 Windows Server 2008" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
required: false,
|
|
||||||
order: 100,
|
|
||||||
helper: "兼容Windows Server各个版本",
|
|
||||||
})
|
|
||||||
pfxArgs = "-macalg SHA1 -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES";
|
|
||||||
|
|
||||||
@TaskInput({
|
@TaskInput({
|
||||||
title: "更新天数",
|
title: "更新天数",
|
||||||
value: 35,
|
value: 35,
|
||||||
@@ -111,14 +49,6 @@ export abstract class CertApplyBasePlugin extends AbstractTaskPlugin {
|
|||||||
// })
|
// })
|
||||||
csrInfo!: string;
|
csrInfo!: string;
|
||||||
|
|
||||||
userContext!: IContext;
|
|
||||||
lastStatus!: Step;
|
|
||||||
|
|
||||||
@TaskOutput({
|
|
||||||
title: "域名证书",
|
|
||||||
})
|
|
||||||
cert?: CertInfo;
|
|
||||||
|
|
||||||
async onInstance() {
|
async onInstance() {
|
||||||
this.userContext = this.ctx.userContext;
|
this.userContext = this.ctx.userContext;
|
||||||
this.lastStatus = this.ctx.lastStatus as Step;
|
this.lastStatus = this.ctx.lastStatus as Step;
|
||||||
@@ -139,7 +69,7 @@ export abstract class CertApplyBasePlugin extends AbstractTaskPlugin {
|
|||||||
if (cert != null) {
|
if (cert != null) {
|
||||||
await this.output(cert, true);
|
await this.output(cert, true);
|
||||||
|
|
||||||
await emitCertApplySuccess(this.ctx.emitter, cert);
|
await this.emitCertApplySuccess();
|
||||||
//清空后续任务的状态,让后续任务能够重新执行
|
//清空后续任务的状态,让后续任务能够重新执行
|
||||||
this.clearLastStatus();
|
this.clearLastStatus();
|
||||||
|
|
||||||
@@ -151,89 +81,6 @@ export abstract class CertApplyBasePlugin extends AbstractTaskPlugin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async output(certReader: CertReader, isNew: boolean) {
|
|
||||||
const cert: CertInfo = certReader.toCertInfo();
|
|
||||||
this.cert = cert;
|
|
||||||
|
|
||||||
this._result.pipelineVars.certExpiresTime = dayjs(certReader.detail.notAfter).valueOf();
|
|
||||||
if (!this._result.pipelinePrivateVars) {
|
|
||||||
this._result.pipelinePrivateVars = {};
|
|
||||||
}
|
|
||||||
this._result.pipelinePrivateVars.cert = cert;
|
|
||||||
|
|
||||||
if (isNew) {
|
|
||||||
try {
|
|
||||||
const converter = new CertConverter({ logger: this.logger });
|
|
||||||
const res = await converter.convert({
|
|
||||||
cert,
|
|
||||||
pfxPassword: this.pfxPassword,
|
|
||||||
pfxArgs: this.pfxArgs,
|
|
||||||
});
|
|
||||||
if (cert.pfx == null && res.pfx) {
|
|
||||||
cert.pfx = res.pfx;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cert.der == null && res.der) {
|
|
||||||
cert.der = res.der;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cert.jks == null && res.jks) {
|
|
||||||
cert.jks = res.jks;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.logger.info("转换证书格式成功");
|
|
||||||
} catch (e) {
|
|
||||||
this.logger.error("转换证书格式失败", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isNew) {
|
|
||||||
const zipFileName = certReader.buildCertFileName("zip", certReader.detail.notBefore);
|
|
||||||
await this.zipCert(cert, zipFileName);
|
|
||||||
} else {
|
|
||||||
this.extendsFiles();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async zipCert(cert: CertInfo, filename: string) {
|
|
||||||
const zip = new JSZip();
|
|
||||||
zip.file("证书.pem", cert.crt);
|
|
||||||
zip.file("私钥.pem", cert.key);
|
|
||||||
zip.file("中间证书.pem", cert.ic);
|
|
||||||
zip.file("cert.crt", cert.crt);
|
|
||||||
zip.file("cert.key", cert.key);
|
|
||||||
zip.file("intermediate.crt", cert.ic);
|
|
||||||
zip.file("origin.crt", cert.oc);
|
|
||||||
zip.file("one.pem", cert.one);
|
|
||||||
if (cert.pfx) {
|
|
||||||
zip.file("cert.pfx", Buffer.from(cert.pfx, "base64"));
|
|
||||||
}
|
|
||||||
if (cert.der) {
|
|
||||||
zip.file("cert.der", Buffer.from(cert.der, "base64"));
|
|
||||||
}
|
|
||||||
if (cert.jks) {
|
|
||||||
zip.file("cert.jks", Buffer.from(cert.jks, "base64"));
|
|
||||||
}
|
|
||||||
|
|
||||||
zip.file(
|
|
||||||
"说明.txt",
|
|
||||||
`证书文件说明
|
|
||||||
cert.crt:证书文件,包含证书链,pem格式
|
|
||||||
cert.key:私钥文件,pem格式
|
|
||||||
intermediate.crt:中间证书文件,pem格式
|
|
||||||
origin.crt:原始证书文件,不含证书链,pem格式
|
|
||||||
one.pem: 证书和私钥简单合并成一个文件,pem格式,crt正文+key正文
|
|
||||||
cert.pfx:pfx格式证书文件,iis服务器使用
|
|
||||||
cert.der:der格式证书文件
|
|
||||||
cert.jks:jks格式证书文件,java服务器使用
|
|
||||||
`
|
|
||||||
);
|
|
||||||
|
|
||||||
const content = await zip.generateAsync({ type: "nodebuffer" });
|
|
||||||
this.saveFile(filename, content);
|
|
||||||
this.logger.info(`已保存文件:${filename}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 是否更新证书
|
* 是否更新证书
|
||||||
*/
|
*/
|
||||||
@@ -279,22 +126,6 @@ cert.jks:jks格式证书文件,java服务器使用
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
formatCert(pem: string) {
|
|
||||||
pem = pem.replace(/\r/g, "");
|
|
||||||
pem = pem.replace(/\n\n/g, "\n");
|
|
||||||
pem = pem.replace(/\n$/g, "");
|
|
||||||
return pem;
|
|
||||||
}
|
|
||||||
|
|
||||||
formatCerts(cert: { crt: string; key: string; csr: string }) {
|
|
||||||
const newCert: CertInfo = {
|
|
||||||
crt: this.formatCert(cert.crt),
|
|
||||||
key: this.formatCert(cert.key),
|
|
||||||
csr: this.formatCert(cert.csr),
|
|
||||||
};
|
|
||||||
return newCert;
|
|
||||||
}
|
|
||||||
|
|
||||||
async readLastCert(): Promise<CertReader | undefined> {
|
async readLastCert(): Promise<CertReader | undefined> {
|
||||||
const cert = this.lastStatus?.status?.output?.cert;
|
const cert = this.lastStatus?.status?.output?.cert;
|
||||||
if (cert == null) {
|
if (cert == null) {
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ export class CertReader {
|
|||||||
cert: CertInfo;
|
cert: CertInfo;
|
||||||
|
|
||||||
detail: CertificateInfo;
|
detail: CertificateInfo;
|
||||||
|
//毫秒时间戳
|
||||||
expires: number;
|
expires: number;
|
||||||
constructor(certInfo: CertInfo) {
|
constructor(certInfo: CertInfo) {
|
||||||
this.cert = certInfo;
|
this.cert = certInfo;
|
||||||
@@ -39,9 +40,13 @@ export class CertReader {
|
|||||||
this.cert.one = this.cert.crt + "\n" + this.cert.key;
|
this.cert.one = this.cert.crt + "\n" + this.cert.key;
|
||||||
}
|
}
|
||||||
|
|
||||||
const { detail, expires } = this.getCrtDetail(this.cert.crt);
|
try {
|
||||||
this.detail = detail;
|
const { detail, expires } = this.getCrtDetail(this.cert.crt);
|
||||||
this.expires = expires.getTime();
|
this.detail = detail;
|
||||||
|
this.expires = expires.getTime();
|
||||||
|
} catch (e) {
|
||||||
|
throw new Error("证书解析失败:" + e.message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getIc() {
|
getIc() {
|
||||||
|
|||||||
@@ -0,0 +1,158 @@
|
|||||||
|
import { IsTaskPlugin, pluginGroups, RunStrategy, Step, TaskInput, TaskOutput } from "@certd/pipeline";
|
||||||
|
import type { CertInfo } from "../acme.js";
|
||||||
|
import { CertReader } from "../cert-reader.js";
|
||||||
|
import { CertApplyBaseConvertPlugin } from "../base-convert.js";
|
||||||
|
import dayjs from "dayjs";
|
||||||
|
|
||||||
|
export { CertReader };
|
||||||
|
export type { CertInfo };
|
||||||
|
@IsTaskPlugin({
|
||||||
|
name: "CertApplyUpload",
|
||||||
|
icon: "ph:certificate",
|
||||||
|
title: "证书手动上传",
|
||||||
|
group: pluginGroups.cert.key,
|
||||||
|
desc: "在证书仓库手动上传后触发部署证书",
|
||||||
|
default: {
|
||||||
|
strategy: {
|
||||||
|
runStrategy: RunStrategy.AlwaysRun,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
shortcut: {
|
||||||
|
certUpdate: {
|
||||||
|
title: "更新证书",
|
||||||
|
icon: "ion:upload",
|
||||||
|
action: "onCertUpdate",
|
||||||
|
form: {
|
||||||
|
columns: {
|
||||||
|
crt: {
|
||||||
|
title: "证书",
|
||||||
|
type: "text",
|
||||||
|
form: {
|
||||||
|
component: {
|
||||||
|
name: "pem-input",
|
||||||
|
vModel: "modelValue",
|
||||||
|
textarea: {
|
||||||
|
rows: 4,
|
||||||
|
placeholder: "-----BEGIN CERTIFICATE-----\n...\n...\n-----END CERTIFICATE-----",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
rules: [{ required: true, message: "此项必填" }],
|
||||||
|
col: { span: 24 },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
key: {
|
||||||
|
title: "私钥",
|
||||||
|
type: "text",
|
||||||
|
form: {
|
||||||
|
component: {
|
||||||
|
name: "pem-input",
|
||||||
|
vModel: "modelValue",
|
||||||
|
textarea: {
|
||||||
|
rows: 4,
|
||||||
|
placeholder: "-----BEGIN PRIVATE KEY-----\n...\n...\n-----END PRIVATE KEY----- ",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
rules: [{ required: true, message: "此项必填" }],
|
||||||
|
col: { span: 24 },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
export class CertApplyUploadPlugin extends CertApplyBaseConvertPlugin {
|
||||||
|
@TaskInput({
|
||||||
|
title: "手动上传证书",
|
||||||
|
component: {
|
||||||
|
name: "cert-info-updater",
|
||||||
|
vModel: "modelValue",
|
||||||
|
},
|
||||||
|
helper: "手动上传证书",
|
||||||
|
order: -9999,
|
||||||
|
required: true,
|
||||||
|
mergeScript: `
|
||||||
|
return {
|
||||||
|
component:{
|
||||||
|
on:{
|
||||||
|
updated(scope){
|
||||||
|
scope.form.input.domains = scope.$event?.domains
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
})
|
||||||
|
uploadCert!: CertInfo;
|
||||||
|
|
||||||
|
@TaskOutput({
|
||||||
|
title: "证书MD5",
|
||||||
|
})
|
||||||
|
certMd5?: string;
|
||||||
|
|
||||||
|
async onInstance() {
|
||||||
|
this.accessService = this.ctx.accessService;
|
||||||
|
this.logger = this.ctx.logger;
|
||||||
|
this.userContext = this.ctx.userContext;
|
||||||
|
this.lastStatus = this.ctx.lastStatus as Step;
|
||||||
|
}
|
||||||
|
async onInit(): Promise<void> {}
|
||||||
|
|
||||||
|
async getCertFromStore() {
|
||||||
|
const certReader = new CertReader(this.uploadCert);
|
||||||
|
if (!certReader.expires && certReader.expires < new Date().getTime()) {
|
||||||
|
throw new Error("证书已过期,停止部署,请重新上传证书");
|
||||||
|
}
|
||||||
|
|
||||||
|
return certReader;
|
||||||
|
}
|
||||||
|
|
||||||
|
async execute(): Promise<string | void> {
|
||||||
|
const certReader = await this.getCertFromStore();
|
||||||
|
const crtMd5 = this.ctx.utils.hash.md5(certReader.cert.crt);
|
||||||
|
|
||||||
|
const leftDays = dayjs(certReader.expires).diff(dayjs(), "day");
|
||||||
|
this.logger.info(`证书过期时间${dayjs(certReader.expires).format("YYYY-MM-DD HH:mm:ss")},剩余${leftDays}天`);
|
||||||
|
|
||||||
|
if (!this.ctx.inputChanged) {
|
||||||
|
this.logger.info("输入参数无变化");
|
||||||
|
const lastCrtMd5 = this.lastStatus?.status?.output?.certMd5;
|
||||||
|
this.logger.info("证书MD5", crtMd5);
|
||||||
|
this.logger.info("上次证书MD5", lastCrtMd5);
|
||||||
|
if (lastCrtMd5 === crtMd5) {
|
||||||
|
this.logger.info("证书无变化,跳过");
|
||||||
|
//输出证书MD5
|
||||||
|
this.certMd5 = crtMd5;
|
||||||
|
await this.output(certReader, false);
|
||||||
|
return "skip";
|
||||||
|
}
|
||||||
|
this.logger.info("证书有变化,重新部署");
|
||||||
|
} else {
|
||||||
|
this.logger.info("输入参数有变化,重新部署");
|
||||||
|
}
|
||||||
|
|
||||||
|
this.clearLastStatus();
|
||||||
|
//输出证书MD5
|
||||||
|
this.certMd5 = crtMd5;
|
||||||
|
await this.output(certReader, true);
|
||||||
|
|
||||||
|
//必须output之后执行
|
||||||
|
await this.emitCertApplySuccess();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
async onCertUpdate(data: any) {
|
||||||
|
const certReader = new CertReader(data);
|
||||||
|
return {
|
||||||
|
input: {
|
||||||
|
uploadCert: {
|
||||||
|
crt: data.crt,
|
||||||
|
key: data.key,
|
||||||
|
},
|
||||||
|
domains: certReader.getAllDomains(),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
new CertApplyUploadPlugin();
|
||||||
@@ -66,7 +66,7 @@ export class CertApplyPlugin extends CertApplyBasePlugin {
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
required: true,
|
required: true,
|
||||||
helper: `DNS直接验证:域名是在阿里云、腾讯云、华为云、Cloudflare、NameSilo、西数注册的,选它;
|
helper: `DNS直接验证:域名是在阿里云、腾讯云、华为云、Cloudflare、NameSilo、西数、dns.la注册的,选它;
|
||||||
CNAME代理验证:支持任何注册商注册的域名,但第一次需要手动添加CNAME记录;
|
CNAME代理验证:支持任何注册商注册的域名,但第一次需要手动添加CNAME记录;
|
||||||
HTTP文件验证:不支持泛域名,需要配置网站文件上传`,
|
HTTP文件验证:不支持泛域名,需要配置网站文件上传`,
|
||||||
})
|
})
|
||||||
@@ -203,8 +203,7 @@ HTTP文件验证:不支持泛域名,需要配置网站文件上传`,
|
|||||||
},
|
},
|
||||||
maybeNeed: true,
|
maybeNeed: true,
|
||||||
required: false,
|
required: false,
|
||||||
helper:
|
helper: "google服务账号授权与EAB授权选填其中一个,[服务账号授权获取方法](https://certd.docmirror.cn/guide/use/google/)\n服务账号授权需要配置代理或者服务器本身在海外",
|
||||||
"google服务账号授权与EAB授权选填其中一个,[服务账号授权获取方法](https://certd.docmirror.cn/guide/use/google/)\n服务账号授权需要配置代理或者服务器本身在海外",
|
|
||||||
mergeScript: `
|
mergeScript: `
|
||||||
return {
|
return {
|
||||||
show: ctx.compute(({form})=>{
|
show: ctx.compute(({form})=>{
|
||||||
@@ -268,6 +267,17 @@ HTTP文件验证:不支持泛域名,需要配置网站文件上传`,
|
|||||||
})
|
})
|
||||||
skipLocalVerify = false;
|
skipLocalVerify = false;
|
||||||
|
|
||||||
|
@TaskInput({
|
||||||
|
title: "检查解析重试次数",
|
||||||
|
value: 20,
|
||||||
|
component: {
|
||||||
|
name: "a-input-number",
|
||||||
|
vModel: "value",
|
||||||
|
},
|
||||||
|
helper: "检查域名验证解析记录重试次数,如果你的域名服务商解析生效速度慢,可以适当增加此值",
|
||||||
|
})
|
||||||
|
maxCheckRetryCount = 20;
|
||||||
|
|
||||||
acme!: AcmeService;
|
acme!: AcmeService;
|
||||||
|
|
||||||
eab!: EabAccess;
|
eab!: EabAccess;
|
||||||
@@ -314,6 +324,7 @@ HTTP文件验证:不支持泛域名,需要配置网站文件上传`,
|
|||||||
reverseProxy: this.reverseProxy,
|
reverseProxy: this.reverseProxy,
|
||||||
privateKeyType: this.privateKeyType,
|
privateKeyType: this.privateKeyType,
|
||||||
signal: this.ctx.signal,
|
signal: this.ctx.signal,
|
||||||
|
maxCheckRetryCount: this.maxCheckRetryCount,
|
||||||
// cnameProxyService: this.ctx.cnameProxyService,
|
// cnameProxyService: this.ctx.cnameProxyService,
|
||||||
// dnsProviderCreator: this.createDnsProvider.bind(this),
|
// dnsProviderCreator: this.createDnsProvider.bind(this),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,2 +1,6 @@
|
|||||||
|
export { EVENT_CERT_APPLY_SUCCESS } from "./cert-plugin/base-convert.js";
|
||||||
|
|
||||||
export * from "./cert-plugin/index.js";
|
export * from "./cert-plugin/index.js";
|
||||||
export * from "./cert-plugin/lego/index.js";
|
export * from "./cert-plugin/lego/index.js";
|
||||||
|
export * from "./cert-plugin/custom/index.js";
|
||||||
|
export const CertApplyPluginNames = ["CertApply", "CertApplyLego", "CertApplyUpload"];
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
"@typescript-eslint/ban-ts-ignore": "off",
|
"@typescript-eslint/ban-ts-ignore": "off",
|
||||||
"@typescript-eslint/no-explicit-any": "off",
|
"@typescript-eslint/no-explicit-any": "off",
|
||||||
"@typescript-eslint/no-empty-function": "off",
|
"@typescript-eslint/no-empty-function": "off",
|
||||||
// "no-unused-expressions": "off",
|
"@typescript-eslint/no-unused-vars": "off"
|
||||||
"max-len": [0, 160, 2, { "ignoreUrls": true }]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
{
|
{
|
||||||
"printWidth": 160
|
"printWidth": 220,
|
||||||
|
"bracketSpacing": true,
|
||||||
|
"singleQuote": false,
|
||||||
|
"trailingComma": "es5",
|
||||||
|
"arrowParens": "avoid"
|
||||||
}
|
}
|
||||||
@@ -3,6 +3,56 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-lib
|
||||||
|
|
||||||
|
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 上传到主机支持scp方式 ([05b6159](https://github.com/certd/certd/commit/05b6159802b9e85b6a410361b60b5c28875b48e7))
|
||||||
|
|
||||||
|
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-lib
|
||||||
|
|
||||||
|
## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 流水线增加上传证书快捷方式 ([425bba6](https://github.com/certd/certd/commit/425bba67c539b734e2a85a83a4f9ecc9b2434fb4))
|
||||||
|
|
||||||
|
## [1.31.3](https://github.com/certd/certd/compare/v1.31.2...v1.31.3) (2025-03-13)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 支持部署到天翼云CDN ([82a72e0](https://github.com/certd/certd/commit/82a72e0b497efa043d342ad0e33c083a2de79a05))
|
||||||
|
|
||||||
|
## [1.31.2](https://github.com/certd/certd/compare/v1.31.1...v1.31.2) (2025-03-12)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-lib
|
||||||
|
|
||||||
|
## [1.31.1](https://github.com/certd/certd/compare/v1.31.0...v1.31.1) (2025-03-11)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-lib
|
||||||
|
|
||||||
|
# [1.31.0](https://github.com/certd/certd/compare/v1.30.6...v1.31.0) (2025-03-10)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-lib
|
||||||
|
|
||||||
|
## [1.30.6](https://github.com/certd/certd/compare/v1.30.5...v1.30.6) (2025-02-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-lib
|
||||||
|
|
||||||
|
## [1.30.5](https://github.com/certd/certd/compare/v1.30.4...v1.30.5) (2025-02-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-lib
|
||||||
|
|
||||||
|
## [1.30.4](https://github.com/certd/certd/compare/v1.30.3...v1.30.4) (2025-02-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-lib
|
||||||
|
|
||||||
## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)
|
## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/plugin-lib
|
**Note:** Version bump only for package @certd/plugin-lib
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/plugin-lib",
|
"name": "@certd/plugin-lib",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.30.3",
|
"version": "1.31.7",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"types": "./dist/index.d.ts",
|
"types": "./dist/index.d.ts",
|
||||||
@@ -16,8 +16,8 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@alicloud/pop-core": "^1.7.10",
|
"@alicloud/pop-core": "^1.7.10",
|
||||||
"@certd/basic": "^1.30.3",
|
"@certd/basic": "^1.31.7",
|
||||||
"@certd/pipeline": "^1.30.3",
|
"@certd/pipeline": "^1.31.7",
|
||||||
"@kubernetes/client-node": "0.21.0",
|
"@kubernetes/client-node": "0.21.0",
|
||||||
"ali-oss": "^6.21.0",
|
"ali-oss": "^6.21.0",
|
||||||
"basic-ftp": "^5.0.5",
|
"basic-ftp": "^5.0.5",
|
||||||
@@ -37,8 +37,8 @@
|
|||||||
"@types/chai": "^4.3.3",
|
"@types/chai": "^4.3.3",
|
||||||
"@types/mocha": "^10.0.0",
|
"@types/mocha": "^10.0.0",
|
||||||
"@types/psl": "^1.1.3",
|
"@types/psl": "^1.1.3",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.38.1",
|
"@typescript-eslint/eslint-plugin": "^8.26.1",
|
||||||
"@typescript-eslint/parser": "^5.38.1",
|
"@typescript-eslint/parser": "^8.26.1",
|
||||||
"chai": "^4.3.6",
|
"chai": "^4.3.6",
|
||||||
"eslint": "^8.24.0",
|
"eslint": "^8.24.0",
|
||||||
"eslint-config-prettier": "^8.5.0",
|
"eslint-config-prettier": "^8.5.0",
|
||||||
@@ -48,5 +48,5 @@
|
|||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "bcacafeb84cf2798a6733ee58b48ecc9bffdafb9"
|
"gitHead": "86ca35ce3381b98b455538b11219d9856be5d0d6"
|
||||||
}
|
}
|
||||||
|
|||||||
31
packages/plugins/plugin-lib/src/ctyun/access/ctyun-access.ts
Normal file
31
packages/plugins/plugin-lib/src/ctyun/access/ctyun-access.ts
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
import { IsAccess, AccessInput, BaseAccess } from "@certd/pipeline";
|
||||||
|
|
||||||
|
@IsAccess({
|
||||||
|
name: "ctyun",
|
||||||
|
title: "天翼云授权",
|
||||||
|
desc: "",
|
||||||
|
icon: "ant-design:aliyun-outlined",
|
||||||
|
})
|
||||||
|
export class CtyunAccess extends BaseAccess {
|
||||||
|
@AccessInput({
|
||||||
|
title: "accessKeyId",
|
||||||
|
component: {
|
||||||
|
placeholder: "accessKeyId",
|
||||||
|
},
|
||||||
|
helper: "[前往创建天翼云AccessKey](https://iam.ctyun.cn/myAccessKey)",
|
||||||
|
required: true,
|
||||||
|
})
|
||||||
|
accessKeyId = "";
|
||||||
|
@AccessInput({
|
||||||
|
title: "securityKey",
|
||||||
|
component: {
|
||||||
|
placeholder: "securityKey",
|
||||||
|
},
|
||||||
|
required: true,
|
||||||
|
encrypt: true,
|
||||||
|
helper: "",
|
||||||
|
})
|
||||||
|
securityKey = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
new CtyunAccess();
|
||||||
1
packages/plugins/plugin-lib/src/ctyun/index.ts
Normal file
1
packages/plugins/plugin-lib/src/ctyun/index.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export * from "./access/ctyun-access.js";
|
||||||
@@ -4,3 +4,4 @@ export * from "./common/index.js";
|
|||||||
export * from "./ftp/index.js";
|
export * from "./ftp/index.js";
|
||||||
export * from "./tencent/index.js";
|
export * from "./tencent/index.js";
|
||||||
export * from "./qiniu/index.js";
|
export * from "./qiniu/index.js";
|
||||||
|
export * from "./ctyun/index.js";
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import { SshAccess } from "./ssh-access.js";
|
|||||||
import stripAnsi from "strip-ansi";
|
import stripAnsi from "strip-ansi";
|
||||||
import { SocksClient } from "socks";
|
import { SocksClient } from "socks";
|
||||||
import { SocksProxy, SocksProxyType } from "socks/typings/common/constants.js";
|
import { SocksProxy, SocksProxyType } from "socks/typings/common/constants.js";
|
||||||
|
import fs from "fs";
|
||||||
|
|
||||||
export type TransportItem = { localPath: string; remotePath: string };
|
export type TransportItem = { localPath: string; remotePath: string };
|
||||||
|
|
||||||
export class AsyncSsh2Client {
|
export class AsyncSsh2Client {
|
||||||
@@ -61,7 +63,17 @@ export class AsyncSsh2Client {
|
|||||||
this.conn = conn;
|
this.conn = conn;
|
||||||
resolve(this.conn);
|
resolve(this.conn);
|
||||||
})
|
})
|
||||||
.connect(this.connConf);
|
.connect({
|
||||||
|
...this.connConf,
|
||||||
|
algorithms: {
|
||||||
|
kex: [
|
||||||
|
"ecdh-sha2-nistp256",
|
||||||
|
"diffie-hellman-group1-sha1",
|
||||||
|
"diffie-hellman-group14-sha1", // 示例:添加服务器支持的旧算法
|
||||||
|
"diffie-hellman-group-exchange-sha256",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
reject(e);
|
reject(e);
|
||||||
}
|
}
|
||||||
@@ -255,15 +267,15 @@ export class SshClient {
|
|||||||
}
|
}
|
||||||
* @param options
|
* @param options
|
||||||
*/
|
*/
|
||||||
async uploadFiles(options: { connectConf: SshAccess; transports: TransportItem[]; mkdirs: boolean; opts?: { mode?: string } }) {
|
async uploadFiles(options: { connectConf: SshAccess; transports: TransportItem[]; mkdirs: boolean; opts?: { mode?: string }; uploadType?: string }) {
|
||||||
const { connectConf, transports, mkdirs, opts } = options;
|
const { connectConf, transports, mkdirs, opts } = options;
|
||||||
await this._call({
|
await this._call({
|
||||||
connectConf,
|
connectConf,
|
||||||
callable: async (conn: AsyncSsh2Client) => {
|
callable: async (conn: AsyncSsh2Client) => {
|
||||||
const sftp = await conn.getSftp();
|
|
||||||
this.logger.info("开始上传");
|
this.logger.info("开始上传");
|
||||||
for (const transport of transports) {
|
if (mkdirs !== false) {
|
||||||
if (mkdirs !== false) {
|
this.logger.info("初始化父目录");
|
||||||
|
for (const transport of transports) {
|
||||||
const filePath = path.dirname(transport.remotePath);
|
const filePath = path.dirname(transport.remotePath);
|
||||||
let mkdirCmd = `mkdir -p ${filePath} `;
|
let mkdirCmd = `mkdir -p ${filePath} `;
|
||||||
if (conn.windows) {
|
if (conn.windows) {
|
||||||
@@ -281,13 +293,60 @@ export class SshClient {
|
|||||||
}
|
}
|
||||||
await conn.exec(mkdirCmd);
|
await conn.exec(mkdirCmd);
|
||||||
}
|
}
|
||||||
await conn.fastPut({ sftp, ...transport, opts });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (options.uploadType === "sftp") {
|
||||||
|
const sftp = await conn.getSftp();
|
||||||
|
for (const transport of transports) {
|
||||||
|
await conn.fastPut({ sftp, ...transport, opts });
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//scp
|
||||||
|
for (const transport of transports) {
|
||||||
|
await this.scpUpload({ conn, ...transport, opts });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.logger.info("文件全部上传成功");
|
this.logger.info("文件全部上传成功");
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async scpUpload(options: { conn: any; localPath: string; remotePath: string; opts?: { mode?: string } }) {
|
||||||
|
const { conn, localPath, remotePath } = options;
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
// 关键步骤:构造 SCP 命令
|
||||||
|
try {
|
||||||
|
this.logger.info(`开始上传:${localPath} => ${remotePath}`);
|
||||||
|
conn.conn.exec(
|
||||||
|
`scp -t ${remotePath}`, // -t 表示目标模式
|
||||||
|
(err, stream) => {
|
||||||
|
if (err) {
|
||||||
|
return reject(err);
|
||||||
|
}
|
||||||
|
// 准备 SCP 协议头
|
||||||
|
const fileStats = fs.statSync(localPath);
|
||||||
|
const fileName = path.basename(localPath);
|
||||||
|
|
||||||
|
// SCP 协议格式:C[权限] [文件大小] [文件名]\n
|
||||||
|
stream.write(`C0644 ${fileStats.size} ${fileName}\n`);
|
||||||
|
|
||||||
|
// 通过管道传输文件
|
||||||
|
fs.createReadStream(localPath)
|
||||||
|
.pipe(stream)
|
||||||
|
.on("finish", () => {
|
||||||
|
this.logger.info(`上传文件成功:${localPath} => ${remotePath}`);
|
||||||
|
resolve(true);
|
||||||
|
})
|
||||||
|
.on("error", reject);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
reject(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
async removeFiles(opts: { connectConf: SshAccess; files: string[] }) {
|
async removeFiles(opts: { connectConf: SshAccess; files: string[] }) {
|
||||||
const { connectConf, files } = opts;
|
const { connectConf, files } = opts;
|
||||||
await this._call({
|
await this._call({
|
||||||
|
|||||||
@@ -9,4 +9,4 @@ VITE_APP_COPYRIGHT_URL=https://certd.handsfree.work
|
|||||||
VITE_APP_LOGO=/static/images/logo/logo.svg
|
VITE_APP_LOGO=/static/images/logo/logo.svg
|
||||||
VITE_APP_LOGIN_LOGO=/static/images/logo/rect-black.svg
|
VITE_APP_LOGIN_LOGO=/static/images/logo/rect-black.svg
|
||||||
VITE_APP_PROJECT_PATH=https://github.com/certd/certd
|
VITE_APP_PROJECT_PATH=https://github.com/certd/certd
|
||||||
|
VITE_APP_NAMESPACE=fs
|
||||||
@@ -3,34 +3,34 @@ module.exports = {
|
|||||||
env: {
|
env: {
|
||||||
browser: true,
|
browser: true,
|
||||||
node: true,
|
node: true,
|
||||||
es6: true
|
es6: true,
|
||||||
},
|
},
|
||||||
parser: "vue-eslint-parser",
|
parser: 'vue-eslint-parser',
|
||||||
parserOptions: {
|
parserOptions: {
|
||||||
parser: "@typescript-eslint/parser",
|
parser: '@typescript-eslint/parser',
|
||||||
ecmaVersion: 2020,
|
ecmaVersion: 2020,
|
||||||
sourceType: "module",
|
sourceType: 'module',
|
||||||
jsxPragma: "React",
|
jsxPragma: 'React',
|
||||||
ecmaFeatures: {
|
ecmaFeatures: {
|
||||||
jsx: true,
|
jsx: true,
|
||||||
tsx: true
|
tsx: true,
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
extends: ["plugin:vue/vue3-recommended", "plugin:@typescript-eslint/recommended", "plugin:prettier/recommended", "prettier"],
|
extends: ['plugin:vue/vue3-recommended', 'plugin:@typescript-eslint/recommended', 'plugin:prettier/recommended', 'prettier'],
|
||||||
rules: {
|
rules: {
|
||||||
//"max-len": [0, 200, 2, { ignoreUrls: true }],
|
//"max-len": [0, 200, 2, { ignoreUrls: true }],
|
||||||
"@typescript-eslint/no-unused-vars": "off",
|
'@typescript-eslint/no-unused-vars': 'off',
|
||||||
"no-unused-vars": "off",
|
'no-unused-vars': 'off',
|
||||||
"@typescript-eslint/ban-ts-ignore": "off",
|
'@typescript-eslint/ban-ts-ignore': 'off',
|
||||||
"@typescript-eslint/ban-ts-comment": "off",
|
'@typescript-eslint/ban-ts-comment': 'off',
|
||||||
"@typescript-eslint/ban-types": "off",
|
'@typescript-eslint/ban-types': 'off',
|
||||||
"@typescript-eslint/explicit-function-return-type": "off",
|
'@typescript-eslint/explicit-function-return-type': 'off',
|
||||||
"@typescript-eslint/no-explicit-any": "off",
|
'@typescript-eslint/no-explicit-any': 'off',
|
||||||
"@typescript-eslint/no-var-requires": "off",
|
'@typescript-eslint/no-var-requires': 'off',
|
||||||
"@typescript-eslint/no-empty-function": "off",
|
'@typescript-eslint/no-empty-function': 'off',
|
||||||
"@typescript-eslint/no-use-before-define": "off",
|
'@typescript-eslint/no-use-before-define': 'off',
|
||||||
"@typescript-eslint/no-non-null-assertion": "off",
|
'@typescript-eslint/no-non-null-assertion': 'off',
|
||||||
"@typescript-eslint/explicit-module-boundary-types": "off"
|
'@typescript-eslint/explicit-module-boundary-types': 'off',
|
||||||
// "@typescript-eslint/no-unused-vars": [
|
// "@typescript-eslint/no-unused-vars": [
|
||||||
// "error",
|
// "error",
|
||||||
// {
|
// {
|
||||||
@@ -69,5 +69,5 @@ module.exports = {
|
|||||||
// math: "always",
|
// math: "always",
|
||||||
// },
|
// },
|
||||||
// ],
|
// ],
|
||||||
}
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
|
"printWidth": 220,
|
||||||
"trailingComma": "none",
|
"bracketSpacing": true,
|
||||||
"printWidth": 160
|
"singleQuote": false,
|
||||||
|
"trailingComma": "es5",
|
||||||
|
"arrowParens": "avoid"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,84 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 增加服务器时间警告 ([d66ade4](https://github.com/certd/certd/commit/d66ade4e4783850b6c7625c6f164a5a0fc0aa509))
|
||||||
|
* 支持部署到lucky ([e18e399](https://github.com/certd/certd/commit/e18e399ce6529e8c7e36b56c5f674cfdbbd3d3d1))
|
||||||
|
|
||||||
|
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 优化图标 ([c56f48c](https://github.com/certd/certd/commit/c56f48c1e3c54c4e203fafb380d9091d75681b7e))
|
||||||
|
|
||||||
|
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复通知选择器无法选择的bug ([f7b88f9](https://github.com/certd/certd/commit/f7b88f9e3b7d9d9122e4fd2003a20c555bd50c7d))
|
||||||
|
* 修复证书流水线创建失败的bug ([736fe03](https://github.com/certd/certd/commit/736fe038ebda56648bcc4c12884a700341d2c049))
|
||||||
|
|
||||||
|
## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复站点监控通知通过webhook发送失败的bug ([9be1ecc](https://github.com/certd/certd/commit/9be1ecc8aab3ea23dd0dc2dab3688f4edb90ef2c))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 宝塔支持doker站点证书部署 ([589a373](https://github.com/certd/certd/commit/589a373142ef7f50d64d3aa767a90b1f4b64da93))
|
||||||
|
* 保存调整后的列宽 ([873f2b6](https://github.com/certd/certd/commit/873f2b618b9d7320045baf69d6da83afe48a780f))
|
||||||
|
* 创建证书流水线时,支持更多参数展开 ([36aa7f8](https://github.com/certd/certd/commit/36aa7f82b078a053a102331b3c6f132fb9d492f9))
|
||||||
|
* 流水线页面可以鼠标按住左右拖动 ([d85a02f](https://github.com/certd/certd/commit/d85a02feeb3183c5abd6c1ea790d5923a32d7271))
|
||||||
|
* 流水线增加上传证书快捷方式 ([425bba6](https://github.com/certd/certd/commit/425bba67c539b734e2a85a83a4f9ecc9b2434fb4))
|
||||||
|
* 手动上传证书部署流水线 ([fbb66f3](https://github.com/certd/certd/commit/fbb66f3c4389489aa8a43b194d82bc8cf391607b))
|
||||||
|
* 优化选择任务时手机版展示效果 ([d01004d](https://github.com/certd/certd/commit/d01004d53071a75ac91ee21cc96bde9369f77ff3))
|
||||||
|
* 站点证书监控支持模糊查询 ([0069c0e](https://github.com/certd/certd/commit/0069c0e3992946a8dd6410f299d4fc974ef0e76b))
|
||||||
|
* 支持飞书通知 ([b82e1dc](https://github.com/certd/certd/commit/b82e1dcd6217b09a7d7e21cd648bb31de320cadf))
|
||||||
|
* 支持手动上传证书并部署 ([a9fffa5](https://github.com/certd/certd/commit/a9fffa5180c83da27b35886aa2e858a92a2c5f94))
|
||||||
|
|
||||||
|
## [1.31.3](https://github.com/certd/certd/compare/v1.31.2...v1.31.3) (2025-03-13)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 套餐支持3天7天等选项 ([0d71a8e](https://github.com/certd/certd/commit/0d71a8ee501a0e5bb69decf07e8729026e9d85bf))
|
||||||
|
* 证书仓库增加有效期显示 ([be87124](https://github.com/certd/certd/commit/be87124ada7a093f281ca29a45c86b4ea4644ead))
|
||||||
|
* 支持部署到天翼云CDN ([82a72e0](https://github.com/certd/certd/commit/82a72e0b497efa043d342ad0e33c083a2de79a05))
|
||||||
|
|
||||||
|
## [1.31.2](https://github.com/certd/certd/compare/v1.31.1...v1.31.2) (2025-03-12)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/ui-client
|
||||||
|
|
||||||
|
## [1.31.1](https://github.com/certd/certd/compare/v1.31.0...v1.31.1) (2025-03-11)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 一些手机端适配优化 ([5b8d5dd](https://github.com/certd/certd/commit/5b8d5dd97536456a9d5d1384216eac1093b2dc3d))
|
||||||
|
|
||||||
|
# [1.31.0](https://github.com/certd/certd/compare/v1.30.6...v1.31.0) (2025-03-10)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 历史记录查看详情,可以切换到对应的历史记录日志上去 ([082802e](https://github.com/certd/certd/commit/082802e1197156837800f814728ee0f6b300b18c))
|
||||||
|
* 是否允许爬虫爬取增加ui设置选项 ([779db9d](https://github.com/certd/certd/commit/779db9da705d2dfef36fec21f52bd38af9fc5f2e))
|
||||||
|
* 易支付支持固定支付方式,适合没有收银台版本使用 ([81df96b](https://github.com/certd/certd/commit/81df96bf4542ce8d8ef4a428a4460dd554e4719a))
|
||||||
|
* 支持易盾RCDN部署 ([065713c](https://github.com/certd/certd/commit/065713cdb6953d16df08585c316c1a7a8eaec437))
|
||||||
|
|
||||||
|
## [1.30.6](https://github.com/certd/certd/compare/v1.30.5...v1.30.6) (2025-02-24)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/ui-client
|
||||||
|
|
||||||
|
## [1.30.5](https://github.com/certd/certd/compare/v1.30.4...v1.30.5) (2025-02-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/ui-client
|
||||||
|
|
||||||
|
## [1.30.4](https://github.com/certd/certd/compare/v1.30.3...v1.30.4) (2025-02-14)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/ui-client
|
||||||
|
|
||||||
## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)
|
## [1.30.3](https://github.com/certd/certd/compare/v1.30.2...v1.30.3) (2025-02-13)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/ui-client
|
**Note:** Version bump only for package @certd/ui-client
|
||||||
|
|||||||
@@ -13,6 +13,11 @@ https://github.com/fast-crud/fs-server-js
|
|||||||
* [fs-admin-naive](https://github.com/fast-crud/fs-admin-naive-ui) naive版示例
|
* [fs-admin-naive](https://github.com/fast-crud/fs-admin-naive-ui) naive版示例
|
||||||
* [fs-in-vben-starter](https://github.com/fast-crud/fs-in-vben-starter) vben示例
|
* [fs-in-vben-starter](https://github.com/fast-crud/fs-in-vben-starter) vben示例
|
||||||
|
|
||||||
|
# build
|
||||||
|
|
||||||
|
```sh
|
||||||
|
set NODE_OPTIONS=--max-old-space-size=32768 && npm run build
|
||||||
|
```
|
||||||
# 感谢
|
# 感谢
|
||||||
|
|
||||||
### 依赖
|
### 依赖
|
||||||
|
|||||||
254
packages/ui/certd-client/build/tailwind-config/index.mjs
Normal file
254
packages/ui/certd-client/build/tailwind-config/index.mjs
Normal file
@@ -0,0 +1,254 @@
|
|||||||
|
import path from "node:path";
|
||||||
|
|
||||||
|
import { addDynamicIconSelectors } from "@iconify/tailwind";
|
||||||
|
import { getPackagesSync } from "@manypkg/get-packages";
|
||||||
|
import typographyPlugin from "@tailwindcss/typography";
|
||||||
|
import animate from "tailwindcss-animate";
|
||||||
|
|
||||||
|
import { enterAnimationPlugin } from "./plugins/entry.mjs";
|
||||||
|
|
||||||
|
// import defaultTheme from 'tailwindcss/defaultTheme';
|
||||||
|
|
||||||
|
const { packages } = getPackagesSync(process.cwd());
|
||||||
|
|
||||||
|
const tailwindPackages = [];
|
||||||
|
|
||||||
|
packages.forEach((pkg) => {
|
||||||
|
// apps目录下和 @vben-core/tailwind-ui 包需要使用到 tailwindcss ui
|
||||||
|
// if (fs.existsSync(path.join(pkg.dir, 'tailwind.config.mjs'))) {
|
||||||
|
tailwindPackages.push(pkg.dir);
|
||||||
|
// }
|
||||||
|
});
|
||||||
|
|
||||||
|
const shadcnUiColors = {
|
||||||
|
accent: {
|
||||||
|
DEFAULT: "hsl(var(--accent))",
|
||||||
|
foreground: "hsl(var(--accent-foreground))",
|
||||||
|
hover: "hsl(var(--accent-hover))",
|
||||||
|
lighter: "has(val(--accent-lighter))"
|
||||||
|
},
|
||||||
|
background: {
|
||||||
|
deep: "hsl(var(--background-deep))",
|
||||||
|
DEFAULT: "hsl(var(--background))"
|
||||||
|
},
|
||||||
|
border: {
|
||||||
|
DEFAULT: "hsl(var(--border))"
|
||||||
|
},
|
||||||
|
card: {
|
||||||
|
DEFAULT: "hsl(var(--card))",
|
||||||
|
foreground: "hsl(var(--card-foreground))"
|
||||||
|
},
|
||||||
|
destructive: {
|
||||||
|
...createColorsPalette("destructive"),
|
||||||
|
DEFAULT: "hsl(var(--destructive))"
|
||||||
|
},
|
||||||
|
|
||||||
|
foreground: {
|
||||||
|
DEFAULT: "hsl(var(--foreground))"
|
||||||
|
},
|
||||||
|
|
||||||
|
input: {
|
||||||
|
background: "hsl(var(--input-background))",
|
||||||
|
DEFAULT: "hsl(var(--input))"
|
||||||
|
},
|
||||||
|
muted: {
|
||||||
|
DEFAULT: "hsl(var(--muted))",
|
||||||
|
foreground: "hsl(var(--muted-foreground))"
|
||||||
|
},
|
||||||
|
popover: {
|
||||||
|
DEFAULT: "hsl(var(--popover))",
|
||||||
|
foreground: "hsl(var(--popover-foreground))"
|
||||||
|
},
|
||||||
|
primary: {
|
||||||
|
...createColorsPalette("primary"),
|
||||||
|
DEFAULT: "hsl(var(--primary))"
|
||||||
|
},
|
||||||
|
|
||||||
|
ring: "hsl(var(--ring))",
|
||||||
|
secondary: {
|
||||||
|
DEFAULT: "hsl(var(--secondary))",
|
||||||
|
desc: "hsl(var(--secondary-desc))",
|
||||||
|
foreground: "hsl(var(--secondary-foreground))"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const customColors = {
|
||||||
|
green: {
|
||||||
|
...createColorsPalette("green"),
|
||||||
|
foreground: "hsl(var(--success-foreground))"
|
||||||
|
},
|
||||||
|
header: {
|
||||||
|
DEFAULT: "hsl(var(--header))"
|
||||||
|
},
|
||||||
|
heavy: {
|
||||||
|
DEFAULT: "hsl(var(--heavy))",
|
||||||
|
foreground: "hsl(var(--heavy-foreground))"
|
||||||
|
},
|
||||||
|
main: {
|
||||||
|
DEFAULT: "hsl(var(--main))"
|
||||||
|
},
|
||||||
|
overlay: {
|
||||||
|
content: "hsl(var(--overlay-content))",
|
||||||
|
DEFAULT: "hsl(var(--overlay))"
|
||||||
|
},
|
||||||
|
red: {
|
||||||
|
...createColorsPalette("red"),
|
||||||
|
foreground: "hsl(var(--destructive-foreground))"
|
||||||
|
},
|
||||||
|
sidebar: {
|
||||||
|
deep: "hsl(var(--sidebar-deep))",
|
||||||
|
DEFAULT: "hsl(var(--sidebar))"
|
||||||
|
},
|
||||||
|
success: {
|
||||||
|
...createColorsPalette("success"),
|
||||||
|
DEFAULT: "hsl(var(--success))"
|
||||||
|
},
|
||||||
|
warning: {
|
||||||
|
...createColorsPalette("warning"),
|
||||||
|
DEFAULT: "hsl(var(--warning))"
|
||||||
|
},
|
||||||
|
yellow: {
|
||||||
|
...createColorsPalette("yellow"),
|
||||||
|
foreground: "hsl(var(--warning-foreground))"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default {
|
||||||
|
content: ["./index.html", ...tailwindPackages.map((item) => path.join(item, "src/**/*.{vue,js,ts,jsx,tsx,svelte,astro,html}"))],
|
||||||
|
darkMode: "selector",
|
||||||
|
plugins: [animate, typographyPlugin, addDynamicIconSelectors(), enterAnimationPlugin],
|
||||||
|
prefix: "",
|
||||||
|
theme: {
|
||||||
|
container: {
|
||||||
|
center: true,
|
||||||
|
padding: "2rem",
|
||||||
|
screens: {
|
||||||
|
"2xl": "1400px"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
extend: {
|
||||||
|
animation: {
|
||||||
|
"accordion-down": "accordion-down 0.2s ease-out",
|
||||||
|
"accordion-up": "accordion-up 0.2s ease-out",
|
||||||
|
"collapsible-down": "collapsible-down 0.2s ease-in-out",
|
||||||
|
"collapsible-up": "collapsible-up 0.2s ease-in-out",
|
||||||
|
float: "float 5s linear 0ms infinite"
|
||||||
|
},
|
||||||
|
|
||||||
|
animationDuration: {
|
||||||
|
2000: "2000ms",
|
||||||
|
3000: "3000ms"
|
||||||
|
},
|
||||||
|
borderRadius: {
|
||||||
|
lg: "var(--radius)",
|
||||||
|
md: "calc(var(--radius) - 2px)",
|
||||||
|
sm: "calc(var(--radius) - 4px)",
|
||||||
|
xl: "calc(var(--radius) + 4px)"
|
||||||
|
},
|
||||||
|
boxShadow: {
|
||||||
|
float: `0 6px 16px 0 rgb(0 0 0 / 8%),
|
||||||
|
0 3px 6px -4px rgb(0 0 0 / 12%),
|
||||||
|
0 9px 28px 8px rgb(0 0 0 / 5%)`
|
||||||
|
},
|
||||||
|
colors: {
|
||||||
|
...customColors,
|
||||||
|
...shadcnUiColors
|
||||||
|
},
|
||||||
|
fontFamily: {
|
||||||
|
sans: [
|
||||||
|
"var(--font-family)"
|
||||||
|
// ...defaultTheme.fontFamily.sans
|
||||||
|
]
|
||||||
|
},
|
||||||
|
keyframes: {
|
||||||
|
"accordion-down": {
|
||||||
|
from: { height: "0" },
|
||||||
|
to: { height: "var(--radix-accordion-content-height)" }
|
||||||
|
},
|
||||||
|
"accordion-up": {
|
||||||
|
from: { height: "var(--radix-accordion-content-height)" },
|
||||||
|
to: { height: "0" }
|
||||||
|
},
|
||||||
|
"collapsible-down": {
|
||||||
|
from: { height: "0" },
|
||||||
|
to: { height: "var(--radix-collapsible-content-height)" }
|
||||||
|
},
|
||||||
|
"collapsible-up": {
|
||||||
|
from: { height: "var(--radix-collapsible-content-height)" },
|
||||||
|
to: { height: "0" }
|
||||||
|
},
|
||||||
|
float: {
|
||||||
|
"0%": { transform: "translateY(0)" },
|
||||||
|
"50%": { transform: "translateY(-20px)" },
|
||||||
|
"100%": { transform: "translateY(0)" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
zIndex: {
|
||||||
|
100: "100",
|
||||||
|
1000: "1000"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
safelist: ["dark"]
|
||||||
|
};
|
||||||
|
|
||||||
|
function createColorsPalette(name) {
|
||||||
|
// backgroundLightest: '#EFF6FF', // Tailwind CSS 默认的 `blue-50`
|
||||||
|
// backgroundLighter: '#DBEAFE', // Tailwind CSS 默认的 `blue-100`
|
||||||
|
// backgroundLight: '#BFDBFE', // Tailwind CSS 默认的 `blue-200`
|
||||||
|
// borderLight: '#93C5FD', // Tailwind CSS 默认的 `blue-300`
|
||||||
|
// border: '#60A5FA', // Tailwind CSS 默认的 `blue-400`
|
||||||
|
// main: '#3B82F6', // Tailwind CSS 默认的 `blue-500`
|
||||||
|
// hover: '#2563EB', // Tailwind CSS 默认的 `blue-600`
|
||||||
|
// active: '#1D4ED8', // Tailwind CSS 默认的 `blue-700`
|
||||||
|
// backgroundDark: '#1E40AF', // Tailwind CSS 默认的 `blue-800`
|
||||||
|
// backgroundDarker: '#1E3A8A', // Tailwind CSS 默认的 `blue-900`
|
||||||
|
// backgroundDarkest: '#172554', // Tailwind CSS 默认的 `blue-950`
|
||||||
|
|
||||||
|
// • backgroundLightest (#EFF6FF): 适用于最浅的背景色,可能用于非常轻微的阴影或卡片的背景。
|
||||||
|
// • backgroundLighter (#DBEAFE): 适用于略浅的背景色,通常用于次要背景或略浅的区域。
|
||||||
|
// • backgroundLight (#BFDBFE): 适用于浅色背景,可能用于输入框或表单区域的背景。
|
||||||
|
// • borderLight (#93C5FD): 适用于浅色边框,可能用于输入框或卡片的边框。
|
||||||
|
// • border (#60A5FA): 适用于普通边框,可能用于按钮或卡片的边框。
|
||||||
|
// • main (#3B82F6): 适用于主要的主题色,通常用于按钮、链接或主要的强调色。
|
||||||
|
// • hover (#2563EB): 适用于鼠标悬停状态下的颜色,例如按钮悬停时的背景色或边框色。
|
||||||
|
// • active (#1D4ED8): 适用于激活状态下的颜色,例如按钮按下时的背景色或边框色。
|
||||||
|
// • backgroundDark (#1E40AF): 适用于深色背景,可能用于主要按钮或深色卡片背景。
|
||||||
|
// • backgroundDarker (#1E3A8A): 适用于更深的背景,通常用于头部导航栏或页脚。
|
||||||
|
// • backgroundDarkest (#172554): 适用于最深的背景,可能用于非常深色的区域或极端对比色。
|
||||||
|
|
||||||
|
return {
|
||||||
|
50: `hsl(var(--${name}-50))`,
|
||||||
|
100: `hsl(var(--${name}-100))`,
|
||||||
|
200: `hsl(var(--${name}-200))`,
|
||||||
|
300: `hsl(var(--${name}-300))`,
|
||||||
|
400: `hsl(var(--${name}-400))`,
|
||||||
|
500: `hsl(var(--${name}-500))`,
|
||||||
|
600: `hsl(var(--${name}-600))`,
|
||||||
|
700: `hsl(var(--${name}-700))`,
|
||||||
|
// 800: `hsl(var(--${name}-800))`,
|
||||||
|
// 900: `hsl(var(--${name}-900))`,
|
||||||
|
// 950: `hsl(var(--${name}-950))`,
|
||||||
|
// 激活状态下的颜色,适用于按钮按下时的背景色或边框色。
|
||||||
|
active: `hsl(var(--${name}-700))`,
|
||||||
|
// 浅色背景,适用于输入框或表单区域的背景。
|
||||||
|
"background-light": `hsl(var(--${name}-200))`,
|
||||||
|
// 适用于略浅的背景色,通常用于次要背景或略浅的区域。
|
||||||
|
"background-lighter": `hsl(var(--${name}-100))`,
|
||||||
|
// 最浅的背景色,适用于非常轻微的阴影或卡片的背景。
|
||||||
|
"background-lightest": `hsl(var(--${name}-50))`,
|
||||||
|
// 适用于普通边框,可能用于按钮或卡片的边框。
|
||||||
|
border: `hsl(var(--${name}-400))`,
|
||||||
|
// 浅色边框,适用于输入框或卡片的边框。
|
||||||
|
"border-light": `hsl(var(--${name}-300))`,
|
||||||
|
foreground: `hsl(var(--${name}-foreground))`,
|
||||||
|
// 鼠标悬停状态下的颜色,适用于按钮悬停时的背景色或边框色。
|
||||||
|
hover: `hsl(var(--${name}-600))`,
|
||||||
|
// 主色文本
|
||||||
|
text: `hsl(var(--${name}-500))`,
|
||||||
|
// 主色文本激活态
|
||||||
|
"text-active": `hsl(var(--${name}-700))`,
|
||||||
|
// 主色文本悬浮态
|
||||||
|
"text-hover": `hsl(var(--${name}-600))`
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
import plugin from "tailwindcss/plugin.js";
|
||||||
|
|
||||||
|
const enterAnimationPlugin = plugin(({ addUtilities }) => {
|
||||||
|
const maxChild = 5;
|
||||||
|
const utilities = {};
|
||||||
|
for (let i = 1; i <= maxChild; i++) {
|
||||||
|
const baseDelay = 0.1;
|
||||||
|
const delay = `${baseDelay * i}s`;
|
||||||
|
|
||||||
|
utilities[`.enter-x:nth-child(${i})`] = {
|
||||||
|
animation: `enter-x-animation 0.3s ease-in-out ${delay} forwards`,
|
||||||
|
opacity: "0",
|
||||||
|
transform: `translateX(50px)`
|
||||||
|
};
|
||||||
|
|
||||||
|
utilities[`.enter-y:nth-child(${i})`] = {
|
||||||
|
animation: `enter-y-animation 0.3s ease-in-out ${delay} forwards`,
|
||||||
|
opacity: "0",
|
||||||
|
transform: `translateY(50px)`
|
||||||
|
};
|
||||||
|
|
||||||
|
utilities[`.-enter-x:nth-child(${i})`] = {
|
||||||
|
animation: `enter-x-animation 0.3s ease-in-out ${delay} forwards`,
|
||||||
|
opacity: "0",
|
||||||
|
transform: `translateX(-50px)`
|
||||||
|
};
|
||||||
|
|
||||||
|
utilities[`.-enter-y:nth-child(${i})`] = {
|
||||||
|
animation: `enter-y-animation 0.3s ease-in-out ${delay} forwards`,
|
||||||
|
opacity: "0",
|
||||||
|
transform: `translateY(-50px)`
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// 添加动画关键帧
|
||||||
|
addUtilities(utilities);
|
||||||
|
addUtilities({
|
||||||
|
"@keyframes enter-x-animation": {
|
||||||
|
to: {
|
||||||
|
opacity: "1",
|
||||||
|
transform: "translateX(0)"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@keyframes enter-y-animation": {
|
||||||
|
to: {
|
||||||
|
opacity: "1",
|
||||||
|
transform: "translateY(0)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
export { enterAnimationPlugin };
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
import config from ".";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
plugins: {
|
||||||
|
...(process.env.NODE_ENV === "production" ? { cssnano: {} } : {}),
|
||||||
|
// Specifying the config is not necessary in most cases, but it is included
|
||||||
|
autoprefixer: {},
|
||||||
|
// 修复 element-plus 和 ant-design-vue 的样式和tailwindcss冲突问题
|
||||||
|
"postcss-antd-fixes": { prefixes: ["ant", "el"] },
|
||||||
|
"postcss-import": {},
|
||||||
|
"postcss-preset-env": {},
|
||||||
|
tailwindcss: { config },
|
||||||
|
"tailwindcss/nesting": {}
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@certd/ui-client",
|
"name": "@certd/ui-client",
|
||||||
"version": "1.30.3",
|
"version": "1.31.7",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite --open",
|
"dev": "vite --open",
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
"debug": "vite --mode debug --open",
|
"debug": "vite --mode debug --open",
|
||||||
"debug:pm": "vite --mode debugpm",
|
"debug:pm": "vite --mode debugpm",
|
||||||
"debug:force": "vite --force --mode debug",
|
"debug:force": "vite --force --mode debug",
|
||||||
"build": " vite build ",
|
"build": "vite build ",
|
||||||
"dev-build": "echo 1",
|
"dev-build": "echo 1",
|
||||||
"test:unit": "vitest",
|
"test:unit": "vitest",
|
||||||
"serve": "vite preview",
|
"serve": "vite preview",
|
||||||
@@ -21,53 +21,83 @@
|
|||||||
"circle:check": "pnpm dependency-cruise --validate --output-type err-html -f dependency-report.html src",
|
"circle:check": "pnpm dependency-cruise --validate --output-type err-html -f dependency-report.html src",
|
||||||
"afterPubPush": "git add . && git commit -m \"build: publish success\" && git push"
|
"afterPubPush": "git add . && git commit -m \"build: publish success\" && git push"
|
||||||
},
|
},
|
||||||
"author": "Greper",
|
"author": "greper",
|
||||||
"license": "AGPL-3.0",
|
"license": "AGPL-3.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ant-design/colors": "^7.0.2",
|
"@ant-design/colors": "^7.0.2",
|
||||||
"@ant-design/icons-vue": "^6.1.0",
|
"@ant-design/icons-vue": "^7.0.1",
|
||||||
"@fast-crud/fast-crud": "^1.25.0",
|
"@aws-sdk/client-s3": "^3.535.0",
|
||||||
"@fast-crud/fast-extends": "^1.25.0",
|
"@aws-sdk/s3-request-presigner": "^3.535.0",
|
||||||
"@fast-crud/ui-antdv4": "^1.25.0",
|
"@ctrl/tinycolor": "^4.1.0",
|
||||||
"@fast-crud/ui-interface": "^1.25.0",
|
"@fast-crud/fast-crud": "^1.25.4",
|
||||||
|
"@fast-crud/fast-extends": "^1.25.4",
|
||||||
|
"@fast-crud/ui-antdv4": "^1.25.4",
|
||||||
|
"@fast-crud/ui-interface": "^1.25.4",
|
||||||
|
"@iconify/tailwind": "^1.2.0",
|
||||||
"@iconify/vue": "^4.1.1",
|
"@iconify/vue": "^4.1.1",
|
||||||
|
"@manypkg/get-packages": "^2.2.2",
|
||||||
"@soerenmartius/vue3-clipboard": "^0.1.2",
|
"@soerenmartius/vue3-clipboard": "^0.1.2",
|
||||||
|
"@tailwindcss/nesting": "0.0.0-insiders.565cd3e",
|
||||||
|
"@tailwindcss/typography": "^0.5.16",
|
||||||
|
"@tanstack/vue-store": "^0.7.0",
|
||||||
|
"@vee-validate/zod": "^4.15.0",
|
||||||
"@vue-js-cron/light": "^4.0.5",
|
"@vue-js-cron/light": "^4.0.5",
|
||||||
"ant-design-vue": "^4.1.2",
|
"@vue/shared": "^3.5.13",
|
||||||
|
"@vueuse/core": "^10.11.0",
|
||||||
|
"ant-design-vue": "^4.2.6",
|
||||||
"async-validator": "^4.2.5",
|
"async-validator": "^4.2.5",
|
||||||
"axios": "^1.7.2",
|
"axios": "^1.7.2",
|
||||||
"axios-mock-adapter": "^1.22.0",
|
"axios-mock-adapter": "^1.22.0",
|
||||||
"base64-js": "^1.5.1",
|
"base64-js": "^1.5.1",
|
||||||
"better-scroll": "^2.5.1",
|
"better-scroll": "^2.5.1",
|
||||||
"china-division": "^2.7.0",
|
"china-division": "^2.7.0",
|
||||||
|
"class-variance-authority": "^0.7.1",
|
||||||
|
"clsx": "^2.1.1",
|
||||||
"core-js": "^3.36.0",
|
"core-js": "^3.36.0",
|
||||||
"cos-js-sdk-v5": "^1.7.0",
|
"cos-js-sdk-v5": "^1.7.0",
|
||||||
"cron-parser": "^4.9.0",
|
"cron-parser": "^4.9.0",
|
||||||
"cropperjs": "^1.6.1",
|
"cropperjs": "^1.6.1",
|
||||||
|
"cssnano": "^7.0.6",
|
||||||
"dayjs": "^1.11.7",
|
"dayjs": "^1.11.7",
|
||||||
|
"defu": "^6.1.4",
|
||||||
"echarts": "^5.5.1",
|
"echarts": "^5.5.1",
|
||||||
"highlight.js": "^11.9.0",
|
"highlight.js": "^11.9.0",
|
||||||
"humanize-duration": "^3.27.3",
|
"humanize-duration": "^3.27.3",
|
||||||
"lodash-es": "^4.17.21",
|
"lodash-es": "^4.17.21",
|
||||||
|
"lucide-vue-next": "^0.477.0",
|
||||||
"mitt": "^3.0.1",
|
"mitt": "^3.0.1",
|
||||||
"nanoid": "^4.0.0",
|
"nanoid": "^4.0.0",
|
||||||
|
"node-forge": "^1.3.1",
|
||||||
"nprogress": "^0.2.0",
|
"nprogress": "^0.2.0",
|
||||||
"object-assign": "^4.1.1",
|
"object-assign": "^4.1.1",
|
||||||
"pinia": "2.1.7",
|
"pinia": "2.1.7",
|
||||||
|
"pinia-plugin-persistedstate": "^4.2.0",
|
||||||
|
"postcss-antd-fixes": "^0.2.0",
|
||||||
|
"postcss-import": "^16.1.0",
|
||||||
|
"postcss-preset-env": "^10.1.5",
|
||||||
"psl": "^1.9.0",
|
"psl": "^1.9.0",
|
||||||
"qiniu-js": "^3.4.2",
|
"qiniu-js": "^3.4.2",
|
||||||
"qrcode": "^1.5.4",
|
"qrcode": "^1.5.4",
|
||||||
"sortablejs": "^1.15.2",
|
"radix-vue": "^1.9.16",
|
||||||
|
"sortablejs": "^1.15.3",
|
||||||
|
"tailwind-merge": "^3.0.2",
|
||||||
|
"tailwindcss-animate": "^1.0.7",
|
||||||
|
"theme-colors": "^0.1.0",
|
||||||
|
"vee-validate": "^4.15.0",
|
||||||
|
"vitest": "^0.34.6",
|
||||||
"vue": "^3.4.21",
|
"vue": "^3.4.21",
|
||||||
"vue-cropperjs": "^5.0.0",
|
"vue-cropperjs": "^5.0.0",
|
||||||
"vue-echarts": "^7.0.3",
|
"vue-echarts": "^7.0.3",
|
||||||
"vue-i18n": "^9.10.2",
|
"vue-i18n": "^9.10.2",
|
||||||
"vue-router": "^4.3.0",
|
"vue-router": "^4.3.0",
|
||||||
"vuedraggable": "^4.1.0"
|
"vuedraggable": "^4.1.0",
|
||||||
|
"watermark-js-plus": "^1.5.8",
|
||||||
|
"zod": "^3.24.2",
|
||||||
|
"zod-defaults": "^0.1.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@certd/lib-iframe": "^1.30.3",
|
"@certd/lib-iframe": "^1.31.7",
|
||||||
"@certd/pipeline": "^1.30.3",
|
"@certd/pipeline": "^1.31.7",
|
||||||
"@rollup/plugin-commonjs": "^25.0.7",
|
"@rollup/plugin-commonjs": "^25.0.7",
|
||||||
"@rollup/plugin-node-resolve": "^15.2.3",
|
"@rollup/plugin-node-resolve": "^15.2.3",
|
||||||
"@types/chai": "^4.3.12",
|
"@types/chai": "^4.3.12",
|
||||||
@@ -83,7 +113,7 @@
|
|||||||
"@vue/compiler-sfc": "^3.4.21",
|
"@vue/compiler-sfc": "^3.4.21",
|
||||||
"@vue/eslint-config-typescript": "^13.0.0",
|
"@vue/eslint-config-typescript": "^13.0.0",
|
||||||
"@vue/test-utils": "^2.4.6",
|
"@vue/test-utils": "^2.4.6",
|
||||||
"autoprefixer": "^10.4.18",
|
"autoprefixer": "^10.4.20",
|
||||||
"caller-path": "^4.0.0",
|
"caller-path": "^4.0.0",
|
||||||
"chai": "^5.1.0",
|
"chai": "^5.1.0",
|
||||||
"dependency-cruiser": "^16.2.3",
|
"dependency-cruiser": "^16.2.3",
|
||||||
@@ -105,7 +135,7 @@
|
|||||||
"rollup-plugin-visualizer": "^5.12.0",
|
"rollup-plugin-visualizer": "^5.12.0",
|
||||||
"stylelint": "^15.11.0",
|
"stylelint": "^15.11.0",
|
||||||
"stylelint-order": "^6.0.4",
|
"stylelint-order": "^6.0.4",
|
||||||
"tailwindcss": "^3.4.1",
|
"tailwindcss": "^3.4.14",
|
||||||
"terser": "^5.29.2",
|
"terser": "^5.29.2",
|
||||||
"ts-node": "^10.9.2",
|
"ts-node": "^10.9.2",
|
||||||
"tslint": "^6.1.3",
|
"tslint": "^6.1.3",
|
||||||
@@ -114,6 +144,7 @@
|
|||||||
"vite": "^5.3.1",
|
"vite": "^5.3.1",
|
||||||
"vite-plugin-compression": "^0.5.1",
|
"vite-plugin-compression": "^0.5.1",
|
||||||
"vite-plugin-html": "^3.2.2",
|
"vite-plugin-html": "^3.2.2",
|
||||||
|
"vite-plugin-theme": "^0.8.6",
|
||||||
"vite-plugin-windicss": "^1.9.3",
|
"vite-plugin-windicss": "^1.9.3",
|
||||||
"vitest": "^2.1.2",
|
"vitest": "^2.1.2",
|
||||||
"vue-eslint-parser": "^9.4.2",
|
"vue-eslint-parser": "^9.4.2",
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
plugins: {
|
|
||||||
// tailwindcss: {},
|
|
||||||
autoprefixer: {}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
15
packages/ui/certd-client/postcss.config.mjs
Normal file
15
packages/ui/certd-client/postcss.config.mjs
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import config from "./build/tailwind-config/index.mjs";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
plugins: {
|
||||||
|
...(process.env.NODE_ENV === "production" ? { cssnano: {} } : {}),
|
||||||
|
// Specifying the config is not necessary in most cases, but it is included
|
||||||
|
autoprefixer: {},
|
||||||
|
// 修复 element-plus 和 ant-design-vue 的样式和tailwindcss冲突问题
|
||||||
|
"postcss-antd-fixes": { prefixes: ["ant", "el"] },
|
||||||
|
"postcss-import": {},
|
||||||
|
"postcss-preset-env": {},
|
||||||
|
tailwindcss: { config },
|
||||||
|
"tailwindcss/nesting": {}
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -54,6 +54,72 @@
|
|||||||
<div class="content unicode" style="display: block;">
|
<div class="content unicode" style="display: block;">
|
||||||
<ul class="icon_lists dib-box">
|
<ul class="icon_lists dib-box">
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont"></span>
|
||||||
|
<div class="name">plesk_</div>
|
||||||
|
<div class="code-name">&#xecc0;</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont"></span>
|
||||||
|
<div class="name">易支付-01</div>
|
||||||
|
<div class="code-name">&#xe741;</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont"></span>
|
||||||
|
<div class="name">1Panel</div>
|
||||||
|
<div class="code-name">&#xe606;</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont"></span>
|
||||||
|
<div class="name">西部数码</div>
|
||||||
|
<div class="code-name">&#xe73c;</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont"></span>
|
||||||
|
<div class="name">qnap</div>
|
||||||
|
<div class="code-name">&#xe607;</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont"></span>
|
||||||
|
<div class="name">proxmox</div>
|
||||||
|
<div class="code-name">&#xe9cc;</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont"></span>
|
||||||
|
<div class="name">aws</div>
|
||||||
|
<div class="code-name">&#xe604;</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont"></span>
|
||||||
|
<div class="name">uni-app</div>
|
||||||
|
<div class="code-name">&#xe602;</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont"></span>
|
||||||
|
<div class="name">lucky</div>
|
||||||
|
<div class="code-name">&#xe752;</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont"></span>
|
||||||
|
<div class="name">ctyun</div>
|
||||||
|
<div class="code-name">&#xe719;</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont"></span>
|
||||||
|
<div class="name">雷池</div>
|
||||||
|
<div class="code-name">&#xe748;</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
<li class="dib">
|
<li class="dib">
|
||||||
<span class="icon iconfont"></span>
|
<span class="icon iconfont"></span>
|
||||||
<div class="name">华为</div>
|
<div class="name">华为</div>
|
||||||
@@ -108,7 +174,7 @@
|
|||||||
<pre><code class="language-css"
|
<pre><code class="language-css"
|
||||||
>@font-face {
|
>@font-face {
|
||||||
font-family: 'iconfont';
|
font-family: 'iconfont';
|
||||||
src: url('iconfont.svg?t=1730278432006#iconfont') format('svg');
|
src: url('iconfont.svg?t=1742822771904#iconfont') format('svg');
|
||||||
}
|
}
|
||||||
</code></pre>
|
</code></pre>
|
||||||
<h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
|
<h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
|
||||||
@@ -134,6 +200,105 @@
|
|||||||
<div class="content font-class">
|
<div class="content font-class">
|
||||||
<ul class="icon_lists dib-box">
|
<ul class="icon_lists dib-box">
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont icon-plesk"></span>
|
||||||
|
<div class="name">
|
||||||
|
plesk_
|
||||||
|
</div>
|
||||||
|
<div class="code-name">.icon-plesk
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont icon-yizhifu"></span>
|
||||||
|
<div class="name">
|
||||||
|
易支付-01
|
||||||
|
</div>
|
||||||
|
<div class="code-name">.icon-yizhifu
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont icon-onepanel"></span>
|
||||||
|
<div class="name">
|
||||||
|
1Panel
|
||||||
|
</div>
|
||||||
|
<div class="code-name">.icon-onepanel
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont icon-xibushuma"></span>
|
||||||
|
<div class="name">
|
||||||
|
西部数码
|
||||||
|
</div>
|
||||||
|
<div class="code-name">.icon-xibushuma
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont icon-qnap"></span>
|
||||||
|
<div class="name">
|
||||||
|
qnap
|
||||||
|
</div>
|
||||||
|
<div class="code-name">.icon-qnap
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont icon-proxmox"></span>
|
||||||
|
<div class="name">
|
||||||
|
proxmox
|
||||||
|
</div>
|
||||||
|
<div class="code-name">.icon-proxmox
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont icon-aws"></span>
|
||||||
|
<div class="name">
|
||||||
|
aws
|
||||||
|
</div>
|
||||||
|
<div class="code-name">.icon-aws
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont icon-uniapp"></span>
|
||||||
|
<div class="name">
|
||||||
|
uni-app
|
||||||
|
</div>
|
||||||
|
<div class="code-name">.icon-uniapp
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont icon-lucky"></span>
|
||||||
|
<div class="name">
|
||||||
|
lucky
|
||||||
|
</div>
|
||||||
|
<div class="code-name">.icon-lucky
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont icon-ctyun"></span>
|
||||||
|
<div class="name">
|
||||||
|
ctyun
|
||||||
|
</div>
|
||||||
|
<div class="code-name">.icon-ctyun
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<span class="icon iconfont icon-safeline"></span>
|
||||||
|
<div class="name">
|
||||||
|
雷池
|
||||||
|
</div>
|
||||||
|
<div class="code-name">.icon-safeline
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
<li class="dib">
|
<li class="dib">
|
||||||
<span class="icon iconfont icon-huawei"></span>
|
<span class="icon iconfont icon-huawei"></span>
|
||||||
<div class="name">
|
<div class="name">
|
||||||
@@ -215,6 +380,94 @@
|
|||||||
<div class="content symbol">
|
<div class="content symbol">
|
||||||
<ul class="icon_lists dib-box">
|
<ul class="icon_lists dib-box">
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<svg class="icon svg-icon" aria-hidden="true">
|
||||||
|
<use xlink:href="#icon-plesk"></use>
|
||||||
|
</svg>
|
||||||
|
<div class="name">plesk_</div>
|
||||||
|
<div class="code-name">#icon-plesk</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<svg class="icon svg-icon" aria-hidden="true">
|
||||||
|
<use xlink:href="#icon-yizhifu"></use>
|
||||||
|
</svg>
|
||||||
|
<div class="name">易支付-01</div>
|
||||||
|
<div class="code-name">#icon-yizhifu</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<svg class="icon svg-icon" aria-hidden="true">
|
||||||
|
<use xlink:href="#icon-onepanel"></use>
|
||||||
|
</svg>
|
||||||
|
<div class="name">1Panel</div>
|
||||||
|
<div class="code-name">#icon-onepanel</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<svg class="icon svg-icon" aria-hidden="true">
|
||||||
|
<use xlink:href="#icon-xibushuma"></use>
|
||||||
|
</svg>
|
||||||
|
<div class="name">西部数码</div>
|
||||||
|
<div class="code-name">#icon-xibushuma</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<svg class="icon svg-icon" aria-hidden="true">
|
||||||
|
<use xlink:href="#icon-qnap"></use>
|
||||||
|
</svg>
|
||||||
|
<div class="name">qnap</div>
|
||||||
|
<div class="code-name">#icon-qnap</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<svg class="icon svg-icon" aria-hidden="true">
|
||||||
|
<use xlink:href="#icon-proxmox"></use>
|
||||||
|
</svg>
|
||||||
|
<div class="name">proxmox</div>
|
||||||
|
<div class="code-name">#icon-proxmox</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<svg class="icon svg-icon" aria-hidden="true">
|
||||||
|
<use xlink:href="#icon-aws"></use>
|
||||||
|
</svg>
|
||||||
|
<div class="name">aws</div>
|
||||||
|
<div class="code-name">#icon-aws</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<svg class="icon svg-icon" aria-hidden="true">
|
||||||
|
<use xlink:href="#icon-uniapp"></use>
|
||||||
|
</svg>
|
||||||
|
<div class="name">uni-app</div>
|
||||||
|
<div class="code-name">#icon-uniapp</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<svg class="icon svg-icon" aria-hidden="true">
|
||||||
|
<use xlink:href="#icon-lucky"></use>
|
||||||
|
</svg>
|
||||||
|
<div class="name">lucky</div>
|
||||||
|
<div class="code-name">#icon-lucky</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<svg class="icon svg-icon" aria-hidden="true">
|
||||||
|
<use xlink:href="#icon-ctyun"></use>
|
||||||
|
</svg>
|
||||||
|
<div class="name">ctyun</div>
|
||||||
|
<div class="code-name">#icon-ctyun</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dib">
|
||||||
|
<svg class="icon svg-icon" aria-hidden="true">
|
||||||
|
<use xlink:href="#icon-safeline"></use>
|
||||||
|
</svg>
|
||||||
|
<div class="name">雷池</div>
|
||||||
|
<div class="code-name">#icon-safeline</div>
|
||||||
|
</li>
|
||||||
|
|
||||||
<li class="dib">
|
<li class="dib">
|
||||||
<svg class="icon svg-icon" aria-hidden="true">
|
<svg class="icon svg-icon" aria-hidden="true">
|
||||||
<use xlink:href="#icon-huawei"></use>
|
<use xlink:href="#icon-huawei"></use>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
@font-face {
|
@font-face {
|
||||||
font-family: "iconfont"; /* Project id 4688792 */
|
font-family: "iconfont"; /* Project id 4688792 */
|
||||||
src: url('iconfont.svg?t=1730278432006#iconfont') format('svg');
|
src: url('iconfont.svg?t=1742822771904#iconfont') format('svg');
|
||||||
}
|
}
|
||||||
|
|
||||||
.iconfont {
|
.iconfont {
|
||||||
@@ -11,6 +11,50 @@
|
|||||||
-moz-osx-font-smoothing: grayscale;
|
-moz-osx-font-smoothing: grayscale;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.icon-plesk:before {
|
||||||
|
content: "\ecc0";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-yizhifu:before {
|
||||||
|
content: "\e741";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-onepanel:before {
|
||||||
|
content: "\e606";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-xibushuma:before {
|
||||||
|
content: "\e73c";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-qnap:before {
|
||||||
|
content: "\e607";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-proxmox:before {
|
||||||
|
content: "\e9cc";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-aws:before {
|
||||||
|
content: "\e604";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-uniapp:before {
|
||||||
|
content: "\e602";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-lucky:before {
|
||||||
|
content: "\e752";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-ctyun:before {
|
||||||
|
content: "\e719";
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-safeline:before {
|
||||||
|
content: "\e748";
|
||||||
|
}
|
||||||
|
|
||||||
.icon-huawei:before {
|
.icon-huawei:before {
|
||||||
content: "\e610";
|
content: "\e610";
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -5,6 +5,83 @@
|
|||||||
"css_prefix_text": "icon-",
|
"css_prefix_text": "icon-",
|
||||||
"description": "",
|
"description": "",
|
||||||
"glyphs": [
|
"glyphs": [
|
||||||
|
{
|
||||||
|
"icon_id": "27272666",
|
||||||
|
"name": "plesk_",
|
||||||
|
"font_class": "plesk",
|
||||||
|
"unicode": "ecc0",
|
||||||
|
"unicode_decimal": 60608
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "23930871",
|
||||||
|
"name": "易支付-01",
|
||||||
|
"font_class": "yizhifu",
|
||||||
|
"unicode": "e741",
|
||||||
|
"unicode_decimal": 59201
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "40476533",
|
||||||
|
"name": "1Panel",
|
||||||
|
"font_class": "onepanel",
|
||||||
|
"unicode": "e606",
|
||||||
|
"unicode_decimal": 58886
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "26435508",
|
||||||
|
"name": "西部数码",
|
||||||
|
"font_class": "xibushuma",
|
||||||
|
"unicode": "e73c",
|
||||||
|
"unicode_decimal": 59196
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "27487624",
|
||||||
|
"name": "qnap",
|
||||||
|
"font_class": "qnap",
|
||||||
|
"unicode": "e607",
|
||||||
|
"unicode_decimal": 58887
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "27268231",
|
||||||
|
"name": "proxmox",
|
||||||
|
"font_class": "proxmox",
|
||||||
|
"unicode": "e9cc",
|
||||||
|
"unicode_decimal": 59852
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "31636255",
|
||||||
|
"name": "aws",
|
||||||
|
"font_class": "aws",
|
||||||
|
"unicode": "e604",
|
||||||
|
"unicode_decimal": 58884
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "34071209",
|
||||||
|
"name": "uni-app",
|
||||||
|
"font_class": "uniapp",
|
||||||
|
"unicode": "e602",
|
||||||
|
"unicode_decimal": 58882
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "3467975",
|
||||||
|
"name": "lucky",
|
||||||
|
"font_class": "lucky",
|
||||||
|
"unicode": "e752",
|
||||||
|
"unicode_decimal": 59218
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "41854563",
|
||||||
|
"name": "ctyun",
|
||||||
|
"font_class": "ctyun",
|
||||||
|
"unicode": "e719",
|
||||||
|
"unicode_decimal": 59161
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon_id": "43757703",
|
||||||
|
"name": "雷池",
|
||||||
|
"font_class": "safeline",
|
||||||
|
"unicode": "e748",
|
||||||
|
"unicode_decimal": 59208
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"icon_id": "24164616",
|
"icon_id": "24164616",
|
||||||
"name": "华为",
|
"name": "华为",
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user