Compare commits

...

365 Commits

Author SHA1 Message Date
xiaojunnuo
bcacafeb84 v1.30.2 2025-02-09 16:09:40 +08:00
xiaojunnuo
2193ddfabe build: prepare to build 2025-02-09 16:07:13 +08:00
xiaojunnuo
29ae0b7dca build: prepare to build 2025-02-09 16:06:03 +08:00
xiaojunnuo
904837df12 chore: 2025-02-09 16:05:36 +08:00
xiaojunnuo
00c2da444f fix: 修复cloudflare删除解析记录报错的bug 2025-02-09 15:50:08 +08:00
xiaojunnuo
13d0dde9f4 chore: 2025-02-08 22:21:45 +08:00
xiaojunnuo
548f2a960c chore: 增加切换数据库文档 2025-02-08 22:16:27 +08:00
xiaojunnuo
71803f891d chore: 2025-01-24 20:02:11 +08:00
xiaojunnuo
75a38d95f3 perf: 上传自定义证书 2025-01-24 18:04:17 +08:00
xiaojunnuo
c89686a2fd fix: 当前置任务被删除时进行校验 2025-01-24 16:35:40 +08:00
xiaojunnuo
398323533a chore: 2025-01-22 15:43:37 +08:00
xiaojunnuo
a773872cf3 chore: 2025-01-22 15:35:46 +08:00
xiaojunnuo
2eb0d55f92 build: publish 2025-01-20 23:40:07 +08:00
xiaojunnuo
54bd1ad0fa build: trigger build image 2025-01-20 23:39:49 +08:00
xiaojunnuo
089825d360 v1.30.1 2025-01-20 23:37:28 +08:00
xiaojunnuo
333629caff build: prepare to build 2025-01-20 23:35:50 +08:00
xiaojunnuo
d715cd1129 chore: 2025-01-20 23:30:54 +08:00
xiaojunnuo
15d6eaf553 perf: http方式校验,选择sftp时,支持修改文件访问权限比如777 2025-01-20 23:29:03 +08:00
xiaojunnuo
ae5dfc3bee fix: 修复tg消息内容中存在.和*就会发送失败的bug 2025-01-20 18:45:07 +08:00
xiaojunnuo
6ab83b662a fix: 修复部署到阿里云ALB、NLB插件加载混乱的bug 2025-01-20 18:18:16 +08:00
xiaojunnuo
52ae6902d2 perf: 创建流水线时,默认成功时也发送通知 2025-01-20 16:20:14 +08:00
xiaojunnuo
c30adb2671 chore: 2025-01-20 11:55:13 +08:00
xiaojunnuo
e95d29f446 fix: 修复腾讯clb重复执行会报错的bug 2025-01-20 11:53:52 +08:00
xiaojunnuo
c20bb38b06 build: publish 2025-01-20 00:39:15 +08:00
xiaojunnuo
d0213d275d build: trigger build image 2025-01-20 00:38:54 +08:00
xiaojunnuo
9a78dad576 v1.30.0 2025-01-20 00:36:25 +08:00
xiaojunnuo
880f1aeb66 build: prepare to build 2025-01-20 00:34:48 +08:00
xiaojunnuo
e764eabd97 chore: 2025-01-20 00:34:33 +08:00
xiaojunnuo
235f9cf854 build: prepare to build 2025-01-20 00:30:50 +08:00
xiaojunnuo
d10795ecd9 perf: 支持部署证书到proxmox 2025-01-20 00:29:59 +08:00
xiaojunnuo
a7e45dace0 chore: 2025-01-19 23:27:39 +08:00
xiaojunnuo
7e482f798c fix: 修复查看任务日志偶发性无法自动滚动底部的bug 2025-01-19 23:13:30 +08:00
xiaojunnuo
c085bac5d8 perf: 支持部署到阿里云NLB、SLB 2025-01-19 22:55:46 +08:00
xiaojunnuo
653940a0ca perf: 支持部署到阿里云ALB 2025-01-19 15:31:37 +08:00
xiaojunnuo
417d37b199 perf: 支持部署到腾讯云直播 2025-01-19 14:12:16 +08:00
xiaojunnuo
3b2107a4f1 chore: 2025-01-19 01:21:58 +08:00
xiaojunnuo
7f6d03c02a chore: 2025-01-19 01:07:20 +08:00
xiaojunnuo
5fc07d4dd4 chore: 2025-01-19 00:40:43 +08:00
xiaojunnuo
3fb9524cbd Merge remote-tracking branch 'origin/v2-dev' into v2-dev 2025-01-19 00:37:26 +08:00
xiaojunnuo
e79703e49b chore: 2025-01-19 00:33:34 +08:00
xiaojunnuo
b829bd1341 Merge remote-tracking branch 'origin/v2-dev' into v2-dev 2025-01-16 11:49:38 +08:00
xiaojunnuo
8cbab7525a pref: 优化重置管理员密码后打印出用户名,避免忘记用户名的情况 2025-01-16 11:49:09 +08:00
xiaojunnuo
93b37a89c9 chore: 2025-01-15 23:13:17 +08:00
xiaojunnuo
87620b9072 chore: 2025-01-15 22:58:11 +08:00
xiaojunnuo
6877b865a7 chore: 2025-01-15 01:26:39 +08:00
xiaojunnuo
d6b3142a02 chore: 2025-01-15 01:26:23 +08:00
xiaojunnuo
14cdb54212 Merge remote-tracking branch 'origin/v2-dev' into v2-dev 2025-01-15 01:06:16 +08:00
xiaojunnuo
91e7f45a1c perf: 证书仓库 2025-01-15 01:05:34 +08:00
xiaojunnuo
709105120c Merge remote-tracking branch 'origin/v2-dev' into v2-dev 2025-01-14 15:09:16 +08:00
xiaojunnuo
865f26d75c fix: 修复namesilo ttl太短的问题 2025-01-14 14:47:03 +08:00
xiaojunnuo
52a4fd3318 feat: 支持open api接口,根据域名获取证书 2025-01-14 00:54:30 +08:00
xiaojunnuo
c6c269f9e4 chore: 2025-01-12 21:49:17 +08:00
xiaojunnuo
2a8eeaf240 build: publish 2025-01-07 23:19:36 +08:00
xiaojunnuo
f7dcff5113 build: trigger build image 2025-01-07 23:19:12 +08:00
xiaojunnuo
98a81385a6 v1.29.5 2025-01-07 23:16:46 +08:00
xiaojunnuo
7bdc277b58 build: prepare to build 2025-01-07 23:14:55 +08:00
xiaojunnuo
f57116d2be fix: 修复复制到本机插件,pfx格式复制时报错的bug 2025-01-07 23:13:44 +08:00
xiaojunnuo
85c99f7f80 fix: 修复授权管理,点击了查看原文按钮后,无法修改值的bug 2025-01-07 11:00:04 +08:00
xiaojunnuo
75081ceac3 build: publish 2025-01-07 00:02:42 +08:00
xiaojunnuo
65da3ca298 build: trigger build image 2025-01-07 00:02:21 +08:00
xiaojunnuo
94509c64b9 v1.29.4 2025-01-06 23:59:56 +08:00
xiaojunnuo
4f36d94726 build: prepare to build 2025-01-06 23:56:50 +08:00
xiaojunnuo
05c284b999 docs: 文档 2025-01-06 23:55:41 +08:00
xiaojunnuo
635b042690 perf: 优化腾讯云CLB插件,支持非sni情况,sni情况支持填写多个域名 2025-01-06 23:47:08 +08:00
xiaojunnuo
1cb4a539cc fix: 修复站点监控域名校验无法通过的bug 2025-01-06 23:08:16 +08:00
xiaojunnuo
46b87250b2 Merge remote-tracking branch 'origin/v2-dev' into v2-dev 2025-01-06 22:12:42 +08:00
xiaojunnuo
1a05355e54 docs: payments文档 2025-01-06 22:11:07 +08:00
xiaojunnuo
c81c17d17b chore: 2025-01-06 15:32:14 +08:00
xiaojunnuo
7b4f8d31e8 chore: db transform text改成longtext 2025-01-06 09:39:44 +08:00
xiaojunnuo
5cef28c5bd build: publish 2025-01-05 01:14:01 +08:00
xiaojunnuo
6e68da7936 build: trigger build image 2025-01-05 01:13:39 +08:00
xiaojunnuo
0c130f9596 v1.29.3 2025-01-05 01:11:06 +08:00
xiaojunnuo
f156f4cb4e build: prepare to build 2025-01-05 01:09:09 +08:00
xiaojunnuo
fa3bfa2ea8 chore: 2025-01-05 01:07:04 +08:00
xiaojunnuo
ab5c7bb75a chore: 2025-01-05 01:02:41 +08:00
xiaojunnuo
81b322cd60 chore: 2025-01-04 20:17:08 +08:00
xiaojunnuo
e6dd7cd54a perf: 优化站点证书检查页面,检查增加3次重试 2025-01-04 20:10:00 +08:00
xiaojunnuo
aa1da7c11a chore: 2025-01-04 01:46:49 +08:00
xiaojunnuo
3f74d4d9e5 perf: http校验方式,支持七牛云oss、阿里云oss、腾讯云cos 2025-01-04 01:45:24 +08:00
xiaojunnuo
297d09c5ad docs: 增加支付配置说明 2025-01-03 16:50:16 +08:00
xiaojunnuo
07e1dbb4cc chore: 2025-01-03 16:12:37 +08:00
xiaojunnuo
3c6618b4fc chore: 2025-01-03 09:27:51 +08:00
xiaojunnuo
54db744282 perf: 优化acme sdk 2025-01-03 01:17:20 +08:00
xiaojunnuo
03b751fa13 chore: 2025-01-03 00:12:15 +08:00
xiaojunnuo
ec342708b2 chore: 2025-01-02 17:48:54 +08:00
xiaojunnuo
405591c5d0 perf: 支持http校验方式申请证书 2025-01-02 00:28:13 +08:00
xiaojunnuo
67af67b92d chore: 2024-12-27 22:40:07 +08:00
xiaojunnuo
8644348fc4 fix: 修复系统级授权无法查看密钥的bug 2024-12-26 23:15:35 +08:00
xiaojunnuo
00dc226bd2 chore: auto-upgrade 2024-12-26 16:14:08 +08:00
xiaojunnuo
b6b7c3e2e0 chore: storage存储的数据量优化,去掉logs信息 2024-12-26 13:48:55 +08:00
xiaojunnuo
246ef348d3 chore: mysql text 改成longtext 2024-12-26 13:26:10 +08:00
xiaojunnuo
3e9ba1a30a docs: 2024-12-26 09:02:04 +08:00
xiaojunnuo
598cde4865 build: publish 2024-12-26 01:56:08 +08:00
xiaojunnuo
fc4a716b4e build: trigger build image 2024-12-26 01:55:50 +08:00
xiaojunnuo
ed5634ff83 v1.29.2 2024-12-26 01:53:32 +08:00
xiaojunnuo
884af1ea62 build: prepare to build 2024-12-26 01:51:48 +08:00
xiaojunnuo
01ad62df16 build: prepare to build 2024-12-26 01:49:48 +08:00
xiaojunnuo
512a667e44 Merge remote-tracking branch 'origin/v2-dev' into v2-dev 2024-12-26 01:47:50 +08:00
xiaojunnuo
d0e841f7de build: publish 2024-12-26 01:43:52 +08:00
xiaojunnuo
c04641d835 build: trigger build image 2024-12-26 01:43:35 +08:00
xiaojunnuo
f9128d4d45 v1.29.1 2024-12-26 01:41:20 +08:00
xiaojunnuo
2026211622 build: prepare to build 2024-12-26 01:39:23 +08:00
xiaojunnuo
9d0f21a9e5 chore: 2024-12-26 01:36:01 +08:00
xiaojunnuo
26adf7d437 perf: 优化插件名称显示 2024-12-26 01:32:52 +08:00
xiaojunnuo
d2d6f12218 fix: 修复某处金额转换丢失精度的bug 2024-12-26 01:01:28 +08:00
xiaojunnuo
b31c0b6a8d chore: 2024-12-25 23:24:42 +08:00
xiaojunnuo
472f06c2d1 perf: 用户创建证书流水线没有购买套餐或者超限时提前报错 2024-12-25 23:20:07 +08:00
xiaojunnuo
f5ec9870fd fix: 免费套餐支持购买 2024-12-25 17:05:24 +08:00
xiaojunnuo
66fb9e5f49 fix: 修复套餐关闭状态下,仍然限制用户流水线数量的bug 2024-12-25 11:42:42 +08:00
xiaojunnuo
a323f3aa2c chore: 2024-12-25 10:38:48 +08:00
xiaojunnuo
fe4786e168 fix: 修复新版本小红点显示错误问题 2024-12-25 09:25:27 +08:00
xiaojunnuo
83185c8c50 chore: 2024-12-25 01:16:32 +08:00
xiaojunnuo
83ae9db02d build: publish 2024-12-25 01:07:17 +08:00
xiaojunnuo
8bf328ca94 build: trigger build image 2024-12-25 01:06:48 +08:00
xiaojunnuo
36993cb6f8 v1.29.0 2024-12-25 01:04:12 +08:00
xiaojunnuo
c854415319 build: prepare to build 2024-12-25 01:02:01 +08:00
xiaojunnuo
aecc1cd979 build: prepare to build 2024-12-25 00:59:27 +08:00
xiaojunnuo
b2f3b0b584 build: prepare to build 2024-12-25 00:53:02 +08:00
xiaojunnuo
c937f5afc7 chore: 兼容数据库 2024-12-25 00:52:39 +08:00
xiaojunnuo
2d580a26af chore:menu.meta.show参数支持 2024-12-24 23:55:50 +08:00
xiaojunnuo
4a00a3cc1b chore: 2024-12-24 23:23:02 +08:00
xiaojunnuo
d3935219f2 perf: 调整创建证书表单字段的顺序 2024-12-24 23:14:12 +08:00
xiaojunnuo
040788c793 fix: 修复手机模式下,查询框被文字遮盖的bug 2024-12-24 17:52:03 +08:00
xiaojunnuo
005622307e fix: 修复左侧菜单收起时无法展开子菜单的bug 2024-12-24 17:09:06 +08:00
xiaojunnuo
8ebf95a222 perf: 同一时间只允许一个套餐生效 2024-12-24 10:39:54 +08:00
xiaojunnuo
7f596ed315 chore: 2024-12-24 01:16:27 +08:00
xiaojunnuo
ffa4de6911 chore: 2024-12-24 01:12:12 +08:00
xiaojunnuo
cb27d4b490 feat: 基础版不再限制流水线数量 2024-12-23 23:33:13 +08:00
xiaojunnuo
bb4910f4e5 perf: 站点证书监控通知发送,每天定时检查 2024-12-23 18:11:06 +08:00
xiaojunnuo
89c7f07034 perf: 用户名支持修改 2024-12-23 14:47:27 +08:00
xiaojunnuo
b150b2f034 chore: 2024-12-23 13:28:25 +08:00
xiaojunnuo
45d6347f5b feat: 支持微信支付 2024-12-23 13:27:04 +08:00
xiaojunnuo
67d762b6a5 perf: 优化证书申请跳过的状态显示,成功通知现在在跳过时不会发送 2024-12-23 00:49:56 +08:00
xiaojunnuo
faa28f88f9 feat: 套餐购买支持易支付、支付宝支付 2024-12-23 00:24:31 +08:00
xiaojunnuo
9c8c7a7812 feat: 站点证书监控 2024-12-22 14:01:10 +08:00
xiaojunnuo
a019956698 feat: 用户套餐,用户支付功能 2024-12-22 14:00:46 +08:00
xiaojunnuo
d70e2b66a3 chore: 2024-12-20 18:04:32 +08:00
xiaojunnuo
5d568efac3 chore: suite 2024-12-20 01:00:13 +08:00
xiaojunnuo
08111f1418 chore: 2024-12-19 22:37:27 +08:00
xiaojunnuo
45839f227a chore: suite 2024-12-19 01:21:55 +08:00
xiaojunnuo
8814ffeda6 Merge branch 'v2-dev' into v2-dev-suite 2024-12-18 21:28:38 +08:00
xiaojunnuo
d224c4c124 chore: 2024-12-18 21:25:39 +08:00
xiaojunnuo
549525fb37 chore: plesk ok 2024-12-18 10:22:22 +08:00
xiaojunnuo
1c8e25beb3 chore: suite 2024-12-18 09:07:52 +08:00
xiaojunnuo
eda45c1528 perf: 支持plesk网站证书部署 2024-12-18 00:38:27 +08:00
xiaojunnuo
53c38cf714 perf: 支持一体证书 2024-12-17 22:50:18 +08:00
xiaojunnuo
0e7578043e chore: 2024-12-17 22:45:14 +08:00
xiaojunnuo
21f50e0b38 Merge branch 'v2' into v2-dev 2024-12-17 22:22:19 +08:00
greper
515f00c7cd docs: 自动更新方法(@coolxitech)
Update README.md
2024-12-17 10:52:30 +08:00
xiaojunnuo
8057586dc1 chore: suite first 2024-12-17 10:27:35 +08:00
酷曦科技
b101ac7c7f Update README.md
Include the Docker compose configuration file content for automatic version updates.
2024-12-17 00:06:21 +08:00
xiaojunnuo
64319937a1 Merge remote-tracking branch 'origin/v2-dev' into v2-dev 2024-12-13 09:51:13 +08:00
xiaojunnuo
1c0cfd6769 build: publish 2024-12-13 00:19:43 +08:00
xiaojunnuo
f8e17d5285 build: trigger build image 2024-12-13 00:19:23 +08:00
xiaojunnuo
d4385ad8a5 v1.28.4 2024-12-13 00:17:10 +08:00
xiaojunnuo
da07ce419f build: prepare to build 2024-12-13 00:08:18 +08:00
xiaojunnuo
714e0206c4 build: prepare to build 2024-12-13 00:07:32 +08:00
xiaojunnuo
40da82666a chore: 2024-12-12 18:06:07 +08:00
xiaojunnuo
79f7ec4672 perf: 群晖支持6.x 2024-12-12 17:55:54 +08:00
xiaojunnuo
0f5c69040b fix: 修复证书成功通知发送失败的bug 2024-12-12 17:28:33 +08:00
xiaojunnuo
c9d1c45d97 docs: 证书成功同志 2024-12-12 16:49:40 +08:00
xiaojunnuo
ea8fdb120c docs: 证书说明 2024-12-12 16:45:40 +08:00
xiaojunnuo
f6fa830ffe docs: 2024-12-12 12:37:38 +08:00
xiaojunnuo
992e50c014 docs: 2024-12-12 12:30:26 +08:00
xiaojunnuo
bd705d91ba build: publish 2024-12-12 12:08:12 +08:00
xiaojunnuo
2656394195 build: trigger build image 2024-12-12 12:07:54 +08:00
xiaojunnuo
c8df9e698c v1.28.3 2024-12-12 12:06:46 +08:00
xiaojunnuo
19b78a1d2f build: prepare to build 2024-12-12 12:05:16 +08:00
xiaojunnuo
8039e8baf8 perf: 支持腾讯虚拟机开关机(@wujingke) 2024-12-12 11:50:01 +08:00
xiaojunnuo
9c5142c73c chore: 2024-12-12 11:42:46 +08:00
xiaojunnuo
8e3dcdde17 chore: tke挪出来 2024-12-11 22:17:11 +08:00
xiaojunnuo
34023adafb chore: 2024-12-11 17:40:34 +08:00
xiaojunnuo
79914e8d08 chore: 2024-12-11 15:06:02 +08:00
xiaojunnuo
454fbda581 perf: 点击版本红点按钮,跳转到升级帮助页面 2024-12-11 13:59:00 +08:00
xiaojunnuo
2c32703e6b chore: 2024-12-11 12:01:06 +08:00
xiaojunnuo
b561535626 Merge branch 'v2' into v2-dev 2024-12-11 11:48:34 +08:00
xiaojunnuo
1fc684d995 chore: 2024-12-11 11:48:05 +08:00
greper
7595d9fdfd pref: 腾讯云实例开机插件( @wujingke )
pr:  #265
2024-12-11 11:44:53 +08:00
w
3bf7732a21 腾讯云实例开机插件 2024-12-11 11:40:11 +08:00
xiaojunnuo
71b5aaf8ab chore: 2024-12-11 11:38:28 +08:00
xiaojunnuo
e1e5347476 chore: 2024-12-11 11:37:52 +08:00
xiaojunnuo
cdcdb6a2d9 chore: 2024-12-11 11:36:00 +08:00
xiaojunnuo
ec79104ad2 chore: 2024-12-11 11:33:33 +08:00
xiaojunnuo
ff083ce684 perf: 通知标题优化 2024-12-11 11:30:32 +08:00
xiaojunnuo
0f051e322e docs: upgrade 2024-12-11 10:25:16 +08:00
xiaojunnuo
657a2ae032 fix: 修复没有配置eab时,报order无法读取的问题 2024-12-11 09:30:21 +08:00
xiaojunnuo
0db3570026 chore: 2024-12-10 18:30:32 +08:00
xiaojunnuo
0ae39f160a perf: 支持aws cloudfront 2024-12-10 18:28:48 +08:00
xiaojunnuo
b45977c29a fix: 修复授权被删除后,无法清空的bug 2024-12-10 17:22:43 +08:00
xiaojunnuo
b7f5740c57 fix: mysql下access.setting字段改成text 2024-12-10 00:19:35 +08:00
xiaojunnuo
21e23369d3 chore: 2024-12-09 23:08:40 +08:00
xiaojunnuo
fca598991a chore: 2024-12-09 22:56:18 +08:00
xiaojunnuo
aa5b909486 build: publish 2024-12-09 22:53:08 +08:00
xiaojunnuo
0a888cf51a build: trigger build image 2024-12-09 22:52:44 +08:00
xiaojunnuo
e5c164065c v1.28.2 2024-12-09 22:45:02 +08:00
xiaojunnuo
8bc241ca14 build: prepare to build 2024-12-09 22:42:55 +08:00
xiaojunnuo
15beb79631 chore: 2024-12-09 22:40:17 +08:00
xiaojunnuo
fef1305e41 chore: 2024-12-09 21:44:37 +08:00
xiaojunnuo
498cf34999 fix: 修复创建流水线通知设置无效的bug 2024-12-09 18:04:45 +08:00
xiaojunnuo
7cde1fdc4a perf: 支持mysql 2024-12-09 17:47:01 +08:00
xiaojunnuo
228fdf0a0d perf: 优化数据表索引 2024-12-09 15:59:14 +08:00
xiaojunnuo
fdb5ea0ff4 Merge remote-tracking branch 'origin/v2-dev' into v2-dev 2024-12-09 09:34:12 +08:00
xiaojunnuo
a0e838d1ee fix: 修复流水线分组可以被所有人看见的bug 2024-12-09 02:24:30 +08:00
xiaojunnuo
30ddf5ec41 build: publish 2024-12-09 01:56:13 +08:00
xiaojunnuo
cfd3b7b3ae build: trigger build image 2024-12-09 01:55:54 +08:00
xiaojunnuo
a6cd532035 v1.28.1 2024-12-09 01:53:42 +08:00
xiaojunnuo
b1db952fcb build: prepare to build 2024-12-09 01:50:40 +08:00
xiaojunnuo
51e8bab352 build: prepare to build 2024-12-09 01:49:03 +08:00
xiaojunnuo
618ec93786 perf: 支持邀请奖励 2024-12-09 01:40:55 +08:00
xiaojunnuo
a673f9c8ca chore: 2024-12-09 01:39:11 +08:00
xiaojunnuo
e8c9c2a47d perf: cname value优化 2024-12-09 01:31:16 +08:00
xiaojunnuo
aafa5d5f90 chore: 1 2024-12-09 01:25:23 +08:00
xiaojunnuo
8b9c47daf1 perf: favicon支持自定义 2024-12-09 00:12:15 +08:00
xiaojunnuo
4042577c0b chore: 2024-12-08 02:30:25 +08:00
xiaojunnuo
6c9f9940e3 chore: 2024-12-07 16:16:50 +08:00
xiaojunnuo
8f7b3f29ce chore: 2024-12-07 16:13:00 +08:00
xiaojunnuo
6bca7333c9 Merge remote-tracking branch 'origin/v2-dev' into v2-dev 2024-12-07 15:20:08 +08:00
xiaojunnuo
3dfeeec899 fix: 修复cname排查方法 nslookup命令显示黑色的问题 2024-12-07 15:19:28 +08:00
xiaojunnuo
138dc286f6 chore: 删除cloudflare cdn插件 2024-12-05 13:34:21 +08:00
xiaojunnuo
07cee2aadf chore: 2024-12-05 12:10:31 +08:00
xiaojunnuo
1b267813c9 Merge remote-tracking branch 'origin/v2-dev' into v2-dev 2024-12-05 11:10:39 +08:00
xiaojunnuo
96b5981f8c chore: 2024-12-05 11:09:14 +08:00
xiaojunnuo
a2fd9559c5 chore: 2024-12-04 23:05:12 +08:00
xiaojunnuo
3f06419d47 chore: 2024-12-04 22:27:48 +08:00
xiaojunnuo
2aefca3813 chore: 2024-12-04 12:36:17 +08:00
xiaojunnuo
6aa487269c perf: 新增server酱3通知 2024-12-03 10:32:47 +08:00
xiaojunnuo
393ea27fa4 chore: 2024-12-03 00:55:37 +08:00
xiaojunnuo
febe87508c chore: 2024-12-03 00:43:43 +08:00
xiaojunnuo
30db27980c Merge remote-tracking branch 'origin/v2-dev' into v2-dev 2024-12-03 00:35:51 +08:00
xiaojunnuo
4e768ec50f chore: 2024-12-03 00:35:34 +08:00
xiaojunnuo
4467e09426 chore: 2024-12-03 00:07:30 +08:00
xiaojunnuo
66b95d52fd Merge remote-tracking branch 'origin/v2-dev' into v2-dev 2024-12-02 23:21:43 +08:00
xiaojunnuo
1398417829 chore: 2024-12-02 23:17:40 +08:00
xiaojunnuo
58dd5e2750 chore: 2024-12-02 18:15:27 +08:00
xiaojunnuo
70210f567a chore: 2024-12-02 16:43:09 +08:00
xiaojunnuo
49e7dc56e1 perf: 新增七牛云插件分组 2024-12-02 16:35:31 +08:00
xiaojunnuo
72cc586f88 chore: 2024-12-02 15:19:13 +08:00
xiaojunnuo
94fa77fcd2 perf: 支持易发云短信 2024-12-02 15:11:29 +08:00
xiaojunnuo
2c0cbdd29e perf: 通知选择器优化 2024-12-02 14:06:55 +08:00
xiaojunnuo
68a503796c build: publish 2024-12-01 03:25:17 +08:00
xiaojunnuo
48cf28dd7f build: trigger build image 2024-12-01 03:24:59 +08:00
xiaojunnuo
7e103b7744 v1.28.0 2024-12-01 03:23:00 +08:00
xiaojunnuo
79d637c9bf build: prepare to build 2024-12-01 03:20:57 +08:00
xiaojunnuo
7c8d551fe1 build: prepare to build 2024-12-01 03:18:50 +08:00
xiaojunnuo
72862c8be8 chore: 2024-12-01 03:18:36 +08:00
xiaojunnuo
4f1bb48bf7 build: prepare to build 2024-12-01 03:12:08 +08:00
xiaojunnuo
15740a6d8a chore: 2024-12-01 03:09:29 +08:00
xiaojunnuo
2bc3456400 chore: 2024-12-01 03:02:59 +08:00
xiaojunnuo
5a607efa9f chore: 2024-12-01 02:17:29 +08:00
xiaojunnuo
1c8163dd82 chore: 2024-12-01 02:14:49 +08:00
xiaojunnuo
327a919958 chore: 2024-12-01 02:10:57 +08:00
xiaojunnuo
a847e66c4f perf: 流水线支持批量修改分组,批量删除 2024-12-01 02:10:40 +08:00
xiaojunnuo
0772d3b3fd perf: 首页新增修改密码提示 2024-11-30 22:35:26 +08:00
xiaojunnuo
61d6b06c56 chore: 2024-11-30 17:38:41 +08:00
xiaojunnuo
1534f45236 perf: 部署到IIS插件 2024-11-30 17:36:47 +08:00
xiaojunnuo
aedc462135 perf: 选项显示图标 2024-11-30 01:57:09 +08:00
xiaojunnuo
7b55337c5e feat: 手机号登录、邮箱验证码注册 2024-11-29 19:00:05 +08:00
xiaojunnuo
87bbf6f140 perf: 取消docker-compose的dns配置 2024-11-29 13:41:02 +08:00
xiaojunnuo
0d8913ea2f perf: 支持威联通证书部署 2024-11-29 11:57:41 +08:00
xiaojunnuo
387bcc5fa4 perf: 支持短信验证码登录 2024-11-28 17:36:45 +08:00
xiaojunnuo
5a20242111 perf: 优化七牛云cdn,获取域名列表可以选择 2024-11-28 16:14:52 +08:00
xiaojunnuo
196f7d9dc2 perf: 优化七牛云cdn部署,保持http2和forceHttp设置,当未开启https时,主动开启https 2024-11-28 16:05:52 +08:00
xiaojunnuo
954b6df360 perf: 登录失败增加重试次数限制及冷却时间 2024-11-28 11:10:57 +08:00
xiaojunnuo
8002a56efc perf: 优化证书申请成功通知发送方式 2024-11-27 12:36:28 +08:00
xiaojunnuo
7e5ea0cee0 fix: 修复自定义webhook contextType的bug 2024-11-27 09:50:01 +08:00
xiaojunnuo
3254afc756 perf: 自定义webhook显示详细的错误信息 2024-11-26 23:11:20 +08:00
xiaojunnuo
e3553d4c8c chore: 2024-11-26 18:36:28 +08:00
xiaojunnuo
7be14ee905 build: publish 2024-11-26 15:29:27 +08:00
xiaojunnuo
fc234314b7 build: trigger build image 2024-11-26 15:28:58 +08:00
xiaojunnuo
cf19363092 v1.27.9 2024-11-26 15:27:40 +08:00
xiaojunnuo
589b38c75d build: prepare to build 2024-11-26 15:25:43 +08:00
xiaojunnuo
90a8f818bf chore: 2024-11-26 15:21:22 +08:00
xiaojunnuo
642f57ff6d perf: 通知支持vocechat、bark、telegram、discord、slack 2024-11-26 15:13:57 +08:00
xiaojunnuo
cbccd9e3d0 perf: 通知支持自定义webhook、anpush、iyuu、server酱 2024-11-26 11:12:22 +08:00
xiaojunnuo
cf7a3e6f70 build: publish 2024-11-26 02:09:36 +08:00
xiaojunnuo
8993687c37 build: trigger build image 2024-11-26 02:09:11 +08:00
xiaojunnuo
ff1d7b115a v1.27.8 2024-11-26 02:07:06 +08:00
xiaojunnuo
98bd5149e9 build: prepare to build 2024-11-26 02:04:39 +08:00
xiaojunnuo
4efa2e0c6a build: prepare to build 2024-11-26 02:03:00 +08:00
xiaojunnuo
f805036054 build: prepare to build 2024-11-26 02:02:34 +08:00
xiaojunnuo
3c723c4325 chore: 2024-11-26 02:02:18 +08:00
xiaojunnuo
14a83f6b52 build: publish 2024-11-26 01:43:35 +08:00
xiaojunnuo
ff0686670c build: trigger build image 2024-11-26 01:43:14 +08:00
xiaojunnuo
3198d07553 v1.27.7 2024-11-26 01:41:21 +08:00
xiaojunnuo
c7e2896326 build: prepare to build 2024-11-26 01:39:40 +08:00
xiaojunnuo
0db5381a8b chore: 2024-11-26 01:39:19 +08:00
xiaojunnuo
cb86151deb chore: 2024-11-26 01:21:49 +08:00
xiaojunnuo
d6c7326467 chore: 2024-11-26 01:14:16 +08:00
xiaojunnuo
92c6c45e77 chore: 2024-11-25 23:48:04 +08:00
xiaojunnuo
c6fff4950d chore: 2024-11-25 23:24:12 +08:00
xiaojunnuo
81a8123725 perf: 谷歌EAB绑定邮箱改成必填 2024-11-25 18:26:23 +08:00
xiaojunnuo
d0d3e74d55 chore: 2024-11-25 11:38:49 +08:00
xiaojunnuo
b54ae272eb perf: 通知渠道支持测试按钮 2024-11-25 11:35:16 +08:00
xiaojunnuo
3af6d96e6e fix: 修复CNAME时子域名级数超出限制的问题 2024-11-25 10:57:27 +08:00
xiaojunnuo
f38b33ea39 chore: 2024-11-25 09:51:45 +08:00
xiaojunnuo
dd2b0a1595 chore: 2024-11-25 00:53:36 +08:00
xiaojunnuo
c96fcb7afc perf: 支持部署到阿里云WAF 2024-11-24 01:40:42 +08:00
xiaojunnuo
b805a29259 perf: 支持企业微信群聊机器人通知 2024-11-23 23:58:31 +08:00
xiaojunnuo
5450246f06 chore: 2024-11-23 00:25:30 +08:00
xiaojunnuo
d9a00eeaf7 perf: 通知管理 2024-11-22 17:12:39 +08:00
xiaojunnuo
131ed13df1 docs: 2024-11-22 10:05:21 +08:00
xiaojunnuo
5f8d70028a chore: 2024-11-20 18:36:38 +08:00
xiaojunnuo
c222b702c3 chore: 2024-11-20 18:12:10 +08:00
xiaojunnuo
de43391e4c perf: 华为云密钥获取提示及访问链接 2024-11-20 13:58:41 +08:00
xiaojunnuo
547c0b8399 docs: 2024-11-20 11:41:03 +08:00
xiaojunnuo
fcbb5e46a1 perf: 优化插件开发,dnsProvider无需写http logger 变量 2024-11-20 11:36:39 +08:00
xiaojunnuo
7c5166c8bb Merge branch 'v2' into v2-dev 2024-11-20 11:18:35 +08:00
xiaojunnuo
fab66606b3 fix: 修复关键字查询bug 2024-11-20 10:46:05 +08:00
Greper
1d143f7103 pref: deployment to cachefly and gcore plugin
Merge pull request #244 from origami-owo/v2
2024-11-19 18:26:39 +08:00
xiaojunnuo
4955fcd12a build: publish 2024-11-19 18:15:21 +08:00
xiaojunnuo
817e9663fa build: trigger build image 2024-11-19 18:15:02 +08:00
xiaojunnuo
85ca850453 v1.27.6 2024-11-19 18:12:55 +08:00
xiaojunnuo
3baefb2b60 build: prepare to build 2024-11-19 18:10:17 +08:00
xiaojunnuo
ffea5a0e02 build: prepare to build 2024-11-19 18:08:27 +08:00
xiaojunnuo
be55695691 chore: 2024-11-19 18:07:34 +08:00
xiaojunnuo
ea27c96362 Merge remote-tracking branch 'origin/v2-dev' into v2-dev 2024-11-19 17:51:34 +08:00
xiaojunnuo
7a73a01999 chore: 2024-11-19 17:49:59 +08:00
xiaojunnuo
018dee6c38 fix: 修复vip试用secret报错的bug 2024-11-19 17:43:06 +08:00
xiaojunnuo
c7cf2e6f16 Merge branch 'v2-dev' into v2 2024-11-19 11:20:49 +08:00
xiaojunnuo
9ab9a6e8b0 perf: 当步骤全部都禁用时,任务本身显示删除线 2024-11-19 11:19:40 +08:00
xiaojunnuo
67ccff3e86 build: publish 2024-11-18 22:03:19 +08:00
xiaojunnuo
40c09ce26a build: trigger build image 2024-11-18 22:02:58 +08:00
xiaojunnuo
3e0d4a0bed v1.27.5 2024-11-18 22:00:23 +08:00
xiaojunnuo
e8a6d38ac6 build: prepare to build 2024-11-18 21:57:47 +08:00
xiaojunnuo
80159ecca8 perf: 支持namesilo
需要志愿者提供apikey和domain来做测试
2024-11-18 18:23:11 +08:00
xiaojunnuo
c82bb730b2 chore: 2024-11-18 13:43:33 +08:00
xiaojunnuo
26dad399d5 fix: 修复Cname情况下,无法使用DNS类型的bug 2024-11-18 13:33:48 +08:00
xiaojunnuo
2689e6d6c0 fix: 修复1Panel面板本身证书更新导致判定执行失败的问题 2024-11-18 13:32:03 +08:00
xiaojunnuo
90d1b68bd6 perf: 优化腾讯云 cloudflare 重复解析记录时的返回值 2024-11-17 02:01:44 +08:00
xiaojunnuo
c7c4318c11 perf: 专业版试用,无需绑定账号 2024-11-17 01:06:27 +08:00
origami
d6a2e4aee9 Merge branch 'certd:v2' into v2 2024-11-16 23:32:28 +08:00
xiaojunnuo
c6488b58f5 chore: registry注册到全局里面 2024-11-16 11:01:14 +08:00
xiaojunnuo
18bfcc24ad perf: 新手导航在非编辑模式下不显示 2024-11-16 01:14:41 +08:00
xiaojunnuo
d8a134fe7e Merge branch 'v2-dev' into v2 2024-11-16 00:50:30 +08:00
xiaojunnuo
989f48c47a chore: 2024-11-16 00:41:09 +08:00
xiaojunnuo
111a32b5e8 chore: 2024-11-16 00:03:18 +08:00
xiaojunnuo
993ca754b5 chore: 2024-11-16 00:00:26 +08:00
xiaojunnuo
381a37fbaa perf: 系统设置中的代理设置优化为可全局生效,环境变量中的https_proxy设置将无效 2024-11-15 23:52:18 +08:00
xiaojunnuo
0ca61b4d99 chore: 2024-11-15 23:29:04 +08:00
Greper
16748a75d5 fix: .env 读取 \r 问题
fix: .env 读取 \r 问题

Merge pull request #243 from ltxhhz/v2
2024-11-15 23:11:45 +08:00
ltxhhz
0e33dfa019 fix: .env 读取 \r 问题 2024-11-15 20:34:38 +08:00
xiaojunnuo
4a2f7ebf87 perf: 日志查看自动滚动到底部 2024-11-15 14:32:22 +08:00
xiaojunnuo
e9f18b79ea docs: 2024-11-15 13:59:26 +08:00
xiaojunnuo
66629a591a fix: 修复角色无法删除的bug 2024-11-15 10:29:02 +08:00
xiaojunnuo
8f22a358cf build: publish 2024-11-14 21:55:46 +08:00
xiaojunnuo
1f5f1596e5 build: trigger build image 2024-11-14 21:55:27 +08:00
xiaojunnuo
339554bdbf v1.27.4 2024-11-14 21:53:00 +08:00
xiaojunnuo
9b6b614857 build: prepare to build 2024-11-14 21:51:23 +08:00
xiaojunnuo
e6e99d4239 chore: 2024-11-14 21:50:45 +08:00
xiaojunnuo
f4ae5125dc perf: 公共cname服务支持关闭 2024-11-14 18:31:17 +08:00
xiaojunnuo
c3cfbd8474 fix: 修复未设置pfx密码,导致jks转换报错的bug 2024-11-14 18:06:50 +08:00
xiaojunnuo
86dd03c917 chore: 2024-11-14 18:04:59 +08:00
xiaojunnuo
6410e34bf3 chore: 2024-11-14 00:48:48 +08:00
xiaojunnuo
2db7fee745 chore: 2024-11-14 00:48:20 +08:00
xiaojunnuo
4e8908e715 chore: 2024-11-14 00:42:40 +08:00
xiaojunnuo
67d8020147 chore: 2024-11-14 00:41:33 +08:00
xiaojunnuo
b4b9f33b2c chore: 2024-11-14 00:25:47 +08:00
xiaojunnuo
d091703dc0 chore: 降级为node20 2024-11-14 00:24:54 +08:00
xiaojunnuo
509b5291c3 chore: 2024-11-14 00:22:56 +08:00
xiaojunnuo
111a0823e9 build: publish 2024-11-14 00:20:17 +08:00
xiaojunnuo
48bc7a45a9 build: trigger build image 2024-11-14 00:19:58 +08:00
origami
fc9ac23725 Merge branch 'certd:v2' into v2 2024-11-02 01:53:20 +08:00
origami-owo
0f426b9c19 fix 2024-11-02 01:38:50 +08:00
origami-owo
a7d4710702 add gcore 2024-11-02 01:33:51 +08:00
origami-owo
6946279f03 add deploy plugin cachefly 2024-10-31 13:36:49 +08:00
564 changed files with 23172 additions and 3200 deletions

View File

@@ -91,14 +91,14 @@ jobs:
# greper/certd:armv7 # greper/certd:armv7
# greper/certd:${{steps.get_certd_version.outputs.result}}-armv7 # greper/certd:${{steps.get_certd_version.outputs.result}}-armv7
- name: Build agent # - name: Build agent
uses: docker/build-push-action@v6 # uses: docker/build-push-action@v6
with: # with:
platforms: linux/amd64,linux/arm64 # platforms: linux/amd64,linux/arm64
push: true # push: true
context: ./packages/ui/agent/ # context: ./packages/ui/agent/
tags: | # tags: |
registry.cn-shenzhen.aliyuncs.com/handsfree/certd-agent:latest # registry.cn-shenzhen.aliyuncs.com/handsfree/certd-agent:latest
registry.cn-shenzhen.aliyuncs.com/handsfree/certd-agent:${{steps.get_certd_version.outputs.result}} # registry.cn-shenzhen.aliyuncs.com/handsfree/certd-agent:${{steps.get_certd_version.outputs.result}}
greper/certd-agent:latest # greper/certd-agent:latest
greper/certd-agent:${{steps.get_certd_version.outputs.result}} # greper/certd-agent:${{steps.get_certd_version.outputs.result}}

2
.npmrc
View File

@@ -1,2 +1,2 @@
link-workspace-packages=true link-workspace-packages=deep
prefer-workspace-packages=true prefer-workspace-packages=true

View File

@@ -3,6 +3,267 @@
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.30.2](https://github.com/certd/certd/compare/v1.30.1...v1.30.2) (2025-02-09)
### Bug Fixes
* 当前置任务被删除时进行校验 ([c89686a](https://github.com/certd/certd/commit/c89686a2fda251484930f0ae715417b618c21690))
* 修复cloudflare删除解析记录报错的bug ([00c2da4](https://github.com/certd/certd/commit/00c2da444f84adb89f3f1226d03294d7c6e3e4f1))
### Performance Improvements
* 上传自定义证书 ([75a38d9](https://github.com/certd/certd/commit/75a38d95f305b4271d9106babe7cffc1c89ae8f3))
## [1.30.1](https://github.com/certd/certd/compare/v1.30.0...v1.30.1) (2025-01-20)
### Bug Fixes
* 修复部署到阿里云ALB、NLB插件加载混乱的bug ([6ab83b6](https://github.com/certd/certd/commit/6ab83b662a2c5e715b9cb7eb1244de2ebb7f47b0))
* 修复腾讯clb重复执行会报错的bug ([e95d29f](https://github.com/certd/certd/commit/e95d29f446d06eced315a3087fc9e105a30b20bd))
* 修复tg消息内容中存在.和*就会发送失败的bug ([ae5dfc3](https://github.com/certd/certd/commit/ae5dfc3bee950267123ae2fbd1c11e7ce36626ea))
### Performance Improvements
* 创建流水线时,默认成功时也发送通知 ([52ae690](https://github.com/certd/certd/commit/52ae6902d203ca56e0312692b50c55cb6ddd3e39))
* http方式校验选择sftp时支持修改文件访问权限比如777 ([15d6eaf](https://github.com/certd/certd/commit/15d6eaf5532ed25acd4f8d58c429353a2f44206c))
# [1.30.0](https://github.com/certd/certd/compare/v1.29.5...v1.30.0) (2025-01-19)
### Bug Fixes
* 修复查看任务日志偶发性无法自动滚动底部的bug ([7e482f7](https://github.com/certd/certd/commit/7e482f798c0142bce1866f84676cb40210f9638a))
* 修复namesilo ttl太短的问题 ([865f26d](https://github.com/certd/certd/commit/865f26d75c0d3dd4dc8b41448f8830068e45957c))
### Features
* 支持open api接口根据域名获取证书 ([52a4fd3](https://github.com/certd/certd/commit/52a4fd33180e9b3f71b8dc9f7671d7cd8e448c3b))
### Performance Improvements
* 证书仓库 ([91e7f45](https://github.com/certd/certd/commit/91e7f45a1c5ea1e0ec0aa3236b80028f03a6d0aa))
* 支持部署到阿里云ALB ([653940a](https://github.com/certd/certd/commit/653940a0ca64fc380178c1b0b58ae0af64dfaf07))
* 支持部署到阿里云NLB、SLB ([c085bac](https://github.com/certd/certd/commit/c085bac5d877c4250a8a79e17eb8673b8e4fc89c))
* 支持部署到腾讯云直播 ([417d37b](https://github.com/certd/certd/commit/417d37b199b79a42f790f9edab8f178eedf8fbf7))
* 支持部署证书到proxmox ([d10795e](https://github.com/certd/certd/commit/d10795ecd97eb8cf2ffa46aabfdbfc6812636396))
## [1.29.5](https://github.com/certd/certd/compare/v1.29.4...v1.29.5) (2025-01-07)
### Bug Fixes
* 修复复制到本机插件pfx格式复制时报错的bug ([f57116d](https://github.com/certd/certd/commit/f57116d2bebf33e47ad93e0b39c4efe8e4aea25c))
* 修复授权管理点击了查看原文按钮后无法修改值的bug ([85c99f7](https://github.com/certd/certd/commit/85c99f7f80761ac6efaf3255c03b933442db1686))
## [1.29.4](https://github.com/certd/certd/compare/v1.29.3...v1.29.4) (2025-01-06)
### Bug Fixes
* 修复站点监控域名校验无法通过的bug ([1cb4a53](https://github.com/certd/certd/commit/1cb4a539cc523721ffd4b22d40d0e3d2d68cd915))
### Performance Improvements
* 优化腾讯云CLB插件支持非sni情况sni情况支持填写多个域名 ([635b042](https://github.com/certd/certd/commit/635b042690637bff85e97e07c7aac4b87a8a124b))
## [1.29.3](https://github.com/certd/certd/compare/v1.29.2...v1.29.3) (2025-01-04)
### Bug Fixes
* 修复系统级授权无法查看密钥的bug ([8644348](https://github.com/certd/certd/commit/8644348fc41ae2e1672f946ca37e5d3a674e0218))
### Performance Improvements
* 优化站点证书检查页面检查增加3次重试 ([e6dd7cd](https://github.com/certd/certd/commit/e6dd7cd54a3e23897031b5df6e0c3cdc0545d35a))
* 优化acme sdk ([54db744](https://github.com/certd/certd/commit/54db74428259de64d12230c2ab7353ae11197bbc))
* 支持http校验方式申请证书 ([405591c](https://github.com/certd/certd/commit/405591c5d08fa1a3b228ee3980199e7731cfec4a))
* http校验方式支持七牛云oss、阿里云oss、腾讯云cos ([3f74d4d](https://github.com/certd/certd/commit/3f74d4d9e5f5d0e629b44cff1895b3f7a8fbcafc))
## [1.29.2](https://github.com/certd/certd/compare/v1.29.1...v1.29.2) (2024-12-25)
### Bug Fixes
* 修复套餐关闭状态下仍然限制用户流水线数量的bug ([66fb9e5](https://github.com/certd/certd/commit/66fb9e5f49491f9c159363b48af14720a37673b1))
## [1.29.1](https://github.com/certd/certd/compare/v1.29.0...v1.29.1) (2024-12-25)
### Bug Fixes
* 免费套餐支持购买 ([f5ec987](https://github.com/certd/certd/commit/f5ec9870fd6af1f0c9099852bbdb4d07813ccce8))
* 修复某处金额转换丢失精度的bug ([d2d6f12](https://github.com/certd/certd/commit/d2d6f12218cbe7bd55f4ae082b93084be85f0a7b))
* 修复新版本小红点显示错误问题 ([fe4786e](https://github.com/certd/certd/commit/fe4786e168afe03a5243dd67971476c348339809))
### Performance Improvements
* 用户创建证书流水线没有购买套餐或者超限时提前报错 ([472f06c](https://github.com/certd/certd/commit/472f06c2d190d0ae48e8b53c18bc278437656a1c))
* 优化插件名称显示 ([26adf7d](https://github.com/certd/certd/commit/26adf7d437e674385f26a8f92fded6521a620671))
# [1.29.0](https://github.com/certd/certd/compare/v1.28.4...v1.29.0) (2024-12-24)
### Bug Fixes
* 修复手机模式下查询框被文字遮盖的bug ([040788c](https://github.com/certd/certd/commit/040788c793642c3bb2a3ede87fe30fcf3be471bd))
* 修复左侧菜单收起时无法展开子菜单的bug ([0056223](https://github.com/certd/certd/commit/005622307e612717a5408aa1484717ef03003a22))
### Features
* 基础版不再限制流水线数量 ([cb27d4b](https://github.com/certd/certd/commit/cb27d4b4906b2782eaceb0a95bbdc5d0534370d2))
* 套餐购买支持易支付、支付宝支付 ([faa28f8](https://github.com/certd/certd/commit/faa28f88f954cba4c1dd29125562e5acd2fd99af))
* 用户套餐,用户支付功能 ([a019956](https://github.com/certd/certd/commit/a019956698acaf2c4beb620b5ad8c18918ead6a1))
* 站点证书监控 ([9c8c7a7](https://github.com/certd/certd/commit/9c8c7a781223f4217f45510db1e89495600e3cd5))
* 支持微信支付 ([45d6347](https://github.com/certd/certd/commit/45d6347f5b6199493b11aabdd74177f6dca2cea4))
### Performance Improvements
* 调整创建证书表单字段的顺序 ([d393521](https://github.com/certd/certd/commit/d3935219f2aa50d6662c5b5ebf7ee25ad696ab2b))
* 同一时间只允许一个套餐生效 ([8ebf95a](https://github.com/certd/certd/commit/8ebf95a222a900d1707716c7b1f3b39f8a6d8f94))
* 用户名支持修改 ([89c7f07](https://github.com/certd/certd/commit/89c7f070343e86453c84677ebe1669f9b266d871))
* 优化证书申请跳过的状态显示,成功通知现在在跳过时不会发送 ([67d762b](https://github.com/certd/certd/commit/67d762b6a520f1fa24719a124e5ae975a81f5f82))
* 站点证书监控通知发送,每天定时检查 ([bb4910f](https://github.com/certd/certd/commit/bb4910f4e57234e42b44505f4620ae7af66025c5))
* 支持一体证书 ([53c38cf](https://github.com/certd/certd/commit/53c38cf714a6f7486abbf1d71c9f48f56a790100))
* 支持plesk网站证书部署 ([eda45c1](https://github.com/certd/certd/commit/eda45c1528199648b3970505e87f492d398226cd))
## [1.28.4](https://github.com/certd/certd/compare/v1.28.3...v1.28.4) (2024-12-12)
### Bug Fixes
* 修复证书成功通知发送失败的bug ([0f5c690](https://github.com/certd/certd/commit/0f5c69040ba77340c909813220a26bc7ddada3ea))
### Performance Improvements
* 群晖支持6.x ([79f7ec4](https://github.com/certd/certd/commit/79f7ec4672f4fd5744cc45e4a6f104da943f4026))
## [1.28.3](https://github.com/certd/certd/compare/v1.28.2...v1.28.3) (2024-12-12)
### Bug Fixes
* 修复没有配置eab时报order无法读取的问题 ([657a2ae](https://github.com/certd/certd/commit/657a2ae032e6f61ac27fbdd26c7bf169c041219e))
* 修复授权被删除后无法清空的bug ([b45977c](https://github.com/certd/certd/commit/b45977c29a29084c11e496bec3415eaaebafdd74))
* mysql下access.setting字段改成text ([b7f5740](https://github.com/certd/certd/commit/b7f5740c57743914f754f3b4fdd94b59a2e8338c))
### Performance Improvements
* 点击版本红点按钮,跳转到升级帮助页面 ([454fbda](https://github.com/certd/certd/commit/454fbda581bbe22abca5b91e5086ea9d9d58a020))
* 通知标题优化 ([ff083ce](https://github.com/certd/certd/commit/ff083ce6848a8bee3c8248e4b881086ae1517c28))
* 支持腾讯虚拟机开关机([@wujingke](https://github.com/wujingke)) ([8039e8b](https://github.com/certd/certd/commit/8039e8baf83c82d03f1a6198cf61c372026b962b))
* 支持aws cloudfront ([0ae39f1](https://github.com/certd/certd/commit/0ae39f160a7c6b6696b3bf513d68aa28905810ad))
## [1.28.2](https://github.com/certd/certd/compare/v1.28.1...v1.28.2) (2024-12-09)
### Bug Fixes
* 修复创建流水线通知设置无效的bug ([498cf34](https://github.com/certd/certd/commit/498cf34999fddfa24ce088e2e678469fa669abb8))
* 修复流水线分组可以被所有人看见的bug ([a0e838d](https://github.com/certd/certd/commit/a0e838d1eec918e5dc92fe95dc72ac14facb930e))
### Performance Improvements
* 优化数据表索引 ([228fdf0](https://github.com/certd/certd/commit/228fdf0a0d28013f5dd156a97bbde80537e8e97e))
* 支持mysql ([7cde1fd](https://github.com/certd/certd/commit/7cde1fdc4a9ed851900d231a5460c8dbfbcd148e))
## [1.28.1](https://github.com/certd/certd/compare/v1.28.0...v1.28.1) (2024-12-08)
### Bug Fixes
* 修复cname排查方法 nslookup命令显示黑色的问题 ([3dfeeec](https://github.com/certd/certd/commit/3dfeeec899d7d0d7292695ce410f78548e076c03))
### Performance Improvements
* 通知选择器优化 ([2c0cbdd](https://github.com/certd/certd/commit/2c0cbdd29ecb74cc939b2ae7ee86b8d40f70ba31))
* 新增七牛云插件分组 ([49e7dc5](https://github.com/certd/certd/commit/49e7dc56e1a95fbdea3e30cdeb945b48415b69e3))
* 新增server酱3通知 ([6aa4872](https://github.com/certd/certd/commit/6aa487269c9f6862e188b37a0d6c73f79c937d94))
* 支持邀请奖励 ([618ec93](https://github.com/certd/certd/commit/618ec937866b24ebcf8164db43acb1ed66a5b329))
* 支持易发云短信 ([94fa77f](https://github.com/certd/certd/commit/94fa77fcd2b9bea294fb05736c0d8cdc81f56103))
* cname value优化 ([e8c9c2a](https://github.com/certd/certd/commit/e8c9c2a47d47048ae743b16f7bc932dbe18a89e9))
* favicon支持自定义 ([8b9c47d](https://github.com/certd/certd/commit/8b9c47daf194515006689a212ae9cf586bdf5993))
# [1.28.0](https://github.com/certd/certd/compare/v1.27.9...v1.28.0) (2024-11-30)
### Bug Fixes
* 修复自定义webhook contextType的bug ([7e5ea0c](https://github.com/certd/certd/commit/7e5ea0cee003acda952d922ca70592f1e8a2ed80))
### Features
* 手机号登录、邮箱验证码注册 ([7b55337](https://github.com/certd/certd/commit/7b55337c5edb470cca7aa62201eda8d274784004))
### Performance Improvements
* 部署到IIS插件 ([1534f45](https://github.com/certd/certd/commit/1534f4523633265d219d7b3a249a9ea1af99c512))
* 登录失败增加重试次数限制及冷却时间 ([954b6df](https://github.com/certd/certd/commit/954b6df3608695fe074130f8149a33e311d80cc4))
* 流水线支持批量修改分组,批量删除 ([a847e66](https://github.com/certd/certd/commit/a847e66c4fc843b98f1520b2b8072d3586ce8b81))
* 取消docker-compose的dns配置 ([87bbf6f](https://github.com/certd/certd/commit/87bbf6f14080b9fa287c250d7fc4d33279c83ff7))
* 首页新增修改密码提示 ([0772d3b](https://github.com/certd/certd/commit/0772d3b3fd24afdde4086d9f09ef19d037b431b4))
* 选项显示图标 ([aedc462](https://github.com/certd/certd/commit/aedc46213571a3bd93809b7af7fa17a08d546237))
* 优化七牛云cdn获取域名列表可以选择 ([5a20242](https://github.com/certd/certd/commit/5a20242111d6bd255b25dac86fe1f062c8543096))
* 优化七牛云cdn部署保持http2和forceHttp设置当未开启https时主动开启https ([196f7d9](https://github.com/certd/certd/commit/196f7d9dc23d7dd96b663c686542e85270b81aef))
* 优化证书申请成功通知发送方式 ([8002a56](https://github.com/certd/certd/commit/8002a56efc5998aa03db5711ae87f9eb4bc9e160))
* 支持短信验证码登录 ([387bcc5](https://github.com/certd/certd/commit/387bcc5fa418cdeea81a06da5e3f8cd6b43cd082))
* 支持威联通证书部署 ([0d8913e](https://github.com/certd/certd/commit/0d8913ea2f56fdebbcc9bb207eae59e8ddbb8cad))
* 自定义webhook显示详细的错误信息 ([3254afc](https://github.com/certd/certd/commit/3254afc75640eed3729d0fc02a818fefbe5c7fc3))
## [1.27.9](https://github.com/certd/certd/compare/v1.27.8...v1.27.9) (2024-11-26)
### Performance Improvements
* 通知支持自定义webhook、anpush、iyuu、server酱 ([cbccd9e](https://github.com/certd/certd/commit/cbccd9e3d0a4c24aba772af62734666d40b22c57))
* 通知支持vocechat、bark、telegram、discord、slack ([642f57f](https://github.com/certd/certd/commit/642f57ff6d7152a9e14f59c7fc0e32a6b1751fb7))
## [1.27.8](https://github.com/certd/certd/compare/v1.27.7...v1.27.8) (2024-11-25)
**Note:** Version bump only for package root
## [1.27.7](https://github.com/certd/certd/compare/v1.27.6...v1.27.7) (2024-11-25)
### Bug Fixes
* 修复关键字查询bug ([fab6660](https://github.com/certd/certd/commit/fab66606b35a540fac31fee902331ba1ffdebc16))
* 修复CNAME时子域名级数超出限制的问题 ([3af6d96](https://github.com/certd/certd/commit/3af6d96e6e353c9b2111cff81679b79c55195a0a))
### Performance Improvements
* 谷歌EAB绑定邮箱改成必填 ([81a8123](https://github.com/certd/certd/commit/81a8123725d7bf4bd6a32a64a066bd760b7b6a7f))
* 华为云密钥获取提示及访问链接 ([de43391](https://github.com/certd/certd/commit/de43391e4c12dc3ad976f8fa8787f4eb70a41e75))
* 通知管理 ([d9a00ee](https://github.com/certd/certd/commit/d9a00eeaf72735ced67c59d7983d84e3c730064a))
* 通知渠道支持测试按钮 ([b54ae27](https://github.com/certd/certd/commit/b54ae272ebc2d31b32b049d44e2299a6be7f153c))
* 优化插件开发dnsProvider无需写http logger 变量 ([fcbb5e4](https://github.com/certd/certd/commit/fcbb5e46a112174150a62648319b8224fce3b7ed))
* 支持部署到阿里云WAF ([c96fcb7](https://github.com/certd/certd/commit/c96fcb7afced979435cffa73591275008033c90d))
* 支持企业微信群聊机器人通知 ([b805a29](https://github.com/certd/certd/commit/b805a2925984144a31575b8aaa622f0c30d41b56))
## [1.27.6](https://github.com/certd/certd/compare/v1.27.5...v1.27.6) (2024-11-19)
### Bug Fixes
* .env 读取 \r 问题 ([0e33dfa](https://github.com/certd/certd/commit/0e33dfa019a55ea76193c428ec756af386adeb9d))
* 修复vip试用secret报错的bug ([018dee6](https://github.com/certd/certd/commit/018dee6c383233560f078dfd30f6c2857a7e15ee))
### Performance Improvements
* 当步骤全部都禁用时,任务本身显示删除线 ([9ab9a6e](https://github.com/certd/certd/commit/9ab9a6e8b083e19793894f23e59f29c604ec98e5))
## [1.27.5](https://github.com/certd/certd/compare/v1.27.4...v1.27.5) (2024-11-18)
### Bug Fixes
* 修复1Panel面板本身证书更新导致判定执行失败的问题 ([2689e6d](https://github.com/certd/certd/commit/2689e6d6c03aba21da90d5d45232c6ba08696be1))
* 修复角色无法删除的bug ([66629a5](https://github.com/certd/certd/commit/66629a591aecc2d8364ea415c7afc3f9d0406562))
* 修复Cname情况下无法使用DNS类型的bug ([26dad39](https://github.com/certd/certd/commit/26dad399d5768b3205da099ddc11809aef7d6224))
### Performance Improvements
* 日志查看自动滚动到底部 ([4a2f7eb](https://github.com/certd/certd/commit/4a2f7ebf87b7c027cebff7cb763f8f35f6d2aa36))
* 系统设置中的代理设置优化为可全局生效环境变量中的https_proxy设置将无效 ([381a37f](https://github.com/certd/certd/commit/381a37fbaa6b61c887eda743897ae00afb825bdf))
* 新手导航在非编辑模式下不显示 ([18bfcc2](https://github.com/certd/certd/commit/18bfcc24ad0bde57bb04db8a4209861ec6b8ff1d))
* 优化腾讯云 cloudflare 重复解析记录时的返回值 ([90d1b68](https://github.com/certd/certd/commit/90d1b68bd6cf232fbe085234efe07d29b7690044))
* 支持namesilo ([80159ec](https://github.com/certd/certd/commit/80159ecca895103d0495f3217311199e66056572))
* 专业版试用,无需绑定账号 ([c7c4318](https://github.com/certd/certd/commit/c7c4318c11b65a76089787aa58939832d338a232))
## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14)
### Bug Fixes
* 修复未设置pfx密码导致jks转换报错的bug ([c3cfbd8](https://github.com/certd/certd/commit/c3cfbd8474155aed4379f91075de37d5d8c73ef0))
### Performance Improvements
* 公共cname服务支持关闭 ([f4ae512](https://github.com/certd/certd/commit/f4ae5125dc4cd97816976779cb3586b5ee78947e))
## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13) ## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13)
### Bug Fixes ### Bug Fixes

View File

@@ -9,13 +9,21 @@ Certd 是一个免费全自动申请和自动部署更新SSL证书的管理系
本项目不仅支持证书申请过程自动化,还可以自动化部署更新证书,让你的证书永不过期。 本项目不仅支持证书申请过程自动化,还可以自动化部署更新证书,让你的证书永不过期。
* 全自动申请证书(支持所有注册商注册的域名) * 全自动申请证书(支持所有注册商注册的域名)
* 全自动部署更新证书(目前支持部署到主机、部署到阿里云、腾讯云等,目前已支持30+部署插件) * 全自动部署更新证书(目前支持部署到主机、阿里云、腾讯云等,目前已支持40+部署插件)
* 支持通配符域名/泛域名,支持多个域名打到一个证书上 * 支持DNS-01、HTTP-01、CNAME代理等多种域名验证方式
* 邮件通知 * 支持通配符域名/泛域名支持多个域名打到一个证书上支持pem、pfx、der、jks等多种证书格式
* 私有化部署数据保存本地镜像由Github Actions构建过程公开透明 * 邮件通知、webhook通知
* 支持sqlitepostgresql数据库 * 私有化部署数据保存本地授权信息加密存储镜像由Github Actions构建过程公开透明
* 支持SQLitePostgreSQL、MySQL数据库
>
> 流水线数量现已调整为无限制,欢迎大家使用
>
> 关于证书续期:
>* 实际上没有办法不改变证书文件本身情况下直接续期或者续签。
>* 我们所说的续期,其实就是按照全套流程重新申请一份新证书,然后重新部署上去。
## 二、在线体验 ## 二、在线体验
@@ -86,11 +94,13 @@ https://certd.handfree.work/
## 五、 升级 ## 五、 升级
如果使用固定版本号
### docker-compose方式部署
#### 1. 如果使用固定版本号
1. 修改`docker-compose.yaml`中的镜像版本号 1. 修改`docker-compose.yaml`中的镜像版本号
2. 运行`docker compose up -d` 即可 2. 运行`docker compose up -d` 即可
如果使用`latest`版本 #### 2. 如果需要使用最新版本
```shell ```shell
#重新拉取镜像 #重新拉取镜像
docker pull registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest docker pull registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest
@@ -98,24 +108,59 @@ docker pull registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest
docker compose down docker compose down
docker compose up -d docker compose up -d
``` ```
> 数据默认存在`/data/certd`目录下,不用担心数据丢失 > 数据默认存在`/data/certd`目录下,不用担心数据丢失
### 自动升级(仅限尝鲜建议非生产使用)
```yaml
version: '3.3'
services:
certd:
image: registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest
container_name: certd
restart: unless-stopped
volumes:
- /data/certd:/app/data
ports:
- "7001:7001"
- "7002:7002"
environment:
- certd_system_resetAdminPasswd=false
labels:
com.centurylinklabs.watchtower.enable: "true"
更新日志: [CHANGELOG](./CHANGELOG.md) certd-updater: # 添加 Watchtower 服务
image: containrrr/watchtower:latest
container_name: certd-updater
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
# 配置 自动更新
environment:
- WATCHTOWER_CLEANUP=true # 自动清理旧版本容器
- WATCHTOWER_INCLUDE_STOPPED=false # 不更新已停止的容器
- WATCHTOWER_LABEL_ENABLE=true # 根据容器标签进行更新
- WATCHTOWER_POLL_INTERVAL=300 # 每 5 分钟检查一次更新
```
### 其他部署方式升级方法
请参考 https://certd.docmirror.cn/guide/install/upgrade.html
### 更新日志:
[CHANGELOG](./CHANGELOG.md)
## 六、一些说明 ## 六、一些说明
* 本项目ssl证书提供商为letencrypt/Google/ZeroSSL * 本项目ssl证书提供商为letencrypt/Google/ZeroSSL
* 申请过程遵循acme协议 * 申请过程遵循acme协议
* 需要验证域名所有权一般有两种方式目前本项目仅支持dns-01
* http-01 在网站根目录下放置一份txt文件
* dns-01 需要给域名添加txt解析记录通配符域名只能用这种方式
* 证书续期: * 证书续期:
* 实际上没有办法不改变证书文件本身情况下直接续期或者续签。 * 实际上没有办法不改变证书文件本身情况下直接续期或者续签。
* 我们所说的续期,其实就是按照全套流程重新申请一份新证书,然后重新部署上去。 * 我们所说的续期,其实就是按照全套流程重新申请一份新证书,然后重新部署上去。
* 免费证书过期时间90天以后可能还会缩短所以自动化部署必不可少 * 免费证书过期时间90天以后可能还会缩短所以自动化部署必不可少
* 设置每天自动运行,当证书过期前20天,会自动重新申请证书并部署 * 设置每天自动运行,当证书过期前35天,会自动重新申请证书并部署
## 七、不同平台的设置说明 ## 七、不同平台的设置说明
@@ -155,12 +200,14 @@ https://afdian.com/a/greper
专业版特权对比 专业版特权对比
| 功能 | 免费版 | 专业版 | | 功能 | 基础版 | 专业版 |
|---------|-------------------|-----------------------| |------|-----------------|-------------------|
| 免费证书申请 | 免费无限制 | 免费无限制 | | 免费证书申请 | 免费无限制 | 无限制 |
| 自动部署插件 | 阿里云、腾讯云、七牛云、主机部署等 | 支持群晖、宝塔、1Panel等持续开发中 | | 域名数量 | 免费无限制 | 无限制 |
| 发邮件功能 | 需要配置 | 免配置 | | 证书流水线条数 | 免费无限制 | 无限制 |
| 证书流水线条数 | 10条 | 无限制 | | 站点证书监控 | 1 | 无限制 |
| 自动部署插件 | 阿里云、腾讯云、七牛云、SSH | 支持群晖、宝塔、1Panel等持续开发中 |
| 通知 | 邮件、webhook | server酱、企微、anpush等 |
************************ ************************

View File

@@ -1 +1 @@
1 23:39

View File

@@ -1,7 +1,7 @@
version: '3.3' # 兼容旧版docker-compose version: '3.3' # 兼容旧版docker-compose
services: services:
certd: certd:
# 镜像 # ↓↓↓↓↓ ---- 镜像版本号,建议改成固定版本号 # 镜像 # ↓↓↓↓↓ ---- 镜像版本号,建议改成固定版本号,例如certd:1.29.0
image: registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest image: registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest
container_name: certd # 容器名 container_name: certd # 容器名
restart: unless-stopped # 自动重启 restart: unless-stopped # 自动重启
@@ -14,27 +14,34 @@ services:
# ↓↓↓↓ ---------------------------------------------------------- https端口可以根据实际情况是否暴露该端口 # ↓↓↓↓ ---------------------------------------------------------- https端口可以根据实际情况是否暴露该端口
- "7002:7002" - "7002:7002"
#↓↓↓↓ -------------------------------------------------------------- 如果出现getaddrinfo ENOTFOUND错误可以尝试设置dns #↓↓↓↓ -------------------------------------------------------------- 如果出现getaddrinfo ENOTFOUND错误可以尝试设置dns
dns: # dns:
- 223.5.5.5 # 阿里云公共dns # - 223.5.5.5 # 阿里云公共dns
- 223.6.6.6 # - 223.6.6.6
# # ↓↓↓↓ --------------------------------------------------------- 如果你服务器在腾讯云可以用这个替换上面阿里云的公共dns # # ↓↓↓↓ --------------------------------------------------------- 如果你服务器在腾讯云可以用这个替换上面阿里云的公共dns
# - 119.29.29.29 # 腾讯云公共dns # - 119.29.29.29 # 腾讯云公共dns
# - 182.254.116.116 # - 182.254.116.116
# # ↓↓↓↓ --------------------------------------------------------- 如果你服务器部署在国外可以用这个替换上面阿里云的公共dns # # ↓↓↓↓ --------------------------------------------------------- 如果你服务器部署在国外可以用这个替换上面阿里云的公共dns
# - 8.8.8.8 # 谷歌公共dns # - 8.8.8.8 # 谷歌公共dns
# - 8.8.4.4 # - 8.8.4.4
# extra_hosts: # extra_hosts:
# # ↓↓↓↓ -------------------------------------------------------- 这里可以配置自定义hosts外网域名可以指向本地局域网ip地址 # # ↓↓↓↓ -------------------------------------------------------- 这里可以配置自定义hosts外网域名可以指向本地局域网ip地址
# - "localdomain.comm:192.168.1.3" # - "localdomain.com:192.168.1.3"
labels:
com.centurylinklabs.watchtower.enable: "true"
# ↓↓↓↓ -------------------------------------------------------------- 启用ipv6网络还需要把下面networks的注释放开
# networks:
# - ip6net
environment: environment:
# 设置环境变量即可自定义certd配置 # 设置环境变量即可自定义certd配置
# 配置项见: packages/ui/certd-server/src/config/config.default.ts # 配置项见: packages/ui/certd-server/src/config/config.default.ts
# 配置规则: certd_ + 配置项, 点号用_代替 # 配置规则: certd_ + 配置项, 点号用_代替
# #↓↓↓↓ ----------------------------- 如果忘记管理员密码可以设置为true重启之后管理员密码将改成123456然后请及时修改回false # #↓↓↓↓ ----------------------------- 如果忘记管理员密码可以设置为true重启之后管理员密码将改成123456然后请及时修改回false
- certd_system_resetAdminPasswd=false - certd_system_resetAdminPasswd=false
# #↓↓↓↓ ----------------------------- 使用postgresql数据库
# 默认使用sqlite文件数据库如果需要使用其他数据库请设置以下环境变量
# 注意: 选定使用一种数据库之后,不支持更换数据库。
# 数据库迁移方法1、使用新数据库重新部署一套然后将旧数据同步过去注意flyway_history表的数据不要同步
# #↓↓↓↓ ----------------------------- 使用postgresql数据库需要提前创建数据库
# - certd_flyway_scriptDir=./db/migration-pg # 升级脚本目录 # - certd_flyway_scriptDir=./db/migration-pg # 升级脚本目录
# - certd_typeorm_dataSource_default_type=postgres # 数据库类型 # - certd_typeorm_dataSource_default_type=postgres # 数据库类型
# - certd_typeorm_dataSource_default_host=localhost # 数据库地址 # - certd_typeorm_dataSource_default_host=localhost # 数据库地址
@@ -43,9 +50,31 @@ services:
# - certd_typeorm_dataSource_default_password=yourpasswd # 密码 # - certd_typeorm_dataSource_default_password=yourpasswd # 密码
# - certd_typeorm_dataSource_default_database=certd # 数据库名 # - certd_typeorm_dataSource_default_database=certd # 数据库名
# #↓↓↓↓ ------------------------------------------------------------- 启用ipv6网络 # #↓↓↓↓ ----------------------------- 使用mysql数据库需要提前创建数据库 charset=utf8mb4, collation=utf8mb4_bin
# networks: # - certd_flyway_scriptDir=./db/migration-mysql # 升级脚本目录
# - ip6net # - certd_typeorm_dataSource_default_type=mysql # 数据库类型, 或者 mariadb
# - certd_typeorm_dataSource_default_host=localhost # 数据库地址
# - certd_typeorm_dataSource_default_port=3306 # 数据库端口
# - certd_typeorm_dataSource_default_username=root # 用户名
# - certd_typeorm_dataSource_default_password=yourpasswd # 密码
# - certd_typeorm_dataSource_default_database=certd # 数据库名
# ↓↓↓↓ --------------------------------------------------------- 自动升级上面certd的版本号要保持为latest
# certd-updater: # 添加 Watchtower 服务
# image: containrrr/watchtower:latest
# container_name: certd-updater
# restart: unless-stopped
# volumes:
# - /var/run/docker.sock:/var/run/docker.sock
# # 配置 自动更新
# environment:
# - WATCHTOWER_CLEANUP=true # 自动清理旧版本容器
# - WATCHTOWER_INCLUDE_STOPPED=false # 不更新已停止的容器
# - WATCHTOWER_LABEL_ENABLE=true # 根据容器标签进行更新
# - WATCHTOWER_POLL_INTERVAL=600 # 每 10 分钟检查一次更新
# ↓↓↓↓ -------------------------------------------------------------- 启用ipv6网络还需要把上面networks的注释放开
#networks: #networks:
# ip6net: # ip6net:
# enable_ipv6: true # enable_ipv6: true

View File

@@ -57,6 +57,7 @@ export default defineConfig({
nav: [ nav: [
{ text: "首页", link: "/" }, { text: "首页", link: "/" },
{ text: "指南", link: "/guide/" }, { text: "指南", link: "/guide/" },
{ text: "商业版", link: "/comm/" },
{ text: "Demo体验", link: "https://certd.handfree.work" } { text: "Demo体验", link: "https://certd.handfree.work" }
], ],
sidebar: { sidebar: {
@@ -76,8 +77,9 @@ export default defineConfig({
{ text: "源码部署", link: "/guide/install/source/" } { text: "源码部署", link: "/guide/install/source/" }
] ]
}, },
{ text: "演示教程", link: "/guide/tutorial.md" } { text: "演示教程", link: "/guide/tutorial.md" },
{ text: "版本升级", link: "/guide/install/upgrade.md" },
{ text: "切换数据库", link: "/guide/install/database.md" }
] ]
}, },
{ {
@@ -100,12 +102,13 @@ export default defineConfig({
{ text: "Certd本身的证书更新", link: "/guide/use/https/index.md" }, { text: "Certd本身的证书更新", link: "/guide/use/https/index.md" },
{ text: "js脚本插件使用", link: "/guide/use/custom-script/index.md" }, { text: "js脚本插件使用", link: "/guide/use/custom-script/index.md" },
{ text: "邮箱配置", link: "/guide/use/email/index.md" }, { text: "邮箱配置", link: "/guide/use/email/index.md" },
{ text: "如何贡献代码", link: "/guide/development/index.md" }, { text: "IPv6支持", link: "/guide/use/setting/ipv6.md" },
] ]
}, },
{ {
text: "其他", text: "其他",
items: [ items: [
{ text: "贡献代码", link: "/guide/development/index.md" },
{ text: "更新日志", link: "/guide/changelogs/CHANGELOG.md" }, { text: "更新日志", link: "/guide/changelogs/CHANGELOG.md" },
{ text: "镜像说明", link: "/guide/image.md" }, { text: "镜像说明", link: "/guide/image.md" },
{ text: "联系我们", link: "/guide/contact/" }, { text: "联系我们", link: "/guide/contact/" },
@@ -115,8 +118,20 @@ export default defineConfig({
] ]
} }
],
"/comm/": [
{
text: "商业版",
items: [
{ text: "支付宝配置", link: "/comm/payments/alipay.md" },
{ text: "微信支付配置", link: "/comm/payments/wxpay.md" },
{ text: "彩虹易支付配置", link: "/comm/payments/yizhifu.md" },
]
}
] ]
,
}, },
socialLinks: [ socialLinks: [
{ icon: "github", link: "https://github.com/certd/certd" } { icon: "github", link: "https://github.com/certd/certd" }
], ],

BIN
docs/comm/images/index.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB

9
docs/comm/index.md Normal file
View File

@@ -0,0 +1,9 @@
# 商业版文档
![](./images/index.png)
## 支付方式配置
* [支付宝支付配置](./payments/alipay.md)
* [微信支付配置](./payments/wxpay.md)
* [彩虹易支付配置](./payments/yizhifu.md)

View File

@@ -0,0 +1,21 @@
# 支付宝配置
## 配置步骤
1. 创建应用获取APPID
* 登录支付宝开放平台进入开发者中心创建网页应用获取应用的AppId左上角复制
* 开发者中心https://open.alipay.com/develop/manage
2. 进入应用详情,选择开发设置,配置接口加签方式 (选择密钥类型)
* 参考文档https://opendocs.alipay.com/common/02kdnc?pathHash=fb0c752a
* 此步骤完成后,可以获取应用的私钥、支付宝公钥。
* 注意:支付宝不会保存应用的私钥,你需要自己保管好私钥。
3. 在Certd后台配置支付宝
* 进入“系统”->"设置"->“支付设置”
* 启用支付宝,选择“支付宝配置”,点击添加
* 填写支付宝AppId、应用私钥、支付宝公钥等信息即可。

View File

@@ -0,0 +1,27 @@
# 微信支付配置
## 配置步骤
1. 开通Native支付
* 登录微信支付平台
* 进入产品中心: https://pay.weixin.qq.com/index.php/extend/product/lists?tid=3
* 选择开通Native支付
2. 申请证书
* 进入“账户中心”->“API安全”->“商户API证书”->“管理证书”
* 根据指引生成证书
* 得到私钥和公钥
3. 填写APIv3密钥
* 进入“账户中心”->“API安全”->“解密回调”
* 填写APIv3密钥
* 参考文档 https://kf.qq.com/faq/180830E36vyQ180830AZFZvu.html
4. 在Certd后台配置微信支付
* 进入“系统”->"设置"->“支付设置”
* 启用微信支付,选择“微信支付配置”,点击添加
* 填写微信支付商户号、证书私钥、证书公钥、APIv3密钥即可。

View File

@@ -0,0 +1,19 @@
# 彩虹易支付配置
彩虹易支付是一款非常流行的php聚合支付系统。
## 配置步骤
1. 获取商户ID、商户密钥
* 登录彩虹易支付平台
* 进入用户中心https://xxxxxx.com/user/userinfo.php?mod=api
* 点击API信息
* 可以复制接口地址、商户ID、商户密钥key
* 点击查看文档了解支持的签名类型一般为MD5
2. 进入Certd后台配置彩虹易支付
* 进入“系统”->"设置"->“支付设置”
* 启用彩虹易支付,选择“彩虹易支付配置”,点击添加
* 填写接口地址、商户ID、商户密钥、签名方式等信息即可。

View File

@@ -3,6 +3,271 @@
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.30.1](https://github.com/certd/certd/compare/v1.30.0...v1.30.1) (2025-01-20)
### Bug Fixes
* 修复部署到阿里云ALB、NLB插件加载混乱的bug ([6ab83b6](https://github.com/certd/certd/commit/6ab83b662a2c5e715b9cb7eb1244de2ebb7f47b0))
* 修复腾讯clb重复执行会报错的bug ([e95d29f](https://github.com/certd/certd/commit/e95d29f446d06eced315a3087fc9e105a30b20bd))
* 修复tg消息内容中存在.和*就会发送失败的bug ([ae5dfc3](https://github.com/certd/certd/commit/ae5dfc3bee950267123ae2fbd1c11e7ce36626ea))
### Performance Improvements
* 创建流水线时,默认成功时也发送通知 ([52ae690](https://github.com/certd/certd/commit/52ae6902d203ca56e0312692b50c55cb6ddd3e39))
* http方式校验选择sftp时支持修改文件访问权限比如777 ([15d6eaf](https://github.com/certd/certd/commit/15d6eaf5532ed25acd4f8d58c429353a2f44206c))
# [1.30.0](https://github.com/certd/certd/compare/v1.29.5...v1.30.0) (2025-01-19)
### Bug Fixes
* 修复查看任务日志偶发性无法自动滚动底部的bug ([7e482f7](https://github.com/certd/certd/commit/7e482f798c0142bce1866f84676cb40210f9638a))
* 修复namesilo ttl太短的问题 ([865f26d](https://github.com/certd/certd/commit/865f26d75c0d3dd4dc8b41448f8830068e45957c))
### Features
* 支持open api接口根据域名获取证书 ([52a4fd3](https://github.com/certd/certd/commit/52a4fd33180e9b3f71b8dc9f7671d7cd8e448c3b))
### Performance Improvements
* 证书仓库 ([91e7f45](https://github.com/certd/certd/commit/91e7f45a1c5ea1e0ec0aa3236b80028f03a6d0aa))
* 支持部署到阿里云ALB ([653940a](https://github.com/certd/certd/commit/653940a0ca64fc380178c1b0b58ae0af64dfaf07))
* 支持部署到阿里云NLB、SLB ([c085bac](https://github.com/certd/certd/commit/c085bac5d877c4250a8a79e17eb8673b8e4fc89c))
* 支持部署到腾讯云直播 ([417d37b](https://github.com/certd/certd/commit/417d37b199b79a42f790f9edab8f178eedf8fbf7))
* 支持部署证书到proxmox ([d10795e](https://github.com/certd/certd/commit/d10795ecd97eb8cf2ffa46aabfdbfc6812636396))
## [1.29.5](https://github.com/certd/certd/compare/v1.29.4...v1.29.5) (2025-01-07)
### Bug Fixes
* 修复复制到本机插件pfx格式复制时报错的bug ([f57116d](https://github.com/certd/certd/commit/f57116d2bebf33e47ad93e0b39c4efe8e4aea25c))
* 修复授权管理点击了查看原文按钮后无法修改值的bug ([85c99f7](https://github.com/certd/certd/commit/85c99f7f80761ac6efaf3255c03b933442db1686))
## [1.29.4](https://github.com/certd/certd/compare/v1.29.3...v1.29.4) (2025-01-06)
### Bug Fixes
* 修复站点监控域名校验无法通过的bug ([1cb4a53](https://github.com/certd/certd/commit/1cb4a539cc523721ffd4b22d40d0e3d2d68cd915))
### Performance Improvements
* 优化腾讯云CLB插件支持非sni情况sni情况支持填写多个域名 ([635b042](https://github.com/certd/certd/commit/635b042690637bff85e97e07c7aac4b87a8a124b))
## [1.29.3](https://github.com/certd/certd/compare/v1.29.2...v1.29.3) (2025-01-04)
### Bug Fixes
* 修复系统级授权无法查看密钥的bug ([8644348](https://github.com/certd/certd/commit/8644348fc41ae2e1672f946ca37e5d3a674e0218))
### Performance Improvements
* 优化站点证书检查页面检查增加3次重试 ([e6dd7cd](https://github.com/certd/certd/commit/e6dd7cd54a3e23897031b5df6e0c3cdc0545d35a))
* 优化acme sdk ([54db744](https://github.com/certd/certd/commit/54db74428259de64d12230c2ab7353ae11197bbc))
* 支持http校验方式申请证书 ([405591c](https://github.com/certd/certd/commit/405591c5d08fa1a3b228ee3980199e7731cfec4a))
* http校验方式支持七牛云oss、阿里云oss、腾讯云cos ([3f74d4d](https://github.com/certd/certd/commit/3f74d4d9e5f5d0e629b44cff1895b3f7a8fbcafc))
## [1.29.2](https://github.com/certd/certd/compare/v1.29.1...v1.29.2) (2024-12-25)
### Bug Fixes
* 修复套餐关闭状态下仍然限制用户流水线数量的bug ([66fb9e5](https://github.com/certd/certd/commit/66fb9e5f49491f9c159363b48af14720a37673b1))
## [1.29.1](https://github.com/certd/certd/compare/v1.29.0...v1.29.1) (2024-12-25)
### Bug Fixes
* 免费套餐支持购买 ([f5ec987](https://github.com/certd/certd/commit/f5ec9870fd6af1f0c9099852bbdb4d07813ccce8))
* 修复某处金额转换丢失精度的bug ([d2d6f12](https://github.com/certd/certd/commit/d2d6f12218cbe7bd55f4ae082b93084be85f0a7b))
* 修复新版本小红点显示错误问题 ([fe4786e](https://github.com/certd/certd/commit/fe4786e168afe03a5243dd67971476c348339809))
### Performance Improvements
* 用户创建证书流水线没有购买套餐或者超限时提前报错 ([472f06c](https://github.com/certd/certd/commit/472f06c2d190d0ae48e8b53c18bc278437656a1c))
* 优化插件名称显示 ([26adf7d](https://github.com/certd/certd/commit/26adf7d437e674385f26a8f92fded6521a620671))
# [1.29.0](https://github.com/certd/certd/compare/v1.28.4...v1.29.0) (2024-12-24)
### Bug Fixes
* 修复手机模式下查询框被文字遮盖的bug ([040788c](https://github.com/certd/certd/commit/040788c793642c3bb2a3ede87fe30fcf3be471bd))
* 修复左侧菜单收起时无法展开子菜单的bug ([0056223](https://github.com/certd/certd/commit/005622307e612717a5408aa1484717ef03003a22))
### Features
* 基础版不再限制流水线数量 ([cb27d4b](https://github.com/certd/certd/commit/cb27d4b4906b2782eaceb0a95bbdc5d0534370d2))
* 套餐购买支持易支付、支付宝支付 ([faa28f8](https://github.com/certd/certd/commit/faa28f88f954cba4c1dd29125562e5acd2fd99af))
* 用户套餐,用户支付功能 ([a019956](https://github.com/certd/certd/commit/a019956698acaf2c4beb620b5ad8c18918ead6a1))
* 站点证书监控 ([9c8c7a7](https://github.com/certd/certd/commit/9c8c7a781223f4217f45510db1e89495600e3cd5))
* 支持微信支付 ([45d6347](https://github.com/certd/certd/commit/45d6347f5b6199493b11aabdd74177f6dca2cea4))
### Performance Improvements
* 调整创建证书表单字段的顺序 ([d393521](https://github.com/certd/certd/commit/d3935219f2aa50d6662c5b5ebf7ee25ad696ab2b))
* 同一时间只允许一个套餐生效 ([8ebf95a](https://github.com/certd/certd/commit/8ebf95a222a900d1707716c7b1f3b39f8a6d8f94))
* 用户名支持修改 ([89c7f07](https://github.com/certd/certd/commit/89c7f070343e86453c84677ebe1669f9b266d871))
* 优化证书申请跳过的状态显示,成功通知现在在跳过时不会发送 ([67d762b](https://github.com/certd/certd/commit/67d762b6a520f1fa24719a124e5ae975a81f5f82))
* 站点证书监控通知发送,每天定时检查 ([bb4910f](https://github.com/certd/certd/commit/bb4910f4e57234e42b44505f4620ae7af66025c5))
* 支持一体证书 ([53c38cf](https://github.com/certd/certd/commit/53c38cf714a6f7486abbf1d71c9f48f56a790100))
* 支持plesk网站证书部署 ([eda45c1](https://github.com/certd/certd/commit/eda45c1528199648b3970505e87f492d398226cd))
## [1.28.4](https://github.com/certd/certd/compare/v1.28.3...v1.28.4) (2024-12-12)
### Bug Fixes
* 修复证书成功通知发送失败的bug ([0f5c690](https://github.com/certd/certd/commit/0f5c69040ba77340c909813220a26bc7ddada3ea))
### Performance Improvements
* 群晖支持6.x ([79f7ec4](https://github.com/certd/certd/commit/79f7ec4672f4fd5744cc45e4a6f104da943f4026))
## [1.28.3](https://github.com/certd/certd/compare/v1.28.2...v1.28.3) (2024-12-12)
### Bug Fixes
* 修复没有配置eab时报order无法读取的问题 ([657a2ae](https://github.com/certd/certd/commit/657a2ae032e6f61ac27fbdd26c7bf169c041219e))
* 修复授权被删除后无法清空的bug ([b45977c](https://github.com/certd/certd/commit/b45977c29a29084c11e496bec3415eaaebafdd74))
* mysql下access.setting字段改成text ([b7f5740](https://github.com/certd/certd/commit/b7f5740c57743914f754f3b4fdd94b59a2e8338c))
### Performance Improvements
* 点击版本红点按钮,跳转到升级帮助页面 ([454fbda](https://github.com/certd/certd/commit/454fbda581bbe22abca5b91e5086ea9d9d58a020))
* 通知标题优化 ([ff083ce](https://github.com/certd/certd/commit/ff083ce6848a8bee3c8248e4b881086ae1517c28))
* 支持腾讯虚拟机开关机([@wujingke](https://github.com/wujingke)) ([8039e8b](https://github.com/certd/certd/commit/8039e8baf83c82d03f1a6198cf61c372026b962b))
* 支持aws cloudfront ([0ae39f1](https://github.com/certd/certd/commit/0ae39f160a7c6b6696b3bf513d68aa28905810ad))
## [1.28.2](https://github.com/certd/certd/compare/v1.28.1...v1.28.2) (2024-12-09)
### Bug Fixes
* 修复创建流水线通知设置无效的bug ([498cf34](https://github.com/certd/certd/commit/498cf34999fddfa24ce088e2e678469fa669abb8))
* 修复流水线分组可以被所有人看见的bug ([a0e838d](https://github.com/certd/certd/commit/a0e838d1eec918e5dc92fe95dc72ac14facb930e))
### Performance Improvements
* 优化数据表索引 ([228fdf0](https://github.com/certd/certd/commit/228fdf0a0d28013f5dd156a97bbde80537e8e97e))
* 支持mysql ([7cde1fd](https://github.com/certd/certd/commit/7cde1fdc4a9ed851900d231a5460c8dbfbcd148e))
## [1.28.1](https://github.com/certd/certd/compare/v1.28.0...v1.28.1) (2024-12-08)
### Bug Fixes
* 修复cname排查方法 nslookup命令显示黑色的问题 ([3dfeeec](https://github.com/certd/certd/commit/3dfeeec899d7d0d7292695ce410f78548e076c03))
### Performance Improvements
* 通知选择器优化 ([2c0cbdd](https://github.com/certd/certd/commit/2c0cbdd29ecb74cc939b2ae7ee86b8d40f70ba31))
* 新增七牛云插件分组 ([49e7dc5](https://github.com/certd/certd/commit/49e7dc56e1a95fbdea3e30cdeb945b48415b69e3))
* 新增server酱3通知 ([6aa4872](https://github.com/certd/certd/commit/6aa487269c9f6862e188b37a0d6c73f79c937d94))
* 支持邀请奖励 ([618ec93](https://github.com/certd/certd/commit/618ec937866b24ebcf8164db43acb1ed66a5b329))
* 支持易发云短信 ([94fa77f](https://github.com/certd/certd/commit/94fa77fcd2b9bea294fb05736c0d8cdc81f56103))
* cname value优化 ([e8c9c2a](https://github.com/certd/certd/commit/e8c9c2a47d47048ae743b16f7bc932dbe18a89e9))
* favicon支持自定义 ([8b9c47d](https://github.com/certd/certd/commit/8b9c47daf194515006689a212ae9cf586bdf5993))
# [1.28.0](https://github.com/certd/certd/compare/v1.27.9...v1.28.0) (2024-11-30)
### Bug Fixes
* 修复自定义webhook contextType的bug ([7e5ea0c](https://github.com/certd/certd/commit/7e5ea0cee003acda952d922ca70592f1e8a2ed80))
### Features
* 手机号登录、邮箱验证码注册 ([7b55337](https://github.com/certd/certd/commit/7b55337c5edb470cca7aa62201eda8d274784004))
### Performance Improvements
* 部署到IIS插件 ([1534f45](https://github.com/certd/certd/commit/1534f4523633265d219d7b3a249a9ea1af99c512))
* 登录失败增加重试次数限制及冷却时间 ([954b6df](https://github.com/certd/certd/commit/954b6df3608695fe074130f8149a33e311d80cc4))
* 流水线支持批量修改分组,批量删除 ([a847e66](https://github.com/certd/certd/commit/a847e66c4fc843b98f1520b2b8072d3586ce8b81))
* 取消docker-compose的dns配置 ([87bbf6f](https://github.com/certd/certd/commit/87bbf6f14080b9fa287c250d7fc4d33279c83ff7))
* 首页新增修改密码提示 ([0772d3b](https://github.com/certd/certd/commit/0772d3b3fd24afdde4086d9f09ef19d037b431b4))
* 选项显示图标 ([aedc462](https://github.com/certd/certd/commit/aedc46213571a3bd93809b7af7fa17a08d546237))
* 优化七牛云cdn获取域名列表可以选择 ([5a20242](https://github.com/certd/certd/commit/5a20242111d6bd255b25dac86fe1f062c8543096))
* 优化七牛云cdn部署保持http2和forceHttp设置当未开启https时主动开启https ([196f7d9](https://github.com/certd/certd/commit/196f7d9dc23d7dd96b663c686542e85270b81aef))
* 优化证书申请成功通知发送方式 ([8002a56](https://github.com/certd/certd/commit/8002a56efc5998aa03db5711ae87f9eb4bc9e160))
* 支持短信验证码登录 ([387bcc5](https://github.com/certd/certd/commit/387bcc5fa418cdeea81a06da5e3f8cd6b43cd082))
* 支持威联通证书部署 ([0d8913e](https://github.com/certd/certd/commit/0d8913ea2f56fdebbcc9bb207eae59e8ddbb8cad))
* 自定义webhook显示详细的错误信息 ([3254afc](https://github.com/certd/certd/commit/3254afc75640eed3729d0fc02a818fefbe5c7fc3))
## [1.27.9](https://github.com/certd/certd/compare/v1.27.8...v1.27.9) (2024-11-26)
### Performance Improvements
* 通知支持自定义webhook、anpush、iyuu、server酱 ([cbccd9e](https://github.com/certd/certd/commit/cbccd9e3d0a4c24aba772af62734666d40b22c57))
* 通知支持vocechat、bark、telegram、discord、slack ([642f57f](https://github.com/certd/certd/commit/642f57ff6d7152a9e14f59c7fc0e32a6b1751fb7))
## [1.27.8](https://github.com/certd/certd/compare/v1.27.7...v1.27.8) (2024-11-25)
**Note:** Version bump only for package root
## [1.27.7](https://github.com/certd/certd/compare/v1.27.6...v1.27.7) (2024-11-25)
### Bug Fixes
* 修复关键字查询bug ([fab6660](https://github.com/certd/certd/commit/fab66606b35a540fac31fee902331ba1ffdebc16))
* 修复CNAME时子域名级数超出限制的问题 ([3af6d96](https://github.com/certd/certd/commit/3af6d96e6e353c9b2111cff81679b79c55195a0a))
### Performance Improvements
* 谷歌EAB绑定邮箱改成必填 ([81a8123](https://github.com/certd/certd/commit/81a8123725d7bf4bd6a32a64a066bd760b7b6a7f))
* 华为云密钥获取提示及访问链接 ([de43391](https://github.com/certd/certd/commit/de43391e4c12dc3ad976f8fa8787f4eb70a41e75))
* 通知管理 ([d9a00ee](https://github.com/certd/certd/commit/d9a00eeaf72735ced67c59d7983d84e3c730064a))
* 通知渠道支持测试按钮 ([b54ae27](https://github.com/certd/certd/commit/b54ae272ebc2d31b32b049d44e2299a6be7f153c))
* 优化插件开发dnsProvider无需写http logger 变量 ([fcbb5e4](https://github.com/certd/certd/commit/fcbb5e46a112174150a62648319b8224fce3b7ed))
* 支持部署到阿里云WAF ([c96fcb7](https://github.com/certd/certd/commit/c96fcb7afced979435cffa73591275008033c90d))
* 支持企业微信群聊机器人通知 ([b805a29](https://github.com/certd/certd/commit/b805a2925984144a31575b8aaa622f0c30d41b56))
## [1.27.6](https://github.com/certd/certd/compare/v1.27.5...v1.27.6) (2024-11-19)
### Bug Fixes
* .env 读取 \r 问题 ([0e33dfa](https://github.com/certd/certd/commit/0e33dfa019a55ea76193c428ec756af386adeb9d))
* 修复vip试用secret报错的bug ([018dee6](https://github.com/certd/certd/commit/018dee6c383233560f078dfd30f6c2857a7e15ee))
### Performance Improvements
* 当步骤全部都禁用时,任务本身显示删除线 ([9ab9a6e](https://github.com/certd/certd/commit/9ab9a6e8b083e19793894f23e59f29c604ec98e5))
## [1.27.5](https://github.com/certd/certd/compare/v1.27.4...v1.27.5) (2024-11-18)
### Bug Fixes
* 修复1Panel面板本身证书更新导致判定执行失败的问题 ([2689e6d](https://github.com/certd/certd/commit/2689e6d6c03aba21da90d5d45232c6ba08696be1))
* 修复角色无法删除的bug ([66629a5](https://github.com/certd/certd/commit/66629a591aecc2d8364ea415c7afc3f9d0406562))
* 修复Cname情况下无法使用DNS类型的bug ([26dad39](https://github.com/certd/certd/commit/26dad399d5768b3205da099ddc11809aef7d6224))
### Performance Improvements
* 日志查看自动滚动到底部 ([4a2f7eb](https://github.com/certd/certd/commit/4a2f7ebf87b7c027cebff7cb763f8f35f6d2aa36))
* 系统设置中的代理设置优化为可全局生效环境变量中的https_proxy设置将无效 ([381a37f](https://github.com/certd/certd/commit/381a37fbaa6b61c887eda743897ae00afb825bdf))
* 新手导航在非编辑模式下不显示 ([18bfcc2](https://github.com/certd/certd/commit/18bfcc24ad0bde57bb04db8a4209861ec6b8ff1d))
* 优化腾讯云 cloudflare 重复解析记录时的返回值 ([90d1b68](https://github.com/certd/certd/commit/90d1b68bd6cf232fbe085234efe07d29b7690044))
* 支持namesilo ([80159ec](https://github.com/certd/certd/commit/80159ecca895103d0495f3217311199e66056572))
* 专业版试用,无需绑定账号 ([c7c4318](https://github.com/certd/certd/commit/c7c4318c11b65a76089787aa58939832d338a232))
## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14)
### Bug Fixes
* 修复未设置pfx密码导致jks转换报错的bug ([c3cfbd8](https://github.com/certd/certd/commit/c3cfbd8474155aed4379f91075de37d5d8c73ef0))
### Performance Improvements
* 公共cname服务支持关闭 ([f4ae512](https://github.com/certd/certd/commit/f4ae5125dc4cd97816976779cb3586b5ee78947e))
## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13)
### Bug Fixes
* 修复偶发性cname一直验证超时的bug ([d2ce72e](https://github.com/certd/certd/commit/d2ce72e4aaacdf726ba8b91fcd71db40a27714ba))
* 修复邮件配置忽略证书校验设置不生效的bug ([66a9690](https://github.com/certd/certd/commit/66a9690dc958732e1b3c672d965db502296446f9))
* 修复ipv6未开启情况下请求带有ipv6地址域名报ETIMEDOUT的bug ([a9a0967](https://github.com/certd/certd/commit/a9a0967a6f1d0bd27e69f3ec52c31d90d470bc23))
### Performance Improvements
* 修复站点个性化浏览器标题没有生效的bug ([bcfac02](https://github.com/certd/certd/commit/bcfac02c96ceaf23d1a0b05b48d8047da933beaf))
* 优化上传到主机插 路径选择,根据证书格式显示 ([8c3f86c](https://github.com/certd/certd/commit/8c3f86c6909ed91f48bb2880e78834e22f6f6a29))
* 支持jks ([889eaae](https://github.com/certd/certd/commit/889eaaea92818f628b922dae540c026630611707))
* ipv6支持 ([da6ac16](https://github.com/certd/certd/commit/da6ac1626b3574be2fabeeb18a1f10d60bdcbe49))
## [1.27.2](https://github.com/certd/certd/compare/v1.27.1...v1.27.2) (2024-11-08) ## [1.27.2](https://github.com/certd/certd/compare/v1.27.1...v1.27.2) (2024-11-08)
### Bug Fixes ### Bug Fixes

View File

@@ -3,7 +3,7 @@
建议nodejs版本 `20.x` 及以上 建议nodejs版本 `20.x` 及以上
## 1.本地调试运行 ## 一、本地调试运行
### 克隆代码 ### 克隆代码
```shell ```shell
@@ -14,9 +14,6 @@ git clone https://github.com/certd/certd --depth=1
#进入项目目录 #进入项目目录
cd certd cd certd
# 切换到最新版本代码【如果v2分支无法编译请尝试切换到最新版tag】
# git checkout v1.27.0 # 这里换成最新版本号
``` ```
### 修改pnpm-workspace.yaml文件 ### 修改pnpm-workspace.yaml文件
@@ -57,7 +54,7 @@ npm run dev
``` ```
## 开发插件 ## 二、开发插件
进入 `packages/ui/certd-server/src/plugins` 进入 `packages/ui/certd-server/src/plugins`
### 1.复制`plugin-demo`目录作为你的插件目录 ### 1.复制`plugin-demo`目录作为你的插件目录
@@ -91,8 +88,22 @@ export * from './plugins/plugin-deploy-to-xx'
export * from "./plugin-cloudflare.js" export * from "./plugin-cloudflare.js"
``` ```
## 重启服务进行调试 ### 6. 重启服务进行调试
刷新浏览器,检查你的插件是否工作正常, 确保能够正常进行证书申请和部署 刷新浏览器,检查你的插件是否工作正常, 确保能够正常进行证书申请和部署
## 提交PR ## 三、提交PR
我们将尽快审核PR 我们将尽快审核PR
## 四、 注意事项
### 1. 如何让任务报错停止
```js
// 抛出异常即可使任务停止,否则会判定为成功
throw new Error("错误信息")
```
## 五、贡献插件送激活码
- PR要求插件功能完整代码规范
- PR通过后联系我们送您一个半年期专业版激活码

View File

@@ -14,7 +14,7 @@ Certd 是一款开源、免费、全自动申请和部署更新SSL证书的工
* 支持通配符域名/泛域名,支持多个域名打到一个证书上 * 支持通配符域名/泛域名,支持多个域名打到一个证书上
* 邮件通知 * 邮件通知
* 私有化部署,保障数据安全 * 私有化部署,保障数据安全
* 支持sqlitepostgresql数据库 * 支持SQLite、Postgresql、MySQL数据库
## 二、一些说明 ## 二、一些说明
@@ -26,9 +26,9 @@ Certd 是一款开源、免费、全自动申请和部署更新SSL证书的工
* 实际上没有办法不改变证书文件本身情况下直接续期或者续签。 * 实际上没有办法不改变证书文件本身情况下直接续期或者续签。
* 我们所说的续期,其实就是按照全套流程重新申请一份新证书,然后重新部署上去。 * 我们所说的续期,其实就是按照全套流程重新申请一份新证书,然后重新部署上去。
* 免费证书过期时间90天以后可能还会缩短所以自动化部署必不可少 * 免费证书过期时间90天以后可能还会缩短所以自动化部署必不可少
* 设置每天自动运行,当证书过期前20天,会自动重新申请证书并部署 * 设置每天自动运行,当证书过期前35天,会自动重新申请证书并部署
## 三、证书颁发机构对比 ## 三、证书颁发机构对比
* Let's Encrypt申请最简单。 * Let's Encrypt申请最简单。
* Google: 大厂光环兼容性好需要翻墙获取EAB。 * Google: 大厂光环,兼容性好,首次需要翻墙获取EAB。
* ZeroSSL 有数量限制获取EAB无需翻墙。 * ZeroSSL 需要EAB获取EAB无需翻墙。

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -19,7 +19,8 @@ https://1panel.cn/docs/installation/online_installation/
3. 点击确定,启动容器 3. 点击确定,启动容器
![](./images/2.png) ![](./images/2.png)
> 默认数据保存在`/data/certd`目录下,可以手动备份 > 默认使用sqlite数据库数据保存在`/data/certd`目录下,可以手动备份该目录
> certd还支持`mysql`和`postgresql`数据库,[点我了解如何切换其他数据库](../../database/)
3. 访问测试 3. 访问测试
@@ -31,15 +32,12 @@ admin/123456
## 三、升级 ## 三、升级
1. 找到容器,点击编辑 1. 找到容器,点击更多->升级
![](./images/edit1.png) ![](./images/upgrade-1.png)
2. 将latest修改为最新版本号 2. 选择强制拉取镜像,点击确认即可
![](https://img.shields.io/npm/v/%40certd%2Fpipeline) ![img.png](./images/upgrade-2.png)
![img.png](./images/edit2.png)
3. 点击确定,重启容器
## 四、数据备份 ## 四、数据备份
@@ -48,4 +46,4 @@ admin/123456
## 五、备份恢复 ## 五、备份恢复
将备份的`db.sqlite`覆盖到原来的位置即可 将备份的`db.sqlite`及同目录下的其他文件一起覆盖到原来的位置重启certd即可

View File

@@ -29,6 +29,9 @@
点击确定,等待启动完成 点击确定,等待启动完成
![](./images/2.png) ![](./images/2.png)
> certd默认使用sqlite数据库另外支持`mysql`和`postgresql`数据库,[点我了解如何切换其他数据库](../../database/)
## 二、访问应用 ## 二、访问应用
http://ip:7001 http://ip:7001
@@ -38,28 +41,12 @@ admin/123456
登录后请及时修改密码 登录后请及时修改密码
## 三、如何升级 ## 三、如何升级
宝塔升级certd非常简单
### 1. 应用商店安装,直接更新镜像即可 `docker`->`容器编排`->`左侧选择Certd`->`更新镜像`
![img.png](./images/upgrade.png) ![img.png](./images/upgrade.png)
### 2. latest更新方式
在主机上拉取最新镜像,然后面板上重启容器
```shell
docker pull registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest
```
### 3. 固定版本号方式
修改容器编排模版中的镜像版本号,然后面板上重启容器
```shell
services:
certd:
# 镜像 # 修改最新版本号 ---- ↓↓↓↓↓
image: registry.cn-shenzhen.aliyuncs.com/handsfree/certd:v1.xx.x
```
## 四、数据备份 ## 四、数据备份
### 4.1 应用商店部署方式 ### 4.1 应用商店部署方式
@@ -75,10 +62,11 @@ services:
数据默认保存在`/data/certd`目录下,可以手动备份 数据默认保存在`/data/certd`目录下,可以手动备份
### 4.3 自动备份 ### 4.3 自动备份
> 建议配置一条 [数据库备份流水线](../../use/backup/),自动备份 > 建议配置一条 [数据库备份流水线](../../use/backup/),自动备份
## 五、备份恢复 ## 五、备份恢复
将备份的`db.sqlite`覆盖到原来的位置即可 将备份的`db.sqlite`及同目录下的其他文件一起覆盖到原来的位置重启certd即可

View File

@@ -0,0 +1,73 @@
# 切换数据库
certd支持如下几种数据库
1. sqlite3 (默认)
2. mysql
3. postgresql
您可以按如下两种方式切换数据库
## 一、全新安装
::: tip
以下按照`docker-compose`安装方式介绍如何使用mysql或postgresql数据库
如果您使用其他方式部署,请自行修改对应的环境变量即可。
:::
### 1.1、使用mysql数据库
1. 安装mysql创建数据库 `(注意charset=utf8mb4, collation=utf8mb4_bin)`
2. 下载最新的docker-compose.yaml
3. 修改环境变量配置
```yaml
services:
certd:
environment:
# 使用mysql数据库需要提前创建数据库 charset=utf8mb4, collation=utf8mb4_bin
- certd_flyway_scriptDir=./db/migration-mysql # 升级脚本目录 【照抄】
- certd_typeorm_dataSource_default_type=mysql # 数据库类型, 或者 mariadb
- certd_typeorm_dataSource_default_host=localhost # 数据库地址
- certd_typeorm_dataSource_default_port=3306 # 数据库端口
- certd_typeorm_dataSource_default_username=root # 用户名
- certd_typeorm_dataSource_default_password=yourpasswd # 密码
- certd_typeorm_dataSource_default_database=certd # 数据库名
```
4. 启动certd
```shell
docker-compose up -d
```
### 1.2、使用Postgresql数据库
1. 安装postgresql创建数据库
2. 下载最新的docker-compose.yaml
3. 修改环境变量配置
```yaml
services:
certd:
environment:
# 使用postgresql数据库需要提前创建数据库
- certd_flyway_scriptDir=./db/migration-pg # 升级脚本目录 【照抄】
- certd_typeorm_dataSource_default_type=postgres # 数据库类型 【照抄】
- certd_typeorm_dataSource_default_host=localhost # 数据库地址
- certd_typeorm_dataSource_default_port=5433 # 数据库端口
- certd_typeorm_dataSource_default_username=postgres # 用户名
- certd_typeorm_dataSource_default_password=yourpasswd # 密码
- certd_typeorm_dataSource_default_database=certd # 数据库名
```
4. 启动certd
```shell
docker-compose up -d
```
## 二、从旧版的sqlite切换数据库
1. 先将`旧certd`升级到最新版 `建议备份sqlite数据库`
2. 按照上面全新安装方式部署一套`新的certd` `注意新旧版本的certd要一致`
3. 使用数据库工具将数据从sqlite导入到mysql或postgresql `注意flyway_history数据表不要导入`
4. 重启新certd
5. 确认没有问题之后删除旧版certd

View File

@@ -41,7 +41,9 @@ 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/
> 然后使用 `docker-compose up -d` 启动
> certd默认使用sqlite数据库另外还支持`mysql`和`postgresql`数据库,[点我了解如何切换其他数据库](../../database/)
### 3. 访问测试 ### 3. 访问测试
@@ -71,4 +73,4 @@ docker compose up -d
## 四、备份恢复 ## 四、备份恢复
将备份的`db.sqlite`覆盖到原来的位置即可 将备份的`db.sqlite`及同目录下的其他文件一起覆盖到原来的位置重启certd即可

View File

@@ -1,11 +1,14 @@
# 源码部署 # 源码部署
不推荐
## 一、源码安装 ## 一、源码安装
### 环境要求
- nodejs 20 及以上
### 源码启动 ### 源码启动
```shell ```shell
# 克隆代码 # 克隆代码
git clone https://github.com/certd/certd git clone https://github.com/certd/certd
# git checkout v1.x.x # 1.x.x换成最新版本号当v2主干分支代码无法正常启动时可以尝试此命令 # git checkout v1.x.x # 当v2主干分支代码无法正常启动时可以尝试此命令1.x.x换成最新版本号
cd certd cd certd
# 启动服务 # 启动服务
./start.sh ./start.sh
@@ -26,9 +29,15 @@ https://your_server_ip:7002
## 二、升级 ## 二、升级
```shell ```shell
# 更新代码并启动
cd certd cd certd
# 确保数据安全,备份一下数据
cp -rf ./packages/ui/certd-server/data ../certd-data-backup
git pull git pull
# 如果提示pull失败可以尝试强制更新
# git checkout v2 -f && git pull
# 先停止旧的服务,7001是certd的默认端口 # 先停止旧的服务,7001是certd的默认端口
kill -9 $(lsof -t -i:7001) kill -9 $(lsof -t -i:7001)
# 重新编译启动 # 重新编译启动
@@ -42,4 +51,4 @@ kill -9 $(lsof -t -i:7001)
## 四、备份恢复 ## 四、备份恢复
将备份的`db.sqlite`覆盖到原来的位置即可 将备份的`db.sqlite`及同目录下的其他文件覆盖到原来的位置重启certd即可

View File

@@ -0,0 +1,12 @@
# 版本升级
## 升级方法
根据不同部署方式查看升级方法
1. [Docker方式部署升级](./docker/#二、升级)
2. [宝塔面板方式部署升级](./baota/#三、如何升级)
3. [1Panel面板方式部署升级](./1panel/#三、升级)
4. [源码方式部署](./source/#二、升级)
## 升级日志
[CHANGELOG](../changelogs/CHANGELOG.md)

View File

@@ -1,721 +0,0 @@
# Change Log
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.27.2](https://github.com/certd/certd/compare/v1.27.1...v1.27.2) (2024-11-08)
### Bug Fixes
* 修复某些容器管理ui无法识别端口列表的bug ([576e60a](https://github.com/certd/certd/commit/576e60a2b52315909e659d2a58cf98b130e69e6f))
* 修复删除腾讯云过期证书时间判断上的bug导致已过期仍然没有删除证书 ([1ba1007](https://github.com/certd/certd/commit/1ba10072615015d91b81fc56a3b01dae6a2ae9d1))
### Performance Improvements
* 优化部署到阿里云CDN插件支持多域名更易用 ([80c500f](https://github.com/certd/certd/commit/80c500f618b169a1f64c57fe442242a4d0d9d833))
* 优化流水线页面切换回来不丢失查询条件 ([4dcf6e8](https://github.com/certd/certd/commit/4dcf6e87bc5f7657ce8a56c5331e8723a0fee8ee))
* 支持公共cname服务 ([3c919ee](https://github.com/certd/certd/commit/3c919ee5d1aef5d26cf3620a7c49d920786bc941))
* 执行历史支持点击查看流水线详情 ([8968639](https://github.com/certd/certd/commit/89686399f90058835435b92872fc236fac990148))
* 专业版7天试用 ([c58250e](https://github.com/certd/certd/commit/c58250e1f065a9bd8b4e82acc1df754504c0010c))
## [1.27.1](https://github.com/certd/certd/compare/v1.27.0...v1.27.1) (2024-11-04)
### Bug Fixes
* 修复头像没有更新的bug ([9b4a31f](https://github.com/certd/certd/commit/9b4a31fa6a32b9cab2e22bd141cf96ca29120445))
### Performance Improvements
* 禁止页面缓存点击tab页签可以刷新数据 ([7ad4b55](https://github.com/certd/certd/commit/7ad4b55ee000c1dd0747832b11107f32b0ffb889))
* 优化时间选择器,自动填写分钟和秒钟 ([396dc34](https://github.com/certd/certd/commit/396dc34a841c7d016b033736afdba8366fb2d211))
* cname 域名映射记录可读性优化 ([b1117ed](https://github.com/certd/certd/commit/b1117ed54a3ef015752999324ff72b821ef5e4b9))
# [1.27.0](https://github.com/certd/certd/compare/v1.26.16...v1.27.0) (2024-10-31)
### Bug Fixes
* 修复历史记录不能按名称查询的bug ([6113c38](https://github.com/certd/certd/commit/6113c388b7fc58b11ca19ff05cc1286d096c8d28))
* pfx兼容windows server 2016 ([e5e468a](https://github.com/certd/certd/commit/e5e468a463f66d02f235de54b7c1e09ace5f1cb1))
### Features
* 首页全新改版 ([63ec5b5](https://github.com/certd/certd/commit/63ec5b5519c760a3330569c0da6dac157302a330))
### Performance Improvements
* 管理控制台数据统计 ([babd589](https://github.com/certd/certd/commit/babd5897ae013ff7c04ebfcbfac8a00d84dd627c))
* 增加向导 ([6d9ef26](https://github.com/certd/certd/commit/6d9ef26ecab71d752c2c55d75aed4fb5f6c05a39))
* lego 升级到 4.19.2 ([129bf53](https://github.com/certd/certd/commit/129bf53edc9bbb001fe49fbd7e239bd1d09cc128))
## [1.26.16](https://github.com/certd/certd/compare/v1.26.15...v1.26.16) (2024-10-30)
### Bug Fixes
* 修复lego No help topic for 错误 ([aaaf8d7](https://github.com/certd/certd/commit/aaaf8d7db34896cf8f2ff8f12eec1ab0cae58f0f))
### Performance Improvements
* 支持白山云cdn部署 ([b1b2cd0](https://github.com/certd/certd/commit/b1b2cd088b684eda764962abd61754c26a204d1c))
* 支持华为云cdn ([81a3fdb](https://github.com/certd/certd/commit/81a3fdbc29b71f380762008cc151493ec97458f9))
## [1.26.15](https://github.com/certd/certd/compare/v1.26.14...v1.26.15) (2024-10-28)
### Bug Fixes
* 顶部菜单变...的bug ([6dabad7](https://github.com/certd/certd/commit/6dabad76baba96be0f8af36a3fbfb9f5182aecf1))
### Performance Improvements
* 默认证书更新时间设置为35天增加腾讯云删除过期证书插件可以避免腾讯云过期证书邮件 ([51b6fed](https://github.com/certd/certd/commit/51b6fed468eaa6f28ce4497ce303ace1a52abb96))
* 授权加密支持解密查看 ([5575c83](https://github.com/certd/certd/commit/5575c839705f6987ad2bdcd33256b0962c6a9c6a))
* 重置管理员密码同时启用管理员账户,避免之前禁用了,重置密码还是登录不进去 ([f92d918](https://github.com/certd/certd/commit/f92d918a1e28e29b794ad4754661ea760c18af46))
## [1.26.14](https://github.com/certd/certd/compare/v1.26.13...v1.26.14) (2024-10-26)
### Bug Fixes
* 修复阿里云部署大杀器报插件_还未注册错误的bug ([abd2dcf](https://github.com/certd/certd/commit/abd2dcf2e85a545321bae6451406d081f773b132))
* 修复启动时自签证书无法保存的bug ([526c484](https://github.com/certd/certd/commit/526c48450bcd37b3ccded9b448f17de8140bdc6e))
### Performance Improvements
* 顶部菜单自定义 ([54d136c](https://github.com/certd/certd/commit/54d136cc6ae122f7c891b7a5c7232fe5de8e5cb5))
* 禁用readonly用户 ([d10d42e](https://github.com/certd/certd/commit/d10d42e20619bb55a50d636b8867ff33db4e3b4b))
* 限制其他用户流水线数量 ([315e437](https://github.com/certd/certd/commit/315e43746baf01682737f82e41579237a48409af))
* 用户管理优化头像上传 ([661293c](https://github.com/certd/certd/commit/661293c189a3abf3cdc953b5225192372f57930d))
## [1.26.13](https://github.com/certd/certd/compare/v1.26.12...v1.26.13) (2024-10-26)
### Bug Fixes
* 修复对话框全屏按钮与关闭按钮重叠的bug ([95df56c](https://github.com/certd/certd/commit/95df56cc5ca5e3eb843cd17cb7078cde47729f1e))
* deprecated的运行时不要报错只报警告 ([bcbefaa](https://github.com/certd/certd/commit/bcbefaaa35cf6d0eec085b3a2c5bfc7c6a8de9e1))
### Performance Improvements
* 更新certd本身的证书文档说明 ([0c50ede](https://github.com/certd/certd/commit/0c50ede129337b82df54575cbd2f4c2a783a0732))
* 支持同时监听https端口7002 ([d5a17f9](https://github.com/certd/certd/commit/d5a17f9e6afd63fda2df0981118480f25a1fac2e))
## [1.26.12](https://github.com/certd/certd/compare/v1.26.11...v1.26.12) (2024-10-25)
### Performance Improvements
* 部署到阿里云任意云资源,阿里云部署大杀器 ([4075be7](https://github.com/certd/certd/commit/4075be7849b140acb92bd8da8a9acbf4eef85180))
* 文件名特殊字符限制输入 ([c4164c6](https://github.com/certd/certd/commit/c4164c66e29f3ec799f98108a344806ca61e94ff))
* 新增部署到百度云CDN插件 ([f126f9f](https://github.com/certd/certd/commit/f126f9f932d37fa01fff1accc7bdd17d349f8db5))
* 新增部署到腾讯云CDN-v2推荐使用 ([d782655](https://github.com/certd/certd/commit/d782655cb4dfbb74138178afbffeee76fc755115))
* 优化cron选择器增加下次触发时间显示 ([5b148b7](https://github.com/certd/certd/commit/5b148b7ed960ca6f7f5b733b2eadd56eeecbd4c2))
* 支持部署到腾讯云COS ([a8a45d7](https://github.com/certd/certd/commit/a8a45d7f757820990e278533277a3deda5ba48f3))
* 支持配置公共ZeroSSL授权 ([a90d1e6](https://github.com/certd/certd/commit/a90d1e68ee9cbc3705223457b8a86f071b150968))
## [1.26.11](https://github.com/certd/certd/compare/v1.26.10...v1.26.11) (2024-10-23)
### Bug Fixes
* 申请证书没有使用到系统设置的http代理的bug ([3db216f](https://github.com/certd/certd/commit/3db216f515ba404cb4330fdab452971b22a50f08))
* 修复移动任务后出现空阶段的bug ([4ea3edd](https://github.com/certd/certd/commit/4ea3edd59e93ca4f5b2e43b20dd4ef33909caddb))
* 修复google证书*.xx.com与xx.com同时申请时报错的bug ([f8b99b8](https://github.com/certd/certd/commit/f8b99b81a23e7e9fd5e05ebd5caf355c41d67a90))
* 允许七牛云cdn插件输入.号开头的通配符域名 ([18ee87d](https://github.com/certd/certd/commit/18ee87daff6eafc2201b58e28d85aafd3cb7a5b9))
### Performance Improvements
* 申请证书启用新的反代地址 ([a705182](https://github.com/certd/certd/commit/a705182b85e51157883e48f23463263793bf3c12))
* 优化日志颜色 ([1291e98](https://github.com/certd/certd/commit/1291e98e821c5b1810aab7f0aebe3f5f5cd44a20))
* 优化证书申请速度和成功率反代地址优化google基本可以稳定请求。增加请求重试。 ([41d9c3a](https://github.com/certd/certd/commit/41d9c3ac8398def541e65351cbe920d4a927182d))
* 优化pfx密码密码输入框让浏览器不自动填写密码 ([ffeede3](https://github.com/certd/certd/commit/ffeede38afa70c5ff6f2015516bead23d2c4df87))
## [1.26.10](https://github.com/certd/certd/compare/v1.26.9...v1.26.10) (2024-10-20)
### Bug Fixes
* 修复cname服务普通用户access访问权限问题 ([c1e3e2e](https://github.com/certd/certd/commit/c1e3e2ee1f923ee5806479dd5f178c3286a01ae0))
## [1.26.9](https://github.com/certd/certd/compare/v1.26.8...v1.26.9) (2024-10-19)
### Bug Fixes
* 修复普通用户无法校验cname配置的bug ([6285497](https://github.com/certd/certd/commit/62854978bf0bdbe749b42f8e40ab227ab31ec92f))
* 修复切换普通用户登录时左侧菜单没有同步更新的bug ([12116a8](https://github.com/certd/certd/commit/12116a89f43cf8b98f16d2ea6073f6b72a643215))
* 修正邮箱设置跳转路由 ([17d8890](https://github.com/certd/certd/commit/17d88900a1f0e3af609b74597f5b1978230db32d))
### Performance Improvements
* 触发证书重新申请input变化对比规则优化减少升级版本后触发申请证书的情况 ([c46a2a9](https://github.com/certd/certd/commit/c46a2a9a399c2a9a8bb59a48b9fb6e93227cce9b))
* 任务下所有步骤都跳过时,整个任务显示跳过 ([84fd3b2](https://github.com/certd/certd/commit/84fd3b250dd1161ea06c5582fdadece4b29c2e53))
* 授权配置去除前后空格 ([57d8d48](https://github.com/certd/certd/commit/57d8d48046fbf51c52b041d2dec03d51fb018587))
* 数据库备份插件,先压缩再备份 ([304ef49](https://github.com/certd/certd/commit/304ef494fd5787c996ad0dcb6edd2f517afce9e2))
* 优化菜单 ([1f4f157](https://github.com/certd/certd/commit/1f4f15757de1015cf7563f7022599eef58cc93d7))
* 增加文档站 https://certd.docmirror.cn ([6e2ac1c](https://github.com/certd/certd/commit/6e2ac1c089f6ddccb396f1f2738509c05333e1bb))
## [1.26.8](https://github.com/certd/certd/compare/v1.26.7...v1.26.8) (2024-10-15)
### Bug Fixes
* 修复无法设置角色的bug ([02fe704](https://github.com/certd/certd/commit/02fe704769edb25fea5ffd85a51a5530864b37b3))
### Performance Improvements
* 角色删除安全 ([28bb485](https://github.com/certd/certd/commit/28bb4856bee03569153f6471527c9b9f28cb3d14))
* 密钥备份 ([1c6028a](https://github.com/certd/certd/commit/1c6028abcf8849163462bb2f8441b6838357e09b))
* 证书直接查看 ([5dde5bd](https://github.com/certd/certd/commit/5dde5bd3f76db3959d411619d29bfb8064e3b307))
* sqlite数据库备份插件 ([77f1631](https://github.com/certd/certd/commit/77f163144f7dcfb0431475c55508fecfd6d969f8))
## [1.26.7](https://github.com/certd/certd/compare/v1.26.6...v1.26.7) (2024-10-14)
### Bug Fixes
* 修复siteInfo每次都要重新设置的bug ([36b26ae](https://github.com/certd/certd/commit/36b26ae9f5c7a53c1c2546fb79b2ea451b854abf))
## [1.26.6](https://github.com/certd/certd/compare/v1.26.5...v1.26.6) (2024-10-14)
### Bug Fixes
* 修复排序失效的bug ([1f0742e](https://github.com/certd/certd/commit/1f0742ef9f0caae0c7e713acf0fd3cebf5d63875))
## [1.26.5](https://github.com/certd/certd/compare/v1.26.4...v1.26.5) (2024-10-14)
### Bug Fixes
* 修复版本号获取错误的bug ([8851870](https://github.com/certd/certd/commit/8851870400df86e496198ad509061b8989fcc44f))
## [1.26.4](https://github.com/certd/certd/compare/v1.26.3...v1.26.4) (2024-10-14)
### Performance Improvements
* [comm] 支持插件管理 ([e8b617b](https://github.com/certd/certd/commit/e8b617b80ce882dd63006f0cfc719a80a1cc6acc))
* 新增代理设置功能 ([273ab61](https://github.com/certd/certd/commit/273ab6139f5807f4d7fe865cc353b97f51b9a668))
* EAB授权支持绑定邮箱支持公共EAB设置 ([07043af](https://github.com/certd/certd/commit/07043aff0ca7fd29c56dd3c363002cb15d78b464))
## [1.26.3](https://github.com/certd/certd/compare/v1.26.2...v1.26.3) (2024-10-12)
### Performance Improvements
* 优化系统设置加载时机 ([7396253](https://github.com/certd/certd/commit/73962536d5a4769902d760d005f3f879465addcc))
## [1.26.2](https://github.com/certd/certd/compare/v1.26.1...v1.26.2) (2024-10-11)
### Bug Fixes
* 修复某些情况下bindUrl失败的bug ([91fc1cd](https://github.com/certd/certd/commit/91fc1cd7353be4a22be951239ed70b38baebc74e))
### Performance Improvements
* 邮箱设置改为系统设置,普通用户无需配置发件邮箱 ([4244569](https://github.com/certd/certd/commit/42445692117184a3293e63bef84a74cbb5984b0e))
## [1.26.1](https://github.com/certd/certd/compare/v1.26.0...v1.26.1) (2024-10-10)
**Note:** Version bump only for package root
# [1.26.0](https://github.com/certd/certd/compare/v1.25.9...v1.26.0) (2024-10-10)
### Bug Fixes
* 修复管理员编辑其他用户流水线任务时归属userid也被修改的bug ([e85c477](https://github.com/certd/certd/commit/e85c47744cf740b4af3b93dca7c2f0ccc818ec2f))
* 修复历史记录根据流水线名称查询报错的bug ([ce9a986](https://github.com/certd/certd/commit/ce9a9862f122fce2186e7727eaa4b251b59e6032))
* 修复某些代理情况下 报 400 The plain HTTP request was sent to HTTPS port use proxy 的bug ([a13203f](https://github.com/certd/certd/commit/a13203fb3f48c427d0d81a504912248dcc07df1a))
### Features
* 域名验证方法支持CNAME间接方式此方式支持所有域名注册商且无需提供Access授权但是需要手动添加cname解析 ([f3d3508](https://github.com/certd/certd/commit/f3d35084ed44f9f33845f7045e520be5c27eed93))
* 站点个性化设置 ([11a9fe9](https://github.com/certd/certd/commit/11a9fe9014d96cba929e5a066e78f2af7ae59d14))
### Performance Improvements
* 并行任务名称改成添加任务取消并行可以在同一个阶段获取上一个task的输出 ([c5e5877](https://github.com/certd/certd/commit/c5e58770d1c5edc19c6f9ea1618f44b68e091f35))
* 调整静态资源到static目录 ([0584b36](https://github.com/certd/certd/commit/0584b3672b40f9042a2ed87e5627022606d046cd))
* 调整全部静态资源到static目录 ([a218890](https://github.com/certd/certd/commit/a21889080d6c7ffdf0af526a3a21f0b2d1c77288))
* 检查cname是否正确配置 ([b5d8935](https://github.com/certd/certd/commit/b5d8935159374fbe7fc7d4c48ae0ed9396861bdd))
* 七牛云cdn支持配置多个域名 ([88d745e](https://github.com/certd/certd/commit/88d745e29063a089864fb9c6705be7b8d4c2669a))
* 上传到主机插件支持注入环境变量 ([81fac73](https://github.com/certd/certd/commit/81fac736f9ccc8d1cda7ef4178752239cec20849))
* 优化宝塔网站部署插件远程获取数据的提示 ([2a3ca9f](https://github.com/certd/certd/commit/2a3ca9f552d96594ec6690a1c4c91f598451b9a1))
* 优化缩短首页缓存时间 ([49395e8](https://github.com/certd/certd/commit/49395e8cb65f4b30c0145329ed5de48be4ef3842))
* 域名输入增加校验提示,避免输入错误的域名 ([0c8e83e](https://github.com/certd/certd/commit/0c8e83e1254a9ce4d5a4e7888eb1710394a4b77c))
* cname校验配置增加未校验通过提示 ([77cc3c4](https://github.com/certd/certd/commit/77cc3c4a5cbd81f8233a8e0bb33fab0621c0905f))
* google eab授权支持自动获取不过要配置代理 ([592791d](https://github.com/certd/certd/commit/592791d1356fc252fbb70d7f168567aee9585507))
## [1.25.9](https://github.com/certd/certd/compare/v1.25.8...v1.25.9) (2024-10-01)
### Bug Fixes
* 修复西部数码账户级别apikey不可用的bug ([f8f3e8b](https://github.com/certd/certd/commit/f8f3e8b43fd5d815887bcb53b95f46dc96424b79))
### Performance Improvements
* 增加等待插件 ([3ef0541](https://github.com/certd/certd/commit/3ef0541cc85ab6abf698ead3b258ae1ac156ef98))
## [1.25.8](https://github.com/certd/certd/compare/v1.25.7...v1.25.8) (2024-09-30)
### Bug Fixes
* 修复pfxPassword无效的bug ([251e450](https://github.com/certd/certd/commit/251e450fabfe62405bac13e39f2153736c081ef0))
### Performance Improvements
* 群晖获取deviceid优化 ([8d42273](https://github.com/certd/certd/commit/8d4227366548eb70f6bc04303829e6933168f906))
## [1.25.7](https://github.com/certd/certd/compare/v1.25.6...v1.25.7) (2024-09-29)
### Bug Fixes
* 修复某些地区被屏蔽无法激活专业版的bug ([7532a96](https://github.com/certd/certd/commit/7532a960851b84d4f2cc3dba02353c5235e1a364))
### Performance Improvements
* 上传到主机支持socks代理 ([d91026d](https://github.com/certd/certd/commit/d91026dc4fbfe5fedc4ee8e43dc0d08f1cf88356))
* 支持上传到七牛云oss ([bf024bd](https://github.com/certd/certd/commit/bf024bdda8bc2a463475be5761acf0da7317a08a))
## [1.25.6](https://github.com/certd/certd/compare/v1.25.5...v1.25.6) (2024-09-29)
### Bug Fixes
* 修复中间证书复制错误的bug ([76e86ea](https://github.com/certd/certd/commit/76e86ea283ecbe4ec76cdc92b98457d0fef544ac))
### Performance Improvements
* 部署支持1Panel ([d047234](https://github.com/certd/certd/commit/d047234d98d31504f2e5a472b66e1b75806af26e))
* 增加使用教程 ([9d9c021](https://github.com/certd/certd/commit/9d9c0218195af5b9896cce7109b26a433480571d))
## [1.25.5](https://github.com/certd/certd/compare/v1.25.4...v1.25.5) (2024-09-26)
**Note:** Version bump only for package root
## [1.25.4](https://github.com/certd/certd/compare/v1.25.3...v1.25.4) (2024-09-25)
### Bug Fixes
* 修复启动报授权验证失败的bug ([3460d3d](https://github.com/certd/certd/commit/3460d3ddca222ea702816ab805909d489eff957f))
## [1.25.3](https://github.com/certd/certd/compare/v1.25.2...v1.25.3) (2024-09-24)
### Bug Fixes
* 修复upload to host trim错误 ([0f0ddb9](https://github.com/certd/certd/commit/0f0ddb9c5963fd643d6d203334efac471c43ec3b))
## [1.25.2](https://github.com/certd/certd/compare/v1.25.1...v1.25.2) (2024-09-24)
**Note:** Version bump only for package root
## [1.25.1](https://github.com/certd/certd/compare/v1.25.0...v1.25.1) (2024-09-24)
**Note:** Version bump only for package root
# [1.25.0](https://github.com/certd/certd/compare/v1.24.4...v1.25.0) (2024-09-24)
### Bug Fixes
* 修复首次创建任务运行时不自动设置当前运行情况的bug ([ecd83ee](https://github.com/certd/certd/commit/ecd83ee136abdd3df9ed2f21ec2ff0f24c0ed9d9))
### Features
* 账号绑定 ([e046640](https://github.com/certd/certd/commit/e0466409d0c021bb415abd94df448c8a0d4799e9))
* 支持中间证书 ([e86756e](https://github.com/certd/certd/commit/e86756e4c65a53dd23106d7ecbfe2fa987cc13f3))
* 支持vip转移 ([361e8fe](https://github.com/certd/certd/commit/361e8fe7ae5877e23fd5de31bc919bedd09c57f5))
### Performance Improvements
* 群晖支持OTP双重验证登录 ([8b8039f](https://github.com/certd/certd/commit/8b8039f42bbce10a4d0e737cdeeeef9bb17bee5a))
* 任务支持禁用 ([8ed16b3](https://github.com/certd/certd/commit/8ed16b3ea2dfe847357863a0bfa614e4fa5fc041))
* 优化收件邮箱输入 ([22ef28f](https://github.com/certd/certd/commit/22ef28f6338a78465bd52ccbad13e66e80263b2f))
* 优化主机登录失败提示 ([9de77b3](https://github.com/certd/certd/commit/9de77b327d39cff5ed6660ec53b58ba0eea18e5a))
* 增加重启certd插件 ([48238d9](https://github.com/certd/certd/commit/48238d929e6c4afa1d428e4d35b9159d37a47ae0))
* 证书支持旧版RSApkcs1 ([3d9c3ec](https://github.com/certd/certd/commit/3d9c3ecb3eb604b2458154f608bde0f01915d116))
* 支持阿里云ACK证书部署 ([d331fea](https://github.com/certd/certd/commit/d331fea47789122650e057ec7c9e85ee8e66f09b))
* 支持七牛云 ([8ecc2f9](https://github.com/certd/certd/commit/8ecc2f9446a9ebd11b9bfbffbb6cf7812a043495))
* 支持k8s ingress secret ([e5a5d0a](https://github.com/certd/certd/commit/e5a5d0a607bb6b4e1a1f7a1a419bada5f2dee59f))
* http请求增加默认超时时间 ([664bd86](https://github.com/certd/certd/commit/664bd863e5b4895aabe2384277c0c65f5902fdb2))
* plugins增加图标 ([a8da658](https://github.com/certd/certd/commit/a8da658a9723342b4f43a579f7805bfef0648efb))
## [1.24.4](https://github.com/certd/certd/compare/v1.24.3...v1.24.4) (2024-09-09)
### Bug Fixes
* 修复腾讯云cdn证书部署后会自动关闭hstshttp2.0等配置的bug ([7908ab7](https://github.com/certd/certd/commit/7908ab79da624c94fa05849925b15e480e3317c4))
* 修复腾讯云tke证书部署报错的bug ([653f409](https://github.com/certd/certd/commit/653f409d91a441850d6381f89a8dd390831f0d5e))
### Performance Improvements
* 插件选择支持搜索 ([d1498a7](https://github.com/certd/certd/commit/d1498a71601b74d38343b1d070eadd03705dd9d5))
* 前置任务步骤增加错误提示 ([ae3daa9](https://github.com/certd/certd/commit/ae3daa9bcf4fc363825aad9b77f5d3879aeeff70))
* 群晖部署教程 ([0f0af2f](https://github.com/certd/certd/commit/0f0af2f309390f388e7a272cea3a1dd30c01977d))
* 支持群晖 ([5c270b6](https://github.com/certd/certd/commit/5c270b6b9d45a2152f9fdb3c07bd98b7c803cb8e))
## [1.24.3](https://github.com/certd/certd/compare/v1.24.2...v1.24.3) (2024-09-06)
### Performance Improvements
* 支持多吉云cdn证书部署 ([65ef685](https://github.com/certd/certd/commit/65ef6857296784ca765926e09eafcb6fc8b6ecde))
## [1.24.2](https://github.com/certd/certd/compare/v1.24.1...v1.24.2) (2024-09-06)
### Bug Fixes
* 修复复制流水线出现的各种问题 ([6314e8d](https://github.com/certd/certd/commit/6314e8d7eb58cd52e2a7bd3b5ffb9112b0b69577))
* 修复windows下无法执行第二条命令的bug ([71ac8aa](https://github.com/certd/certd/commit/71ac8aae4aa694e1a23761e9761c9fba30b43a21))
### Performance Improvements
* 阶段、任务、步骤全面支持拖动排序 ([bd73a16](https://github.com/certd/certd/commit/bd73a163cd0497f062bd424ddc6bc9bbc95f81ea))
* 任务配置不需要的字段可以自动隐藏 ([192d9dc](https://github.com/certd/certd/commit/192d9dc7e36737d684c769f255f407c28b1152ac))
* 任务支持拖动排序 ([1e9b563](https://github.com/certd/certd/commit/1e9b5638aa36a8ce70019a9c750230ba41938327))
* 西部数据支持用户级的apikey ([1c17b41](https://github.com/certd/certd/commit/1c17b41e160944b073e1849e6f9467c3659a4bfc))
* 修复windows下无法执行第二条命令的bug ([d5bfcdb](https://github.com/certd/certd/commit/d5bfcdb6de1dcc1702155442e2e00237d0bbb6e5))
* 优化跳过处理逻辑 ([b80210f](https://github.com/certd/certd/commit/b80210f24bf5db1c958d06ab27c9e5d3db452eda))
* 支持阿里云oss ([87a2673](https://github.com/certd/certd/commit/87a2673e8c33dff6eda1b836d92ecc121564ed78))
* 支持西部数码DNS ([c59cab1](https://github.com/certd/certd/commit/c59cab1aaeb19f86df8e3e0d8127cbd0a9ef77f3))
* 支持pfx、der ([fbeaed2](https://github.com/certd/certd/commit/fbeaed203519f59b6d9396c4e8953353ccb5e723))
* client 请求超时时间延长为10s ([ff46771](https://github.com/certd/certd/commit/ff46771d8dd43e71c1ca70e3ba783945750342cc))
## [1.24.1](https://github.com/certd/certd/compare/v1.24.0...v1.24.1) (2024-09-02)
### Bug Fixes
* 激活仅限管理员 ([1c17970](https://github.com/certd/certd/commit/1c17970b981f0987c506744ee6b2283fd5e40493))
* 修复在没有勾选使用代理的情况下仍然会使用代理的bug ([0f66794](https://github.com/certd/certd/commit/0f6679425f6a736bb0128527dd99c085fac17d84))
### Performance Improvements
* 部署插件支持宝塔、易盾云等 ([ee61709](https://github.com/certd/certd/commit/ee617095efa1171548cf52fd45f0f98a368555a3))
* 授权配置支持加密 ([42a56b5](https://github.com/certd/certd/commit/42a56b581d754c3e5f9838179d19ab0d004ef2eb))
* 优化内存占用 ([db61033](https://github.com/certd/certd/commit/db6103363364440b650bc10bb334834e4a9470c7))
* 支持阿里云 DCDN ([98b77f8](https://github.com/certd/certd/commit/98b77f80843834616fb26f83b4c42245326abd06))
* 支持已跳过的步骤重新运行 ([ea775ad](https://github.com/certd/certd/commit/ea775adae18d57a04470cfba6b9460d761d74035))
* 支持cdnfly ([724a850](https://github.com/certd/certd/commit/724a85028b4a7146c9e3b4df4497dcf2a7bf7c67))
* 支持ftp上传 ([b9bddbf](https://github.com/certd/certd/commit/b9bddbfabb5664365f1232e9432532187c98006c))
# [1.24.0](https://github.com/certd/certd/compare/v1.23.1...v1.24.0) (2024-08-25)
### Bug Fixes
* 部署到腾讯云cdn选择证书任务步骤限制只能选证书 ([3345c14](https://github.com/certd/certd/commit/3345c145b802170f75a098a35d0c4b8312efcd17))
* 修复成功后跳过之后丢失腾讯云证书id的bug ([37eb762](https://github.com/certd/certd/commit/37eb762afe25c5896b75dee25f32809f8426e7b7))
* 修复创建流水线后立即运行时报no id错误的bug ([17ead54](https://github.com/certd/certd/commit/17ead547aab25333603980304aa3aad3db1f73d5))
* 修复使用代理的情况下申请证书失败的bug ([95122e2](https://github.com/certd/certd/commit/95122e28609333f4df55c266e5434897954c0fb3))
* 修复执行日志没有清理的bug ([22a3363](https://github.com/certd/certd/commit/22a336370a88a7df2a23c967043bae153da71ed5))
* 修复重置密码参数配置后无效的bug ([e358a88](https://github.com/certd/certd/commit/e358a8869696578687306e4cd0dcda53f898fe13))
* 修复ssh无法连接成功无法执行命令的bug ([41b9837](https://github.com/certd/certd/commit/41b9837582323fb400ef8525ce65e8b37ad4b36f))
### Features
* 支持ECC类型 ([a7424e0](https://github.com/certd/certd/commit/a7424e02f5c7e02ac1688791040785920ce67473))
* 支持google证书申请需要使用代理 ([a593056](https://github.com/certd/certd/commit/a593056e79e99dd6a74f75b5eab621af7248cfbe))
### Performance Improvements
* 更新k8s底层api库 ([746bb9d](https://github.com/certd/certd/commit/746bb9d385e2f397daef4976eca1d4782a2f5ebd))
* 优化成功后跳过的提示 ([7b451bb](https://github.com/certd/certd/commit/7b451bbf6e6337507f4627b5a845f5bd96ab4f7b))
* 优化证书申请成功率 ([968c469](https://github.com/certd/certd/commit/968c4690a07f69c08dcb3d3a494da4e319627345))
* 优化dnspod的token id 说明 ([790bf11](https://github.com/certd/certd/commit/790bf11af06d6264ef74bc1bb919661f0354239a))
* email proxy ([453f1ba](https://github.com/certd/certd/commit/453f1baa0b9eb0f648aa1b71ccf5a95b202ce13f))
## [1.23.1](https://github.com/certd/certd/compare/v1.23.0...v1.23.1) (2024-08-06)
### Bug Fixes
* 修复模糊查询无效的bug ([9355917](https://github.com/certd/certd/commit/93559174c780173f0daec7cdbd1f72f8d5c504d5))
### Performance Improvements
* 优化插件字段的default value ([24c7be2](https://github.com/certd/certd/commit/24c7be2c9cb39c14f7a97b674127c88033280b02))
* 优化默认值设置 ([1af19f0](https://github.com/certd/certd/commit/1af19f0ac053fe109782882964533636b5969d6b))
# [1.23.0](https://github.com/certd/certd/compare/v1.22.9...v1.23.0) (2024-08-05)
### Bug Fixes
* 修复环境变量多个下划线不生效的bug ([7ec2218](https://github.com/certd/certd/commit/7ec2218c9fee5bee2bf0aa31f3e3a4301575f247))
### Features
* use node 20 ([e8ed972](https://github.com/certd/certd/commit/e8ed97206bf28e83f942db2ef4ea07fa76fd3567))
## [1.22.9](https://github.com/certd/certd/compare/v1.22.8...v1.22.9) (2024-08-05)
### Performance Improvements
* 优化定时任务 ([87e440e](https://github.com/certd/certd/commit/87e440ee2a8b10dc571ce619f28bc83c1e5eb147))
## [1.22.8](https://github.com/certd/certd/compare/v1.22.7...v1.22.8) (2024-08-05)
### Performance Improvements
* 修复删除历史记录没有删除log的bug新增history管理页面演示站点启动时不自动启动非管理员用户的定时任务 ([f78ae93](https://github.com/certd/certd/commit/f78ae93eedfe214008c3d071ca3d77c962137a64))
* 优化pipeline删除时删除其他history ([b425203](https://github.com/certd/certd/commit/b4252033d56a9ad950f3e204ff021497c3978015))
## [1.22.7](https://github.com/certd/certd/compare/v1.22.6...v1.22.7) (2024-08-04)
### Bug Fixes
* 修复保存配置报id不能为空的bug ([367f807](https://github.com/certd/certd/commit/367f80731396003416665c22853dfbc09c2c03a0))
## [1.22.6](https://github.com/certd/certd/compare/v1.22.5...v1.22.6) (2024-08-03)
### Bug Fixes
* 修复在相同的cron时偶尔无法触发定时任务的bug ([680941a](https://github.com/certd/certd/commit/680941af119619006b592e3ab6fb112cb5556a8b))
* 修复pg下pipeline title 类型问题 ([a9717b9](https://github.com/certd/certd/commit/a9717b9a0df7b5a64d4fe03314fecad4f59774cc))
### Performance Improvements
* 流水线支持名称模糊查询 ([59897c4](https://github.com/certd/certd/commit/59897c4ceae992ebe2972ca9e8f9196616ffdfd7))
* 腾讯云clb支持更多大区选择 ([e4f4570](https://github.com/certd/certd/commit/e4f4570b29f26c60f1ee9660a4c507cbeaba3d7e))
* 优化前置任务输出为空的提示 ([6ed1e18](https://github.com/certd/certd/commit/6ed1e18c7d9c46d964ecc6abc90f3908297b7632))
## [1.22.5](https://github.com/certd/certd/compare/v1.22.4...v1.22.5) (2024-07-26)
### Bug Fixes
* 修复用户管理无法添加用户的bug ([e7e89b8](https://github.com/certd/certd/commit/e7e89b8de7386e84c0d6b8e217e2034909657d68))
## [1.22.4](https://github.com/certd/certd/compare/v1.22.3...v1.22.4) (2024-07-26)
### Performance Improvements
* 证书申请支持反向代理letsencrypt无法访问时的备用方案 ([b7b5df0](https://github.com/certd/certd/commit/b7b5df0587e0f7ea288c1b2af6f87211f207395f))
* 支持arm64 ([fa14f87](https://github.com/certd/certd/commit/fa14f87a8093ef3addc5e5f3315ce1bfc9982782))
## [1.22.3](https://github.com/certd/certd/compare/v1.22.2...v1.22.3) (2024-07-25)
### Bug Fixes
* lege 无执行权限问题 ([338eb3b](https://github.com/certd/certd/commit/338eb3bdfeb461e9b3bc7eee97b97a59f5642ffe))
## [1.22.2](https://github.com/certd/certd/compare/v1.22.1...v1.22.2) (2024-07-23)
### Bug Fixes
* 修复创建流水线时无法根据dns类型默认正确的dns授权的bug ([a2c43b5](https://github.com/certd/certd/commit/a2c43b50a6069ed48958fd142844a8568c2af452))
## [1.22.1](https://github.com/certd/certd/compare/v1.22.0...v1.22.1) (2024-07-20)
### Performance Improvements
* 创建证书任务可以选择lege插件 ([affef13](https://github.com/certd/certd/commit/affef130378030c517250c58a4e787b0fc85d7d1))
* 创建证书任务增加定时任务和邮件通知输入 ([427620d](https://github.com/certd/certd/commit/427620d34f3b8ad6933005faf1878908441a2453))
* 支持配置启动后自动触发一次任务 ([a5a0c1f](https://github.com/certd/certd/commit/a5a0c1f6e7a3f05e581005e491d5b102ee854412))
# [1.22.0](https://github.com/certd/certd/compare/v1.21.2...v1.22.0) (2024-07-19)
### Features
* 升级midway支持esm ([485e603](https://github.com/certd/certd/commit/485e603b5165c28bc08694997726eaf2a585ebe7))
* 支持lego海量DNS提供商 ([0bc6d0a](https://github.com/certd/certd/commit/0bc6d0a211920fb0084d705e1db67ee1e7262c44))
* 支持postgresql ([3b19bfb](https://github.com/certd/certd/commit/3b19bfb4291e89064b3b407a80dae092d54747d5))
### Performance Improvements
* 优化一些小细节 ([b168852](https://github.com/certd/certd/commit/b1688525dbbbfd67e0ab1cf5b4ddfbe9d394f370))
* 增加备案号设置 ([bd3d959](https://github.com/certd/certd/commit/bd3d959944db63a5690b55ee150e1007133868b9))
* 自动生成jwtkey无需手动配置 ([390e485](https://github.com/certd/certd/commit/390e4853a570390a97df6a3b3882579f9547eeb4))
## [1.21.2](https://github.com/certd/certd/compare/v1.21.1...v1.21.2) (2024-07-08)
### Performance Improvements
* 申请证书时可以选择跳过本地dns校验 ([fe91d94](https://github.com/certd/certd/commit/fe91d94090d22ed0a3ea753ba74dfaa1bf057c17))
## [1.21.1](https://github.com/certd/certd/compare/v1.21.0...v1.21.1) (2024-07-08)
### Performance Improvements
* 上传到主机支持设置不mkdirs ([5ba9831](https://github.com/certd/certd/commit/5ba9831ed1aa6ec6057df246f1035b36b9c41d2e))
* 说明优化,默认值优化 ([970c7fd](https://github.com/certd/certd/commit/970c7fd8a0f557770e973d8462ee5684ef742810))
# [1.21.0](https://github.com/certd/certd/compare/v1.20.17...v1.21.0) (2024-07-03)
### Features
* 支持zero ssl ([eade2c2](https://github.com/certd/certd/commit/eade2c2b681569f03e9cd466e7d5bcd6703ed492))
## [1.20.17](https://github.com/certd/certd/compare/v1.20.16...v1.20.17) (2024-07-03)
### Performance Improvements
* 创建dns解析后强制等待60s ([f47b35f](https://github.com/certd/certd/commit/f47b35f6d5bd7d675005c3e286b7e9a029201f8b))
* 文件上传提示由cert.crt改为cert.pem ([a09b0e4](https://github.com/certd/certd/commit/a09b0e48c176f3ed763791bd50322c29729f7c1c))
* 优化cname verify ([eba333d](https://github.com/certd/certd/commit/eba333de7a5b5ef4b0b7eaa904f578720102fa61))
## [1.20.16](https://github.com/certd/certd/compare/v1.20.15...v1.20.16) (2024-07-01)
### Bug Fixes
* 修复配置了cdn cname后申请失败的bug ([4a5fa76](https://github.com/certd/certd/commit/4a5fa767edc347d03d29a467e86c9a4d70b0220c))
## [1.20.15](https://github.com/certd/certd/compare/v1.20.14...v1.20.15) (2024-06-28)
### Bug Fixes
* 修复无法强制取消任务的bug ([9cc01db](https://github.com/certd/certd/commit/9cc01db1d569a5c45bb3e731f35d85df324a8e62))
### Performance Improvements
* 腾讯云dns provider 支持腾讯云的accessId ([e0eb3a4](https://github.com/certd/certd/commit/e0eb3a441384d474fe2923c69b25318264bdc9df))
* 支持windows文件上传 ([7f61cab](https://github.com/certd/certd/commit/7f61cab101fa13b4e88234e9ad47434e6130fed2))
## [1.20.14](https://github.com/certd/certd/compare/v1.20.13...v1.20.14) (2024-06-23)
### Bug Fixes
* 修复修改密码功能异常问题 ([f740ff5](https://github.com/certd/certd/commit/f740ff517f521dce361284c2c54bccc68aee0ea2))
## [1.20.13](https://github.com/certd/certd/compare/v1.20.12...v1.20.13) (2024-06-18)
### Bug Fixes
* 日志高度越界 ([c4c9adb](https://github.com/certd/certd/commit/c4c9adb8bfd513f57252e523794e3799a9b220f8))
* 修复邮箱设置页面SMTP拼写错误的问题 ([b98f1c0](https://github.com/certd/certd/commit/b98f1c0dd0bc6c6b4f814c578692afdf6d90b88d))
* 修复logo问题 ([7e483e6](https://github.com/certd/certd/commit/7e483e60913d509b113148c735fe13ba1d72dddf))
### Performance Improvements
* 增加警告,修复一些样式错乱问题 ([fd54c2f](https://github.com/certd/certd/commit/fd54c2ffac492222e85ff2f5f49a9ee5cfc73588))
* ssh登录支持openssh格式私钥、支持私钥密码 ([5c2c508](https://github.com/certd/certd/commit/5c2c50839a9076004f9034d754ac6deb531acdfb))
## [1.20.12](https://github.com/certd/certd/compare/v1.20.10...v1.20.12) (2024-06-17)
### Bug Fixes
* 修复aliyun域名超过100个找不到域名的bug ([5b1494b](https://github.com/certd/certd/commit/5b1494b3ce93d1026dc56ee741342fbb8bf7be24))
### Performance Improvements
* 增加系统设置,可以关闭自助注册功能 ([20feace](https://github.com/certd/certd/commit/20feacea12d43386540db6a600f391d786be4014))
* 增加cloudflare access token说明 ([934e6e2](https://github.com/certd/certd/commit/934e6e2bd05387cd50ffab95f230933543954098))
* 支持重置管理员密码,忘记密码的补救方案 ([732cbc5](https://github.com/certd/certd/commit/732cbc5e927b526850724594830392b2f10c6705))
* 支持cloudflare域名 ([fbb9a47](https://github.com/certd/certd/commit/fbb9a47e8f7bb805289b9ee64bd46ffee0f01c06))
## [1.20.10](https://github.com/certd/certd/compare/v1.20.9...v1.20.10) (2024-05-30)
### Bug Fixes
* 增加权限相关helper说明 ([83e4083](https://github.com/certd/certd/commit/83e40836ebff10bec60efe8933183e1ba1c22bf9))
* 增加权限相关helper说明 ([4304c94](https://github.com/certd/certd/commit/4304c9443ad9248f63dd6d8c512d8d6f32f90d37))
### Performance Improvements
* 上传到主机插件支持复制到本机路径 ([92446c3](https://github.com/certd/certd/commit/92446c339936f98f08f654b8971a7393d8435224))
* 优化文件下载包名 ([d9eb927](https://github.com/certd/certd/commit/d9eb927b0a1445feab08b1958aa9ea80637a5ae6))
* 增加任务复制功能 ([39ad759](https://github.com/certd/certd/commit/39ad7597fa0e19cc1f7631bbd6fea0a9e05a62c9))
## [1.20.9](https://github.com/certd/certd/compare/v1.20.8...v1.20.9) (2024-03-22)
**Note:** Version bump only for package root
## [1.20.8](https://github.com/certd/certd/compare/v1.20.7...v1.20.8) (2024-03-22)
**Note:** Version bump only for package root
## [1.20.7](https://github.com/certd/certd/compare/v1.20.6...v1.20.7) (2024-03-22)
**Note:** Version bump only for package root
## [1.20.6](https://github.com/certd/certd/compare/v1.20.5...v1.20.6) (2024-03-21)
### Bug Fixes
* 调整按钮图标到居中位置 ([836d18f](https://github.com/certd/certd/commit/836d18f07e22d00faf2f213bc3301a6672b5bafc))
### Performance Improvements
* 插件贡献文档及示例 ([72fb20a](https://github.com/certd/certd/commit/72fb20abf3ba5bdd862575d2907703a52fd7eb17))
## [1.20.5](https://github.com/certd/certd/compare/v1.20.2...v1.20.5) (2024-03-11)
### Bug Fixes
* 修复腾讯云cdn部署无法选择端点的bug ([154409b](https://github.com/certd/certd/commit/154409b1dfee3ea1caae740ad9c1f99a6e7a9814))
## [1.20.2](https://github.com/certd/certd/compare/v1.2.1...v1.20.2) (2024-02-28)
### Bug Fixes
* 临时修复阿里云domainlist接口返回域名列表不全的问题后续还需要增加翻页查询 ([849c145](https://github.com/certd/certd/commit/849c145926984762bd9dbec87bd91cd047fc0855))
## [1.2.1](https://github.com/certd/certd/compare/v1.2.0...v1.2.1) (2023-12-12)
### Bug Fixes
* 修复邮箱设置无效的bug ([aaa3224](https://github.com/certd/certd/commit/aaa322464d0f65e924d1850995540d396ee24d25))
**Note:** Version bump only for package root
# [1.2.0](https://github.com/certd/certd/compare/v1.1.6...v1.2.0) (2023-10-27)
* 🔱: [client] sync upgrade with 2 commits [trident-sync] ([aa3207f](https://github.com/certd/certd/commit/aa3207fca5f15f7c3da789989d99c8ae7d1c4551))
### BREAKING CHANGES
* search支持自定义布局search.layout、search.collapse转移到 search.container之下。如果想使用原来的search组件请配置search.is=fs-search-v1
## [1.1.6](https://github.com/certd/certd/compare/v1.1.5...v1.1.6) (2023-07-10)
### Bug Fixes
* 修复上传证书到腾讯云失败的bug ([e950322](https://github.com/certd/certd/commit/e950322232e19d1263b8552eefa5b0150fd7864e))
## [1.1.5](https://github.com/certd/certd/compare/v1.1.4...v1.1.5) (2023-07-03)
**Note:** Version bump only for package root
## [1.1.4](https://github.com/certd/certd/compare/v1.1.3...v1.1.4) (2023-07-03)
### Bug Fixes
* 成功图标转动的问题 ([f87eee3](https://github.com/certd/certd/commit/f87eee3b9ff1ef9874e79a81fe0ed7104cb9ee8c))
### Performance Improvements
* cancel task ([bc65c0a](https://github.com/certd/certd/commit/bc65c0a786360c087fe95cad93ec6a87804cc5ee))
* flush log ([891a43a](https://github.com/certd/certd/commit/891a43ae6716ff98ed06643f7da2e35199ee195c))
* flush logger ([91be682](https://github.com/certd/certd/commit/91be6826b902e0f302b1a6cbdb1d24e15914c18d))
* timeout ([3eeb1f7](https://github.com/certd/certd/commit/3eeb1f77aa2922f3545f3d2067f561d95621d54f))
## [1.1.3](https://github.com/certd/certd/compare/v1.1.2...v1.1.3) (2023-07-03)
**Note:** Version bump only for package root
## [1.1.2](https://github.com/certd/certd/compare/v1.1.1...v1.1.2) (2023-07-03)
**Note:** Version bump only for package root
## [1.1.1](https://github.com/certd/certd/compare/v1.1.0...v1.1.1) (2023-06-28)
**Note:** Version bump only for package root
# [1.1.0](https://github.com/certd/certd/compare/v1.0.6...v1.1.0) (2023-06-28)
### Bug Fixes
* 修复access选择类型trigger ([2851a33](https://github.com/certd/certd/commit/2851a33eb2510f038fadb55da29512597a4ba512))
### Features
* 权限控制 ([27a4c81](https://github.com/certd/certd/commit/27a4c81c6d70e70abb3892c3ea58d4719988808a))
* 邮件通知 ([937e3fa](https://github.com/certd/certd/commit/937e3fac19cd03b8aa91db8ba03fda7fcfbacea2))
* cert download ([5a51c14](https://github.com/certd/certd/commit/5a51c14de521cb8075a80d2ae41a16e6d5281259))
* config merge ([fdc25dc](https://github.com/certd/certd/commit/fdc25dc0d795555cffacc4572648ec158988fbbb))
* save files ([99522fb](https://github.com/certd/certd/commit/99522fb49adb42c1dfdf7bec3dd52d641158285b))
* save files ([671d273](https://github.com/certd/certd/commit/671d273e2f9136d16896536b0ca127cf372f1619))
## [1.0.6](https://github.com/certd/certd/compare/v1.0.5...v1.0.6) (2023-05-25)
**Note:** Version bump only for package root
## [1.0.5](https://github.com/certd/certd/compare/v1.0.4...v1.0.5) (2023-05-25)
**Note:** Version bump only for package root
## [1.0.4](https://github.com/certd/certd/compare/v1.0.3...v1.0.4) (2023-05-25)
**Note:** Version bump only for package root
## [1.0.3](https://github.com/certd/certd/compare/v1.0.2...v1.0.3) (2023-05-25)
**Note:** Version bump only for package root
## [1.0.2](https://github.com/certd/certd/compare/v1.0.1...v1.0.2) (2023-05-24)
**Note:** Version bump only for package root
## [1.0.1](https://github.com/certd/certd/compare/v1.0.0...v1.0.1) (2023-05-24)
**Note:** Version bump only for package root

View File

@@ -9,3 +9,13 @@ ALIYUN_CLIENT_CONNECT_TIMEOUT=10000 # 连接超时,单位毫秒
ALIYUN_CLIENT_READ_TIMEOUT=10000 #读取数据超时,单位毫秒 ALIYUN_CLIENT_READ_TIMEOUT=10000 #读取数据超时,单位毫秒
``` ```
## 阿里云Access权限设置
* 申请证书 `AliyunDNSFullAccess`
* 上传证书到阿里云: `AliyunYundunCertFullAccess`
* 部署证书到OSS: `AliyunYundunCertFullAccess``AliyunOSSFullAccess`
* 部署证书到CDN: `AliyunYundunCertFullAccess``AliyunCDNFullAccess`
* 部署证书到DCDN `AliyunYundunCertFullAccess``AliyunDCDNFullAccess`

View File

@@ -27,4 +27,4 @@
## 三、备份恢复 ## 三、备份恢复
将备份的`db.sqlite`覆盖到原来的位置即可 将备份的`db.sqlite`覆盖到原来的位置重启certd即可

View File

@@ -0,0 +1,10 @@
# 证书申请失败情况
## DNS记录问题
1. DNS 不要设置CAA记录删除即可
2. DNSSEC相关报错DNSSEC管理中删除即可
3. DNS 有其他平台申请过的_acme-challenge记录删除即可

View File

@@ -18,6 +18,10 @@ const res = await ctx.http.request({
key : certKey key : certKey
} }
}) })
if(!res || res.code !== 0){
//抛异常才能让任务失败
throw new Error("上传失败")
}
//不能用console.log需要用ctx.logger 才能把日志打印在ui上 //不能用console.log需要用ctx.logger 才能把日志打印在ui上
ctx.logger.info("上传成功",res.data) ctx.logger.info("上传成功",res.data)
@@ -79,3 +83,4 @@ type CustomScriptPlugin = {
} }
``` ```

View File

@@ -25,3 +25,15 @@ win+R 弹出运行对话框,输入 services.msc 打开服务管理器
C:\Users\xxxxx> C:\Users\xxxxx>
↑↑↑↑---------这个就是windows ssh的登录用户名 ↑↑↑↑---------这个就是windows ssh的登录用户名
``` ```
### 4. 切换默认shell终端
安装openssh后默认终端是cmd建议切换成powershell
```shell
# powershell中执行如下命令切换
# 设置默认shell为powershell 【推荐】
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force
# 恢复默认shell为cmd 【不推荐】
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\cmd.exe" -PropertyType String -Force
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

View File

@@ -0,0 +1,21 @@
# IPv6支持
## 启用IPv6
`docker-compose.yaml`中启用IPv6支持放开如下注释
```yaml
# #↓↓↓↓ ------------------------------------------------------------- 启用ipv6网络
networks:
- ip6net
networks:
ip6net:
enable_ipv6: true
ipam:
config:
- subnet: 2001:db8::/64
```
## 设置双栈网络优先级
可根据实际情况设置
![img.png](./images/ipv6.png)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 53 KiB

View File

@@ -1,8 +1,12 @@
# 群晖部署和证书更新 # 群晖部署和证书更新
支持群晖`6.x``7.x`
## 一、群晖部署Certd ## 一、群晖部署Certd
以下是群晖`7.x`的部署`certd`步骤。
群晖`6.x`请参考[docker部署](./../../install/docker/)
### 1. 打开Container Manager ### 1. 打开Container Manager
![](./images/1.png) ![](./images/1.png)
@@ -32,6 +36,8 @@
## 二、更新群晖证书 ## 二、更新群晖证书
证书部署插件支持群晖`6.x``7.x`
## 1. 前提条件 ## 1. 前提条件
* 已经部署了certd * 已经部署了certd
* 群晖上已经设置好了证书(证书建议设置好描述,插件需要根据描述查找证书) * 群晖上已经设置好了证书(证书建议设置好描述,插件需要根据描述查找证书)

View File

@@ -30,7 +30,7 @@ features:
- title: 多证书格式支持 - title: 多证书格式支持
details: 支持pem、pfx、der、jks等多种证书格式支持Google、Letsencrypt、ZeroSSL证书颁发机构 details: 支持pem、pfx、der、jks等多种证书格式支持Google、Letsencrypt、ZeroSSL证书颁发机构
- title: 支持私有化部署 - title: 支持私有化部署
details: 保障数据安全 details: 授权数据加密存储,保障数据安全
- title: 多数据库支持 - title: 多数据库支持
details: 支持sqlitepostgresql数据库 details: 支持SQLite、Postgresql、MySQL数据库
--- ---

View File

@@ -9,5 +9,5 @@
} }
}, },
"npmClient": "pnpm", "npmClient": "pnpm",
"version": "1.27.3" "version": "1.30.2"
} }

View File

@@ -21,7 +21,7 @@
"transform-sql": "cd ./packages/ui/certd-server/db/ && node --experimental-json-modules transform.js", "transform-sql": "cd ./packages/ui/certd-server/db/ && node --experimental-json-modules transform.js",
"commitAll": "git add . && git commit -m \"build: publish\" && git push && npm run commitPro", "commitAll": "git add . && git commit -m \"build: publish\" && git push && npm run commitPro",
"commitPro": "cd ./packages/core/ && git add . && git commit -m \"build: publish\" && git push", "commitPro": "cd ./packages/core/ && git add . && git commit -m \"build: publish\" && git push",
"copylogs": "copyfiles \"CHANGELOG.md\" ./docs/guide/other/changelogs/", "copylogs": "copyfiles \"CHANGELOG.md\" ./docs/guide/changelogs/",
"prepublishOnly1": "npm run check && lerna run build ", "prepublishOnly1": "npm run check && lerna run build ",
"prepublishOnly2": "npm run check && npm run before-build && lerna run build ", "prepublishOnly2": "npm run check && npm run before-build && lerna run build ",
"before-build": "npm run transform-sql && cd ./packages/core/basic && time /t >build.md && git add ./build.md && git commit -m \"build: prepare to build\"", "before-build": "npm run transform-sql && cd ./packages/core/basic && time /t >build.md && git add ./build.md && git commit -m \"build: prepare to build\"",

View File

@@ -3,6 +3,92 @@
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.30.2](https://github.com/publishlab/node-acme-client/compare/v1.30.1...v1.30.2) (2025-02-09)
**Note:** Version bump only for package @certd/acme-client
## [1.30.1](https://github.com/publishlab/node-acme-client/compare/v1.30.0...v1.30.1) (2025-01-20)
**Note:** Version bump only for package @certd/acme-client
# [1.30.0](https://github.com/publishlab/node-acme-client/compare/v1.29.5...v1.30.0) (2025-01-19)
### Bug Fixes
* 修复查看任务日志偶发性无法自动滚动底部的bug ([7e482f7](https://github.com/publishlab/node-acme-client/commit/7e482f798c0142bce1866f84676cb40210f9638a))
## [1.29.5](https://github.com/publishlab/node-acme-client/compare/v1.29.4...v1.29.5) (2025-01-07)
**Note:** Version bump only for package @certd/acme-client
## [1.29.4](https://github.com/publishlab/node-acme-client/compare/v1.29.3...v1.29.4) (2025-01-06)
**Note:** Version bump only for package @certd/acme-client
## [1.29.3](https://github.com/publishlab/node-acme-client/compare/v1.29.2...v1.29.3) (2025-01-04)
### Performance Improvements
* 优化acme sdk ([54db744](https://github.com/publishlab/node-acme-client/commit/54db74428259de64d12230c2ab7353ae11197bbc))
## [1.29.2](https://github.com/publishlab/node-acme-client/compare/v1.29.1...v1.29.2) (2024-12-25)
**Note:** Version bump only for package @certd/acme-client
## [1.29.1](https://github.com/publishlab/node-acme-client/compare/v1.29.0...v1.29.1) (2024-12-25)
**Note:** Version bump only for package @certd/acme-client
# [1.29.0](https://github.com/publishlab/node-acme-client/compare/v1.28.4...v1.29.0) (2024-12-24)
**Note:** Version bump only for package @certd/acme-client
## [1.28.4](https://github.com/publishlab/node-acme-client/compare/v1.28.3...v1.28.4) (2024-12-12)
**Note:** Version bump only for package @certd/acme-client
## [1.28.3](https://github.com/publishlab/node-acme-client/compare/v1.28.2...v1.28.3) (2024-12-12)
**Note:** Version bump only for package @certd/acme-client
## [1.28.2](https://github.com/publishlab/node-acme-client/compare/v1.28.1...v1.28.2) (2024-12-09)
### Performance Improvements
* 支持mysql ([7cde1fd](https://github.com/publishlab/node-acme-client/commit/7cde1fdc4a9ed851900d231a5460c8dbfbcd148e))
## [1.28.1](https://github.com/publishlab/node-acme-client/compare/v1.28.0...v1.28.1) (2024-12-08)
**Note:** Version bump only for package @certd/acme-client
# [1.28.0](https://github.com/publishlab/node-acme-client/compare/v1.27.9...v1.28.0) (2024-11-30)
**Note:** Version bump only for package @certd/acme-client
## [1.27.9](https://github.com/publishlab/node-acme-client/compare/v1.27.8...v1.27.9) (2024-11-26)
**Note:** Version bump only for package @certd/acme-client
## [1.27.8](https://github.com/publishlab/node-acme-client/compare/v1.27.7...v1.27.8) (2024-11-25)
**Note:** Version bump only for package @certd/acme-client
## [1.27.7](https://github.com/publishlab/node-acme-client/compare/v1.27.6...v1.27.7) (2024-11-25)
**Note:** Version bump only for package @certd/acme-client
## [1.27.6](https://github.com/publishlab/node-acme-client/compare/v1.27.5...v1.27.6) (2024-11-19)
**Note:** Version bump only for package @certd/acme-client
## [1.27.5](https://github.com/publishlab/node-acme-client/compare/v1.27.4...v1.27.5) (2024-11-18)
**Note:** Version bump only for package @certd/acme-client
## [1.27.4](https://github.com/publishlab/node-acme-client/compare/v1.27.3...v1.27.4) (2024-11-14)
**Note:** Version bump only for package @certd/acme-client
## [1.27.3](https://github.com/publishlab/node-acme-client/compare/v1.27.2...v1.27.3) (2024-11-13) ## [1.27.3](https://github.com/publishlab/node-acme-client/compare/v1.27.2...v1.27.3) (2024-11-13)
**Note:** Version bump only for package @certd/acme-client **Note:** Version bump only for package @certd/acme-client

View File

@@ -6,6 +6,38 @@
</dd> </dd>
</dl> </dl>
## Constants
<dl>
<dt><a href="#createPrivateEcdsaKey">createPrivateEcdsaKey</a> ⇒ <code>Promise.&lt;buffer&gt;</code></dt>
<dd><p>Generate a private ECDSA key</p>
</dd>
<dt><a href="#getPublicKey">getPublicKey</a> ⇒ <code>buffer</code></dt>
<dd><p>Get a public key derived from a RSA or ECDSA key</p>
</dd>
<dt><a href="#getPemBodyAsB64u">getPemBodyAsB64u</a> ⇒ <code>string</code></dt>
<dd><p>Parse body of PEM encoded object and return a Base64URL string
If multiple objects are chained, the first body will be returned</p>
</dd>
<dt><a href="#readCsrDomains">readCsrDomains</a> ⇒ <code>object</code></dt>
<dd><p>Read domains from a Certificate Signing Request</p>
</dd>
<dt><a href="#readCertificateInfo">readCertificateInfo</a> ⇒ <code>object</code></dt>
<dd><p>Read information from a certificate
If multiple certificates are chained, the first will be read</p>
</dd>
<dt><a href="#createCsr">createCsr</a> ⇒ <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code></dt>
<dd><p>Create a Certificate Signing Request</p>
</dd>
<dt><a href="#createAlpnCertificate">createAlpnCertificate</a> ⇒ <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code></dt>
<dd><p>Create a self-signed ALPN certificate for TLS-ALPN-01 challenges</p>
<p><a href="https://datatracker.ietf.org/doc/html/rfc8737">https://datatracker.ietf.org/doc/html/rfc8737</a></p>
</dd>
<dt><a href="#isAlpnCertificateAuthorizationValid">isAlpnCertificateAuthorizationValid</a> ⇒ <code>boolean</code></dt>
<dd><p>Validate that a ALPN certificate contains the expected key authorization</p>
</dd>
</dl>
## Functions ## Functions
<dl> <dl>
@@ -15,12 +47,6 @@
<dt><a href="#createPrivateKey">createPrivateKey()</a></dt> <dt><a href="#createPrivateKey">createPrivateKey()</a></dt>
<dd><p>Alias of <code>createPrivateRsaKey()</code></p> <dd><p>Alias of <code>createPrivateRsaKey()</code></p>
</dd> </dd>
<dt><a href="#createPrivateEcdsaKey">createPrivateEcdsaKey([namedCurve])</a> ⇒ <code>Promise.&lt;buffer&gt;</code></dt>
<dd><p>Generate a private ECDSA key</p>
</dd>
<dt><a href="#getPublicKey">getPublicKey(keyPem)</a> ⇒ <code>buffer</code></dt>
<dd><p>Get a public key derived from a RSA or ECDSA key</p>
</dd>
<dt><a href="#getJwk">getJwk(keyPem)</a> ⇒ <code>object</code></dt> <dt><a href="#getJwk">getJwk(keyPem)</a> ⇒ <code>object</code></dt>
<dd><p>Get a JSON Web Key derived from a RSA or ECDSA key</p> <dd><p>Get a JSON Web Key derived from a RSA or ECDSA key</p>
<p><a href="https://datatracker.ietf.org/doc/html/rfc7517">https://datatracker.ietf.org/doc/html/rfc7517</a></p> <p><a href="https://datatracker.ietf.org/doc/html/rfc7517">https://datatracker.ietf.org/doc/html/rfc7517</a></p>
@@ -28,27 +54,6 @@
<dt><a href="#splitPemChain">splitPemChain(chainPem)</a> ⇒ <code>Array.&lt;string&gt;</code></dt> <dt><a href="#splitPemChain">splitPemChain(chainPem)</a> ⇒ <code>Array.&lt;string&gt;</code></dt>
<dd><p>Split chain of PEM encoded objects from string into array</p> <dd><p>Split chain of PEM encoded objects from string into array</p>
</dd> </dd>
<dt><a href="#getPemBodyAsB64u">getPemBodyAsB64u(pem)</a> ⇒ <code>string</code></dt>
<dd><p>Parse body of PEM encoded object and return a Base64URL string
If multiple objects are chained, the first body will be returned</p>
</dd>
<dt><a href="#readCsrDomains">readCsrDomains(csrPem)</a> ⇒ <code>object</code></dt>
<dd><p>Read domains from a Certificate Signing Request</p>
</dd>
<dt><a href="#readCertificateInfo">readCertificateInfo(certPem)</a> ⇒ <code>object</code></dt>
<dd><p>Read information from a certificate
If multiple certificates are chained, the first will be read</p>
</dd>
<dt><a href="#createCsr">createCsr(data, [keyPem])</a> ⇒ <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code></dt>
<dd><p>Create a Certificate Signing Request</p>
</dd>
<dt><a href="#createAlpnCertificate">createAlpnCertificate(authz, keyAuthorization, [keyPem])</a> ⇒ <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code></dt>
<dd><p>Create a self-signed ALPN certificate for TLS-ALPN-01 challenges</p>
<p><a href="https://datatracker.ietf.org/doc/html/rfc8737">https://datatracker.ietf.org/doc/html/rfc8737</a></p>
</dd>
<dt><a href="#isAlpnCertificateAuthorizationValid">isAlpnCertificateAuthorizationValid(certPem, keyAuthorization)</a> ⇒ <code>boolean</code></dt>
<dd><p>Validate that a ALPN certificate contains the expected key authorization</p>
</dd>
</dl> </dl>
<a name="crypto"></a> <a name="crypto"></a>
@@ -57,40 +62,12 @@ If multiple certificates are chained, the first will be read</p>
Native Node.js crypto interface Native Node.js crypto interface
**Kind**: global namespace **Kind**: global namespace
<a name="createPrivateRsaKey"></a>
## createPrivateRsaKey([modulusLength]) ⇒ <code>Promise.&lt;buffer&gt;</code>
Generate a private RSA key
**Kind**: global function
**Returns**: <code>Promise.&lt;buffer&gt;</code> - PEM encoded private RSA key
| Param | Type | Default | Description |
| --- | --- | --- | --- |
| [modulusLength] | <code>number</code> | <code>2048</code> | Size of the keys modulus in bits, default: `2048` |
**Example**
Generate private RSA key
```js
const privateKey = await acme.crypto.createPrivateRsaKey();
```
**Example**
Private RSA key with modulus size 4096
```js
const privateKey = await acme.crypto.createPrivateRsaKey(4096);
```
<a name="createPrivateKey"></a>
## createPrivateKey()
Alias of `createPrivateRsaKey()`
**Kind**: global function
<a name="createPrivateEcdsaKey"></a> <a name="createPrivateEcdsaKey"></a>
## createPrivateEcdsaKey([namedCurve]) ⇒ <code>Promise.&lt;buffer&gt;</code> ## createPrivateEcdsaKey ⇒ <code>Promise.&lt;buffer&gt;</code>
Generate a private ECDSA key Generate a private ECDSA key
**Kind**: global function **Kind**: global constant
**Returns**: <code>Promise.&lt;buffer&gt;</code> - PEM encoded private ECDSA key **Returns**: <code>Promise.&lt;buffer&gt;</code> - PEM encoded private ECDSA key
| Param | Type | Description | | Param | Type | Description |
@@ -109,10 +86,10 @@ const privateKey = await acme.crypto.createPrivateEcdsaKey('P-384');
``` ```
<a name="getPublicKey"></a> <a name="getPublicKey"></a>
## getPublicKey(keyPem) ⇒ <code>buffer</code> ## getPublicKey ⇒ <code>buffer</code>
Get a public key derived from a RSA or ECDSA key Get a public key derived from a RSA or ECDSA key
**Kind**: global function **Kind**: global constant
**Returns**: <code>buffer</code> - PEM encoded public key **Returns**: <code>buffer</code> - PEM encoded public key
| Param | Type | Description | | Param | Type | Description |
@@ -124,44 +101,13 @@ Get public key
```js ```js
const publicKey = acme.crypto.getPublicKey(privateKey); const publicKey = acme.crypto.getPublicKey(privateKey);
``` ```
<a name="getJwk"></a>
## getJwk(keyPem) ⇒ <code>object</code>
Get a JSON Web Key derived from a RSA or ECDSA key
https://datatracker.ietf.org/doc/html/rfc7517
**Kind**: global function
**Returns**: <code>object</code> - JSON Web Key
| Param | Type | Description |
| --- | --- | --- |
| keyPem | <code>buffer</code> \| <code>string</code> | PEM encoded private or public key |
**Example**
Get JWK
```js
const jwk = acme.crypto.getJwk(privateKey);
```
<a name="splitPemChain"></a>
## splitPemChain(chainPem) ⇒ <code>Array.&lt;string&gt;</code>
Split chain of PEM encoded objects from string into array
**Kind**: global function
**Returns**: <code>Array.&lt;string&gt;</code> - Array of PEM objects including headers
| Param | Type | Description |
| --- | --- | --- |
| chainPem | <code>buffer</code> \| <code>string</code> | PEM encoded object chain |
<a name="getPemBodyAsB64u"></a> <a name="getPemBodyAsB64u"></a>
## getPemBodyAsB64u(pem) ⇒ <code>string</code> ## getPemBodyAsB64u ⇒ <code>string</code>
Parse body of PEM encoded object and return a Base64URL string Parse body of PEM encoded object and return a Base64URL string
If multiple objects are chained, the first body will be returned If multiple objects are chained, the first body will be returned
**Kind**: global function **Kind**: global constant
**Returns**: <code>string</code> - Base64URL-encoded body **Returns**: <code>string</code> - Base64URL-encoded body
| Param | Type | Description | | Param | Type | Description |
@@ -170,10 +116,10 @@ If multiple objects are chained, the first body will be returned
<a name="readCsrDomains"></a> <a name="readCsrDomains"></a>
## readCsrDomains(csrPem) ⇒ <code>object</code> ## readCsrDomains ⇒ <code>object</code>
Read domains from a Certificate Signing Request Read domains from a Certificate Signing Request
**Kind**: global function **Kind**: global constant
**Returns**: <code>object</code> - {commonName, altNames} **Returns**: <code>object</code> - {commonName, altNames}
| Param | Type | Description | | Param | Type | Description |
@@ -190,11 +136,11 @@ console.log(`Alt names: ${altNames.join(', ')}`);
``` ```
<a name="readCertificateInfo"></a> <a name="readCertificateInfo"></a>
## readCertificateInfo(certPem) ⇒ <code>object</code> ## readCertificateInfo ⇒ <code>object</code>
Read information from a certificate Read information from a certificate
If multiple certificates are chained, the first will be read If multiple certificates are chained, the first will be read
**Kind**: global function **Kind**: global constant
**Returns**: <code>object</code> - Certificate info **Returns**: <code>object</code> - Certificate info
| Param | Type | Description | | Param | Type | Description |
@@ -215,10 +161,10 @@ console.log(`Alt names: ${altNames.join(', ')}`);
``` ```
<a name="createCsr"></a> <a name="createCsr"></a>
## createCsr(data, [keyPem]) ⇒ <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code> ## createCsr ⇒ <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code>
Create a Certificate Signing Request Create a Certificate Signing Request
**Kind**: global function **Kind**: global constant
**Returns**: <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code> - [privateKey, certificateSigningRequest] **Returns**: <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code> - [privateKey, certificateSigningRequest]
| Param | Type | Description | | Param | Type | Description |
@@ -276,12 +222,12 @@ const [, certificateRequest] = await acme.crypto.createCsr({
``` ```
<a name="createAlpnCertificate"></a> <a name="createAlpnCertificate"></a>
## createAlpnCertificate(authz, keyAuthorization, [keyPem]) ⇒ <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code> ## createAlpnCertificate ⇒ <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code>
Create a self-signed ALPN certificate for TLS-ALPN-01 challenges Create a self-signed ALPN certificate for TLS-ALPN-01 challenges
https://datatracker.ietf.org/doc/html/rfc8737 https://datatracker.ietf.org/doc/html/rfc8737
**Kind**: global function **Kind**: global constant
**Returns**: <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code> - [privateKey, certificate] **Returns**: <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code> - [privateKey, certificate]
| Param | Type | Description | | Param | Type | Description |
@@ -303,10 +249,10 @@ const [, alpnCertificate] = await acme.crypto.createAlpnCertificate(authz, keyAu
``` ```
<a name="isAlpnCertificateAuthorizationValid"></a> <a name="isAlpnCertificateAuthorizationValid"></a>
## isAlpnCertificateAuthorizationValid(certPem, keyAuthorization) ⇒ <code>boolean</code> ## isAlpnCertificateAuthorizationValid ⇒ <code>boolean</code>
Validate that a ALPN certificate contains the expected key authorization Validate that a ALPN certificate contains the expected key authorization
**Kind**: global function **Kind**: global constant
**Returns**: <code>boolean</code> - True when valid **Returns**: <code>boolean</code> - True when valid
| Param | Type | Description | | Param | Type | Description |
@@ -314,3 +260,62 @@ Validate that a ALPN certificate contains the expected key authorization
| certPem | <code>buffer</code> \| <code>string</code> | PEM encoded certificate | | certPem | <code>buffer</code> \| <code>string</code> | PEM encoded certificate |
| keyAuthorization | <code>string</code> | Expected challenge key authorization | | keyAuthorization | <code>string</code> | Expected challenge key authorization |
<a name="createPrivateRsaKey"></a>
## createPrivateRsaKey([modulusLength]) ⇒ <code>Promise.&lt;buffer&gt;</code>
Generate a private RSA key
**Kind**: global function
**Returns**: <code>Promise.&lt;buffer&gt;</code> - PEM encoded private RSA key
| Param | Type | Description |
| --- | --- | --- |
| [modulusLength] | <code>number</code> | Size of the keys modulus in bits, default: `2048` |
**Example**
Generate private RSA key
```js
const privateKey = await acme.crypto.createPrivateRsaKey();
```
**Example**
Private RSA key with modulus size 4096
```js
const privateKey = await acme.crypto.createPrivateRsaKey(4096);
```
<a name="createPrivateKey"></a>
## createPrivateKey()
Alias of `createPrivateRsaKey()`
**Kind**: global function
<a name="getJwk"></a>
## getJwk(keyPem) ⇒ <code>object</code>
Get a JSON Web Key derived from a RSA or ECDSA key
https://datatracker.ietf.org/doc/html/rfc7517
**Kind**: global function
**Returns**: <code>object</code> - JSON Web Key
| Param | Type | Description |
| --- | --- | --- |
| keyPem | <code>buffer</code> \| <code>string</code> | PEM encoded private or public key |
**Example**
Get JWK
```js
const jwk = acme.crypto.getJwk(privateKey);
```
<a name="splitPemChain"></a>
## splitPemChain(chainPem) ⇒ <code>Array.&lt;string&gt;</code>
Split chain of PEM encoded objects from string into array
**Kind**: global function
**Returns**: <code>Array.&lt;string&gt;</code> - Array of PEM objects including headers
| Param | Type | Description |
| --- | --- | --- |
| chainPem | <code>buffer</code> \| <code>string</code> | PEM encoded object chain |

View File

@@ -8,37 +8,42 @@ major release. Please migrate to the new <code>acme.crypto</code> interface at y
</dd> </dd>
</dl> </dl>
## Constants
<dl>
<dt><a href="#createPublicKey">createPublicKey</a> ⇒ <code>Promise.&lt;buffer&gt;</code></dt>
<dd><p>Create public key from a private RSA key</p>
</dd>
<dt><a href="#getPemBody">getPemBody</a> ⇒ <code>string</code></dt>
<dd><p>Parse body of PEM encoded object from buffer or string
If multiple objects are chained, the first body will be returned</p>
</dd>
<dt><a href="#splitPemChain">splitPemChain</a> ⇒ <code>Array.&lt;string&gt;</code></dt>
<dd><p>Split chain of PEM encoded objects from buffer or string into array</p>
</dd>
<dt><a href="#getModulus">getModulus</a> ⇒ <code>Promise.&lt;buffer&gt;</code></dt>
<dd><p>Get modulus</p>
</dd>
<dt><a href="#getPublicExponent">getPublicExponent</a> ⇒ <code>Promise.&lt;buffer&gt;</code></dt>
<dd><p>Get public exponent</p>
</dd>
<dt><a href="#readCsrDomains">readCsrDomains</a> ⇒ <code>Promise.&lt;object&gt;</code></dt>
<dd><p>Read domains from a Certificate Signing Request</p>
</dd>
<dt><a href="#readCertificateInfo">readCertificateInfo</a> ⇒ <code>Promise.&lt;object&gt;</code></dt>
<dd><p>Read information from a certificate</p>
</dd>
<dt><a href="#createCsr">createCsr</a> ⇒ <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code></dt>
<dd><p>Create a Certificate Signing Request</p>
</dd>
</dl>
## Functions ## Functions
<dl> <dl>
<dt><a href="#createPrivateKey">createPrivateKey([size])</a> ⇒ <code>Promise.&lt;buffer&gt;</code></dt> <dt><a href="#createPrivateKey">createPrivateKey([size])</a> ⇒ <code>Promise.&lt;buffer&gt;</code></dt>
<dd><p>Generate a private RSA key</p> <dd><p>Generate a private RSA key</p>
</dd> </dd>
<dt><a href="#createPublicKey">createPublicKey(key)</a> ⇒ <code>Promise.&lt;buffer&gt;</code></dt>
<dd><p>Create public key from a private RSA key</p>
</dd>
<dt><a href="#getPemBody">getPemBody(str)</a> ⇒ <code>string</code></dt>
<dd><p>Parse body of PEM encoded object from buffer or string
If multiple objects are chained, the first body will be returned</p>
</dd>
<dt><a href="#splitPemChain">splitPemChain(str)</a> ⇒ <code>Array.&lt;string&gt;</code></dt>
<dd><p>Split chain of PEM encoded objects from buffer or string into array</p>
</dd>
<dt><a href="#getModulus">getModulus(input)</a> ⇒ <code>Promise.&lt;buffer&gt;</code></dt>
<dd><p>Get modulus</p>
</dd>
<dt><a href="#getPublicExponent">getPublicExponent(input)</a> ⇒ <code>Promise.&lt;buffer&gt;</code></dt>
<dd><p>Get public exponent</p>
</dd>
<dt><a href="#readCsrDomains">readCsrDomains(csr)</a> ⇒ <code>Promise.&lt;object&gt;</code></dt>
<dd><p>Read domains from a Certificate Signing Request</p>
</dd>
<dt><a href="#readCertificateInfo">readCertificateInfo(cert)</a> ⇒ <code>Promise.&lt;object&gt;</code></dt>
<dd><p>Read information from a certificate</p>
</dd>
<dt><a href="#createCsr">createCsr(data, [key])</a> ⇒ <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code></dt>
<dd><p>Create a Certificate Signing Request</p>
</dd>
</dl> </dl>
<a name="forge"></a> <a name="forge"></a>
@@ -50,34 +55,12 @@ DEPRECATION WARNING: This crypto interface is deprecated and will be removed fro
major release. Please migrate to the new `acme.crypto` interface at your earliest convenience. major release. Please migrate to the new `acme.crypto` interface at your earliest convenience.
**Kind**: global namespace **Kind**: global namespace
<a name="createPrivateKey"></a>
## createPrivateKey([size]) ⇒ <code>Promise.&lt;buffer&gt;</code>
Generate a private RSA key
**Kind**: global function
**Returns**: <code>Promise.&lt;buffer&gt;</code> - PEM encoded private RSA key
| Param | Type | Default | Description |
| --- | --- | --- | --- |
| [size] | <code>number</code> | <code>2048</code> | Size of the key, default: `2048` |
**Example**
Generate private RSA key
```js
const privateKey = await acme.forge.createPrivateKey();
```
**Example**
Private RSA key with defined size
```js
const privateKey = await acme.forge.createPrivateKey(4096);
```
<a name="createPublicKey"></a> <a name="createPublicKey"></a>
## createPublicKey(key) ⇒ <code>Promise.&lt;buffer&gt;</code> ## createPublicKey ⇒ <code>Promise.&lt;buffer&gt;</code>
Create public key from a private RSA key Create public key from a private RSA key
**Kind**: global function **Kind**: global constant
**Returns**: <code>Promise.&lt;buffer&gt;</code> - PEM encoded public RSA key **Returns**: <code>Promise.&lt;buffer&gt;</code> - PEM encoded public RSA key
| Param | Type | Description | | Param | Type | Description |
@@ -91,11 +74,11 @@ const publicKey = await acme.forge.createPublicKey(privateKey);
``` ```
<a name="getPemBody"></a> <a name="getPemBody"></a>
## getPemBody(str) ⇒ <code>string</code> ## getPemBody ⇒ <code>string</code>
Parse body of PEM encoded object from buffer or string Parse body of PEM encoded object from buffer or string
If multiple objects are chained, the first body will be returned If multiple objects are chained, the first body will be returned
**Kind**: global function **Kind**: global constant
**Returns**: <code>string</code> - PEM body **Returns**: <code>string</code> - PEM body
| Param | Type | Description | | Param | Type | Description |
@@ -104,10 +87,10 @@ If multiple objects are chained, the first body will be returned
<a name="splitPemChain"></a> <a name="splitPemChain"></a>
## splitPemChain(str) ⇒ <code>Array.&lt;string&gt;</code> ## splitPemChain ⇒ <code>Array.&lt;string&gt;</code>
Split chain of PEM encoded objects from buffer or string into array Split chain of PEM encoded objects from buffer or string into array
**Kind**: global function **Kind**: global constant
**Returns**: <code>Array.&lt;string&gt;</code> - Array of PEM bodies **Returns**: <code>Array.&lt;string&gt;</code> - Array of PEM bodies
| Param | Type | Description | | Param | Type | Description |
@@ -116,10 +99,10 @@ Split chain of PEM encoded objects from buffer or string into array
<a name="getModulus"></a> <a name="getModulus"></a>
## getModulus(input) ⇒ <code>Promise.&lt;buffer&gt;</code> ## getModulus ⇒ <code>Promise.&lt;buffer&gt;</code>
Get modulus Get modulus
**Kind**: global function **Kind**: global constant
**Returns**: <code>Promise.&lt;buffer&gt;</code> - Modulus **Returns**: <code>Promise.&lt;buffer&gt;</code> - Modulus
| Param | Type | Description | | Param | Type | Description |
@@ -135,10 +118,10 @@ const m3 = await acme.forge.getModulus(certificateRequest);
``` ```
<a name="getPublicExponent"></a> <a name="getPublicExponent"></a>
## getPublicExponent(input) ⇒ <code>Promise.&lt;buffer&gt;</code> ## getPublicExponent ⇒ <code>Promise.&lt;buffer&gt;</code>
Get public exponent Get public exponent
**Kind**: global function **Kind**: global constant
**Returns**: <code>Promise.&lt;buffer&gt;</code> - Exponent **Returns**: <code>Promise.&lt;buffer&gt;</code> - Exponent
| Param | Type | Description | | Param | Type | Description |
@@ -154,10 +137,10 @@ const e3 = await acme.forge.getPublicExponent(certificateRequest);
``` ```
<a name="readCsrDomains"></a> <a name="readCsrDomains"></a>
## readCsrDomains(csr) ⇒ <code>Promise.&lt;object&gt;</code> ## readCsrDomains ⇒ <code>Promise.&lt;object&gt;</code>
Read domains from a Certificate Signing Request Read domains from a Certificate Signing Request
**Kind**: global function **Kind**: global constant
**Returns**: <code>Promise.&lt;object&gt;</code> - {commonName, altNames} **Returns**: <code>Promise.&lt;object&gt;</code> - {commonName, altNames}
| Param | Type | Description | | Param | Type | Description |
@@ -174,10 +157,10 @@ console.log(`Alt names: ${altNames.join(', ')}`);
``` ```
<a name="readCertificateInfo"></a> <a name="readCertificateInfo"></a>
## readCertificateInfo(cert) ⇒ <code>Promise.&lt;object&gt;</code> ## readCertificateInfo ⇒ <code>Promise.&lt;object&gt;</code>
Read information from a certificate Read information from a certificate
**Kind**: global function **Kind**: global constant
**Returns**: <code>Promise.&lt;object&gt;</code> - Certificate info **Returns**: <code>Promise.&lt;object&gt;</code> - Certificate info
| Param | Type | Description | | Param | Type | Description |
@@ -198,10 +181,10 @@ console.log(`Alt names: ${altNames.join(', ')}`);
``` ```
<a name="createCsr"></a> <a name="createCsr"></a>
## createCsr(data, [key]) ⇒ <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code> ## createCsr ⇒ <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code>
Create a Certificate Signing Request Create a Certificate Signing Request
**Kind**: global function **Kind**: global constant
**Returns**: <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code> - [privateKey, certificateSigningRequest] **Returns**: <code>Promise.&lt;Array.&lt;buffer&gt;&gt;</code> - [privateKey, certificateSigningRequest]
| Param | Type | Description | | Param | Type | Description |
@@ -256,3 +239,25 @@ const certificateKey = await acme.forge.createPrivateKey();
const [, certificateRequest] = await acme.forge.createCsr({ const [, certificateRequest] = await acme.forge.createCsr({
altNames: ['test.example.com'], altNames: ['test.example.com'],
}, certificateKey); }, certificateKey);
<a name="createPrivateKey"></a>
## createPrivateKey([size]) <code>Promise.&lt;buffer&gt;</code>
Generate a private RSA key
**Kind**: global function
**Returns**: <code>Promise.&lt;buffer&gt;</code> - PEM encoded private RSA key
| Param | Type | Description |
| --- | --- | --- |
| [size] | <code>number</code> | Size of the key, default: `2048` |
**Example**
Generate private RSA key
```js
const privateKey = await acme.forge.createPrivateKey();
```
**Example**
Private RSA key with defined size
```js
const privateKey = await acme.forge.createPrivateKey(4096);
```

View File

@@ -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.27.3", "version": "1.30.2",
"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.27.3", "@certd/basic": "^1.30.2",
"@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",
@@ -65,5 +65,5 @@
"bugs": { "bugs": {
"url": "https://github.com/publishlab/node-acme-client/issues" "url": "https://github.com/publishlab/node-acme-client/issues"
}, },
"gitHead": "3a0178b2949083c770ed96a4122e4c0a5e0bcc11" "gitHead": "089825d3602440188392f7018d0eb9038617c1d6"
} }

View File

@@ -99,31 +99,14 @@ export default async (client, userOpts) => {
return; return;
} }
const keyAuthorizationGetter = async (challenge) => {
return await client.getChallengeKeyAuthorization(challenge);
}
try { try {
/* Select challenge based on priority */
const challenge = authz.challenges.sort((a, b) => {
const aidx = opts.challengePriority.indexOf(a.type);
const bidx = opts.challengePriority.indexOf(b.type);
if (aidx === -1) return 1;
if (bidx === -1) return -1;
return aidx - bidx;
}).slice(0, 1)[0];
if (!challenge) {
throw new Error(`Unable to select challenge for ${d}, no challenge found`);
}
log(`[auto] [${d}] Found ${authz.challenges.length} challenges, selected type: ${challenge.type}`);
/* Trigger challengeCreateFn() */
log(`[auto] [${d}] Trigger challengeCreateFn()`); log(`[auto] [${d}] Trigger challengeCreateFn()`);
const keyAuthorization = await client.getChallengeKeyAuthorization(challenge);
try { try {
const { recordReq, recordRes, dnsProvider } = await opts.challengeCreateFn(authz, challenge, keyAuthorization); const { recordReq, recordRes, dnsProvider,challenge ,keyAuthorization} = await opts.challengeCreateFn(authz, keyAuthorizationGetter);
log(`[auto] [${d}] challengeCreateFn success`);
log(`[auto] [${d}] add challengeRemoveFn()`);
clearTasks.push(async () => { clearTasks.push(async () => {
/* Trigger challengeRemoveFn(), suppress errors */ /* Trigger challengeRemoveFn(), suppress errors */
log(`[auto] [${d}] Trigger challengeRemoveFn()`); log(`[auto] [${d}] Trigger challengeRemoveFn()`);
@@ -141,7 +124,7 @@ export default async (client, userOpts) => {
await wait(60 * 1000); await wait(60 * 1000);
} }
else { else {
log(`[auto] [${d}] Running challenge verification`); log(`[auto] [${d}] Running challenge verification, type = ${challenge.type}`);
try { try {
await client.verifyChallenge(authz, challenge); await client.verifyChallenge(authz, challenge);
} }

View File

@@ -126,6 +126,7 @@ instance.interceptors.response.use(null, async (error) => {
/* Wait and retry the request */ /* Wait and retry the request */
await new Promise((resolve) => { setTimeout(resolve, (retryAfter * 1000)); }); await new Promise((resolve) => { setTimeout(resolve, (retryAfter * 1000)); });
log(`Retrying request to URL ${config.url}`);
return instance(config); return instance(config);
} }
} }

View File

@@ -5,3 +5,5 @@ export class CancelError extends Error {
} }
} }

View File

@@ -4,6 +4,8 @@
import { AxiosInstance } from 'axios'; import { AxiosInstance } from 'axios';
import * as rfc8555 from './rfc8555'; import * as rfc8555 from './rfc8555';
import {CancelError} from '../src/error.js'
export * from '../src/error.js'
export type PrivateKeyBuffer = Buffer; export type PrivateKeyBuffer = Buffer;
export type PublicKeyBuffer = Buffer; export type PublicKeyBuffer = Buffer;
@@ -56,7 +58,7 @@ export interface ClientExternalAccountBindingOptions {
export interface ClientAutoOptions { export interface ClientAutoOptions {
csr: CsrBuffer | CsrString; csr: CsrBuffer | CsrString;
challengeCreateFn: (authz: Authorization, challenge: rfc8555.Challenge, keyAuthorization: string) => Promise<{recordReq:any,recordRes:any,dnsProvider:any}>; challengeCreateFn: (authz: Authorization, keyAuthorization: (challenge:rfc8555.Challenge)=>Promise<string>) => Promise<{recordReq?:any,recordRes?:any,dnsProvider?:any,challenge: rfc8555.Challenge,keyAuthorization:string}>;
challengeRemoveFn: (authz: Authorization, challenge: rfc8555.Challenge, keyAuthorization: string,recordReq:any, recordRes:any,dnsProvider:any) => Promise<any>; challengeRemoveFn: (authz: Authorization, challenge: rfc8555.Challenge, keyAuthorization: string,recordReq:any, recordRes:any,dnsProvider:any) => Promise<any>;
email?: string; email?: string;
termsOfServiceAgreed?: boolean; termsOfServiceAgreed?: boolean;
@@ -202,4 +204,4 @@ export function setLogger(fn: (message: any, ...args: any[]) => void): void;
export function walkTxtRecord(record: any): Promise<string[]>; export function walkTxtRecord(record: any): Promise<string[]>;
export const CancelError: Error; export const CancelError: typeof CancelError;

View File

@@ -0,0 +1,137 @@
"use strict";
/**
* acme-client type definition tests
*/
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
var acme = require("acme-client");
(function () { return __awaiter(void 0, void 0, void 0, function () {
var accountKey, client, order, authorizations, authorization, challenge, _a, certKey, certCsr;
return __generator(this, function (_b) {
switch (_b.label) {
case 0: return [4 /*yield*/, acme.crypto.createPrivateKey()];
case 1:
accountKey = _b.sent();
client = new acme.Client({
accountKey: accountKey,
directoryUrl: acme.directory.letsencrypt.staging
});
/* Account */
return [4 /*yield*/, client.createAccount({
termsOfServiceAgreed: true,
contact: ['mailto:test@example.com']
})];
case 2:
/* Account */
_b.sent();
return [4 /*yield*/, client.createOrder({
identifiers: [
{ type: 'dns', value: 'example.com' },
{ type: 'dns', value: '*.example.com' },
]
})];
case 3:
order = _b.sent();
return [4 /*yield*/, client.getOrder(order)];
case 4:
_b.sent();
return [4 /*yield*/, client.getAuthorizations(order)];
case 5:
authorizations = _b.sent();
authorization = authorizations[0];
challenge = authorization.challenges[0];
return [4 /*yield*/, client.getChallengeKeyAuthorization(challenge)];
case 6:
_b.sent();
return [4 /*yield*/, client.verifyChallenge(authorization, challenge)];
case 7:
_b.sent();
return [4 /*yield*/, client.completeChallenge(challenge)];
case 8:
_b.sent();
return [4 /*yield*/, client.waitForValidStatus(challenge)];
case 9:
_b.sent();
return [4 /*yield*/, acme.crypto.createCsr({
commonName: 'example.com',
altNames: ['example.com', '*.example.com']
})];
case 10:
_a = _b.sent(), certKey = _a[0], certCsr = _a[1];
return [4 /*yield*/, client.finalizeOrder(order, certCsr)];
case 11:
_b.sent();
return [4 /*yield*/, client.getCertificate(order)];
case 12:
_b.sent();
return [4 /*yield*/, client.getCertificate(order, 'DST Root CA X3')];
case 13:
_b.sent();
/* Auto */
return [4 /*yield*/, client.auto({
csr: certCsr,
challengeCreateFn: function (authz, challenge, keyAuthorization) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
return [2 /*return*/];
}); }); },
challengeRemoveFn: function (authz, challenge, keyAuthorization) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
return [2 /*return*/];
}); }); }
})];
case 14:
/* Auto */
_b.sent();
return [4 /*yield*/, client.auto({
csr: certCsr,
email: 'test@example.com',
termsOfServiceAgreed: false,
skipChallengeVerification: false,
challengePriority: ['http-01', 'dns-01'],
preferredChain: 'DST Root CA X3',
challengeCreateFn: function (authz, challenge, keyAuthorization) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
return [2 /*return*/];
}); }); },
challengeRemoveFn: function (authz, challenge, keyAuthorization) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
return [2 /*return*/];
}); }); }
})];
case 15:
_b.sent();
return [2 /*return*/];
}
});
}); })();

View File

@@ -1,2 +1,2 @@
link-workspace-packages=true link-workspace-packages=deep
prefer-workspace-packages=true prefer-workspace-packages=true

View File

@@ -3,6 +3,105 @@
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.30.2](https://github.com/certd/certd/compare/v1.30.1...v1.30.2) (2025-02-09)
**Note:** Version bump only for package @certd/basic
## [1.30.1](https://github.com/certd/certd/compare/v1.30.0...v1.30.1) (2025-01-20)
**Note:** Version bump only for package @certd/basic
# [1.30.0](https://github.com/certd/certd/compare/v1.29.5...v1.30.0) (2025-01-19)
**Note:** Version bump only for package @certd/basic
## [1.29.5](https://github.com/certd/certd/compare/v1.29.4...v1.29.5) (2025-01-07)
**Note:** Version bump only for package @certd/basic
## [1.29.4](https://github.com/certd/certd/compare/v1.29.3...v1.29.4) (2025-01-06)
**Note:** Version bump only for package @certd/basic
## [1.29.3](https://github.com/certd/certd/compare/v1.29.2...v1.29.3) (2025-01-04)
**Note:** Version bump only for package @certd/basic
## [1.29.2](https://github.com/certd/certd/compare/v1.29.1...v1.29.2) (2024-12-25)
**Note:** Version bump only for package @certd/basic
## [1.29.1](https://github.com/certd/certd/compare/v1.29.0...v1.29.1) (2024-12-25)
### Bug Fixes
* 修复某处金额转换丢失精度的bug ([d2d6f12](https://github.com/certd/certd/commit/d2d6f12218cbe7bd55f4ae082b93084be85f0a7b))
# [1.29.0](https://github.com/certd/certd/compare/v1.28.4...v1.29.0) (2024-12-24)
### Features
* 用户套餐,用户支付功能 ([a019956](https://github.com/certd/certd/commit/a019956698acaf2c4beb620b5ad8c18918ead6a1))
* 支持微信支付 ([45d6347](https://github.com/certd/certd/commit/45d6347f5b6199493b11aabdd74177f6dca2cea4))
### Performance Improvements
* 站点证书监控通知发送,每天定时检查 ([bb4910f](https://github.com/certd/certd/commit/bb4910f4e57234e42b44505f4620ae7af66025c5))
* 支持plesk网站证书部署 ([eda45c1](https://github.com/certd/certd/commit/eda45c1528199648b3970505e87f492d398226cd))
## [1.28.4](https://github.com/certd/certd/compare/v1.28.3...v1.28.4) (2024-12-12)
**Note:** Version bump only for package @certd/basic
## [1.28.3](https://github.com/certd/certd/compare/v1.28.2...v1.28.3) (2024-12-12)
**Note:** Version bump only for package @certd/basic
## [1.28.2](https://github.com/certd/certd/compare/v1.28.1...v1.28.2) (2024-12-09)
**Note:** Version bump only for package @certd/basic
## [1.28.1](https://github.com/certd/certd/compare/v1.28.0...v1.28.1) (2024-12-08)
### Performance Improvements
* 通知选择器优化 ([2c0cbdd](https://github.com/certd/certd/commit/2c0cbdd29ecb74cc939b2ae7ee86b8d40f70ba31))
# [1.28.0](https://github.com/certd/certd/compare/v1.27.9...v1.28.0) (2024-11-30)
### Performance Improvements
* 优化证书申请成功通知发送方式 ([8002a56](https://github.com/certd/certd/commit/8002a56efc5998aa03db5711ae87f9eb4bc9e160))
* 支持短信验证码登录 ([387bcc5](https://github.com/certd/certd/commit/387bcc5fa418cdeea81a06da5e3f8cd6b43cd082))
## [1.27.9](https://github.com/certd/certd/compare/v1.27.8...v1.27.9) (2024-11-26)
**Note:** Version bump only for package @certd/basic
## [1.27.8](https://github.com/certd/certd/compare/v1.27.7...v1.27.8) (2024-11-25)
**Note:** Version bump only for package @certd/basic
## [1.27.7](https://github.com/certd/certd/compare/v1.27.6...v1.27.7) (2024-11-25)
**Note:** Version bump only for package @certd/basic
## [1.27.6](https://github.com/certd/certd/compare/v1.27.5...v1.27.6) (2024-11-19)
**Note:** Version bump only for package @certd/basic
## [1.27.5](https://github.com/certd/certd/compare/v1.27.4...v1.27.5) (2024-11-18)
### Performance Improvements
* 系统设置中的代理设置优化为可全局生效环境变量中的https_proxy设置将无效 ([381a37f](https://github.com/certd/certd/commit/381a37fbaa6b61c887eda743897ae00afb825bdf))
* 新手导航在非编辑模式下不显示 ([18bfcc2](https://github.com/certd/certd/commit/18bfcc24ad0bde57bb04db8a4209861ec6b8ff1d))
* 优化腾讯云 cloudflare 重复解析记录时的返回值 ([90d1b68](https://github.com/certd/certd/commit/90d1b68bd6cf232fbe085234efe07d29b7690044))
## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14)
**Note:** Version bump only for package @certd/basic
## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13) ## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13)
### Bug Fixes ### Bug Fixes

View File

@@ -1 +1 @@
00:16 16:07

View File

@@ -1,7 +1,7 @@
{ {
"name": "@certd/basic", "name": "@certd/basic",
"private": false, "private": false,
"version": "1.27.3", "version": "1.30.2",
"type": "module", "type": "module",
"main": "./dist/index.js", "main": "./dist/index.js",
"module": "./dist/index.js", "module": "./dist/index.js",
@@ -23,6 +23,7 @@
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"log4js": "^6.9.1", "log4js": "^6.9.1",
"lru-cache": "^10.0.0", "lru-cache": "^10.0.0",
"mitt": "^3.0.1",
"nanoid": "^5.0.7", "nanoid": "^5.0.7",
"node-forge": "^1.3.1", "node-forge": "^1.3.1",
"nodemailer": "^6.9.3" "nodemailer": "^6.9.3"
@@ -43,5 +44,5 @@
"tslib": "^2.8.1", "tslib": "^2.8.1",
"typescript": "^5.4.2" "typescript": "^5.4.2"
}, },
"gitHead": "3a0178b2949083c770ed96a4122e4c0a5e0bcc11" "gitHead": "089825d3602440188392f7018d0eb9038617c1d6"
} }

View File

@@ -8,6 +8,11 @@ export * from './util.hash.js';
export * from './util.merge.js'; export * from './util.merge.js';
export * from './util.cache.js'; export * from './util.cache.js';
export * from './util.string.js'; export * from './util.string.js';
export * from './util.lock.js';
export * from './util.mitter.js';
export * from './util.id.js';
export * from './util.domain.js';
export * from './util.amount.js';
import { stringUtils } from './util.string.js'; import { stringUtils } from './util.string.js';
import sleep from './util.sleep.js'; import sleep from './util.sleep.js';
import { http, download } from './util.request.js'; import { http, download } from './util.request.js';
@@ -22,8 +27,11 @@ import { cache } from './util.cache.js';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { domainUtils } from './util.domain.js'; import { domainUtils } from './util.domain.js';
import { optionsUtils } from './util.options.js'; import { optionsUtils } from './util.options.js';
import { amountUtils } from './util.amount.js';
import { nanoid } from 'nanoid'; 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 { mitter } from './util.mitter.js';
export const utils = { export const utils = {
sleep, sleep,
http, http,
@@ -41,4 +49,7 @@ export const utils = {
domain: domainUtils, domain: domainUtils,
options: optionsUtils, options: optionsUtils,
string: stringUtils, string: stringUtils,
locker,
mitter,
amount: amountUtils,
}; };

View File

@@ -0,0 +1,9 @@
export const amountUtils = {
toCent(amount: number): number {
return parseInt((amount * 100).toFixed(0));
},
toYuan(amount: number): number {
return parseFloat((amount / 100).toFixed(2));
},
};

View File

@@ -1,4 +1,4 @@
export function isDev() { export function isDev() {
const nodeEnv = process.env.NODE_ENV || ''; const nodeEnv = process.env.NODE_ENV || '';
return nodeEnv === 'development' || nodeEnv.indexOf('local') >= 0; return nodeEnv === 'development' || nodeEnv.includes('local') || nodeEnv.startsWith('dev');
} }

View File

@@ -3,7 +3,10 @@ import crypto from 'crypto';
function md5(data: string) { function md5(data: string) {
return crypto.createHash('md5').update(data).digest('hex'); return crypto.createHash('md5').update(data).digest('hex');
} }
function sha256(data: string) {
return crypto.createHash('sha256').update(data).digest('hex');
}
export const hashUtils = { export const hashUtils = {
md5, md5,
sha256,
}; };

View File

@@ -1,3 +1,4 @@
import { customAlphabet } from 'nanoid'; import { customAlphabet } from 'nanoid';
export const randomNumber = customAlphabet('1234567890', 4);
export const simpleNanoId = customAlphabet('1234567890abcdefghijklmopqrstuvwxyz', 12); export const simpleNanoId = customAlphabet('1234567890abcdefghijklmopqrstuvwxyz', 12);

View File

@@ -0,0 +1,47 @@
import { logger, utils } from './index.js';
export class Locker {
locked: Record<string, any> = {};
async execute(lockStr: string, callback: any) {
await this.lock(lockStr);
const timeoutId = setTimeout(() => {
logger.warn('Lock timeout,自动解锁', lockStr);
this.unlock(lockStr);
}, 20000);
try {
return await callback();
} finally {
clearTimeout(timeoutId);
this.unlock(lockStr);
}
}
async lock(str: string) {
const isLocked = this.isLocked(str);
if (isLocked) {
let count = 0;
while (true) {
await utils.sleep(100);
if (!this.isLocked(str)) {
break;
}
count++;
if (count > 20) {
throw new Error('Lock timeout');
}
}
}
this.locked[str] = true;
}
unlock(str: string) {
delete this.locked[str];
}
isLocked(str: string) {
return this.locked[str] ?? false;
}
}
export const locker = new Locker();

View File

@@ -0,0 +1,2 @@
import mitt from 'mitt';
export const mitter = mitt();

View File

@@ -37,6 +37,8 @@ function buildGroupOptions(options: any[], inDomains: string[]) {
} }
export const optionsUtils = { export const optionsUtils = {
//获取分组
groupByDomain, groupByDomain,
//构建分组后的选项列表,常用
buildGroupOptions, buildGroupOptions,
}; };

View File

@@ -1,4 +1,4 @@
import axios, { AxiosRequestConfig } from 'axios'; import axios, { AxiosHeaders, AxiosRequestConfig } from 'axios';
import { ILogger, logger } from './util.log.js'; import { ILogger, logger } from './util.log.js';
import { Logger } from 'log4js'; import { Logger } from 'log4js';
import { HttpProxyAgent } from 'http-proxy-agent'; import { HttpProxyAgent } from 'http-proxy-agent';
@@ -13,7 +13,7 @@ export class HttpError extends Error {
statusText?: string; statusText?: string;
code?: string; code?: string;
request?: { baseURL: string; url: string; method: string; params?: any; data?: any }; request?: { baseURL: string; url: string; method: string; params?: any; data?: any };
response?: { data: any }; response?: { data: any; headers: AxiosHeaders };
cause?: any; cause?: any;
constructor(error: any) { constructor(error: any) {
if (!error) { if (!error) {
@@ -55,6 +55,7 @@ export class HttpError extends Error {
this.response = { this.response = {
data: error.response?.data, data: error.response?.data,
headers: error.response?.headers,
}; };
const { stack, cause } = error; const { stack, cause } = error;
@@ -98,10 +99,22 @@ export function createAxiosService({ logger }: { logger: Logger }) {
config.timeout = 15000; config.timeout = 15000;
} }
let agents = defaultAgents; let agents = defaultAgents;
if (config.skipSslVerify) { if (config.skipSslVerify || config.httpProxy) {
logger.info('跳过SSL验证'); let rejectUnauthorized = true;
agents = createAgent({ rejectUnauthorized: false } as any); if (config.skipSslVerify) {
logger.info('跳过SSL验证');
rejectUnauthorized = false;
}
const proxy: any = {};
if (config.httpProxy) {
logger.info('使用自定义http代理:', config.httpProxy);
proxy.httpProxy = config.httpProxy;
proxy.httpsProxy = config.httpProxy;
}
agents = createAgent({ rejectUnauthorized, ...proxy } as any);
} }
delete config.skipSslVerify; delete config.skipSslVerify;
config.httpsAgent = agents.httpsAgent; config.httpsAgent = agents.httpsAgent;
config.httpAgent = agents.httpAgent; config.httpAgent = agents.httpAgent;
@@ -132,6 +145,9 @@ export function createAxiosService({ logger }: { logger: Logger }) {
} else { } else {
logger.info('http response status:', response?.status); logger.info('http response status:', response?.status);
} }
if (response?.config?.returnResponse) {
return response;
}
return response.data; return response.data;
}, },
(error: any) => { (error: any) => {
@@ -141,13 +157,13 @@ export function createAxiosService({ logger }: { logger: Logger }) {
error.message = '请求错误'; error.message = '请求错误';
break; break;
case 401: case 401:
error.message = '未授权,请登录'; error.message = '认证/登录失败';
break; break;
case 403: case 403:
error.message = '拒绝访问'; error.message = '拒绝访问';
break; break;
case 404: case 404:
error.message = `请求地址出错: ${error.response.config.url}`; error.message = `请求地址出错`;
break; break;
case 408: case 408:
error.message = '请求超时'; error.message = '请求超时';
@@ -178,7 +194,10 @@ export function createAxiosService({ logger }: { logger: Logger }) {
); );
logger.error('返回数据:', JSON.stringify(error.response?.data)); logger.error('返回数据:', JSON.stringify(error.response?.data));
if (error.response?.data) { if (error.response?.data) {
error.message = error.response.data.message || error.response.data.msg || error.response.data.error || error.response.data; const message = error.response.data.message || error.response.data.msg || error.response.data.error;
if (typeof message === 'string') {
error.message = message;
}
} }
if (error instanceof AggregateError) { if (error instanceof AggregateError) {
logger.error('AggregateError', error); logger.error('AggregateError', error);
@@ -197,11 +216,16 @@ export type HttpRequestConfig<D = any> = {
skipCheckRes?: boolean; skipCheckRes?: boolean;
logParams?: boolean; logParams?: boolean;
logRes?: boolean; logRes?: boolean;
httpProxy?: string;
returnResponse?: boolean;
} & AxiosRequestConfig<D>; } & AxiosRequestConfig<D>;
export type HttpClient = { export type HttpClient = {
request<D = any, R = any>(config: HttpRequestConfig<D>): Promise<HttpClientResponse<R>>; request<D = any, R = any>(config: HttpRequestConfig<D>): Promise<HttpClientResponse<R>>;
}; };
// const http_proxy_backup = process.env.HTTP_PROXY || process.env.http_proxy;
// const https_proxy_backup = process.env.HTTPS_PROXY || process.env.https_proxy;
export type CreateAgentOptions = { export type CreateAgentOptions = {
httpProxy?: string; httpProxy?: string;
httpsProxy?: string; httpsProxy?: string;
@@ -216,20 +240,28 @@ export function createAgent(opts: CreateAgentOptions = {}) {
); );
let httpAgent, httpsAgent; let httpAgent, httpsAgent;
const httpProxy = opts.httpProxy || process.env.HTTP_PROXY || process.env.http_proxy; const httpProxy = opts.httpProxy;
if (httpProxy) { if (httpProxy) {
process.env.HTTP_PROXY = httpProxy;
process.env.http_proxy = httpProxy;
logger.info('use httpProxy:', httpProxy); logger.info('use httpProxy:', httpProxy);
httpAgent = new HttpProxyAgent(httpProxy, opts as any); httpAgent = new HttpProxyAgent(httpProxy, opts as any);
merge(httpAgent.options, opts); merge(httpAgent.options, opts);
} else { } else {
process.env.HTTP_PROXY = '';
process.env.http_proxy = '';
httpAgent = new nodeHttp.Agent(opts); httpAgent = new nodeHttp.Agent(opts);
} }
const httpsProxy = opts.httpsProxy || process.env.HTTPS_PROXY || process.env.https_proxy; const httpsProxy = opts.httpsProxy;
if (httpsProxy) { if (httpsProxy) {
process.env.HTTPS_PROXY = httpsProxy;
process.env.https_proxy = httpsProxy;
logger.info('use httpsProxy:', httpsProxy); logger.info('use httpsProxy:', httpsProxy);
httpsAgent = new HttpsProxyAgent(httpsProxy, opts as any); httpsAgent = new HttpsProxyAgent(httpsProxy, opts as any);
merge(httpsAgent.options, opts); merge(httpsAgent.options, opts);
} else { } else {
process.env.HTTPS_PROXY = '';
process.env.https_proxy = '';
httpsAgent = new https.Agent(opts); httpsAgent = new https.Agent(opts);
} }
return { return {

View File

@@ -1,2 +1,2 @@
link-workspace-packages=true link-workspace-packages=deep
prefer-workspace-packages=true prefer-workspace-packages=true

View File

@@ -3,6 +3,130 @@
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.30.2](https://github.com/certd/certd/compare/v1.30.1...v1.30.2) (2025-02-09)
**Note:** Version bump only for package @certd/pipeline
## [1.30.1](https://github.com/certd/certd/compare/v1.30.0...v1.30.1) (2025-01-20)
### Bug Fixes
* 修复tg消息内容中存在.和*就会发送失败的bug ([ae5dfc3](https://github.com/certd/certd/commit/ae5dfc3bee950267123ae2fbd1c11e7ce36626ea))
# [1.30.0](https://github.com/certd/certd/compare/v1.29.5...v1.30.0) (2025-01-19)
### Performance Improvements
* 证书仓库 ([91e7f45](https://github.com/certd/certd/commit/91e7f45a1c5ea1e0ec0aa3236b80028f03a6d0aa))
## [1.29.5](https://github.com/certd/certd/compare/v1.29.4...v1.29.5) (2025-01-07)
**Note:** Version bump only for package @certd/pipeline
## [1.29.4](https://github.com/certd/certd/compare/v1.29.3...v1.29.4) (2025-01-06)
**Note:** Version bump only for package @certd/pipeline
## [1.29.3](https://github.com/certd/certd/compare/v1.29.2...v1.29.3) (2025-01-04)
### Performance Improvements
* 支持http校验方式申请证书 ([405591c](https://github.com/certd/certd/commit/405591c5d08fa1a3b228ee3980199e7731cfec4a))
## [1.29.2](https://github.com/certd/certd/compare/v1.29.1...v1.29.2) (2024-12-25)
**Note:** Version bump only for package @certd/pipeline
## [1.29.1](https://github.com/certd/certd/compare/v1.29.0...v1.29.1) (2024-12-25)
### Performance Improvements
* 用户创建证书流水线没有购买套餐或者超限时提前报错 ([472f06c](https://github.com/certd/certd/commit/472f06c2d190d0ae48e8b53c18bc278437656a1c))
# [1.29.0](https://github.com/certd/certd/compare/v1.28.4...v1.29.0) (2024-12-24)
### Features
* 套餐购买支持易支付、支付宝支付 ([faa28f8](https://github.com/certd/certd/commit/faa28f88f954cba4c1dd29125562e5acd2fd99af))
* 支持微信支付 ([45d6347](https://github.com/certd/certd/commit/45d6347f5b6199493b11aabdd74177f6dca2cea4))
### Performance Improvements
* 同一时间只允许一个套餐生效 ([8ebf95a](https://github.com/certd/certd/commit/8ebf95a222a900d1707716c7b1f3b39f8a6d8f94))
* 优化证书申请跳过的状态显示,成功通知现在在跳过时不会发送 ([67d762b](https://github.com/certd/certd/commit/67d762b6a520f1fa24719a124e5ae975a81f5f82))
* 支持plesk网站证书部署 ([eda45c1](https://github.com/certd/certd/commit/eda45c1528199648b3970505e87f492d398226cd))
## [1.28.4](https://github.com/certd/certd/compare/v1.28.3...v1.28.4) (2024-12-12)
### Bug Fixes
* 修复证书成功通知发送失败的bug ([0f5c690](https://github.com/certd/certd/commit/0f5c69040ba77340c909813220a26bc7ddada3ea))
## [1.28.3](https://github.com/certd/certd/compare/v1.28.2...v1.28.3) (2024-12-12)
### Performance Improvements
* 通知标题优化 ([ff083ce](https://github.com/certd/certd/commit/ff083ce6848a8bee3c8248e4b881086ae1517c28))
* 支持aws cloudfront ([0ae39f1](https://github.com/certd/certd/commit/0ae39f160a7c6b6696b3bf513d68aa28905810ad))
## [1.28.2](https://github.com/certd/certd/compare/v1.28.1...v1.28.2) (2024-12-09)
**Note:** Version bump only for package @certd/pipeline
## [1.28.1](https://github.com/certd/certd/compare/v1.28.0...v1.28.1) (2024-12-08)
### Performance Improvements
* 通知选择器优化 ([2c0cbdd](https://github.com/certd/certd/commit/2c0cbdd29ecb74cc939b2ae7ee86b8d40f70ba31))
* 新增七牛云插件分组 ([49e7dc5](https://github.com/certd/certd/commit/49e7dc56e1a95fbdea3e30cdeb945b48415b69e3))
# [1.28.0](https://github.com/certd/certd/compare/v1.27.9...v1.28.0) (2024-11-30)
### Features
* 手机号登录、邮箱验证码注册 ([7b55337](https://github.com/certd/certd/commit/7b55337c5edb470cca7aa62201eda8d274784004))
### Performance Improvements
* 首页新增修改密码提示 ([0772d3b](https://github.com/certd/certd/commit/0772d3b3fd24afdde4086d9f09ef19d037b431b4))
* 选项显示图标 ([aedc462](https://github.com/certd/certd/commit/aedc46213571a3bd93809b7af7fa17a08d546237))
* 优化证书申请成功通知发送方式 ([8002a56](https://github.com/certd/certd/commit/8002a56efc5998aa03db5711ae87f9eb4bc9e160))
* 支持短信验证码登录 ([387bcc5](https://github.com/certd/certd/commit/387bcc5fa418cdeea81a06da5e3f8cd6b43cd082))
## [1.27.9](https://github.com/certd/certd/compare/v1.27.8...v1.27.9) (2024-11-26)
### Performance Improvements
* 通知支持自定义webhook、anpush、iyuu、server酱 ([cbccd9e](https://github.com/certd/certd/commit/cbccd9e3d0a4c24aba772af62734666d40b22c57))
* 通知支持vocechat、bark、telegram、discord、slack ([642f57f](https://github.com/certd/certd/commit/642f57ff6d7152a9e14f59c7fc0e32a6b1751fb7))
## [1.27.8](https://github.com/certd/certd/compare/v1.27.7...v1.27.8) (2024-11-25)
**Note:** Version bump only for package @certd/pipeline
## [1.27.7](https://github.com/certd/certd/compare/v1.27.6...v1.27.7) (2024-11-25)
### Performance Improvements
* 通知管理 ([d9a00ee](https://github.com/certd/certd/commit/d9a00eeaf72735ced67c59d7983d84e3c730064a))
* 通知渠道支持测试按钮 ([b54ae27](https://github.com/certd/certd/commit/b54ae272ebc2d31b32b049d44e2299a6be7f153c))
* 优化插件开发dnsProvider无需写http logger 变量 ([fcbb5e4](https://github.com/certd/certd/commit/fcbb5e46a112174150a62648319b8224fce3b7ed))
* 支持企业微信群聊机器人通知 ([b805a29](https://github.com/certd/certd/commit/b805a2925984144a31575b8aaa622f0c30d41b56))
## [1.27.6](https://github.com/certd/certd/compare/v1.27.5...v1.27.6) (2024-11-19)
**Note:** Version bump only for package @certd/pipeline
## [1.27.5](https://github.com/certd/certd/compare/v1.27.4...v1.27.5) (2024-11-18)
### Performance Improvements
* 新手导航在非编辑模式下不显示 ([18bfcc2](https://github.com/certd/certd/commit/18bfcc24ad0bde57bb04db8a4209861ec6b8ff1d))
## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14)
**Note:** Version bump only for package @certd/pipeline
## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13) ## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13)
**Note:** Version bump only for package @certd/pipeline **Note:** Version bump only for package @certd/pipeline

View File

@@ -1,7 +1,7 @@
{ {
"name": "@certd/pipeline", "name": "@certd/pipeline",
"private": false, "private": false,
"version": "1.27.3", "version": "1.30.2",
"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.27.3", "@certd/basic": "^1.30.2",
"@certd/plus-core": "^1.27.3", "@certd/plus-core": "^1.30.2",
"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"
@@ -43,5 +43,5 @@
"tslib": "^2.8.1", "tslib": "^2.8.1",
"typescript": "^5.4.2" "typescript": "^5.4.2"
}, },
"gitHead": "3a0178b2949083c770ed96a4122e4c0a5e0bcc11" "gitHead": "089825d3602440188392f7018d0eb9038617c1d6"
} }

View File

@@ -2,7 +2,15 @@ import { Registrable } from "../registry/index.js";
import { FormItemProps } from "../dt/index.js"; import { FormItemProps } from "../dt/index.js";
import { HttpClient, ILogger, utils } from "@certd/basic"; import { HttpClient, ILogger, utils } from "@certd/basic";
import * as _ from "lodash-es"; import * as _ from "lodash-es";
import { AccessRequestHandleReq } from "../core"; import { PluginRequestHandleReq } from "../plugin/index.js";
export type AccessRequestHandleReqInput<T = any> = {
id?: number;
title?: string;
access: T;
};
export type AccessRequestHandleReq<T = any> = PluginRequestHandleReq<AccessRequestHandleReqInput<T>>;
export type AccessInputDefine = FormItemProps & { export type AccessInputDefine = FormItemProps & {
title: string; title: string;
@@ -10,6 +18,7 @@ export type AccessInputDefine = FormItemProps & {
encrypt?: boolean; encrypt?: boolean;
}; };
export type AccessDefine = Registrable & { export type AccessDefine = Registrable & {
icon?: string;
input?: { input?: {
[key: string]: AccessInputDefine; [key: string]: AccessInputDefine;
}; };
@@ -33,6 +42,10 @@ export type AccessContext = {
export abstract class BaseAccess implements IAccess { export abstract class BaseAccess implements IAccess {
ctx!: AccessContext; ctx!: AccessContext;
setCtx(ctx: AccessContext) {
this.ctx = ctx;
}
async onRequest(req: AccessRequestHandleReq) { async onRequest(req: AccessRequestHandleReq) {
if (!req.action) { if (!req.action) {
throw new Error("action is required"); throw new Error("action is required");

View File

@@ -56,6 +56,6 @@ export function newAccess(type: string, input: any, ctx?: AccessContext) {
utils, utils,
}; };
} }
access.ctx = ctx; access.setCtx(ctx);
return access; return access;
} }

View File

@@ -1,4 +1,4 @@
import { Registry } from "../registry/index.js"; import { createRegistry } from "../registry/index.js";
// @ts-ignore // @ts-ignore
export const accessRegistry = new Registry("access"); export const accessRegistry = createRegistry("access");

View File

@@ -7,9 +7,16 @@ 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 } from "../service/index.js"; import { ICnameProxyService, IEmailService, IPluginConfigService, 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 { taskEmitterCreate } from "../service/emit.js";
export type SysInfo = {
//系统标题
title?: string;
};
export type ExecutorOptions = { export type ExecutorOptions = {
pipeline: Pipeline; pipeline: Pipeline;
@@ -17,10 +24,14 @@ export type ExecutorOptions = {
onChanged: (history: RunHistory) => Promise<void>; onChanged: (history: RunHistory) => Promise<void>;
accessService: IAccessService; accessService: IAccessService;
emailService: IEmailService; emailService: IEmailService;
notificationService: INotificationService;
cnameProxyService: ICnameProxyService; cnameProxyService: ICnameProxyService;
pluginConfigService: IPluginConfigService; pluginConfigService: IPluginConfigService;
urlService: IUrlService;
fileRootDir?: string; fileRootDir?: string;
user: UserInfo; user: UserInfo;
baseURL?: string;
sysInfo?: SysInfo;
}; };
export class Executor { export class Executor {
@@ -82,20 +93,30 @@ export class Executor {
await this.onChanged(this.runtime); await this.onChanged(this.runtime);
}, 5000); }, 5000);
await this.runWithHistory(this.pipeline, "pipeline", async () => { const result = await this.runWithHistory(this.pipeline, "pipeline", async () => {
return await this.runStages(this.pipeline); return await this.runStages(this.pipeline);
}); });
if (this.lastRuntime && this.lastRuntime.pipeline.status?.status === ResultType.error) { if (result === ResultType.success) {
await this.notification("turnToSuccess"); if (this.lastRuntime && this.lastRuntime.pipeline.status?.status === ResultType.error) {
await this.notification("turnToSuccess");
} else {
await this.notification("success");
}
} }
await this.notification("success"); return result;
} catch (e: any) { } catch (e: any) {
await this.notification("error", e); await this.notification("error", e);
this.logger.error("pipeline 执行失败", e); this.logger.error("pipeline 执行失败", e);
} finally { } finally {
clearInterval(intervalFlushLogId); clearInterval(intervalFlushLogId);
await this.onChanged(this.runtime); await this.onChanged(this.runtime);
await this.pipelineContext.setObj("lastRuntime", this.runtime); //保存之前移除logs
const lastRuntime: any = {
...this.runtime,
};
delete lastRuntime.logs;
delete lastRuntime._loggers;
await this.pipelineContext.setObj("lastRuntime", lastRuntime);
this.logger.info(`pipeline.${this.pipeline.id} end`); this.logger.info(`pipeline.${this.pipeline.id} end`);
} }
} }
@@ -299,6 +320,7 @@ export class Executor {
}; };
const taskCtx: TaskInstanceContext = { const taskCtx: TaskInstanceContext = {
pipeline: this.pipeline, pipeline: this.pipeline,
runtime: this.runtime,
step, step,
lastStatus, lastStatus,
http, http,
@@ -309,6 +331,8 @@ export class Executor {
emailService: this.options.emailService, emailService: this.options.emailService,
cnameProxyService: this.options.cnameProxyService, cnameProxyService: this.options.cnameProxyService,
pluginConfigService: this.options.pluginConfigService, pluginConfigService: this.options.pluginConfigService,
notificationService: this.options.notificationService,
urlService: this.options.urlService,
pipelineContext: this.pipelineContext, pipelineContext: this.pipelineContext,
userContext: this.contextFactory.getContext("user", this.options.user.id), userContext: this.contextFactory.getContext("user", this.options.user.id),
fileStore: new FileStore({ fileStore: new FileStore({
@@ -319,11 +343,15 @@ export class Executor {
signal: this.abort.signal, signal: this.abort.signal,
utils, utils,
user: this.options.user, user: this.options.user,
emitter: taskEmitterCreate({
step,
pipeline: this.pipeline,
}),
}; };
instance.setCtx(taskCtx); instance.setCtx(taskCtx);
await instance.onInstance(); await instance.onInstance();
await instance.execute(); const result = await instance.execute();
//执行结果处理 //执行结果处理
if (instance._result.clearLastStatus) { if (instance._result.clearLastStatus) {
//是否需要清除所有状态 //是否需要清除所有状态
@@ -351,26 +379,30 @@ export class Executor {
merge(vars, instance._result.pipelinePrivateVars); merge(vars, instance._result.pipelinePrivateVars);
await this.pipelineContext.setObj("privateVars", vars); await this.pipelineContext.setObj("privateVars", vars);
} }
return result;
} }
async notification(when: NotificationWhen, error?: any) { async notification(when: NotificationWhen, error?: any) {
if (!this.pipeline.notifications) { if (!this.pipeline.notifications) {
return; return;
} }
const url = await this.options.urlService.getPipelineDetailUrl(this.pipeline.id, this.runtime.id);
let subject = ""; let subject = "";
let content = ""; let content = "";
const errorMessage = error?.message;
if (when === "start") { if (when === "start") {
subject = `【CertD】开始执行,${this.pipeline.id}${this.pipeline.title}`; subject = `开始执行,${this.pipeline.title}${this.pipeline.id}`;
content = `buildId:${this.runtime.id}`; content = `流水线ID:${this.pipeline.id}运行ID:${this.runtime.id}`;
} else if (when === "success") { } else if (when === "success") {
subject = `【CertD】执行成功,${this.pipeline.id}${this.pipeline.title}`; subject = `执行成功,${this.pipeline.title}${this.pipeline.id}`;
content = `buildId:${this.runtime.id}`; content = `流水线ID:${this.pipeline.id}运行ID:${this.runtime.id}`;
} else if (when === "turnToSuccess") { } else if (when === "turnToSuccess") {
subject = `【CertD】执行成功(错误转成功),${this.pipeline.id}${this.pipeline.title}`; subject = `执行成功(失败转成功),${this.pipeline.title}${this.pipeline.id}`;
content = `buildId:${this.runtime.id}`; content = `流水线ID:${this.pipeline.id}运行ID:${this.runtime.id}`;
} else if (when === "error") { } else if (when === "error") {
subject = `【CertD】执行失败,${this.pipeline.id}${this.pipeline.title}`; subject = `执行失败,${this.pipeline.title}${this.pipeline.id}`;
content = `buildId:${this.runtime.id}\nerror:${error.message}`; content = `流水线ID:${this.pipeline.id}运行ID:${this.runtime.id}\n\n${this.currentStatusMap?.currentStep?.title} 执行失败\n\n错误详情:${error.message}`;
} else { } else {
return; return;
} }
@@ -379,10 +411,10 @@ export class Executor {
if (!notification.when.includes(when)) { if (!notification.when.includes(when)) {
continue; continue;
} }
if (notification.type === "email") { if (notification.type === "email") {
try { try {
await this.options.emailService?.send({ await this.options.emailService?.send({
userId: this.pipeline.userId,
subject, subject,
content, content,
receivers: notification.options.receivers, receivers: notification.options.receivers,
@@ -390,6 +422,29 @@ export class Executor {
} catch (e) { } catch (e) {
logger.error("send email error", e); logger.error("send email error", e);
} }
} else {
try {
//发送通知
await this.options.notificationService.send({
id: notification.notificationId,
useDefault: true,
useEmail: false,
logger: this.logger,
body: {
title: subject,
content,
userId: this.pipeline.userId,
pipeline: this.pipeline,
result: this.lastRuntime?.pipeline?.status,
pipelineId: this.pipeline.id,
historyId: this.runtime.id,
errorMessage,
url,
},
});
} catch (e) {
logger.error("send notification error", e);
}
} }
} }
} }

View File

@@ -1,21 +0,0 @@
import { HttpClient, ILogger, utils } from "@certd/basic";
export type PluginRequestHandleReq<T = any> = {
typeName: string;
action: string;
input: T;
data: any;
};
export type AccessRequestHandleReqInput<T = any> = {
id?: number;
title?: string;
access: T;
};
export type AccessRequestHandleContext = {
http: HttpClient;
logger: ILogger;
utils: typeof utils;
};
export type AccessRequestHandleReq<T = any> = PluginRequestHandleReq<AccessRequestHandleReqInput<T>>;

View File

@@ -3,5 +3,4 @@ export * from "./run-history.js";
export * from "./context.js"; export * from "./context.js";
export * from "./storage.js"; export * from "./storage.js";
export * from "./file-store.js"; export * from "./file-store.js";
export * from "./handler.js";
export * from "./exceptions.js"; export * from "./exceptions.js";

View File

@@ -18,7 +18,7 @@ export function NewRunHistory(obj: any) {
return history; return history;
} }
export class RunHistory { export class RunHistory {
id!: string; id!: any;
pipeline!: Pipeline; pipeline!: Pipeline;
logs: { logs: {
[runnableId: string]: string[]; [runnableId: string]: string[];
@@ -134,6 +134,7 @@ export class RunHistory {
export class RunnableCollection { export class RunnableCollection {
private collection: RunnableMap = {}; private collection: RunnableMap = {};
private pipeline!: Pipeline; private pipeline!: Pipeline;
currentStep!: Step;
constructor(pipeline?: Pipeline) { constructor(pipeline?: Pipeline) {
if (!pipeline) { if (!pipeline) {
return; return;
@@ -143,6 +144,23 @@ export class RunnableCollection {
this.collection = map; this.collection = map;
} }
static initPipelineRunnableType(pipeline: Pipeline) {
pipeline.runnableType = "pipeline";
if (pipeline.stages === undefined) {
pipeline.stages = [];
return;
}
pipeline.stages.forEach((stage) => {
stage.runnableType = "stage";
stage.tasks.forEach((task) => {
task.runnableType = "task";
task.steps.forEach((step) => {
step.runnableType = "step";
});
});
});
}
static each<T extends Runnable>(list: T[], exec: (item: Runnable) => void) { static each<T extends Runnable>(list: T[], exec: (item: Runnable) => void) {
list.forEach((item) => { list.forEach((item) => {
exec(item); exec(item);
@@ -193,5 +211,8 @@ export class RunnableCollection {
add(runnable: Runnable) { add(runnable: Runnable) {
this.collection[runnable.id] = runnable; this.collection[runnable.id] = runnable;
if (runnable.runnableType === "step") {
this.currentStep = runnable as Step;
}
} }
} }

View File

@@ -62,7 +62,7 @@ export type FileItem = {
path: string; path: string;
}; };
export type Runnable = { export type Runnable = {
id: string; id: any;
title: string; title: string;
strategy?: RunnableStrategy; strategy?: RunnableStrategy;
runnableType?: string; // pipeline, stage, task , step runnableType?: string; // pipeline, stage, task , step
@@ -83,6 +83,9 @@ export type Notification = {
type: NotificationType; type: NotificationType;
when: NotificationWhen[]; when: NotificationWhen[];
options: EmailOptions; options: EmailOptions;
notificationId: number;
title: string;
subType: string;
}; };
export type Pipeline = Runnable & { export type Pipeline = Runnable & {

View File

@@ -6,3 +6,4 @@ export * from "./plugin/index.js";
export * from "./context/index.js"; export * from "./context/index.js";
export * from "./decorator/index.js"; export * from "./decorator/index.js";
export * from "./service/index.js"; export * from "./service/index.js";
export * from "./notification/index.js";

View File

@@ -0,0 +1,135 @@
import { PluginRequestHandleReq } from "../plugin";
import { Registrable } from "../registry/index.js";
import { FormItemProps, HistoryResult, Pipeline } from "../dt/index.js";
import { HttpClient, ILogger, utils } from "@certd/basic";
import * as _ from "lodash-es";
import { IEmailService } from "../service/index.js";
import { isPlus } from "@certd/plus-core";
export type NotificationBody = {
userId?: number;
title: string;
content: string;
pipeline?: Pipeline;
pipelineId?: number;
result?: HistoryResult;
historyId?: number;
errorMessage?: string;
url?: string;
};
export type NotificationRequestHandleReqInput<T = any> = {
id?: number;
title?: string;
access: T;
};
export type NotificationRequestHandleReq<T = any> = PluginRequestHandleReq<NotificationRequestHandleReqInput<T>>;
export type NotificationInputDefine = FormItemProps & {
title: string;
required?: boolean;
encrypt?: boolean;
};
export type NotificationDefine = Registrable & {
needPlus?: boolean;
input?: {
[key: string]: NotificationInputDefine;
};
};
export type NotificationInstanceConfig = {
id: number;
type: string;
name: string;
userId: number;
setting: {
[key: string]: any;
};
};
export type NotificationSendReq = {
id?: number;
useDefault?: boolean;
useEmail?: boolean;
emailAddress?: string;
logger: ILogger;
body: NotificationBody;
};
export interface INotificationService {
getById(id: number): Promise<NotificationInstanceConfig>;
getDefault(): Promise<NotificationInstanceConfig>;
send(req: NotificationSendReq): Promise<void>;
}
export interface INotification {
ctx: NotificationContext;
[key: string]: any;
}
export type NotificationContext = {
http: HttpClient;
logger: ILogger;
utils: typeof utils;
emailService: IEmailService;
};
export abstract class BaseNotification implements INotification {
define!: NotificationDefine;
ctx!: NotificationContext;
http!: HttpClient;
logger!: ILogger;
async doSend(body: NotificationBody) {
if (this.define.needPlus && !isPlus()) {
body.content = `${body.content}\n\n注意此通知渠道已调整为专业版功能后续版本将不再支持发送请尽快修改或升级为专业版`;
}
return await this.send(body);
}
abstract send(body: NotificationBody): Promise<void>;
// eslint-disable-next-line @typescript-eslint/no-empty-function
async onInstance() {}
setCtx(ctx: NotificationContext) {
this.ctx = ctx;
this.http = ctx.http;
this.logger = ctx.logger;
}
setDefine = (define: NotificationDefine) => {
this.define = define;
};
async onRequest(req: NotificationRequestHandleReq) {
if (!req.action) {
throw new Error("action is required");
}
let methodName = req.action;
if (!req.action.startsWith("on")) {
methodName = `on${_.upperFirst(req.action)}`;
}
// @ts-ignore
const method = this[methodName];
if (method) {
// @ts-ignore
return await this[methodName](req.data);
}
throw new Error(`action ${req.action} not found`);
}
async onTestRequest() {
await this.doSend({
userId: 0,
title: "【Certd】测试通知【*.foo.com】标题长度测试、测试、测试",
content: "测试通知,*.foo.com",
pipeline: {
id: 1,
title: "证书申请成功【测试流水线】",
} as any,
pipelineId: 1,
historyId: 1,
url: "https://certd.docmirror.cn",
});
}
}

View File

@@ -0,0 +1,63 @@
// src/decorator/memoryCache.decorator.ts
import { Decorator } from "../decorator/index.js";
import * as _ from "lodash-es";
import { merge } from "lodash-es";
import { notificationRegistry } from "./registry.js";
import { BaseNotification, NotificationBody, NotificationContext, NotificationDefine, NotificationInputDefine, NotificationInstanceConfig } from "./api.js";
// 提供一个唯一 key
export const NOTIFICATION_CLASS_KEY = "pipeline:notification";
export const NOTIFICATION_INPUT_KEY = "pipeline:notification:input";
export function IsNotification(define: NotificationDefine): ClassDecorator {
return (target: any) => {
target = Decorator.target(target);
const inputs: any = {};
const properties = Decorator.getClassProperties(target);
for (const property in properties) {
const input = Reflect.getMetadata(NOTIFICATION_INPUT_KEY, target, property);
if (input) {
inputs[property] = input;
}
}
_.merge(define, { input: inputs });
Reflect.defineMetadata(NOTIFICATION_CLASS_KEY, define, target);
target.define = define;
notificationRegistry.register(define.name, {
define,
target,
});
};
}
export function NotificationInput(input?: NotificationInputDefine): PropertyDecorator {
return (target, propertyKey) => {
target = Decorator.target(target, propertyKey);
// const _type = Reflect.getMetadata("design:type", target, propertyKey);
Reflect.defineMetadata(NOTIFICATION_INPUT_KEY, input, target, propertyKey);
};
}
export async function newNotification(type: string, input: any, ctx: NotificationContext) {
const register = notificationRegistry.get(type);
if (register == null) {
throw new Error(`notification ${type} not found`);
}
// @ts-ignore
const plugin = new register.target();
merge(plugin, input);
if (!ctx) {
throw new Error("ctx is required");
}
plugin.setDefine(register.define);
plugin.setCtx(ctx);
await plugin.onInstance();
return plugin;
}
export async function sendNotification(opts: { config: NotificationInstanceConfig; ctx: NotificationContext; body: NotificationBody }) {
const notification: BaseNotification = await newNotification(opts.config.type, opts.config.setting, opts.ctx);
await notification.doSend(opts.body);
}

View File

@@ -0,0 +1,3 @@
export * from "./api.js";
export * from "./registry.js";
export * from "./decorator.js";

View File

@@ -0,0 +1,4 @@
import { createRegistry } from "../registry/index.js";
// @ts-ignore
export const notificationRegistry = createRegistry("notification");

View File

@@ -2,13 +2,23 @@ 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 } from "../service/index.js"; import { ICnameProxyService, IEmailService, IUrlService } from "../service/index.js";
import { CancelError, IContext, PluginRequestHandleReq, 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";
import dayjs from "dayjs"; import dayjs from "dayjs";
import { IPluginConfigService } from "../service/config"; import { IPluginConfigService } from "../service/config.js";
import { upperFirst } from "lodash-es"; import { upperFirst } from "lodash-es";
import { INotificationService } from "../notification/index.js";
import { TaskEmitter } from "../service/emit.js";
export type PluginRequestHandleReq<T = any> = {
typeName: string;
action: string;
input: T;
data: any;
};
export type UserInfo = { export type UserInfo = {
role: "admin" | "user"; role: "admin" | "user";
id: any; id: any;
@@ -50,7 +60,7 @@ export type PluginDefine = Registrable & {
export type ITaskPlugin = { export type ITaskPlugin = {
onInstance(): Promise<void>; onInstance(): Promise<void>;
execute(): Promise<void>; execute(): Promise<void | string>;
onRequest(req: PluginRequestHandleReq<any>): Promise<any>; onRequest(req: PluginRequestHandleReq<any>): Promise<any>;
[key: string]: any; [key: string]: any;
}; };
@@ -64,6 +74,8 @@ export type TaskResult = {
export type TaskInstanceContext = { export type TaskInstanceContext = {
//流水线定义 //流水线定义
pipeline: Pipeline; pipeline: Pipeline;
//运行时历史
runtime: RunHistory;
//步骤定义 //步骤定义
step: Step; step: Step;
//日志 //日志
@@ -78,6 +90,10 @@ export type TaskInstanceContext = {
cnameProxyService: ICnameProxyService; cnameProxyService: ICnameProxyService;
//插件配置服务 //插件配置服务
pluginConfigService: IPluginConfigService; pluginConfigService: IPluginConfigService;
//通知服务
notificationService: INotificationService;
//url构建
urlService: IUrlService;
//流水线上下文 //流水线上下文
pipelineContext: IContext; pipelineContext: IContext;
//用户上下文 //用户上下文
@@ -96,12 +112,15 @@ export type TaskInstanceContext = {
utils: typeof utils; utils: typeof utils;
//用户信息 //用户信息
user: UserInfo; user: UserInfo;
emitter: TaskEmitter;
}; };
export abstract class AbstractTaskPlugin implements ITaskPlugin { export abstract class AbstractTaskPlugin implements ITaskPlugin {
_result: TaskResult = { clearLastStatus: false, files: [], pipelineVars: {}, pipelinePrivateVars: {} }; _result: TaskResult = { clearLastStatus: false, files: [], pipelineVars: {}, pipelinePrivateVars: {} };
ctx!: TaskInstanceContext; ctx!: TaskInstanceContext;
logger!: ILogger; logger!: ILogger;
http!: HttpClient;
accessService!: IAccessService; accessService!: IAccessService;
clearLastStatus() { clearLastStatus() {
@@ -122,6 +141,7 @@ export abstract class AbstractTaskPlugin implements ITaskPlugin {
this.ctx = ctx; this.ctx = ctx;
this.logger = ctx.logger; this.logger = ctx.logger;
this.accessService = ctx.accessService; this.accessService = ctx.accessService;
this.http = ctx.http;
} }
async getAccess<T = any>(accessId: string) { async getAccess<T = any>(accessId: string) {
@@ -167,7 +187,7 @@ export abstract class AbstractTaskPlugin implements ITaskPlugin {
return; return;
} }
abstract execute(): Promise<void>; abstract execute(): Promise<void | string>;
appendTimeSuffix(name?: string) { appendTimeSuffix(name?: string) {
if (name == null) { if (name == null) {

View File

@@ -20,8 +20,10 @@ export const pluginGroups = {
aliyun: new PluginGroup("aliyun", "阿里云", 2), aliyun: new PluginGroup("aliyun", "阿里云", 2),
huawei: new PluginGroup("huawei", "华为云", 3), huawei: new PluginGroup("huawei", "华为云", 3),
tencent: new PluginGroup("tencent", "腾讯云", 4), tencent: new PluginGroup("tencent", "腾讯云", 4),
host: new PluginGroup("host", "主机", 5), qiniu: new PluginGroup("qiniu", "七牛云", 5),
cdn: new PluginGroup("cdn", "CDN", 6), aws: new PluginGroup("aws", "亚马逊云", 6),
panel: new PluginGroup("panel", "面板", 7), host: new PluginGroup("host", "主机", 7),
other: new PluginGroup("other", "其他", 8), cdn: new PluginGroup("cdn", "CDN", 8),
panel: new PluginGroup("panel", "面板", 9),
other: new PluginGroup("other", "其他", 10),
}; };

View File

@@ -1,4 +1,4 @@
import { OnRegisterContext, Registry } from "../registry/index.js"; import { createRegistry, OnRegisterContext } from "../registry/index.js";
import { AbstractTaskPlugin } from "./api.js"; import { AbstractTaskPlugin } from "./api.js";
import { pluginGroups } from "./group.js"; import { pluginGroups } from "./group.js";
@@ -13,4 +13,4 @@ const onRegister = ({ key, value }: OnRegisterContext<AbstractTaskPlugin>) => {
} }
} }
}; };
export const pluginRegistry = new Registry<AbstractTaskPlugin>("plugin", onRegister); export const pluginRegistry = createRegistry<AbstractTaskPlugin>("plugin", onRegister);

View File

@@ -19,7 +19,7 @@ export type OnRegisterContext<T> = {
value: RegistryItem<T>; value: RegistryItem<T>;
}; };
export type OnRegister<T> = (ctx: OnRegisterContext<T>) => void; export type OnRegister<T> = (ctx: OnRegisterContext<T>) => void;
export class Registry<T> { export class Registry<T = any> {
type = ""; type = "";
storage: { storage: {
[key: string]: RegistryItem<T>; [key: string]: RegistryItem<T>;
@@ -88,3 +88,21 @@ export class Registry<T> {
return item.define; return item.define;
} }
} }
export function createRegistry<T>(type: string, onRegister?: OnRegister<T>): Registry<T> {
const pipelineregistrycacheKey = "PIPELINE_REGISTRY_CACHE";
// @ts-ignore
let cached: any = global[pipelineregistrycacheKey];
if (!cached) {
cached = {};
// @ts-ignore
global[pipelineregistrycacheKey] = cached;
}
if (cached[type]) {
return cached[type];
}
const newRegistry = new Registry<T>(type, onRegister);
cached[type] = newRegistry;
return newRegistry;
}

View File

@@ -18,6 +18,7 @@ export type CnameRecord = {
status: string; status: string;
commonDnsProvider?: any; commonDnsProvider?: any;
}; };
export type ICnameProxyService = { export type ICnameProxyService = {
getByDomain: (domain: string) => Promise<CnameRecord>; getByDomain: (domain: string) => Promise<CnameRecord>;
}; };

View File

@@ -1,5 +1,4 @@
export type EmailSend = { export type EmailSend = {
userId: number;
subject: string; subject: string;
content: string; content: string;
receivers: string[]; receivers: string[];

View File

@@ -0,0 +1,68 @@
import { logger } from "@certd/basic";
import { Pipeline, Runnable } from "../dt";
export type PipelineEventListener = (...args: any[]) => Promise<void>;
export type PipelineEvent<T> = {
pipeline: Pipeline;
step: Runnable;
event: T;
};
export class PipelineEmitter {
events: Record<string, PipelineEventListener[]>;
constructor() {
this.events = {};
}
on(event: string, listener: PipelineEventListener) {
if (!this.events[event]) {
this.events[event] = [];
}
this.events[event].push(listener);
}
async emit<T>(name: string, event: PipelineEvent<T>) {
const listeners = this.events[name];
if (listeners) {
for (const listener of listeners) {
try {
await listener(event);
} catch (e) {
logger.error(`事件<${name}>监听器执行失败:`, e);
}
}
}
}
off(event: string, listener: PipelineEventListener) {
if (this.events[event]) {
this.events[event] = this.events[event].filter((l) => l !== listener);
}
}
once(event: string, listener: PipelineEventListener) {
const onceListener = async (...args: any[]) => {
this.off(event, onceListener);
await listener(...args);
};
this.on(event, onceListener);
}
}
export const pipelineEmitter = new PipelineEmitter();
export type TaskEmitterCreateReq = {
step: Runnable;
pipeline: Pipeline;
};
export type TaskEmitter = {
emit: <T>(name: string, event: T) => Promise<void>;
};
export function taskEmitterCreate(req: TaskEmitterCreateReq) {
return {
emit: async <T>(name: string, event: T) => {
await pipelineEmitter.emit(name, {
pipeline: req.pipeline,
step: req.step,
event,
});
},
} as TaskEmitter;
}

View File

@@ -1,3 +1,5 @@
export * from "./email.js"; export * from "./email.js";
export * from "./cname.js"; export * from "./cname.js";
export * from "./config.js"; export * from "./config.js";
export * from "./url.js";
export * from "./emit.js";

View File

@@ -0,0 +1,3 @@
export interface IUrlService {
getPipelineDetailUrl(pipelineId: number, historyId: number): Promise<string>;
}

View File

@@ -3,6 +3,86 @@
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.30.2](https://github.com/certd/certd/compare/v1.30.1...v1.30.2) (2025-02-09)
**Note:** Version bump only for package @certd/lib-huawei
## [1.30.1](https://github.com/certd/certd/compare/v1.30.0...v1.30.1) (2025-01-20)
**Note:** Version bump only for package @certd/lib-huawei
# [1.30.0](https://github.com/certd/certd/compare/v1.29.5...v1.30.0) (2025-01-19)
**Note:** Version bump only for package @certd/lib-huawei
## [1.29.5](https://github.com/certd/certd/compare/v1.29.4...v1.29.5) (2025-01-07)
**Note:** Version bump only for package @certd/lib-huawei
## [1.29.4](https://github.com/certd/certd/compare/v1.29.3...v1.29.4) (2025-01-06)
**Note:** Version bump only for package @certd/lib-huawei
## [1.29.3](https://github.com/certd/certd/compare/v1.29.2...v1.29.3) (2025-01-04)
**Note:** Version bump only for package @certd/lib-huawei
## [1.29.2](https://github.com/certd/certd/compare/v1.29.1...v1.29.2) (2024-12-25)
**Note:** Version bump only for package @certd/lib-huawei
## [1.29.1](https://github.com/certd/certd/compare/v1.29.0...v1.29.1) (2024-12-25)
**Note:** Version bump only for package @certd/lib-huawei
# [1.29.0](https://github.com/certd/certd/compare/v1.28.4...v1.29.0) (2024-12-24)
**Note:** Version bump only for package @certd/lib-huawei
## [1.28.4](https://github.com/certd/certd/compare/v1.28.3...v1.28.4) (2024-12-12)
**Note:** Version bump only for package @certd/lib-huawei
## [1.28.3](https://github.com/certd/certd/compare/v1.28.2...v1.28.3) (2024-12-12)
**Note:** Version bump only for package @certd/lib-huawei
## [1.28.2](https://github.com/certd/certd/compare/v1.28.1...v1.28.2) (2024-12-09)
**Note:** Version bump only for package @certd/lib-huawei
## [1.28.1](https://github.com/certd/certd/compare/v1.28.0...v1.28.1) (2024-12-08)
**Note:** Version bump only for package @certd/lib-huawei
# [1.28.0](https://github.com/certd/certd/compare/v1.27.9...v1.28.0) (2024-11-30)
**Note:** Version bump only for package @certd/lib-huawei
## [1.27.9](https://github.com/certd/certd/compare/v1.27.8...v1.27.9) (2024-11-26)
**Note:** Version bump only for package @certd/lib-huawei
## [1.27.8](https://github.com/certd/certd/compare/v1.27.7...v1.27.8) (2024-11-25)
**Note:** Version bump only for package @certd/lib-huawei
## [1.27.7](https://github.com/certd/certd/compare/v1.27.6...v1.27.7) (2024-11-25)
**Note:** Version bump only for package @certd/lib-huawei
## [1.27.6](https://github.com/certd/certd/compare/v1.27.5...v1.27.6) (2024-11-19)
**Note:** Version bump only for package @certd/lib-huawei
## [1.27.5](https://github.com/certd/certd/compare/v1.27.4...v1.27.5) (2024-11-18)
**Note:** Version bump only for package @certd/lib-huawei
## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14)
**Note:** Version bump only for package @certd/lib-huawei
## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13) ## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13)
**Note:** Version bump only for package @certd/lib-huawei **Note:** Version bump only for package @certd/lib-huawei

View File

@@ -1,7 +1,7 @@
{ {
"name": "@certd/lib-huawei", "name": "@certd/lib-huawei",
"private": false, "private": false,
"version": "1.27.3", "version": "1.30.2",
"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",
@@ -21,5 +21,5 @@
"prettier": "^2.8.8", "prettier": "^2.8.8",
"tslib": "^2.8.1" "tslib": "^2.8.1"
}, },
"gitHead": "3a0178b2949083c770ed96a4122e4c0a5e0bcc11" "gitHead": "089825d3602440188392f7018d0eb9038617c1d6"
} }

View File

@@ -3,6 +3,86 @@
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.30.2](https://github.com/certd/certd/compare/v1.30.1...v1.30.2) (2025-02-09)
**Note:** Version bump only for package @certd/lib-iframe
## [1.30.1](https://github.com/certd/certd/compare/v1.30.0...v1.30.1) (2025-01-20)
**Note:** Version bump only for package @certd/lib-iframe
# [1.30.0](https://github.com/certd/certd/compare/v1.29.5...v1.30.0) (2025-01-19)
**Note:** Version bump only for package @certd/lib-iframe
## [1.29.5](https://github.com/certd/certd/compare/v1.29.4...v1.29.5) (2025-01-07)
**Note:** Version bump only for package @certd/lib-iframe
## [1.29.4](https://github.com/certd/certd/compare/v1.29.3...v1.29.4) (2025-01-06)
**Note:** Version bump only for package @certd/lib-iframe
## [1.29.3](https://github.com/certd/certd/compare/v1.29.2...v1.29.3) (2025-01-04)
**Note:** Version bump only for package @certd/lib-iframe
## [1.29.2](https://github.com/certd/certd/compare/v1.29.1...v1.29.2) (2024-12-25)
**Note:** Version bump only for package @certd/lib-iframe
## [1.29.1](https://github.com/certd/certd/compare/v1.29.0...v1.29.1) (2024-12-25)
**Note:** Version bump only for package @certd/lib-iframe
# [1.29.0](https://github.com/certd/certd/compare/v1.28.4...v1.29.0) (2024-12-24)
**Note:** Version bump only for package @certd/lib-iframe
## [1.28.4](https://github.com/certd/certd/compare/v1.28.3...v1.28.4) (2024-12-12)
**Note:** Version bump only for package @certd/lib-iframe
## [1.28.3](https://github.com/certd/certd/compare/v1.28.2...v1.28.3) (2024-12-12)
**Note:** Version bump only for package @certd/lib-iframe
## [1.28.2](https://github.com/certd/certd/compare/v1.28.1...v1.28.2) (2024-12-09)
**Note:** Version bump only for package @certd/lib-iframe
## [1.28.1](https://github.com/certd/certd/compare/v1.28.0...v1.28.1) (2024-12-08)
**Note:** Version bump only for package @certd/lib-iframe
# [1.28.0](https://github.com/certd/certd/compare/v1.27.9...v1.28.0) (2024-11-30)
**Note:** Version bump only for package @certd/lib-iframe
## [1.27.9](https://github.com/certd/certd/compare/v1.27.8...v1.27.9) (2024-11-26)
**Note:** Version bump only for package @certd/lib-iframe
## [1.27.8](https://github.com/certd/certd/compare/v1.27.7...v1.27.8) (2024-11-25)
**Note:** Version bump only for package @certd/lib-iframe
## [1.27.7](https://github.com/certd/certd/compare/v1.27.6...v1.27.7) (2024-11-25)
**Note:** Version bump only for package @certd/lib-iframe
## [1.27.6](https://github.com/certd/certd/compare/v1.27.5...v1.27.6) (2024-11-19)
**Note:** Version bump only for package @certd/lib-iframe
## [1.27.5](https://github.com/certd/certd/compare/v1.27.4...v1.27.5) (2024-11-18)
**Note:** Version bump only for package @certd/lib-iframe
## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14)
**Note:** Version bump only for package @certd/lib-iframe
## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13) ## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13)
**Note:** Version bump only for package @certd/lib-iframe **Note:** Version bump only for package @certd/lib-iframe

View File

@@ -1,7 +1,7 @@
{ {
"name": "@certd/lib-iframe", "name": "@certd/lib-iframe",
"private": false, "private": false,
"version": "1.27.3", "version": "1.30.2",
"type": "module", "type": "module",
"main": "./dist/index.js", "main": "./dist/index.js",
"module": "./dist/index.js", "module": "./dist/index.js",
@@ -30,5 +30,5 @@
"tslib": "^2.8.1", "tslib": "^2.8.1",
"typescript": "^5.4.2" "typescript": "^5.4.2"
}, },
"gitHead": "3a0178b2949083c770ed96a4122e4c0a5e0bcc11" "gitHead": "089825d3602440188392f7018d0eb9038617c1d6"
} }

View File

@@ -3,6 +3,86 @@
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.30.2](https://github.com/certd/certd/compare/v1.30.1...v1.30.2) (2025-02-09)
**Note:** Version bump only for package @certd/lib-k8s
## [1.30.1](https://github.com/certd/certd/compare/v1.30.0...v1.30.1) (2025-01-20)
**Note:** Version bump only for package @certd/lib-k8s
# [1.30.0](https://github.com/certd/certd/compare/v1.29.5...v1.30.0) (2025-01-19)
**Note:** Version bump only for package @certd/lib-k8s
## [1.29.5](https://github.com/certd/certd/compare/v1.29.4...v1.29.5) (2025-01-07)
**Note:** Version bump only for package @certd/lib-k8s
## [1.29.4](https://github.com/certd/certd/compare/v1.29.3...v1.29.4) (2025-01-06)
**Note:** Version bump only for package @certd/lib-k8s
## [1.29.3](https://github.com/certd/certd/compare/v1.29.2...v1.29.3) (2025-01-04)
**Note:** Version bump only for package @certd/lib-k8s
## [1.29.2](https://github.com/certd/certd/compare/v1.29.1...v1.29.2) (2024-12-25)
**Note:** Version bump only for package @certd/lib-k8s
## [1.29.1](https://github.com/certd/certd/compare/v1.29.0...v1.29.1) (2024-12-25)
**Note:** Version bump only for package @certd/lib-k8s
# [1.29.0](https://github.com/certd/certd/compare/v1.28.4...v1.29.0) (2024-12-24)
**Note:** Version bump only for package @certd/lib-k8s
## [1.28.4](https://github.com/certd/certd/compare/v1.28.3...v1.28.4) (2024-12-12)
**Note:** Version bump only for package @certd/lib-k8s
## [1.28.3](https://github.com/certd/certd/compare/v1.28.2...v1.28.3) (2024-12-12)
**Note:** Version bump only for package @certd/lib-k8s
## [1.28.2](https://github.com/certd/certd/compare/v1.28.1...v1.28.2) (2024-12-09)
**Note:** Version bump only for package @certd/lib-k8s
## [1.28.1](https://github.com/certd/certd/compare/v1.28.0...v1.28.1) (2024-12-08)
**Note:** Version bump only for package @certd/lib-k8s
# [1.28.0](https://github.com/certd/certd/compare/v1.27.9...v1.28.0) (2024-11-30)
**Note:** Version bump only for package @certd/lib-k8s
## [1.27.9](https://github.com/certd/certd/compare/v1.27.8...v1.27.9) (2024-11-26)
**Note:** Version bump only for package @certd/lib-k8s
## [1.27.8](https://github.com/certd/certd/compare/v1.27.7...v1.27.8) (2024-11-25)
**Note:** Version bump only for package @certd/lib-k8s
## [1.27.7](https://github.com/certd/certd/compare/v1.27.6...v1.27.7) (2024-11-25)
**Note:** Version bump only for package @certd/lib-k8s
## [1.27.6](https://github.com/certd/certd/compare/v1.27.5...v1.27.6) (2024-11-19)
**Note:** Version bump only for package @certd/lib-k8s
## [1.27.5](https://github.com/certd/certd/compare/v1.27.4...v1.27.5) (2024-11-18)
**Note:** Version bump only for package @certd/lib-k8s
## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14)
**Note:** Version bump only for package @certd/lib-k8s
## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13) ## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13)
**Note:** Version bump only for package @certd/lib-k8s **Note:** Version bump only for package @certd/lib-k8s

View File

@@ -1,7 +1,7 @@
{ {
"name": "@certd/lib-k8s", "name": "@certd/lib-k8s",
"private": false, "private": false,
"version": "1.27.3", "version": "1.30.2",
"type": "module", "type": "module",
"main": "./dist/index.js", "main": "./dist/index.js",
"module": "./dist/index.js", "module": "./dist/index.js",
@@ -16,7 +16,7 @@
"preview": "vite preview" "preview": "vite preview"
}, },
"dependencies": { "dependencies": {
"@certd/basic": "^1.27.3", "@certd/basic": "^1.30.2",
"@kubernetes/client-node": "0.21.0" "@kubernetes/client-node": "0.21.0"
}, },
"devDependencies": { "devDependencies": {
@@ -31,5 +31,5 @@
"tslib": "^2.8.1", "tslib": "^2.8.1",
"typescript": "^5.4.2" "typescript": "^5.4.2"
}, },
"gitHead": "3a0178b2949083c770ed96a4122e4c0a5e0bcc11" "gitHead": "089825d3602440188392f7018d0eb9038617c1d6"
} }

View File

@@ -3,6 +3,110 @@
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.30.2](https://github.com/certd/certd/compare/v1.30.1...v1.30.2) (2025-02-09)
**Note:** Version bump only for package @certd/lib-server
## [1.30.1](https://github.com/certd/certd/compare/v1.30.0...v1.30.1) (2025-01-20)
**Note:** Version bump only for package @certd/lib-server
# [1.30.0](https://github.com/certd/certd/compare/v1.29.5...v1.30.0) (2025-01-19)
### Features
* 支持open api接口根据域名获取证书 ([52a4fd3](https://github.com/certd/certd/commit/52a4fd33180e9b3f71b8dc9f7671d7cd8e448c3b))
## [1.29.5](https://github.com/certd/certd/compare/v1.29.4...v1.29.5) (2025-01-07)
**Note:** Version bump only for package @certd/lib-server
## [1.29.4](https://github.com/certd/certd/compare/v1.29.3...v1.29.4) (2025-01-06)
**Note:** Version bump only for package @certd/lib-server
## [1.29.3](https://github.com/certd/certd/compare/v1.29.2...v1.29.3) (2025-01-04)
### Bug Fixes
* 修复系统级授权无法查看密钥的bug ([8644348](https://github.com/certd/certd/commit/8644348fc41ae2e1672f946ca37e5d3a674e0218))
## [1.29.2](https://github.com/certd/certd/compare/v1.29.1...v1.29.2) (2024-12-25)
**Note:** Version bump only for package @certd/lib-server
## [1.29.1](https://github.com/certd/certd/compare/v1.29.0...v1.29.1) (2024-12-25)
**Note:** Version bump only for package @certd/lib-server
# [1.29.0](https://github.com/certd/certd/compare/v1.28.4...v1.29.0) (2024-12-24)
### Features
* 基础版不再限制流水线数量 ([cb27d4b](https://github.com/certd/certd/commit/cb27d4b4906b2782eaceb0a95bbdc5d0534370d2))
* 套餐购买支持易支付、支付宝支付 ([faa28f8](https://github.com/certd/certd/commit/faa28f88f954cba4c1dd29125562e5acd2fd99af))
* 用户套餐,用户支付功能 ([a019956](https://github.com/certd/certd/commit/a019956698acaf2c4beb620b5ad8c18918ead6a1))
### Performance Improvements
* 站点证书监控通知发送,每天定时检查 ([bb4910f](https://github.com/certd/certd/commit/bb4910f4e57234e42b44505f4620ae7af66025c5))
## [1.28.4](https://github.com/certd/certd/compare/v1.28.3...v1.28.4) (2024-12-12)
**Note:** Version bump only for package @certd/lib-server
## [1.28.3](https://github.com/certd/certd/compare/v1.28.2...v1.28.3) (2024-12-12)
**Note:** Version bump only for package @certd/lib-server
## [1.28.2](https://github.com/certd/certd/compare/v1.28.1...v1.28.2) (2024-12-09)
**Note:** Version bump only for package @certd/lib-server
## [1.28.1](https://github.com/certd/certd/compare/v1.28.0...v1.28.1) (2024-12-08)
### Performance Improvements
* favicon支持自定义 ([8b9c47d](https://github.com/certd/certd/commit/8b9c47daf194515006689a212ae9cf586bdf5993))
# [1.28.0](https://github.com/certd/certd/compare/v1.27.9...v1.28.0) (2024-11-30)
### Performance Improvements
* 登录失败增加重试次数限制及冷却时间 ([954b6df](https://github.com/certd/certd/commit/954b6df3608695fe074130f8149a33e311d80cc4))
* 流水线支持批量修改分组,批量删除 ([a847e66](https://github.com/certd/certd/commit/a847e66c4fc843b98f1520b2b8072d3586ce8b81))
* 支持短信验证码登录 ([387bcc5](https://github.com/certd/certd/commit/387bcc5fa418cdeea81a06da5e3f8cd6b43cd082))
## [1.27.9](https://github.com/certd/certd/compare/v1.27.8...v1.27.9) (2024-11-26)
**Note:** Version bump only for package @certd/lib-server
## [1.27.8](https://github.com/certd/certd/compare/v1.27.7...v1.27.8) (2024-11-25)
**Note:** Version bump only for package @certd/lib-server
## [1.27.7](https://github.com/certd/certd/compare/v1.27.6...v1.27.7) (2024-11-25)
**Note:** Version bump only for package @certd/lib-server
## [1.27.6](https://github.com/certd/certd/compare/v1.27.5...v1.27.6) (2024-11-19)
### Bug Fixes
* 修复vip试用secret报错的bug ([018dee6](https://github.com/certd/certd/commit/018dee6c383233560f078dfd30f6c2857a7e15ee))
## [1.27.5](https://github.com/certd/certd/compare/v1.27.4...v1.27.5) (2024-11-18)
### Performance Improvements
* 专业版试用,无需绑定账号 ([c7c4318](https://github.com/certd/certd/commit/c7c4318c11b65a76089787aa58939832d338a232))
## [1.27.4](https://github.com/certd/certd/compare/v1.27.3...v1.27.4) (2024-11-14)
### Performance Improvements
* 公共cname服务支持关闭 ([f4ae512](https://github.com/certd/certd/commit/f4ae5125dc4cd97816976779cb3586b5ee78947e))
## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13) ## [1.27.3](https://github.com/certd/certd/compare/v1.27.2...v1.27.3) (2024-11-13)
### Performance Improvements ### Performance Improvements

View File

@@ -1,6 +1,6 @@
{ {
"name": "@certd/lib-server", "name": "@certd/lib-server",
"version": "1.27.3", "version": "1.30.2",
"description": "midway with flyway, sql upgrade way ", "description": "midway with flyway, sql upgrade way ",
"private": false, "private": false,
"type": "module", "type": "module",
@@ -27,10 +27,10 @@
], ],
"license": "AGPL", "license": "AGPL",
"dependencies": { "dependencies": {
"@certd/acme-client": "^1.27.3", "@certd/acme-client": "^1.30.2",
"@certd/basic": "^1.27.3", "@certd/basic": "^1.30.2",
"@certd/pipeline": "^1.27.3", "@certd/pipeline": "^1.30.2",
"@certd/plus-core": "^1.27.3", "@certd/plus-core": "^1.30.2",
"@midwayjs/cache": "~3.14.0", "@midwayjs/cache": "~3.14.0",
"@midwayjs/core": "~3.17.1", "@midwayjs/core": "~3.17.1",
"@midwayjs/i18n": "~3.17.3", "@midwayjs/i18n": "~3.17.3",
@@ -61,5 +61,5 @@
"typeorm": "^0.3.11", "typeorm": "^0.3.11",
"typescript": "^5.4.2" "typescript": "^5.4.2"
}, },
"gitHead": "3a0178b2949083c770ed96a4122e4c0a5e0bcc11" "gitHead": "089825d3602440188392f7018d0eb9038617c1d6"
} }

View File

@@ -25,7 +25,7 @@ export abstract class BaseController {
* @param msg * @param msg
* @param code * @param code
*/ */
fail(msg: string, code: any) { fail(msg: string, code?: any) {
return { return {
code: code ? code : Constants.res.error.code, code: code ? code : Constants.res.error.code,
msg: msg ? msg : Constants.res.error.code, msg: msg ? msg : Constants.res.error.code,
@@ -39,4 +39,12 @@ export abstract class BaseController {
} }
return userId; return userId;
} }
getLoginUser() {
const user = this.ctx.user;
if (user == null) {
throw new Error('Token已过期');
}
return user;
}
} }

View File

@@ -1,10 +1,9 @@
import { ValidateException } from './exception/index.js'; import { PermissionException, ValidateException } from './exception/index.js';
import * as _ from 'lodash-es';
import { PermissionException } from './exception/index.js';
import { In, Repository, SelectQueryBuilder } from 'typeorm'; import { In, Repository, SelectQueryBuilder } from 'typeorm';
import { Inject } from '@midwayjs/core'; import { Inject } from '@midwayjs/core';
import { TypeORMDataSourceManager } from '@midwayjs/typeorm'; import { TypeORMDataSourceManager } from '@midwayjs/typeorm';
import { EntityManager } from 'typeorm/entity-manager/EntityManager.js'; import { EntityManager } from 'typeorm/entity-manager/EntityManager.js';
import { FindManyOptions } from 'typeorm';
export type PageReq<T = any> = { export type PageReq<T = any> = {
page?: { offset: number; limit: number }; page?: { offset: number; limit: number };
@@ -17,6 +16,7 @@ export type ListReq<T = any> = {
asc: boolean; asc: boolean;
}; };
buildQuery?: (bq: SelectQueryBuilder<any>) => void; buildQuery?: (bq: SelectQueryBuilder<any>) => void;
select?: any;
}; };
/** /**
@@ -55,7 +55,7 @@ export abstract class BaseService<T> {
* 非分页查询 * 非分页查询
* @param options * @param options
*/ */
async find(options) { async find(options: FindManyOptions<T>) {
return await this.getRepository().find(options); return await this.getRepository().find(options);
} }
@@ -101,7 +101,7 @@ export abstract class BaseService<T> {
* 新增|修改 * 新增|修改
* @param param 数据 * @param param 数据
*/ */
async addOrUpdate(param) { async addOrUpdate(param: any) {
await this.getRepository().save(param); await this.getRepository().save(param);
} }
@@ -109,7 +109,7 @@ export abstract class BaseService<T> {
* 新增 * 新增
* @param param 数据 * @param param 数据
*/ */
async add(param) { async add(param: any) {
const now = new Date(); const now = new Date();
param.createTime = now; param.createTime = now;
param.updateTime = now; param.updateTime = now;
@@ -124,7 +124,7 @@ export abstract class BaseService<T> {
* 修改 * 修改
* @param param 数据 * @param param 数据
*/ */
async update(param) { async update(param: any) {
if (!param.id) throw new ValidateException('id 不能为空'); if (!param.id) throw new ValidateException('id 不能为空');
param.updateTime = new Date(); param.updateTime = new Date();
await this.addOrUpdate(param); await this.addOrUpdate(param);
@@ -150,6 +150,7 @@ export abstract class BaseService<T> {
page.limit = 20; page.limit = 20;
} }
const qb = this.buildListQuery(pageReq); const qb = this.buildListQuery(pageReq);
qb.offset(page.offset).limit(page.limit); qb.offset(page.offset).limit(page.limit);
const list = await qb.getMany(); const list = await qb.getMany();
const total = await qb.getCount(); const total = await qb.getCount();
@@ -164,28 +165,27 @@ export abstract class BaseService<T> {
private buildListQuery(listReq: ListReq<T>) { private buildListQuery(listReq: ListReq<T>) {
const { query, sort, buildQuery } = listReq; const { query, sort, buildQuery } = listReq;
const qb = this.getRepository().createQueryBuilder('main'); const qb = this.getRepository().createQueryBuilder('main');
if (sort && sort.prop) {
qb.addOrderBy('main.' + sort.prop, sort.asc ? 'ASC' : 'DESC');
}
qb.addOrderBy('id', 'DESC');
//根据bean query
if (query) { if (query) {
let whereSql = ''; const keys = Object.keys(query);
let index = 0; for (const key of keys) {
_.forEach(query, (value, key) => { const value = query[key];
if (!value) { if (value == null) {
return; delete query[key];
} }
if (index !== 0) { }
whereSql += ' and '; qb.where(query);
}
if (sort && sort.prop) {
const found = this.getRepository().metadata.columns.find(column => {
if (column.propertyName === sort.prop) {
return true;
} }
whereSql += ` main.${key} = :${key} `;
index++;
}); });
if (index > 0) { if (found) {
qb.andWhere(whereSql, query); qb.addOrderBy('main.' + sort.prop, sort.asc ? 'ASC' : 'DESC');
} }
} }
qb.addOrderBy('id', 'DESC');
//自定义query //自定义query
if (buildQuery) { if (buildQuery) {
buildQuery(qb); buildQuery(qb);

View File

@@ -12,6 +12,8 @@ export const Constants = {
authOnly: '_authOnly_', authOnly: '_authOnly_',
//仅需要登录 //仅需要登录
loginOnly: '_authOnly_', loginOnly: '_authOnly_',
open: '_open_',
}, },
res: { res: {
serverError(message: string) { serverError(message: string) {
@@ -36,6 +38,18 @@ export const Constants = {
code: 88, code: 88,
message: '需要VIP', message: '需要VIP',
}, },
needsuite: {
code: 89,
message: '需要购买或升级套餐',
},
loginError: {
code: 2,
message: '登录失败',
},
codeError: {
code: 3,
message: '验证码错误',
},
auth: { auth: {
code: 401, code: 401,
message: '您还未登录或token已过期', message: '您还未登录或token已过期',
@@ -56,5 +70,33 @@ export const Constants = {
code: 10001, code: 10001,
message: '对不起,预览环境不允许修改此数据', message: '对不起,预览环境不允许修改此数据',
}, },
openKeyError: {
code: 20000,
message: 'ApiToken错误',
},
openKeySignError: {
code: 20001,
message: 'ApiToken签名错误',
},
openKeyExpiresError: {
code: 20002,
message: 'ApiToken时间戳错误',
},
openKeySignTypeError: {
code: 20003,
message: 'ApiToken签名类型不支持',
},
openParamError: {
code: 20010,
message: '请求参数错误',
},
openCertNotFound: {
code: 20011,
message: '证书不存在',
},
openCertNotReady: {
code: 20012,
message: '证书还未生成',
},
}, },
}; };

View File

@@ -49,4 +49,10 @@ export abstract class CrudController<T> extends BaseController {
await this.getService().delete([id]); await this.getService().delete([id]);
return this.ok(null); return this.ok(null);
} }
@Post('/deleteByIds')
async deleteByIds(@Body('ids') ids: number[]) {
await this.getService().delete(ids);
return this.ok(null);
}
} }

View File

@@ -5,10 +5,6 @@ import { BaseException } from './base-exception.js';
*/ */
export class AuthException extends BaseException { export class AuthException extends BaseException {
constructor(message) { constructor(message) {
super( super('AuthException', Constants.res.auth.code, message ? message : Constants.res.auth.message);
'AuthException',
Constants.res.auth.code,
message ? message : Constants.res.auth.message
);
} }
} }

View File

@@ -2,10 +2,10 @@
* 异常基类 * 异常基类
*/ */
export class BaseException extends Error { export class BaseException extends Error {
status: number; code: number;
constructor(name, code, message) { constructor(name, code, message) {
super(message); super(message);
this.name = name; this.name = name;
this.status = code; this.code = code;
} }
} }

View File

@@ -0,0 +1,10 @@
import { Constants } from '../constants.js';
import { BaseException } from './base-exception.js';
/**
* 验证码异常
*/
export class CodeErrorException extends BaseException {
constructor(message) {
super('CodeErrorException', Constants.res.codeError.code, message ? message : Constants.res.codeError.message);
}
}

View File

@@ -5,10 +5,12 @@ import { BaseException } from './base-exception.js';
*/ */
export class CommonException extends BaseException { export class CommonException extends BaseException {
constructor(message) { constructor(message) {
super( super('CommonException', Constants.res.error.code, message ? message : Constants.res.error.message);
'CommonException', }
Constants.res.error.code, }
message ? message : Constants.res.error.message
); export class CodeException extends BaseException {
constructor(res: { code: number; message: string }) {
super('CodeException', res.code, res.message);
} }
} }

View File

@@ -0,0 +1,12 @@
import { Constants } from '../constants.js';
import { BaseException } from './base-exception.js';
/**
* 通用异常
*/
export class LoginErrorException extends BaseException {
leftCount: number;
constructor(message, leftCount: number) {
super('LoginErrorException', Constants.res.loginError.code, message ? message : Constants.res.loginError.message);
this.leftCount = leftCount;
}
}

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