Compare commits

..

329 Commits

Author SHA1 Message Date
xiaojunnuo
f3a24ef6de chore: singleton 2025-12-28 23:46:55 +08:00
xiaojunnuo
1347355cb1 perf: 支持授权给管理员查看和下载用户证书 2025-12-28 23:36:53 +08:00
xiaojunnuo
f847c4a414 chore: 1 2025-12-28 01:05:48 +08:00
xiaojunnuo
776fa924e3 chore: 1 2025-12-28 00:49:41 +08:00
xiaojunnuo
8872466968 perf: 支持从阿里云商用证书订单中获取证书 2025-12-28 00:38:38 +08:00
xiaojunnuo
b620038d98 Merge branch 'v2-dev' of https://github.com/certd/certd into v2-dev 2025-12-27 22:57:31 +08:00
xiaojunnuo
a248367b15 perf: 支持ucloud waf(未测试) 2025-12-27 22:57:26 +08:00
xiaojunnuo
c159ec4a9a Merge branch 'v2-dev' of https://github.com/certd/certd into v2-dev 2025-12-27 15:05:52 +08:00
xiaojunnuo
5359a7670f perf: 优化阿里云esa清理证书时机 2025-12-27 15:05:43 +08:00
xiaojunnuo
7e1c7a6de2 chore: 1 2025-12-27 02:23:29 +08:00
xiaojunnuo
91e19bbdd3 chore: 优化图标 2025-12-27 02:20:01 +08:00
xiaojunnuo
e61daaee2d perf: 支持ucloud,上传到ussl,部署到ucdn 2025-12-27 01:54:47 +08:00
xiaojunnuo
8caab1fd92 perf: aws route53 2025-12-26 23:20:14 +08:00
xiaojunnuo
cd944882c3 perf: 执行队列数量支持设置 2025-12-26 18:17:05 +08:00
xiaojunnuo
888d9591fe perf: 支持执行队列,避免同一时间触发流水线太多导致被限制 2025-12-26 16:30:03 +08:00
xiaojunnuo
833808c5de fix: 修复从模版创建的流水线不会自动执行的bug 2025-12-26 16:29:20 +08:00
xiaojunnuo
d731956b06 fix: 首页最快到期证书,不包含已禁用的流水线 2025-12-26 14:37:03 +08:00
xiaojunnuo
40449ae4de chore: docs 2025-12-26 14:26:27 +08:00
xiaojunnuo
44ad61f004 Merge branch 'v2-dev' of https://github.com/certd/certd into v2-dev 2025-12-26 09:29:37 +08:00
xiaojunnuo
74865d53f8 chore: 修复aws route53 删除record失败的问题 2025-12-26 09:29:29 +08:00
xiaojunnuo
373415261e Merge branch 'v2-dev' of https://github.com/certd/certd into v2-dev 2025-12-25 22:20:59 +08:00
xiaojunnuo
d0f653da9a perf: 批量修改定时时间支持随机时间 2025-12-25 22:20:54 +08:00
xiaojunnuo
cbb8319cfa perf: 支持aws route53 dns 2025-12-25 18:56:27 +08:00
xiaojunnuo
0e467a6024 chore: docs 2025-12-22 16:36:32 +08:00
xiaojunnuo
e505916525 fix: 修复用户删除后,用相同的oauth授权登录报错用户不存在的问题
https://github.com/certd/certd/issues/603
2025-12-19 11:37:22 +08:00
xiaojunnuo
31f09ab117 chore: ip证书文档 2025-12-19 11:30:01 +08:00
xiaojunnuo
09e5e0f9b3 chore: 1 2025-12-19 10:49:10 +08:00
xiaojunnuo
773cada57a perf: ip证书校验方式提示 2025-12-19 10:08:28 +08:00
xiaojunnuo
403947ed6d chore: 开源地址 2025-12-18 19:07:27 +08:00
xiaojunnuo
d9d08a725c perf: 官方开源地址 2025-12-18 19:03:46 +08:00
xiaojunnuo
e2ed75af94 Merge branch 'v2-dev' of https://github.com/certd/certd into v2-dev 2025-12-17 10:02:30 +08:00
xiaojunnuo
dd19afce92 fix: 修复部署到华为obs 报错的bug 2025-12-17 10:02:23 +08:00
xiaojunnuo
5b5deac7d9 perf: 腾讯云EO增加请求参数打印 2025-12-16 23:10:30 +08:00
xiaojunnuo
3f3ee3456e chore: 支持仅查询其他用户的流水线 2025-12-16 22:52:07 +08:00
xiaojunnuo
3e2f2fc02e chore: 批量修改流水线优化 2025-12-16 22:31:06 +08:00
xiaojunnuo
c5a3003cf7 fix: 发送证书到邮箱插件的邮件模版转为使用邮箱配置中的通用模版 2025-12-16 22:07:39 +08:00
xiaojunnuo
4c6dcddf11 Merge branch 'v2-dev' of https://github.com/certd/certd into v2-dev 2025-12-16 10:02:31 +08:00
xiaojunnuo
b314e500cd build: release 2025-12-16 07:43:49 +08:00
xiaojunnuo
b83e6ad13f build: publish 2025-12-16 01:47:46 +08:00
xiaojunnuo
fee401cfdf build: trigger build image 2025-12-16 01:47:35 +08:00
xiaojunnuo
fa14f62198 v1.37.16 2025-12-16 01:46:13 +08:00
xiaojunnuo
5526665494 build: prepare to build 2025-12-16 01:44:10 +08:00
xiaojunnuo
6249af996a build: prepare to build 2025-12-16 01:41:26 +08:00
xiaojunnuo
e51a1b365e build: prepare to build 2025-12-16 01:30:58 +08:00
xiaojunnuo
f53f00d126 chore: 1 2025-12-16 00:39:21 +08:00
xiaojunnuo
ab8fbaf21d chore: 修复清除定时任务未生效的bug 2025-12-16 00:34:32 +08:00
xiaojunnuo
63d8bcf882 perf: 批量设置定时,支持清除定时 2025-12-16 00:21:31 +08:00
xiaojunnuo
e4e16bc6a6 fix: 修复ipv6作为证书域名申请证书校验失败的bug 2025-12-15 23:34:47 +08:00
xiaojunnuo
e4c21c4d5c chore: 模版发邮件 plus 2025-12-15 22:32:25 +08:00
xiaojunnuo
d9e6dbf889 chore: 优化telegram更多保留字符 2025-12-15 22:21:43 +08:00
xiaojunnuo
5f4469e306 fix: telegram 修复消息内存在横杠无法发出的bug 2025-12-15 15:12:07 +08:00
xiaojunnuo
16f6365b18 chore: oidc自动注册时增加邮箱 2025-12-15 00:23:35 +08:00
xiaojunnuo
cdab54bf51 chore: 1 2025-12-15 00:21:42 +08:00
xiaojunnuo
b6fea0c856 perf: oidc支持使用第三方昵称或账号作为certd用户的用户名 2025-12-15 00:19:55 +08:00
xiaojunnuo
6f186932cc perf: 支持彩虹聚合登录 2025-12-15 00:12:27 +08:00
xiaojunnuo
de544ec725 chore: email template优化 2025-12-14 23:19:32 +08:00
xiaojunnuo
a6c0d2c6f1 perf: 支持邮件模版设置 2025-12-14 01:36:20 +08:00
xiaojunnuo
437d956cad chore: email template 2025-12-12 23:39:09 +08:00
xiaojunnuo
43ba0b9da6 docs: 1panel增加应用商店部署方式 2025-12-11 18:14:15 +08:00
xiaojunnuo
fe1e2c3b62 Merge branch 'v2-dev' of https://github.com/certd/certd into v2-dev 2025-12-10 14:17:20 +08:00
xiaojunnuo
bbe7e5f96d chore: 1 2025-12-10 14:15:39 +08:00
xiaojunnuo
2bfad9fc65 fix: 优化西部数据 500 already exists 的问题 2025-12-09 23:33:11 +08:00
xiaojunnuo
9f24c18f7f chore: 优化数据库脚本 2025-12-09 23:28:29 +08:00
xiaojunnuo
a2d1e5ea03 chore: 修复sqlite语句双引号改单引号 2025-12-09 23:11:19 +08:00
xiaojunnuo
b082e4e988 chore: 1 2025-12-09 00:47:08 +08:00
xiaojunnuo
45fbce0c2a perf: 新增数据库迁移doc说明文档,优化datetime字段平滑迁移 2025-12-09 00:45:10 +08:00
xiaojunnuo
ff7006e232 build: release 2025-12-07 01:17:22 +08:00
xiaojunnuo
c68fdef0e4 build: publish 2025-12-07 00:59:50 +08:00
xiaojunnuo
4c60e4edc1 build: trigger build image 2025-12-07 00:59:39 +08:00
xiaojunnuo
f2e4e59f8d v1.37.15 2025-12-07 00:58:12 +08:00
xiaojunnuo
898205b5b1 build: prepare to build 2025-12-07 00:56:13 +08:00
xiaojunnuo
8ec6862861 chore: 升级fs 2025-12-07 00:56:06 +08:00
xiaojunnuo
c3ba6322d8 build: prepare to build 2025-12-07 00:55:38 +08:00
xiaojunnuo
e589828425 build: prepare to build 2025-12-07 00:47:24 +08:00
xiaojunnuo
c909aa161b chore: webhook修改为隐藏变量,避免别人fork后触发我的流水线 2025-12-07 00:18:05 +08:00
xiaojunnuo
5cee7d44f1 perf: 第三方登录支持gitee 2025-12-06 17:25:02 +08:00
xiaojunnuo
973b323a99 docs: 优化教程 2025-12-06 16:24:19 +08:00
xiaojunnuo
d55954a363 perf: 支持k8s apply 2025-12-05 02:05:27 +08:00
xiaojunnuo
adca151e4f perf: 邮件模版安全优化 2025-12-05 00:45:56 +08:00
xiaojunnuo
43513049be perf: 支持部署到中国移动CDN 2025-12-04 00:46:25 +08:00
xiaojunnuo
a5ca41131b fix: oidc 支持nonce 2025-12-03 22:00:35 +08:00
xiaojunnuo
2ea3810980 build: release 2025-12-03 10:09:24 +08:00
xiaojunnuo
c9cb54e8b2 build: release 2025-12-03 07:34:48 +08:00
xiaojunnuo
23dd3db50b build: publish 2025-12-03 01:01:31 +08:00
xiaojunnuo
179c46914d build: trigger build image 2025-12-03 01:01:20 +08:00
xiaojunnuo
ddb18e6c21 v1.37.14 2025-12-03 00:59:54 +08:00
xiaojunnuo
d2e147ba51 build: prepare to build 2025-12-03 00:57:50 +08:00
xiaojunnuo
b63033f846 build: release 2025-12-03 00:57:37 +08:00
xiaojunnuo
677e1101e6 fix: 修复注销登录时,第三方登录注销请求失败的报错 2025-12-03 00:57:17 +08:00
xiaojunnuo
3abc2ccfbb build: 1 2025-12-03 00:48:21 +08:00
xiaojunnuo
827d28f1cd build: publish 2025-12-03 00:41:16 +08:00
xiaojunnuo
59d12a1bbe build: trigger build image 2025-12-03 00:40:59 +08:00
xiaojunnuo
8134172301 v1.37.13 2025-12-03 00:39:32 +08:00
xiaojunnuo
8d983aa561 build: prepare to build 2025-12-03 00:36:47 +08:00
xiaojunnuo
bb3085ef84 perf: 第三方登录允许选择logo 2025-12-03 00:35:17 +08:00
xiaojunnuo
78b1650bdb fix: 修复西部数据返回信息乱码问题 2025-12-02 16:37:26 +08:00
xiaojunnuo
5edc72d475 fix: 修复西部数码使用域名级别的key申请证书失败的问题 2025-12-02 16:11:33 +08:00
xiaojunnuo
1df32c9dfa docs: 阿里云超时配置 2025-12-01 19:10:47 +08:00
xiaojunnuo
bedb1ff7f9 docs: 流水线有效期 2025-12-01 11:48:57 +08:00
xiaojunnuo
fbf12f16b5 perf: 支持OIDC单点登录 2025-12-01 00:40:46 +08:00
xiaojunnuo
22a5f34e1f build: release 2025-11-30 02:53:41 +08:00
xiaojunnuo
e1a8b08619 build: publish 2025-11-30 02:32:23 +08:00
xiaojunnuo
466d30fb74 build: trigger build image 2025-11-30 02:32:06 +08:00
xiaojunnuo
7a1c6d2918 v1.37.12 2025-11-30 02:30:29 +08:00
xiaojunnuo
9fcc0dc8e7 build: prepare to build 2025-11-30 02:28:22 +08:00
xiaojunnuo
286f244caf build: prepare to build 2025-11-30 02:18:12 +08:00
xiaojunnuo
52ebeab90b chore: group dict刷新 2025-11-30 02:16:04 +08:00
xiaojunnuo
6be7591332 perf: 支持证书颁发机构 LiteSSL
https://github.com/certd/certd/issues/590
2025-11-30 01:30:47 +08:00
xiaojunnuo
73325aaefb perf: 支持微信扫码登录 2025-11-30 01:13:55 +08:00
xiaojunnuo
0adcc6a8d1 fix: 修复waf tls版本号小写 2025-11-29 12:15:58 +08:00
xiaojunnuo
93fb6acd1d build: release 2025-11-29 04:30:52 +08:00
xiaojunnuo
77d52b323d build: publish 2025-11-29 04:17:51 +08:00
xiaojunnuo
ca8e8bf6ef build: trigger build image 2025-11-29 04:17:34 +08:00
xiaojunnuo
9acac86ed5 v1.37.11 2025-11-29 04:15:57 +08:00
xiaojunnuo
ba5007219d build: prepare to build 2025-11-29 04:13:44 +08:00
xiaojunnuo
ec046fd599 build: prepare to build 2025-11-29 04:10:55 +08:00
xiaojunnuo
5452ff1153 build: prepare to build 2025-11-29 04:08:56 +08:00
xiaojunnuo
d03b1e0608 chore: 数据库脚本同步 2025-11-29 04:06:51 +08:00
xiaojunnuo
53c88ad5af perf: 优化天翼云cdn 等待5秒部署完成 2025-11-29 03:25:21 +08:00
xiaojunnuo
21585ca565 chore: 优化oidc登录 2025-11-28 01:42:42 +08:00
xiaojunnuo
2fabee647a fix: 修复阿里云 waf tlsVersion参数缺失导致部署失败的问题 2025-11-27 22:36:33 +08:00
xiaojunnuo
cf4632045c Merge branch 'v2-dev' of https://github.com/certd/certd into v2-dev 2025-11-27 01:59:28 +08:00
xiaojunnuo
ec75afbc44 perf: 支持oidc单点登录 2025-11-27 01:59:22 +08:00
xiaojunnuo
c7b298c46f fix: 修复备注撑开表格行高的bug
https://github.com/certd/certd/issues/586
2025-11-26 23:38:34 +08:00
xiaojunnuo
3406bb5a4a fix: 修复域名管理无法创建tencent-eo dns授权的bug
https://github.com/certd/certd/issues/587
2025-11-26 23:36:34 +08:00
xiaojunnuo
e9427b4694 chore: oauth-second 2025-11-26 23:25:51 +08:00
xiaojunnuo
517a1f1835 Merge branch 'v2-dev' of https://github.com/certd/certd into v2-dev 2025-11-26 16:04:24 +08:00
xiaojunnuo
6e735bbd1e fix: openapi 成功后失败都返回msg 2025-11-26 16:04:14 +08:00
xiaojunnuo
5a148aa3b9 chore: oidc first 2025-11-26 07:34:42 +08:00
xiaojunnuo
b4c362da37 docs: openapi 2025-11-25 09:12:35 +08:00
xiaojunnuo
575ae164c8 perf: ssh支持ppk格式私钥 2025-11-25 00:48:21 +08:00
xiaojunnuo
a9606bfb4e chore: 1 2025-11-24 23:43:14 +08:00
xiaojunnuo
b5ec04723d perf: ssl.com支持ecc 2025-11-24 23:33:25 +08:00
xiaojunnuo
51cc08411f perf: 优化宝塔网站证书在并发部署时导致nginx配置文件错乱的问题 2025-11-24 23:18:56 +08:00
xiaojunnuo
d75034deae build: release 2025-11-19 23:57:16 +08:00
xiaojunnuo
4ce23debb6 build: publish 2025-11-19 23:55:03 +08:00
xiaojunnuo
063706a7bf build: trigger build image 2025-11-19 23:54:03 +08:00
xiaojunnuo
eb41a3655f v1.37.10 2025-11-19 23:52:19 +08:00
xiaojunnuo
a84476187f build: prepare to build 2025-11-19 23:49:47 +08:00
xiaojunnuo
70b603d601 perf: 站点证书监控备注输入框改成textarea 2025-11-19 23:49:09 +08:00
xiaojunnuo
c9709f2698 perf: 优化dokploy 部署插件,配置选择serverId 2025-11-19 23:47:26 +08:00
xiaojunnuo
be4f479afd build: release 2025-11-19 15:41:19 +08:00
xiaojunnuo
a251465dbc build: publish 2025-11-19 15:30:56 +08:00
xiaojunnuo
9b7051f2be build: trigger build image 2025-11-19 15:30:33 +08:00
xiaojunnuo
8bfdef79c4 v1.37.9 2025-11-19 15:28:27 +08:00
xiaojunnuo
f2c2bf81b3 build: prepare to build 2025-11-19 15:24:37 +08:00
xiaojunnuo
8b5247b9bb build: prepare to build 2025-11-19 15:23:57 +08:00
xiaojunnuo
075b1dc0eb fix: 商用证书上传保存失败的bug 2025-11-19 15:13:08 +08:00
xiaojunnuo
42e1f0478d chore: docs 2025-11-19 13:24:40 +08:00
xiaojunnuo
d4653678b2 perf: 优化阿里云clb 过期证书清理报错的问题 2025-11-18 18:09:59 +08:00
xiaojunnuo
a4ce752e58 chore: 阿里云nlb证书清理增加日志打印 2025-11-18 18:02:55 +08:00
xiaojunnuo
f6649398ef chore: 清理过期证书增加日志打印 2025-11-18 18:01:23 +08:00
xiaojunnuo
02859cc270 build: release 2025-11-18 01:28:48 +08:00
xiaojunnuo
4ed30e082f build: publish 2025-11-18 01:18:48 +08:00
xiaojunnuo
d3985dd129 build: trigger build image 2025-11-18 01:18:32 +08:00
xiaojunnuo
ac70821fea v1.37.8 2025-11-18 01:16:57 +08:00
xiaojunnuo
38b273a1c9 build: prepare to build 2025-11-18 01:14:14 +08:00
xiaojunnuo
eb5c88fbb2 perf: 支持回车键触发登录 2025-11-18 01:13:31 +08:00
xiaojunnuo
1102952b47 perf: 修复西数解析记录添加失败的bug,支持部署证书到西数虚拟主机 2025-11-18 01:04:47 +08:00
xiaojunnuo
5ad6cadcee chore: 1 2025-11-15 16:56:04 +08:00
xiaojunnuo
5d236808d6 Merge branch 'v2-dev' of https://github.com/certd/certd into v2-dev 2025-11-15 16:46:06 +08:00
xiaojunnuo
ada9243e84 chore: 1 2025-11-15 16:32:41 +08:00
xiaojunnuo
ad4e1c1b5b Merge branch 'v2' into v2-dev 2025-11-13 13:54:44 +08:00
xiaojunnuo
c5105c29b0 build: release 2025-11-13 01:31:28 +08:00
xiaojunnuo
f689b0f3b2 Merge branch 'v2-dev' into v2 2025-11-13 01:17:55 +08:00
xiaojunnuo
730f614024 build: publish 2025-11-13 01:17:09 +08:00
xiaojunnuo
2e4eb17a48 build: trigger build image 2025-11-13 01:16:45 +08:00
xiaojunnuo
55d2a1f09b v1.37.7 2025-11-13 01:15:01 +08:00
xiaojunnuo
e3a5bcb907 build: prepare to build 2025-11-13 01:12:01 +08:00
xiaojunnuo
d56567c9de chore: teo dns 测试成功 2025-11-13 01:11:04 +08:00
xiaojunnuo
d7c381e05d chore: 1 2025-11-13 00:50:40 +08:00
xiaojunnuo
1d23dd2426 perf: 支持腾讯云teo dns解析 2025-11-13 00:45:05 +08:00
xiaojunnuo
86ce00adf9 perf: 支持使用letencrypt测试环境申请ip证书 2025-11-12 23:56:02 +08:00
xiaojunnuo
e1eef013a8 fix: 修复点击立即触发运行报错的bug 2025-11-12 22:15:17 +08:00
Rab
d20046c866 fix(plugins/woai-cdn): 修正默认接口域名与帮助链接中的路径 (#576) @LjyLab 2025-11-12 15:30:32 +08:00
xiaojunnuo
2df452fe5b Merge branch 'v2' of https://github.com/certd/certd into v2 2025-11-12 09:10:43 +08:00
xiaojunnuo
c31bfd8b94 docs: 1 2025-11-11 16:03:40 +08:00
xiaojunnuo
f443675f4f docs: 1 2025-11-11 16:03:19 +08:00
xiaojunnuo
a44bd8849d chore: 1 2025-11-11 13:29:38 +08:00
xiaojunnuo
274c887140 chore: nslookup 改成dig命令 2025-11-11 11:41:36 +08:00
xiaojunnuo
44973ebd00 fix: 账号绑定页面某些情况下打不开的bug 2025-11-11 11:05:34 +08:00
xiaojunnuo
88f74163ff build: release 2025-11-11 01:16:32 +08:00
xiaojunnuo
6cd57dd426 Merge branch 'v2-dev' into v2 2025-11-11 00:57:37 +08:00
xiaojunnuo
481e866011 build: publish 2025-11-11 00:50:16 +08:00
xiaojunnuo
a78450ba79 build: trigger build image 2025-11-11 00:49:58 +08:00
xiaojunnuo
9fcdeca692 v1.37.6 2025-11-11 00:48:12 +08:00
xiaojunnuo
8e10c56304 build: prepare to build 2025-11-11 00:42:43 +08:00
xiaojunnuo
591f600b11 build: prepare to build 2025-11-11 00:34:53 +08:00
xiaojunnuo
af03e55a73 build: prepare to build 2025-11-11 00:33:55 +08:00
xiaojunnuo
1462cddd1e perf: 支持letencrypt测试环境,支持IP证书? 2025-11-11 00:32:43 +08:00
xiaojunnuo
aac569a925 fix: 修复创建流水线报id不能为空的bug 2025-11-11 00:15:09 +08:00
greper
d19ac1fd15 Update promotional content in README.md 2025-11-10 10:56:54 +08:00
greper
410a23751b Update README.md 2025-11-10 10:56:23 +08:00
greper
8190507e8c Revise README for permanent version promotion
Updated promotional text for the permanent professional version and adjusted the display format.
2025-11-10 10:54:47 +08:00
greper
645f74f39d Update README with promotional content
Added promotional message for permanent professional version and Double Eleven event.
2025-11-10 10:53:38 +08:00
xiaojunnuo
acdf0912d4 perf: server 增加 "@peculiar/x509" 依赖 2025-11-09 20:10:52 +08:00
xiaojunnuo
32e4e91ab8 perf: 增加vip时间同步按钮 2025-11-09 14:38:38 +08:00
xiaojunnuo
b59ca329f3 build: release 2025-11-09 05:19:54 +08:00
xiaojunnuo
beb9099bdc build: publish 2025-11-09 05:08:01 +08:00
xiaojunnuo
a013d95f0f build: trigger build image 2025-11-09 05:07:44 +08:00
xiaojunnuo
9d5daf0015 v1.37.5 2025-11-09 05:06:02 +08:00
xiaojunnuo
1146307736 build: prepare to build 2025-11-09 05:00:01 +08:00
xiaojunnuo
c25eaadc1d build: prepare to build 2025-11-09 04:56:37 +08:00
xiaojunnuo
50f6e76ab9 chore: 1 2025-11-09 04:14:33 +08:00
xiaojunnuo
c3637e731f Merge branch 'v2-dev-buy' into v2-dev 2025-11-09 02:06:57 +08:00
xiaojunnuo
c31eef6b82 chore: buy 2025-11-09 00:12:31 +08:00
xiaojunnuo
802683b765 chore: 1 2025-11-07 01:50:34 +08:00
xiaojunnuo
335cf93970 perf: doge云支持删除过期证书 2025-11-07 01:46:44 +08:00
xiaojunnuo
041954c067 perf: doge云插件支持选择CDN域名,以及支持同时部署多个域名 2025-11-07 01:38:46 +08:00
xiaojunnuo
2da44c3699 chore: 优化流水线运行时状态timeline被挤成2行的问题 2025-11-07 01:35:30 +08:00
xiaojunnuo
65e53092e8 fix: 修复某些情况下编辑流水线,没有立即展示变更效果的bug 2025-11-07 01:15:05 +08:00
xiaojunnuo
0203aa2b6e perf: 优化任务参数配置界面在手机版下的展示效果 2025-11-07 00:44:13 +08:00
xiaojunnuo
f83fe28a18 chore: 优化input-number 2025-11-06 23:24:58 +08:00
xiaojunnuo
e487b45898 Merge branch 'v2-dev' of https://github.com/certd/certd into v2-dev 2025-11-06 23:20:09 +08:00
xiaojunnuo
4a94eab393 perf: 支持列表展示时固定证书最大天数,有助于列表进度条整齐展示 2025-11-06 23:20:02 +08:00
xiaojunnuo
5ff7e6ef0e fix: 修复在苹果手机下输入框被放大的问题 2025-11-05 13:59:40 +08:00
xiaojunnuo
0c99f41bd9 chore: bindurl 提示消除 2025-11-05 00:08:59 +08:00
xiaojunnuo
bcac810f71 Merge branch 'v2-dev' into v2-dev-buy 2025-11-04 23:04:11 +08:00
xiaojunnuo
feae105426 docs: 群晖delegated配置说明 2025-11-03 18:22:35 +08:00
xiaojunnuo
d46b9c54b1 perf: 支持记忆字段排序 2025-10-31 16:57:32 +08:00
xiaojunnuo
d0b7162b6a Merge branch 'v2-dev' of https://github.com/certd/certd into v2-dev 2025-10-30 15:08:20 +08:00
xiaojunnuo
c16660254b fix: 修复批量修改定时没有立即显示生效的bug 2025-10-30 15:08:14 +08:00
xiaojunnuo
bbe0d52740 build: release 2025-10-29 01:52:41 +08:00
xiaojunnuo
65117ebdd7 build: publish 2025-10-29 01:32:37 +08:00
xiaojunnuo
445d55e800 build: trigger build image 2025-10-29 01:32:19 +08:00
xiaojunnuo
dbce751464 v1.37.4 2025-10-29 01:30:41 +08:00
xiaojunnuo
b8640d903f build: prepare to build 2025-10-29 01:28:26 +08:00
xiaojunnuo
6e7560ee77 build: prepare to build 2025-10-29 01:25:54 +08:00
xiaojunnuo
efa26a067f fix: 修复站点证书监控复制按钮无效的bug 2025-10-28 23:45:08 +08:00
xiaojunnuo
f7cf7c198d fix: 修复lego模式下 私钥加密类型错误的bug 2025-10-28 15:46:52 +08:00
xiaojunnuo
d32f4fc38e 修复邮箱注册验证码报错的bug 2025-10-28 15:30:31 +08:00
xiaojunnuo
0c8b8647f3 docs: openapi 2025-10-28 10:34:52 +08:00
xiaojunnuo
c38dbbb1d7 perf: 优化数据备份效率,流式写入文件 2025-10-27 15:25:41 +08:00
xiaojunnuo
98cec15625 build: release 2025-10-25 01:26:51 +08:00
xiaojunnuo
bad9828f47 build: publish 2025-10-25 01:15:11 +08:00
xiaojunnuo
18f91ddffa build: trigger build image 2025-10-25 01:14:52 +08:00
xiaojunnuo
335745d365 v1.37.3 2025-10-25 01:13:14 +08:00
xiaojunnuo
4204b31398 build: prepare to build 2025-10-25 01:10:48 +08:00
xiaojunnuo
029a568645 build: prepare to build 2025-10-25 01:06:05 +08:00
xiaojunnuo
6b2f1fcd3e perf: 注册页面增加手机注册tab页签 2025-10-25 01:05:42 +08:00
xiaojunnuo
3bdc610249 chore: 流水线有效期 2025-10-25 00:42:27 +08:00
xiaojunnuo
c03a70fde2 fix: 修复网络测试,telnet的bug 2025-10-25 00:15:40 +08:00
xiaojunnuo
c77645e173 perf: 通知支持meow 2025-10-25 00:09:54 +08:00
xiaojunnuo
6531002d61 chore: 流水线有效期优化 2025-10-24 23:48:32 +08:00
xiaojunnuo
fea808ca5f chore: 1 2025-10-24 23:11:21 +08:00
xiaojunnuo
59ba408070 perf: 流水线创建时支持添加到证书监控 2025-10-24 23:10:20 +08:00
xiaojunnuo
3a8931feef perf: ssh 增加禁止-i参数提示 2025-10-24 22:48:32 +08:00
xiaojunnuo
7ebd8f6bf5 chore: 1 2025-10-23 00:37:35 +08:00
xiaojunnuo
73883979c6 chore: 1 2025-10-23 00:37:09 +08:00
xiaojunnuo
d8935b46b3 chore: check before 2025-10-23 00:36:20 +08:00
xiaojunnuo
1505d04622 chore: pipeline valid time add to plus 2025-10-23 00:14:31 +08:00
xiaojunnuo
3b690cc31f 支持开启流水线有效期设置 2025-10-23 00:05:36 +08:00
xiaojunnuo
b3814920bd perf: 群辉增加请求超时时长设置 2025-10-22 23:40:00 +08:00
xiaojunnuo
8bf1f828b9 perf: esa 自动删除过期证书提示 2025-10-22 23:07:33 +08:00
xiaojunnuo
911e69e3bc perf: 流水线支持有效期设置 2025-10-21 23:23:56 +08:00
xiaojunnuo
77b4a1eaf6 站点监控批量导入支持分组和备注 2025-10-21 22:38:02 +08:00
xiaojunnuo
2ed12c429e perf: 站点证书监控增加导出和分组功能 2025-10-21 22:28:02 +08:00
xiaojunnuo
e578c52fdf perf: 证书监控增加批量删除 2025-10-21 00:01:28 +08:00
xiaojunnuo
5ff4e3c4ea chore: 1 2025-10-17 14:48:39 +08:00
xiaojunnuo
1c2e7256c1 doc: 1 2025-10-17 13:43:15 +08:00
xiaojunnuo
7a51ca225a Merge branch 'v2' into v2-dev 2025-10-17 09:34:22 +08:00
xiaojunnuo
8d242d8072 Merge branch 'v2-dev' of https://github.com/certd/certd into v2-dev 2025-10-17 09:33:24 +08:00
xiaojunnuo
543b068efa chore: gitignore 2025-10-17 09:33:14 +08:00
xiaojunnuo
eadbd5e821 doc: plugin doc gen 2025-10-17 09:32:14 +08:00
xiaojunnuo
c771f5a13c Merge branch 'v2' of https://github.com/certd/certd into v2 2025-10-17 09:25:31 +08:00
xiaojunnuo
f13b3111c3 doc: plugin-doc-gen 2025-10-17 09:25:22 +08:00
xiaojunnuo
bb2714ff24 fix: 修复并发情况下证书申请日志混乱的bug 2025-10-15 23:03:59 +08:00
xiaojunnuo
54c42b1fc2 build: release 2025-10-14 23:24:59 +08:00
xiaojunnuo
1f42f933f0 fix: 修复站点证书监控,证书已经更新到最新日期了,仍然发出警告通知的bug 2025-10-14 23:24:47 +08:00
xiaojunnuo
6c533d225b chore: 1 2025-10-14 23:00:30 +08:00
xiaojunnuo
67a89d1289 chore: 1 2025-10-14 22:53:32 +08:00
xiaojunnuo
0b9bef2f38 build: publish 2025-10-14 22:52:22 +08:00
xiaojunnuo
1c4649409d build: trigger build image 2025-10-14 22:52:03 +08:00
xiaojunnuo
e1daaf07ce v1.37.2 2025-10-14 22:50:33 +08:00
xiaojunnuo
cd21f2d1d7 build: prepare to build 2025-10-14 22:48:36 +08:00
xiaojunnuo
836e41064f build: prepare to build 2025-10-14 22:43:55 +08:00
xiaojunnuo
4658e4c739 build: prepare to build 2025-10-14 22:41:32 +08:00
xiaojunnuo
7993a7cdb0 perf: 优化start.sh脚本,去掉删除非ui目录的操作及提示 2025-10-14 22:41:03 +08:00
xiaojunnuo
567cb7d737 perf: start.sh脚本支持根据当前系统判断是否使用sudo 2025-10-14 22:35:24 +08:00
xiaojunnuo
985128b537 chore: 1 2025-10-14 22:25:42 +08:00
xiaojunnuo
cd35568e04 perf: 证书监控支持设置证书即将过期天数 2025-10-14 22:25:04 +08:00
xiaojunnuo
f612509cac perf: 支持新网代理方式 2025-10-14 12:05:31 +08:00
xiaojunnuo
f415190483 perf: dns支持新网互联 2025-10-14 10:55:10 +08:00
xiaojunnuo
e00733a346 fix: aliyunoss 选择证书接入点选择新加坡无法上传的bug 2025-10-13 23:16:03 +08:00
xiaojunnuo
aafafa0e73 chore: 1 2025-10-12 23:57:17 +08:00
xiaojunnuo
c87c9af12e chore: 1 2025-10-12 23:56:14 +08:00
xiaojunnuo
622215715f chore: 删除无用依赖 2025-10-11 19:08:14 +08:00
xiaojunnuo
c87250c028 docs: ipv6地址提示 2025-10-11 18:52:57 +08:00
xiaojunnuo
d6b6d700a5 docs: ipv6地址提示 2025-10-11 18:21:17 +08:00
xiaojunnuo
9d4e2c98a3 Merge remote-tracking branch 'origin/v2-dev' into v2-dev 2025-10-11 17:00:00 +08:00
xiaojunnuo
08094c2660 docs: ipv6地址提示 2025-10-11 16:59:28 +08:00
xiaojunnuo
fda82c82b0 chore: 1 2025-10-07 21:54:50 +08:00
xiaojunnuo
f0eabd4ea0 build: vscode auto compile 2025-10-07 21:45:09 +08:00
xiaojunnuo
5a4d812146 perf: 增加飞牛证书id选择的提示 2025-10-07 21:05:28 +08:00
xiaojunnuo
bf156a13bd fix: 修复飞牛证书部署后无法生效的bug 2025-10-07 21:01:19 +08:00
xiaojunnuo
53d276a8fc chore: 官方email服务支持发送附件 2025-10-05 22:44:59 +08:00
xiaojunnuo
978fa54518 Merge branch 'v2-dev' of https://github.com/certd/certd into v2-dev 2025-10-05 08:05:59 +00:00
xiaojunnuo
31f82e58b5 chore: test优化 2025-10-05 07:59:56 +00:00
xiaojunnuo
5967f66e6d chore: 1 2025-10-05 15:01:35 +08:00
xiaojunnuo
bea81b54ca chore: 1 2025-10-05 14:52:25 +08:00
xiaojunnuo
6fd403bdca Merge branch 'v2-dev' of https://github.com/certd/certd into v2-dev 2025-10-05 14:47:45 +08:00
xiaojunnuo
3d673d9d40 chroe: remote 2025-10-05 14:47:40 +08:00
xiaojunnuo
cac949de56 Merge branch 'v2-dev' of https://github.com/certd/certd into v2-dev 2025-10-05 05:57:03 +00:00
xiaojunnuo
dffa152698 chore: nettest 2025-10-05 13:10:03 +08:00
xiaojunnuo
7796298fca 1 2025-10-01 02:11:03 +08:00
xiaojunnuo
5291bfe8d4 chore: 网络测试 2025-09-30 18:03:16 +00:00
xiaojunnuo
b364313297 chore: linux 网络测试命令验证 2025-09-30 18:01:49 +00:00
xiaojunnuo
2bef608e07 perf: 支持网络测试 2025-09-30 23:27:31 +08:00
xiaojunnuo
aee13ad909 docs 2025-09-29 21:11:43 +08:00
xiaojunnuo
9d82eba599 docs: 2025-09-29 21:00:28 +08:00
xiaojunnuo
4852beb390 1.37.1 2025-09-29 20:48:34 +08:00
xiaojunnuo
522c2f61c0 build: publish 2025-09-29 20:37:20 +08:00
xiaojunnuo
d331396afe build: trigger build image 2025-09-29 20:37:03 +08:00
xiaojunnuo
c4ebbaba74 Merge branch 'v2-dev' into v2-dev-buy
# Conflicts:
#	packages/core/basic/src/utils/util.hash.ts
2025-09-24 01:58:11 +08:00
xiaojunnuo
81e588a896 Merge branch 'refs/heads/v2-dev' into v2-dev-buy
# Conflicts:
#	docs/.vitepress/config.ts
#	packages/ui/certd-client/src/views/certd/pipeline/sub-domain/index.vue
2025-09-22 22:29:59 +08:00
xiaojunnuo
b5d8161bc2 perf: 子域名托管说明 2025-08-31 10:50:07 +08:00
xiaojunnuo
b497eda26e Merge branch 'v2-dev' into v2-dev-buy 2025-08-29 16:54:11 +08:00
xiaojunnuo
fe9dd7d23f Merge branch 'v2-dev' into v2-dev-buy 2025-08-25 23:22:39 +08:00
xiaojunnuo
6f8fbe3f09 chore: 2025-08-25 21:16:33 +08:00
xiaojunnuo
6b7631ed5e fix: 修复新部署的无法保存公共eab配置的bug 2025-08-17 19:07:50 +08:00
xiaojunnuo
1b56c0f191 chore: comm trial 2025-08-15 00:20:38 +08:00
xiaojunnuo
94cbeba495 chore: comm trial 2025-08-15 00:11:48 +08:00
xiaojunnuo
962f8233b0 chore: 2025-08-11 02:02:30 +08:00
xiaojunnuo
31923d511e chore: 修复vip过期时间显示错误的问题 2025-08-11 01:47:39 +08:00
xiaojunnuo
fdbb8300d3 chore: 自动更新vip状态 2025-08-10 23:48:40 +08:00
xiaojunnuo
203d8bca57 chore: 永久专业版特殊颜色 2025-08-10 02:21:32 +08:00
xiaojunnuo
74c331eaf7 chore: 永久专业版特殊颜色 2025-08-10 02:07:48 +08:00
xiaojunnuo
54365528a8 chore: buy page and login 2025-08-09 23:41:59 +08:00
xiaojunnuo
bc174f7054 perf: cname方式hostRecord增加user校验 2025-08-09 23:37:31 +08:00
418 changed files with 14714 additions and 3581 deletions

View File

@@ -44,7 +44,8 @@ jobs:
- name: deploy-certd-demo - name: deploy-certd-demo
uses: tyrrrz/action-http-request@master uses: tyrrrz/action-http-request@master
with: with:
url: http://flow-openapi.aliyun.com/pipeline/webhook/lzCzlGrLCOHQaTMMt0mG # 通过webhook 触发 certd-demo来部署
url: ${{ secrets.WEBHOOK_CERTD_DEMO }}
method: POST method: POST
headers: | headers: |
Content-Type: application/json Content-Type: application/json

View File

@@ -121,10 +121,12 @@ jobs:
- name: deploy-certd-doc - name: deploy-certd-doc
uses: tyrrrz/action-http-request@master uses: tyrrrz/action-http-request@master
with: with:
url: http://flow-openapi.aliyun.com/pipeline/webhook/IiSxLDp9aOhgDUxJPytv url: ${{ secrets.WEBHOOK_CERTD_DOC }}
method: POST method: POST
body: | body: |
{} {
"CERTD_VERSION": "1.0.0"
}
headers: | headers: |
Content-Type: application/json Content-Type: application/json
retry-count: 3 retry-count: 3

3
.gitignore vendored
View File

@@ -29,4 +29,5 @@ test/**/*.js
/packages/ui/certd-server/data/db.sqlite /packages/ui/certd-server/data/db.sqlite
/packages/ui/certd-server/data/keys.yaml /packages/ui/certd-server/data/keys.yaml
/packages/pro/ /packages/pro/
test.js test.js
.history

4
.npmrc
View File

@@ -1,2 +1,6 @@
link-workspace-packages=deep link-workspace-packages=deep
prefer-workspace-packages=true prefer-workspace-packages=true
better_sqlite3_binary_host=https://registry.npmmirror.com/-/binary/better-sqlite3
better_sqlite3_binary_host_mirror=https://registry.npmmirror.com/-/binary/better-sqlite3
better-sqlite3_binary_host=https://registry.npmmirror.com/-/binary/better-sqlite3
better-sqlite3_binary_host_mirror=https://registry.npmmirror.com/-/binary/better-sqlite3

38
.vscode/launch.json vendored
View File

@@ -10,8 +10,8 @@
"type": "node", "type": "node",
"request": "launch", "request": "launch",
"cwd": "${workspaceFolder}/packages/ui/certd-client", "cwd": "${workspaceFolder}/packages/ui/certd-client",
"runtimeExecutable": "npm", "runtimeExecutable": "pnpm",
"runtimeArgs": ["run", "dev"], "runtimeArgs": ["dev"],
"console": "integratedTerminal", "console": "integratedTerminal",
"internalConsoleOptions": "neverOpen" "internalConsoleOptions": "neverOpen"
}, },
@@ -20,8 +20,38 @@
"type": "node", "type": "node",
"request": "launch", "request": "launch",
"cwd": "${workspaceFolder}/packages/ui/certd-server", "cwd": "${workspaceFolder}/packages/ui/certd-server",
"runtimeExecutable": "npm", "runtimeExecutable": "pnpm",
"runtimeArgs": ["run", "dev"], "runtimeArgs": ["dev"],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
},
{
"name": "server-mysql",
"type": "node",
"request": "launch",
"cwd": "${workspaceFolder}/packages/ui/certd-server",
"runtimeExecutable": "pnpm",
"runtimeArgs": ["dev-mysql"],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
},
{
"name": "server-pg",
"type": "node",
"request": "launch",
"cwd": "${workspaceFolder}/packages/ui/certd-server",
"runtimeExecutable": "pnpm",
"runtimeArgs": ["dev-pg"],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
},
{
"name": "server-common",
"type": "node",
"request": "launch",
"cwd": "${workspaceFolder}/packages/ui/certd-server",
"runtimeExecutable": "pnpm",
"runtimeArgs": ["dev-commpro"],
"console": "integratedTerminal", "console": "integratedTerminal",
"internalConsoleOptions": "neverOpen" "internalConsoleOptions": "neverOpen"
}, },

12
.vscode/settings.json vendored
View File

@@ -1,4 +1,14 @@
{ {
"eslint.debug": false, "eslint.debug": false,
"eslint.format.enable": true "eslint.format.enable": true,
"typescript.tsc.autoDetect": "watch",
"git.scanRepositories": [
"./packages/pro"
],
"editor.defaultFormatter": "dbaeumer.vscode-eslint",
"[typescript]": {
"editor.defaultFormatter": "vscode.typescript-language-features"
},
"editor.tabSize": 2,
"explorer.autoReveal": false
} }

View File

@@ -3,6 +3,199 @@
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.37.16](https://github.com/certd/certd/compare/v1.37.15...v1.37.16) (2025-12-15)
### Bug Fixes
* 修复ipv6作为证书域名申请证书校验失败的bug ([e4e16bc](https://github.com/certd/certd/commit/e4e16bc6a65bb082c18ca0590226f0987a47d477))
* 优化西部数据 500 already exists 的问题 ([2bfad9f](https://github.com/certd/certd/commit/2bfad9fc651da208b610abd921fbfb2fbc04203f))
### Performance Improvements
* 批量设置定时,支持清除定时 ([63d8bcf](https://github.com/certd/certd/commit/63d8bcf8823f713365042d3c7aee3cf31d44b044))
* 新增数据库迁移doc说明文档优化datetime字段平滑迁移 ([45fbce0](https://github.com/certd/certd/commit/45fbce0c2af5fb3ead6d3dd12a42f8cc1714262f))
* 支持彩虹聚合登录 ([6f18693](https://github.com/certd/certd/commit/6f186932ccad4becfdc0087c0539f7b2d0069844))
* 支持邮件模版设置 ([a6c0d2c](https://github.com/certd/certd/commit/a6c0d2c6f1fd6b60e6d7af290487c94564fd91ea))
* oidc支持使用第三方昵称或账号作为certd用户的用户名 ([b6fea0c](https://github.com/certd/certd/commit/b6fea0c8562abf912daa7d72958ceb2e93575d31))
## [1.37.15](https://github.com/certd/certd/compare/v1.37.14...v1.37.15) (2025-12-06)
### Bug Fixes
* oidc 支持nonce ([a5ca411](https://github.com/certd/certd/commit/a5ca41131b308b36b17ca359d9709ea8e9b7cee1))
### Performance Improvements
* 第三方登录支持gitee ([5cee7d4](https://github.com/certd/certd/commit/5cee7d44f17bd36972f477bc1f270999da558d05))
* 邮件模版安全优化 ([adca151](https://github.com/certd/certd/commit/adca151e4f07a4c6a2a753bfa48ee0d4d6469fd2))
* 支持部署到中国移动CDN ([4351304](https://github.com/certd/certd/commit/43513049beff407558d2a234415521464165cebc))
* 支持k8s apply ([d55954a](https://github.com/certd/certd/commit/d55954a36391ebe6a9397ff7dcfb710193ac5e34))
## [1.37.14](https://github.com/certd/certd/compare/v1.37.13...v1.37.14) (2025-12-02)
### Bug Fixes
* 修复注销登录时,第三方登录注销请求失败的报错 ([677e110](https://github.com/certd/certd/commit/677e1101e6cf4451abd8a876cc1d0ddd26a10b88))
## [1.37.13](https://github.com/certd/certd/compare/v1.37.12...v1.37.13) (2025-12-02)
### Bug Fixes
* 修复西部数据返回信息乱码问题 ([78b1650](https://github.com/certd/certd/commit/78b1650bdb071c858b3f90d53a700d11ee6de328))
* 修复西部数码使用域名级别的key申请证书失败的问题 ([5edc72d](https://github.com/certd/certd/commit/5edc72d47550b8e3364dabda70a41cce75d87956))
### Performance Improvements
* 第三方登录允许选择logo ([bb3085e](https://github.com/certd/certd/commit/bb3085ef84201ccd2dc632ba8c5097cb00258be4))
* 支持OIDC单点登录 ([fbf12f1](https://github.com/certd/certd/commit/fbf12f16b5eaa7676fd41923587bf6bd2595adba))
## [1.37.12](https://github.com/certd/certd/compare/v1.37.11...v1.37.12) (2025-11-29)
### Bug Fixes
* 修复waf tls版本号小写 ([0adcc6a](https://github.com/certd/certd/commit/0adcc6a8d194469be0c26940ed4837fb34929b68))
### Performance Improvements
* 支持微信扫码登录 ([73325aa](https://github.com/certd/certd/commit/73325aaefb0e750a22aaac40929e7bf3f5864996))
* 支持证书颁发机构 LiteSSL ([6be7591](https://github.com/certd/certd/commit/6be75913324e2828d9016eb307ff2d0abbbb2191))
## [1.37.11](https://github.com/certd/certd/compare/v1.37.10...v1.37.11) (2025-11-28)
### Bug Fixes
* 修复阿里云 waf tlsVersion参数缺失导致部署失败的问题 ([2fabee6](https://github.com/certd/certd/commit/2fabee647acf64afe689f5bea3603028cd0ba4a2))
* 修复备注撑开表格行高的bug ([c7b298c](https://github.com/certd/certd/commit/c7b298c46f0d52b43bd2bb17b374e7970a446446))
* 修复域名管理无法创建tencent-eo dns授权的bug ([3406bb5](https://github.com/certd/certd/commit/3406bb5a4a56bb310cddc1a1f410c70909fd129b))
* openapi 成功后失败都返回msg ([6e735bb](https://github.com/certd/certd/commit/6e735bbd1e29712e939f775a4db974db70e3b4b0))
### Performance Improvements
* ssh支持ppk格式私钥 ([575ae16](https://github.com/certd/certd/commit/575ae164c863d0b1f9fa0890549a2ee7472fb469))
* 优化宝塔网站证书在并发部署时导致nginx配置文件错乱的问题 ([51cc084](https://github.com/certd/certd/commit/51cc08411fd2dbab66d769b495dc1b0bf2f2578c))
* 优化天翼云cdn 等待5秒部署完成 ([53c88ad](https://github.com/certd/certd/commit/53c88ad5afe66a3f7c38b9b759747918913a4edc))
* 支持oidc单点登录 ([ec75afb](https://github.com/certd/certd/commit/ec75afbc44139dbe9da534d8a8c08a5b91f86d3c))
* ssl.com支持ecc ([b5ec047](https://github.com/certd/certd/commit/b5ec04723db48422f71041f4043002e7f5b450b1))
## [1.37.10](https://github.com/certd/certd/compare/v1.37.9...v1.37.10) (2025-11-19)
### Performance Improvements
* 优化dokploy 部署插件配置选择serverId ([c9709f2](https://github.com/certd/certd/commit/c9709f26981c1cc9f71c14babb204329fcae0db5))
* 站点证书监控备注输入框改成textarea ([70b603d](https://github.com/certd/certd/commit/70b603d601c34f39148c2ab70c655c51babf563d))
## [1.37.9](https://github.com/certd/certd/compare/v1.37.8...v1.37.9) (2025-11-19)
### Bug Fixes
* 商用证书上传保存失败的bug ([075b1dc](https://github.com/certd/certd/commit/075b1dc0eb8c39acc277277b1b334d66b6717ab2))
### Performance Improvements
* 优化阿里云clb 过期证书清理报错的问题 ([d465367](https://github.com/certd/certd/commit/d4653678b2e3643460f918992eeae4044d3a1cc7))
## [1.37.8](https://github.com/certd/certd/compare/v1.37.7...v1.37.8) (2025-11-17)
### Bug Fixes
* **plugins/woai-cdn:** 修正默认接口域名与帮助链接中的路径 ([#576](https://github.com/certd/certd/issues/576)) @LjyLab ([d20046c](https://github.com/certd/certd/commit/d20046c86681ea177ece434423b7c81a76b437fb))
### Performance Improvements
* 修复西数解析记录添加失败的bug支持部署证书到西数虚拟主机 ([1102952](https://github.com/certd/certd/commit/1102952b4703e8c0bbc17b0700c0ed3ef6f866d3))
* 支持回车键触发登录 ([eb5c88f](https://github.com/certd/certd/commit/eb5c88fbb2901f1a9669429a7cd8dc76f6806d01))
## [1.37.7](https://github.com/certd/certd/compare/v1.37.6...v1.37.7) (2025-11-12)
### Bug Fixes
* 修复点击立即触发运行报错的bug ([e1eef01](https://github.com/certd/certd/commit/e1eef013a856d26fe80a05d9ec6e505e2e31e5f9))
* 账号绑定页面某些情况下打不开的bug ([44973eb](https://github.com/certd/certd/commit/44973ebd00e89c0fee8f3b91174157757ce0160f))
### Performance Improvements
* 支持使用letencrypt测试环境申请ip证书 ([86ce00a](https://github.com/certd/certd/commit/86ce00adf92ff98fead87a3eaaa6631036708f47))
* 支持腾讯云teo dns解析 ([1d23dd2](https://github.com/certd/certd/commit/1d23dd2426bd1e4c4dfea0a9e561d665e045ba9d))
## [1.37.6](https://github.com/certd/certd/compare/v1.37.5...v1.37.6) (2025-11-10)
### Bug Fixes
* 修复创建流水线报id不能为空的bug ([aac569a](https://github.com/certd/certd/commit/aac569a9259ede43399e0ed5d668e936b984d6dd))
### Performance Improvements
* 增加vip时间同步按钮 ([32e4e91](https://github.com/certd/certd/commit/32e4e91ab81008dda422fb53fd6f4d1711c5d80c))
* 支持letencrypt测试环境支持IP证书 ([1462cdd](https://github.com/certd/certd/commit/1462cddd1eb347b7ff238286b5c977b29a0591ec))
* server 增加 "@peculiar/x509" 依赖 ([acdf091](https://github.com/certd/certd/commit/acdf0912d452029f158279fb78155086e4fbac17))
## [1.37.5](https://github.com/certd/certd/compare/v1.37.4...v1.37.5) (2025-11-08)
### Bug Fixes
* 修复某些情况下编辑流水线没有立即展示变更效果的bug ([65e5309](https://github.com/certd/certd/commit/65e53092e8d677eb34b7d04d68c6f738165f5de2))
* 修复批量修改定时没有立即显示生效的bug ([c166602](https://github.com/certd/certd/commit/c16660254b8d637bd3ca100695934b343875fcbf))
* 修复新部署的无法保存公共eab配置的bug ([6b7631e](https://github.com/certd/certd/commit/6b7631ed5e920582d8e2162ec788b9429238ac29))
* 修复在苹果手机下输入框被放大的问题 ([5ff7e6e](https://github.com/certd/certd/commit/5ff7e6ef0eaa6bc111d0dd3c5713e1658f9113ad))
### Performance Improvements
* 支持记忆字段排序 ([d46b9c5](https://github.com/certd/certd/commit/d46b9c54b14ec5c892f4eed141fb549485941edd))
* 优化任务参数配置界面在手机版下的展示效果 ([0203aa2](https://github.com/certd/certd/commit/0203aa2b6e86e58e5e66a1b9d0278d186aa92554))
* 支持列表展示时固定证书最大天数,有助于列表进度条整齐展示 ([4a94eab](https://github.com/certd/certd/commit/4a94eab3935c89a63892661d9cf0d0891e54aa81))
* 子域名托管说明 ([b5d8161](https://github.com/certd/certd/commit/b5d8161bc2e686e6c8b552de0c29117a5d405313))
* cname方式hostRecord增加user校验 ([bc174f7](https://github.com/certd/certd/commit/bc174f70545e487bd549eff250f8ef69c6d343f3))
* doge云插件支持选择CDN域名以及支持同时部署多个域名 ([041954c](https://github.com/certd/certd/commit/041954c0674fabed54ed2cf5e727fecfb6943d19))
* doge云支持删除过期证书 ([335cf93](https://github.com/certd/certd/commit/335cf9397080a5e09074d5a89d03f59bd051cda5))
## [1.37.4](https://github.com/certd/certd/compare/v1.37.3...v1.37.4) (2025-10-28)
### Bug Fixes
* 修复站点证书监控复制按钮无效的bug ([efa26a0](https://github.com/certd/certd/commit/efa26a067f06402f30befc016d9934cadcd5a563))
* 修复lego模式下 私钥加密类型错误的bug ([f7cf7c1](https://github.com/certd/certd/commit/f7cf7c198d7f77b222099770f81accc637bc6619))
### Performance Improvements
* 优化数据备份效率,流式写入文件 ([c38dbbb](https://github.com/certd/certd/commit/c38dbbb1d72bd00a92fe275b76aea82a791e7199))
## [1.37.3](https://github.com/certd/certd/compare/v1.37.2...v1.37.3) (2025-10-24)
### Bug Fixes
* 修复并发情况下证书申请日志混乱的bug ([bb2714f](https://github.com/certd/certd/commit/bb2714ff241f9db4a71d805b23a1b0f9f2f6413a))
* 修复网络测试telnet的bug ([c03a70f](https://github.com/certd/certd/commit/c03a70fde23c8e840bd0fdb4fcbca8990f6c65eb))
* 修复站点证书监控证书已经更新到最新日期了仍然发出警告通知的bug ([1f42f93](https://github.com/certd/certd/commit/1f42f933f07860b27aa3d016e40916ff2b063eac))
### Performance Improvements
* 注册页面增加手机注册tab页签 ([6b2f1fc](https://github.com/certd/certd/commit/6b2f1fcd3e058061b814c3331cda8ce1b2d80d73))
* 流水线创建时支持添加到证书监控 ([59ba408](https://github.com/certd/certd/commit/59ba4080706548828ef1c0a9cd893c1c9a7d591f))
* 流水线支持有效期设置 ([911e69e](https://github.com/certd/certd/commit/911e69e3bc0cdd48b62953b5d0981d640fc1f8ac))
* 群辉增加请求超时时长设置 ([b381492](https://github.com/certd/certd/commit/b3814920bdcabc911f860a8e19b5b9b3a04709ac))
* 通知支持meow ([c77645e](https://github.com/certd/certd/commit/c77645e1733670214aaca5544cf8759d7e4adda4))
* 站点证书监控增加导出和分组功能 ([2ed12c4](https://github.com/certd/certd/commit/2ed12c429eb58274a4f9dd0ed3b66e160d283ded))
* 证书监控增加批量删除 ([e578c52](https://github.com/certd/certd/commit/e578c52fdf2f838038062aa4209b655fbae461fb))
* esa 自动删除过期证书提示 ([8bf1f82](https://github.com/certd/certd/commit/8bf1f828b9eaa9208f32e8ee7460b86420fed0c7))
* ssh 增加禁止-i参数提示 ([3a8931f](https://github.com/certd/certd/commit/3a8931feeffd7157163ff7d46b693e5e1a434b9c))
## [1.37.2](https://github.com/certd/certd/compare/v1.37.1...v1.37.2) (2025-10-14)
### Bug Fixes
* 修复飞牛证书部署后无法生效的bug ([bf156a1](https://github.com/certd/certd/commit/bf156a13bd443cdadb73c9dff79bbef7231b4401))
* aliyunoss 选择证书接入点选择新加坡无法上传的bug ([e00733a](https://github.com/certd/certd/commit/e00733a34644c23ffe926486b15dc96bf2fa4b57))
### Performance Improvements
* 优化start.sh脚本去掉删除非ui目录的操作及提示 ([7993a7c](https://github.com/certd/certd/commit/7993a7cdb01885535950c63187e3f67d67ba2f75))
* 增加飞牛证书id选择的提示 ([5a4d812](https://github.com/certd/certd/commit/5a4d8121462b1afe921d028465687be8c9679814))
* 证书监控支持设置证书即将过期天数 ([cd35568](https://github.com/certd/certd/commit/cd35568e042e6ab928685efad51cdbed823d2d4f))
* 支持网络测试 ([2bef608](https://github.com/certd/certd/commit/2bef608e07ceb56d52007f290667e0afef401b22))
* 支持新网代理方式 ([f612509](https://github.com/certd/certd/commit/f612509cac87b859e81a7a52fe94b2eaccad22f9))
* dns支持新网互联 ([f415190](https://github.com/certd/certd/commit/f41519048326d971acd9e0a30462231f77a299a6))
* start.sh脚本支持根据当前系统判断是否使用sudo ([567cb7d](https://github.com/certd/certd/commit/567cb7d737023e26ec58403c6f28f109e212d379))
## [1.37.1](https://github.com/certd/certd/compare/v1.37.0...v1.37.1) (2025-09-29) ## [1.37.1](https://github.com/certd/certd/compare/v1.37.0...v1.37.1) (2025-09-29)
### Bug Fixes ### Bug Fixes

View File

@@ -16,6 +16,14 @@ Certd® 是一个免费的全自动证书管理系统,让你的网站证书永
> 流水线数量现已调整为无限制,欢迎大家使用 > 流水线数量现已调整为无限制,欢迎大家使用
|官方开源地址: | |
| ---- | ---- |
| [Github](https://github.com/certd/certd)| ![](https://img.shields.io/github/stars/certd/certd?logo=github) |
| [Gitee](https://gitee.com/certd/certd) | ![](https://gitee.com/certd/certd/badge/star.svg?theme=dark) |
| [AtomGit](https://atomgit.com/certd/certd) |![](https://atomgit.com/certd/certd/star/badge.svg) |
## 一、特性 ## 一、特性
本项目不仅支持证书申请过程自动化,还可以自动化部署更新证书,让你的证书永不过期。 本项目不仅支持证书申请过程自动化,还可以自动化部署更新证书,让你的证书永不过期。
@@ -151,29 +159,30 @@ https://certd.handfree.work/
## 八、捐赠 ## 八、捐赠
************************
支持开源,为爱发电,我已入驻爱发电 开源为什么要做专业版收费?
https://afdian.com/a/greper 1. 纯靠为爱发电不可持续比如我的dev-sidecar项目即便是拥有20K+star也差点凉凉幸亏有另外大佬接手用爱发电
2. 没有赞助的项目,作者会比较任性,不会用心倾听用户的心声,不顾用户体验(比如:下意识拒绝需求、频繁破坏性变更升级、全盘推倒重来之类的)
3. 没有赞助的项目,交流群的戾气有时候比较重,容易起冲突
发电权益: 发电权益:
1. 可加入发电专属群,可以获得作者一对一技术支持 1. 可加入发电专属VIP群,可以获得作者一对一技术支持,必要时可以远程协助
2. 您的需求我们将优先实现,并且将作为专业版功能提供 2. 您的需求我们将优先实现,并且可能将作为专业版功能提供
3. 一年期专业版激活码 3. 获得专业版功能
专业版特权对比 专业版特权对比
| 功能 | 免费版 | 专业版 | | 功能 | 免费版 | 专业版 |
|---------|---------------------------------------|--------------------------------| |---------|---------------------------------------|--------------------------------|
| 免费证书申请 | 免费无限制 | 免费无限制 | | 免费证书申请 | 免费无限制 | 免费无限制 |
| 域名数量 | 无限制 | 无限制 | | 域名数量 | 无限制 | 无限制 |
| 证书流水线条数 | 无限制 | 无限制 | | 证书流水线条数 | 无限制 | 无限制 |
| 站点证书监控 | 限制1条 | 无限制 | | 站点证书监控 | 限制1条 | 无限制 |
| 自动部署插件 | 阿里云CDN、腾讯云、七牛CDN、主机部署、宝塔、1Panel等大部分插件 | 群晖 | | 自动部署插件 | 阿里云CDN、腾讯云、七牛CDN、主机部署、宝塔、1Panel等大部分插件 | 群晖、威联通、proxmox等 |
| 通知 | 邮件通知、自定义webhook | 邮件免配置、企微、钉钉、飞书、anpush、server酱等 | | 通知 | 邮件通知、自定义webhook | 邮件免配置、企微、钉钉、飞书、anpush、server酱等 |
| 批量操作 | 无 | 流水线模版,流水线复制,批量运行,批量设置通知、定时等 |
| VIP群 | 无 | 可加,一对一技术支持,必要时可申请远程协助 |
************************
************************
## 九、贡献代码 ## 九、贡献代码

View File

@@ -13,6 +13,15 @@ Certd® is a free, fully automated certificate management system that ensures yo
> The number of pipelines is now unlimited. Welcome to use it. > The number of pipelines is now unlimited. Welcome to use it.
Official Open Source Address:
[Github](https://github.com/certd/certd) ![](https://img.shields.io/github/stars/certd/certd?logo=github)
[Gitee](https://gitee.com/certd/certd) ![](https://gitee.com/certd/certd/badge/star.svg?theme=dark)
[AtomGit](https://atomgit.com/certd/certd) ![](https://atomgit.com/certd/certd/star/badge.svg)
## 1. Features ## 1. Features
This project not only supports automated certificate application but also automated certificate deployment and updates, ensuring your certificates never expire. This project not only supports automated certificate application but also automated certificate deployment and updates, ensuring your certificates never expire.

View File

@@ -9,8 +9,8 @@ services:
restart: unless-stopped # 自动重启 restart: unless-stopped # 自动重启
volumes: volumes:
# ↓↓↓↓↓ -------------------------------------------------------- 数据库以及证书存储路径,默认存在宿主机的/data/certd/目录下,【您需要定时备份此目录,以保障数据容灾】 # ↓↓↓↓↓ -------------------------------------------------------- 数据库以及证书存储路径,默认存在宿主机的/data/certd/目录下,【您需要定时备份此目录,以保障数据容灾】
# 只要修改冒号前面的,冒号后面的/app/data不要动 - /data/certd:/app/data # 只要修改冒号前面的,冒号后面的/app/data切记切记不要动
- /data/certd:/app/data #- /volume1/docker/certd:/app/data:delegated #群晖使用这个配置
# ↓↓↓↓↓ -------------------------------------------------------- 如果走时不准考虑挂载localtime文件 # ↓↓↓↓↓ -------------------------------------------------------- 如果走时不准考虑挂载localtime文件
#- /etc/localtime:/etc/localtime #- /etc/localtime:/etc/localtime
#- /etc/timezone:/etc/timezone #- /etc/timezone:/etc/timezone
@@ -47,6 +47,8 @@ services:
# 配置规则: certd_ + 配置项, 点号用_代替 # 配置规则: certd_ + 配置项, 点号用_代替
# #↓↓↓↓ ----------------------------- 如果忘记管理员密码可以设置为truedocker compose up -d 重建容器之后管理员密码将改成123456然后请及时修改回false # #↓↓↓↓ ----------------------------- 如果忘记管理员密码可以设置为truedocker compose up -d 重建容器之后管理员密码将改成123456然后请及时修改回false
- certd_system_resetAdminPasswd=false - certd_system_resetAdminPasswd=false
# ↓↓↓ 要使用ipv6将此配置修改为::
- certd_koa_hostname=0.0.0.0
# 默认使用sqlite文件数据库如果需要使用其他数据库请设置以下环境变量 # 默认使用sqlite文件数据库如果需要使用其他数据库请设置以下环境变量
# 注意: 选定使用一种数据库之后,不支持更换数据库。 # 注意: 选定使用一种数据库之后,不支持更换数据库。

View File

@@ -95,10 +95,10 @@ export default defineConfig({
}, },
{ {
text: "插件列表", items: [ text: "插件列表", items: [
{text: "授权提供商", link: "/guide/plugins/access.md"},
{text: "DNS提供商", link: "/guide/plugins/dns-provider.md"}, {text: "DNS提供商", link: "/guide/plugins/dns-provider.md"},
{text: "任务插件", link: "/guide/plugins/deploy.md"}, {text: "任务插件", link: "/guide/plugins/deploy.md"},
{text: "通知插件", link: "/guide/plugins/notification.md"}, {text: "通知插件", link: "/guide/plugins/notification.md"},
{text: "授权提供商", link: "/guide/plugins/access.md"},
] ]
}, },
] ]
@@ -121,6 +121,8 @@ export default defineConfig({
{text: "ESXi", link: "/guide/use/ESXi/index.md"}, {text: "ESXi", link: "/guide/use/ESXi/index.md"},
{text: "宝塔动态IP白名单", link: "/guide/use/baota/white_list.md"}, {text: "宝塔动态IP白名单", link: "/guide/use/baota/white_list.md"},
{text: "子域名托管", link: "/guide/use/cert/subdomain.md"}, {text: "子域名托管", link: "/guide/use/cert/subdomain.md"},
{text: "流水线有效期", link: "/guide/use/pipeline/valid.md"},
{text: "IP证书申请", link: "/guide/use/cert/ip.md"},
] ]
}, },
{ {

View File

@@ -3,6 +3,211 @@
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.37.16](https://github.com/certd/certd/compare/v1.37.15...v1.37.16) (2025-12-15)
### Bug Fixes
* 修复ipv6作为证书域名申请证书校验失败的bug ([e4e16bc](https://github.com/certd/certd/commit/e4e16bc6a65bb082c18ca0590226f0987a47d477))
* 优化西部数据 500 already exists 的问题 ([2bfad9f](https://github.com/certd/certd/commit/2bfad9fc651da208b610abd921fbfb2fbc04203f))
### Performance Improvements
* 批量设置定时,支持清除定时 ([63d8bcf](https://github.com/certd/certd/commit/63d8bcf8823f713365042d3c7aee3cf31d44b044))
* 新增数据库迁移doc说明文档优化datetime字段平滑迁移 ([45fbce0](https://github.com/certd/certd/commit/45fbce0c2af5fb3ead6d3dd12a42f8cc1714262f))
* 支持彩虹聚合登录 ([6f18693](https://github.com/certd/certd/commit/6f186932ccad4becfdc0087c0539f7b2d0069844))
* 支持邮件模版设置 ([a6c0d2c](https://github.com/certd/certd/commit/a6c0d2c6f1fd6b60e6d7af290487c94564fd91ea))
* oidc支持使用第三方昵称或账号作为certd用户的用户名 ([b6fea0c](https://github.com/certd/certd/commit/b6fea0c8562abf912daa7d72958ceb2e93575d31))
## [1.37.15](https://github.com/certd/certd/compare/v1.37.14...v1.37.15) (2025-12-06)
### Bug Fixes
* oidc 支持nonce ([a5ca411](https://github.com/certd/certd/commit/a5ca41131b308b36b17ca359d9709ea8e9b7cee1))
### Performance Improvements
* 第三方登录支持gitee ([5cee7d4](https://github.com/certd/certd/commit/5cee7d44f17bd36972f477bc1f270999da558d05))
* 邮件模版安全优化 ([adca151](https://github.com/certd/certd/commit/adca151e4f07a4c6a2a753bfa48ee0d4d6469fd2))
* 支持部署到中国移动CDN ([4351304](https://github.com/certd/certd/commit/43513049beff407558d2a234415521464165cebc))
* 支持k8s apply ([d55954a](https://github.com/certd/certd/commit/d55954a36391ebe6a9397ff7dcfb710193ac5e34))
## [1.37.14](https://github.com/certd/certd/compare/v1.37.13...v1.37.14) (2025-12-02)
### Bug Fixes
* 修复注销登录时,第三方登录注销请求失败的报错 ([677e110](https://github.com/certd/certd/commit/677e1101e6cf4451abd8a876cc1d0ddd26a10b88))
## [1.37.13](https://github.com/certd/certd/compare/v1.37.12...v1.37.13) (2025-12-02)
### Bug Fixes
* 修复西部数据返回信息乱码问题 ([78b1650](https://github.com/certd/certd/commit/78b1650bdb071c858b3f90d53a700d11ee6de328))
* 修复西部数码使用域名级别的key申请证书失败的问题 ([5edc72d](https://github.com/certd/certd/commit/5edc72d47550b8e3364dabda70a41cce75d87956))
### Performance Improvements
* 第三方登录允许选择logo ([bb3085e](https://github.com/certd/certd/commit/bb3085ef84201ccd2dc632ba8c5097cb00258be4))
* 支持OIDC单点登录 ([fbf12f1](https://github.com/certd/certd/commit/fbf12f16b5eaa7676fd41923587bf6bd2595adba))
## [1.37.12](https://github.com/certd/certd/compare/v1.37.11...v1.37.12) (2025-11-29)
### Bug Fixes
* 修复waf tls版本号小写 ([0adcc6a](https://github.com/certd/certd/commit/0adcc6a8d194469be0c26940ed4837fb34929b68))
### Performance Improvements
* 支持微信扫码登录 ([73325aa](https://github.com/certd/certd/commit/73325aaefb0e750a22aaac40929e7bf3f5864996))
* 支持证书颁发机构 LiteSSL ([6be7591](https://github.com/certd/certd/commit/6be75913324e2828d9016eb307ff2d0abbbb2191))
## [1.37.11](https://github.com/certd/certd/compare/v1.37.10...v1.37.11) (2025-11-28)
### Bug Fixes
* 修复阿里云 waf tlsVersion参数缺失导致部署失败的问题 ([2fabee6](https://github.com/certd/certd/commit/2fabee647acf64afe689f5bea3603028cd0ba4a2))
* 修复备注撑开表格行高的bug ([c7b298c](https://github.com/certd/certd/commit/c7b298c46f0d52b43bd2bb17b374e7970a446446))
* 修复域名管理无法创建tencent-eo dns授权的bug ([3406bb5](https://github.com/certd/certd/commit/3406bb5a4a56bb310cddc1a1f410c70909fd129b))
* openapi 成功后失败都返回msg ([6e735bb](https://github.com/certd/certd/commit/6e735bbd1e29712e939f775a4db974db70e3b4b0))
### Performance Improvements
* ssh支持ppk格式私钥 ([575ae16](https://github.com/certd/certd/commit/575ae164c863d0b1f9fa0890549a2ee7472fb469))
* 优化宝塔网站证书在并发部署时导致nginx配置文件错乱的问题 ([51cc084](https://github.com/certd/certd/commit/51cc08411fd2dbab66d769b495dc1b0bf2f2578c))
* 优化天翼云cdn 等待5秒部署完成 ([53c88ad](https://github.com/certd/certd/commit/53c88ad5afe66a3f7c38b9b759747918913a4edc))
* 支持oidc单点登录 ([ec75afb](https://github.com/certd/certd/commit/ec75afbc44139dbe9da534d8a8c08a5b91f86d3c))
* ssl.com支持ecc ([b5ec047](https://github.com/certd/certd/commit/b5ec04723db48422f71041f4043002e7f5b450b1))
## [1.37.10](https://github.com/certd/certd/compare/v1.37.9...v1.37.10) (2025-11-19)
### Performance Improvements
* 优化dokploy 部署插件配置选择serverId ([c9709f2](https://github.com/certd/certd/commit/c9709f26981c1cc9f71c14babb204329fcae0db5))
* 站点证书监控备注输入框改成textarea ([70b603d](https://github.com/certd/certd/commit/70b603d601c34f39148c2ab70c655c51babf563d))
## [1.37.9](https://github.com/certd/certd/compare/v1.37.8...v1.37.9) (2025-11-19)
### Bug Fixes
* 商用证书上传保存失败的bug ([075b1dc](https://github.com/certd/certd/commit/075b1dc0eb8c39acc277277b1b334d66b6717ab2))
### Performance Improvements
* 优化阿里云clb 过期证书清理报错的问题 ([d465367](https://github.com/certd/certd/commit/d4653678b2e3643460f918992eeae4044d3a1cc7))
## [1.37.8](https://github.com/certd/certd/compare/v1.37.7...v1.37.8) (2025-11-17)
### Bug Fixes
* **plugins/woai-cdn:** 修正默认接口域名与帮助链接中的路径 ([#576](https://github.com/certd/certd/issues/576)) @LjyLab ([d20046c](https://github.com/certd/certd/commit/d20046c86681ea177ece434423b7c81a76b437fb))
### Performance Improvements
* 修复西数解析记录添加失败的bug支持部署证书到西数虚拟主机 ([1102952](https://github.com/certd/certd/commit/1102952b4703e8c0bbc17b0700c0ed3ef6f866d3))
* 支持回车键触发登录 ([eb5c88f](https://github.com/certd/certd/commit/eb5c88fbb2901f1a9669429a7cd8dc76f6806d01))
## [1.37.7](https://github.com/certd/certd/compare/v1.37.6...v1.37.7) (2025-11-12)
### Bug Fixes
* 修复点击立即触发运行报错的bug ([e1eef01](https://github.com/certd/certd/commit/e1eef013a856d26fe80a05d9ec6e505e2e31e5f9))
* 账号绑定页面某些情况下打不开的bug ([44973eb](https://github.com/certd/certd/commit/44973ebd00e89c0fee8f3b91174157757ce0160f))
### Performance Improvements
* 支持使用letencrypt测试环境申请ip证书 ([86ce00a](https://github.com/certd/certd/commit/86ce00adf92ff98fead87a3eaaa6631036708f47))
* 支持腾讯云teo dns解析 ([1d23dd2](https://github.com/certd/certd/commit/1d23dd2426bd1e4c4dfea0a9e561d665e045ba9d))
## [1.37.6](https://github.com/certd/certd/compare/v1.37.5...v1.37.6) (2025-11-10)
### Bug Fixes
* 修复创建流水线报id不能为空的bug ([aac569a](https://github.com/certd/certd/commit/aac569a9259ede43399e0ed5d668e936b984d6dd))
### Performance Improvements
* 增加vip时间同步按钮 ([32e4e91](https://github.com/certd/certd/commit/32e4e91ab81008dda422fb53fd6f4d1711c5d80c))
* 支持letencrypt测试环境支持IP证书 ([1462cdd](https://github.com/certd/certd/commit/1462cddd1eb347b7ff238286b5c977b29a0591ec))
* server 增加 "@peculiar/x509" 依赖 ([acdf091](https://github.com/certd/certd/commit/acdf0912d452029f158279fb78155086e4fbac17))
## [1.37.5](https://github.com/certd/certd/compare/v1.37.4...v1.37.5) (2025-11-08)
### Bug Fixes
* 修复某些情况下编辑流水线没有立即展示变更效果的bug ([65e5309](https://github.com/certd/certd/commit/65e53092e8d677eb34b7d04d68c6f738165f5de2))
* 修复批量修改定时没有立即显示生效的bug ([c166602](https://github.com/certd/certd/commit/c16660254b8d637bd3ca100695934b343875fcbf))
* 修复新部署的无法保存公共eab配置的bug ([6b7631e](https://github.com/certd/certd/commit/6b7631ed5e920582d8e2162ec788b9429238ac29))
* 修复在苹果手机下输入框被放大的问题 ([5ff7e6e](https://github.com/certd/certd/commit/5ff7e6ef0eaa6bc111d0dd3c5713e1658f9113ad))
### Performance Improvements
* 支持记忆字段排序 ([d46b9c5](https://github.com/certd/certd/commit/d46b9c54b14ec5c892f4eed141fb549485941edd))
* 优化任务参数配置界面在手机版下的展示效果 ([0203aa2](https://github.com/certd/certd/commit/0203aa2b6e86e58e5e66a1b9d0278d186aa92554))
* 支持列表展示时固定证书最大天数,有助于列表进度条整齐展示 ([4a94eab](https://github.com/certd/certd/commit/4a94eab3935c89a63892661d9cf0d0891e54aa81))
* 子域名托管说明 ([b5d8161](https://github.com/certd/certd/commit/b5d8161bc2e686e6c8b552de0c29117a5d405313))
* cname方式hostRecord增加user校验 ([bc174f7](https://github.com/certd/certd/commit/bc174f70545e487bd549eff250f8ef69c6d343f3))
* doge云插件支持选择CDN域名以及支持同时部署多个域名 ([041954c](https://github.com/certd/certd/commit/041954c0674fabed54ed2cf5e727fecfb6943d19))
* doge云支持删除过期证书 ([335cf93](https://github.com/certd/certd/commit/335cf9397080a5e09074d5a89d03f59bd051cda5))
## [1.37.4](https://github.com/certd/certd/compare/v1.37.3...v1.37.4) (2025-10-28)
### Bug Fixes
* 修复站点证书监控复制按钮无效的bug ([efa26a0](https://github.com/certd/certd/commit/efa26a067f06402f30befc016d9934cadcd5a563))
* 修复lego模式下 私钥加密类型错误的bug ([f7cf7c1](https://github.com/certd/certd/commit/f7cf7c198d7f77b222099770f81accc637bc6619))
### Performance Improvements
* 优化数据备份效率,流式写入文件 ([c38dbbb](https://github.com/certd/certd/commit/c38dbbb1d72bd00a92fe275b76aea82a791e7199))
## [1.37.3](https://github.com/certd/certd/compare/v1.37.2...v1.37.3) (2025-10-24)
### Bug Fixes
* 修复并发情况下证书申请日志混乱的bug ([bb2714f](https://github.com/certd/certd/commit/bb2714ff241f9db4a71d805b23a1b0f9f2f6413a))
* 修复网络测试telnet的bug ([c03a70f](https://github.com/certd/certd/commit/c03a70fde23c8e840bd0fdb4fcbca8990f6c65eb))
* 修复站点证书监控证书已经更新到最新日期了仍然发出警告通知的bug ([1f42f93](https://github.com/certd/certd/commit/1f42f933f07860b27aa3d016e40916ff2b063eac))
### Performance Improvements
* 注册页面增加手机注册tab页签 ([6b2f1fc](https://github.com/certd/certd/commit/6b2f1fcd3e058061b814c3331cda8ce1b2d80d73))
* 流水线创建时支持添加到证书监控 ([59ba408](https://github.com/certd/certd/commit/59ba4080706548828ef1c0a9cd893c1c9a7d591f))
* 流水线支持有效期设置 ([911e69e](https://github.com/certd/certd/commit/911e69e3bc0cdd48b62953b5d0981d640fc1f8ac))
* 群辉增加请求超时时长设置 ([b381492](https://github.com/certd/certd/commit/b3814920bdcabc911f860a8e19b5b9b3a04709ac))
* 通知支持meow ([c77645e](https://github.com/certd/certd/commit/c77645e1733670214aaca5544cf8759d7e4adda4))
* 站点证书监控增加导出和分组功能 ([2ed12c4](https://github.com/certd/certd/commit/2ed12c429eb58274a4f9dd0ed3b66e160d283ded))
* 证书监控增加批量删除 ([e578c52](https://github.com/certd/certd/commit/e578c52fdf2f838038062aa4209b655fbae461fb))
* esa 自动删除过期证书提示 ([8bf1f82](https://github.com/certd/certd/commit/8bf1f828b9eaa9208f32e8ee7460b86420fed0c7))
* ssh 增加禁止-i参数提示 ([3a8931f](https://github.com/certd/certd/commit/3a8931feeffd7157163ff7d46b693e5e1a434b9c))
## [1.37.2](https://github.com/certd/certd/compare/v1.37.1...v1.37.2) (2025-10-14)
### Bug Fixes
* 修复飞牛证书部署后无法生效的bug ([bf156a1](https://github.com/certd/certd/commit/bf156a13bd443cdadb73c9dff79bbef7231b4401))
* aliyunoss 选择证书接入点选择新加坡无法上传的bug ([e00733a](https://github.com/certd/certd/commit/e00733a34644c23ffe926486b15dc96bf2fa4b57))
### Performance Improvements
* 优化start.sh脚本去掉删除非ui目录的操作及提示 ([7993a7c](https://github.com/certd/certd/commit/7993a7cdb01885535950c63187e3f67d67ba2f75))
* 增加飞牛证书id选择的提示 ([5a4d812](https://github.com/certd/certd/commit/5a4d8121462b1afe921d028465687be8c9679814))
* 证书监控支持设置证书即将过期天数 ([cd35568](https://github.com/certd/certd/commit/cd35568e042e6ab928685efad51cdbed823d2d4f))
* 支持网络测试 ([2bef608](https://github.com/certd/certd/commit/2bef608e07ceb56d52007f290667e0afef401b22))
* 支持新网代理方式 ([f612509](https://github.com/certd/certd/commit/f612509cac87b859e81a7a52fe94b2eaccad22f9))
* dns支持新网互联 ([f415190](https://github.com/certd/certd/commit/f41519048326d971acd9e0a30462231f77a299a6))
* start.sh脚本支持根据当前系统判断是否使用sudo ([567cb7d](https://github.com/certd/certd/commit/567cb7d737023e26ec58403c6f28f109e212d379))
## [1.37.1](https://github.com/certd/certd/compare/v1.37.0...v1.37.1) (2025-09-29)
### Bug Fixes
* 修复版本比较bug ([109696e](https://github.com/certd/certd/commit/109696e965d68c50c8627ffd40203edd1d2daea5))
* 修复某些情况下cname申请证书报错主域名不一致的bug ([2671781](https://github.com/certd/certd/commit/2671781e1bb0838981728d85eacf0e1a25a0fa48))
### Performance Improvements
* cname主域名校验提示优化显示不一致的两方便于排查问题 ([6ebb365](https://github.com/certd/certd/commit/6ebb3659f42155e4e8da600c493fb5227cd08137))
* dns解析支持阿里esa ([9291fa6](https://github.com/certd/certd/commit/9291fa68aa7a88a05c2f888bf3048df36a8fbde3))
# [1.37.0](https://github.com/certd/certd/compare/v1.36.25...v1.37.0) (2025-09-28) # [1.37.0](https://github.com/certd/certd/compare/v1.36.25...v1.37.0) (2025-09-28)
### Features ### Features

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -5,6 +5,16 @@ Certd 是一款开源、免费、全自动申请和部署更新SSL证书的工
关键字:证书自动申请、证书自动更新、证书自动续期、证书自动续签、证书管理工具 关键字:证书自动申请、证书自动更新、证书自动续期、证书自动续签、证书管理工具
| 官方开源地址: | |
| ---- | ---- |
| [Github](https://github.com/certd/certd)| ![](https://img.shields.io/github/stars/certd/certd?logo=github) |
| [Gitee](https://gitee.com/certd/certd) | ![](https://gitee.com/certd/certd/badge/star.svg?theme=dark) |
| [AtomGit](https://atomgit.com/certd/certd) |![](https://atomgit.com/certd/certd/star/badge.svg) |
![首页](../images/start/home.png)
## 1、关于证书续期 ## 1、关于证书续期
>* 实际上没有办法不改变证书文件本身情况下直接续期或者续签。 >* 实际上没有办法不改变证书文件本身情况下直接续期或者续签。
>* 我们所说的续期,其实就是按照全套流程重新申请一份新证书,然后重新部署上去。 >* 我们所说的续期,其实就是按照全套流程重新申请一份新证书,然后重新部署上去。
@@ -15,7 +25,7 @@ Certd 是一款开源、免费、全自动申请和部署更新SSL证书的工
本项目不仅支持证书申请过程自动化,还可以自动化部署更新证书,让你的证书永不过期。 本项目不仅支持证书申请过程自动化,还可以自动化部署更新证书,让你的证书永不过期。
* 全自动申请证书支持所有注册商注册的域名支持DNS-01、HTTP-01、CNAME代理等多种域名验证方式 * 全自动申请证书支持所有注册商注册的域名支持DNS-01、HTTP-01、CNAME代理等多种域名验证方式
* 全自动部署更新证书(目前支持部署到主机、阿里云、腾讯云等70+部署插件) * 全自动部署更新证书(目前支持部署到主机、阿里云、腾讯云等100+部署插件)
* 支持通配符域名/泛域名支持多个域名打到一个证书上支持pem、pfx、der、jks等多种证书格式 * 支持通配符域名/泛域名支持多个域名打到一个证书上支持pem、pfx、der、jks等多种证书格式
* 邮件通知、webhook通知、企微、钉钉、飞书、anpush等多种通知方式 * 邮件通知、webhook通知、企微、钉钉、飞书、anpush等多种通知方式
* 私有化部署,数据保存本地,安装升级非常简单快捷 * 私有化部署,数据保存本地,安装升级非常简单快捷

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -7,7 +7,36 @@ https://1panel.cn/docs/installation/online_installation/
## 二、部署certd ## 二、部署certd
有两种安装方式
### 1. 应用商店方式安装【推荐】
#### 1.1 安装
打开`1Panel->应用商店`,更新远程应用,搜索`certd`,点击安装
![](./images/store-1.png)
![](./images/store-2.png)
#### 1.2 访问测试:
http://ip:7001
https://ip:7002
默认账号密码
admin/123456
登录后请及时修改密码
#### 1.3 备份
![](./images/store-3.png)
#### 1.4 恢复
安装新Certd后点击导入备份按钮选择上面备份的文件即可
### 2. docker-compose方式安装
#### 2.1 安装
1. 打开`docker-compose.yaml`,整个内容复制下来 1. 打开`docker-compose.yaml`,整个内容复制下来
https://gitee.com/certd/certd/raw/v2/docker/run/docker-compose.yaml https://gitee.com/certd/certd/raw/v2/docker/run/docker-compose.yaml
@@ -22,7 +51,7 @@ https://1panel.cn/docs/installation/online_installation/
> 默认使用sqlite数据库数据保存在`/data/certd`目录下,您可以手动备份该目录 > 默认使用sqlite数据库数据保存在`/data/certd`目录下,您可以手动备份该目录
> certd还支持`mysql`和`postgresql`数据库,[点我了解如何切换其他数据库](../database) > certd还支持`mysql`和`postgresql`数据库,[点我了解如何切换其他数据库](../database)
3. 访问测试 #### 2.2 访问测试
http://ip:7001 http://ip:7001
https://ip:7002 https://ip:7002
@@ -30,7 +59,7 @@ https://ip:7002
admin/123456 admin/123456
登录后请及时修改密码 登录后请及时修改密码
## 三、升级 #### 2.3 升级
1. 找到容器,点击更多->升级 1. 找到容器,点击更多->升级
![](./images/upgrade-1.png) ![](./images/upgrade-1.png)
@@ -39,11 +68,11 @@ admin/123456
![img.png](./images/upgrade-2.png) ![img.png](./images/upgrade-2.png)
## 四、数据备份 #### 2.4 备份
> 默认数据保存在`/data/certd`目录下,可以手动备份 > 默认数据保存在`/data/certd`目录下,可以手动备份
> 建议配置一条 [数据库备份流水线](../../use/backup/),自动备份 > 建议配置一条 [数据库备份流水线](../../use/backup/),自动备份
## 五、备份恢复 #### 2.5 恢复
将备份的`db.sqlite`及同目录下的其他文件一起覆盖到原来的位置重启certd即可 将备份的`db.sqlite`及同目录下的其他文件一起覆盖到原来的位置重启certd即可

View File

@@ -65,9 +65,54 @@ docker-compose up -d
## 二、从旧版的sqlite切换数据库 ## 二、从旧版的sqlite切换数据库
1. 先将`旧certd`升级到最新版 `建议备份sqlite数据库` 从旧版`sqlite`迁移到`mysql``postgresql`数据库
2. 按照上面全新安装方式部署一套`新的certd` `注意新旧版本的certd要一致`
3. 使用数据库工具将数据从sqlite导入到mysql或postgresql `注意flyway_history数据表不要导入`
4. 重启新certd
5. 确认没有问题之后删除旧版certd
下面以 `SQLite``MySQL` 为例进行演示
![db-0.png](images/db-0.png)
#### 0.前提条件:
1. SQLite版Certd站点已经`升级到最新版` `建议备份sqlite数据库`
2. `全新安装`MySQL版本Certd`确保是全新的,因为里面的数据会被清空覆盖`
3. 两套Certd站点版本一致
#### 1. 安装DBeaver工具
[https://dbeaver.io/download/](https://dbeaver.io/download/)
![db-1.png](images/db-1.png)
#### 2. 连接到sqlite数据库
![db-2.png](images/db-sqlite-1.png)
![db-3.png](images/db-sqlite-2.png)
#### 3. 连接到mysql或postgresql数据库
![db-4.png](images/db-mysql-1.png)
![db-5.png](images/db-mysql-2.png)
#### 4. 开始同步数据
选择mysql数据库选择所有的表`flyway_history除外`),右键导入数据
> 切记flyway_history数据表不要导入
![db-6.png](images/db-sync-1.jpg)
![db-7.png](images/db-sync-2.png)
![db-8.png](images/db-sync-3.png)
下一步、下一步,直到数据加载设置,勾选`在加载前截断目标表`此选项很重要并且会清空mysql certd数据库中的数据
![db-7.png](images/db-sync-4.png)
#### 5. 导入完成
![db-9.png](images/db-success.png)
#### 6. 重启MySQL版本Certd
访问MySQL版本测试数据已成功迁移
确认没有问题之后删除旧版certd

View File

@@ -57,6 +57,10 @@ https://your_server_ip:7002
::: warning ::: warning
如果您是第一次升级certd版本切记切记先备份一下数据 如果您是第一次升级certd版本切记切记先备份一下数据
```
# docker-compose.yaml配置
- /data/certd:/app/data # 请务必确保 /app/data 这个路径没有改动,固定写死
```
::: :::

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

View File

@@ -11,9 +11,12 @@
git clone https://github.com/certd/certd --depth=1 git clone https://github.com/certd/certd --depth=1
# git checkout v1.x.x # 当v2主干分支代码无法正常启动时可以尝试此命令1.x.x换成最新版本号 # git checkout v1.x.x # 当v2主干分支代码无法正常启动时可以尝试此命令1.x.x换成最新版本号
cd certd cd certd
# 启动服务 # 启动服务
./start.sh ./start.sh
``` ```
>如果是windows请先安装`git for windows` ,然后右键,选择`open git bash here`打开终端,再执行`./start.sh`命令 >如果是windows请先安装`git for windows` ,然后右键,选择`open git bash here`打开终端,再执行`./start.sh`命令

View File

@@ -10,6 +10,12 @@
::: warning ::: warning
如果您是第一次升级certd版本切记切记先备份一下数据 如果您是第一次升级certd版本切记切记先备份一下数据
很多人docker不太会配置数据目录没有映射出来升级导致数据丢失
```
# docker-compose.yaml配置
- /data/certd:/app/data # 请务必确保 /app/data 这个路径没有改动,固定写死
```
具体备份方法可以参考上面每种部署方式升级方法后面的备份章节
::: :::
## 升级日志 ## 升级日志

View File

@@ -9,6 +9,7 @@
https://apifox.com/apidoc/shared-2e76f8c4-7c58-413b-a32d-a1316529af44/254949529e0 https://apifox.com/apidoc/shared-2e76f8c4-7c58-413b-a32d-a1316529af44/254949529e0
## Token生成方法 ## Token生成方法
header中传入x-certd-token即可调用开放接口 header中传入x-certd-token即可调用开放接口
@@ -17,6 +18,18 @@ header中传入x-certd-token即可调用开放接口
3、将content加上keySecret进行签名 sign = md5(content + keySecret) 3、将content加上keySecret进行签名 sign = md5(content + keySecret)
4、然后将content和sign分别base64后用.号连接: x-certd-token = base64(content) +"."+base64(sign) 4、然后将content和sign分别base64后用.号连接: x-certd-token = base64(content) +"."+base64(sign)
## 参数
支持证书id和域名两种方式获取证书。
## 创建新的证书申请
参数autoApply=true将在没有证书时自动触发申请证书检查逻辑如下
1. 如果证书仓库里面有,且没有过期,就直接返回证书
2. 如果没有或者已过期,就会去找流水线,有就触发流水线执行
3. 如果没有流水线,就创建一个流水线,触发运行(`注意:需要提前在域名管理中配置好域名校验方式,否则会申请失败`
4. 再次采用相同参数请求接口,如果在申请过程中,就会提示`正在申请中`,可轮循获取状态,直到证书申请成功。
## SDK ## SDK
待开发 待开发

View File

@@ -2,50 +2,71 @@
| 序号 | 名称 | 说明 | | 序号 | 名称 | 说明 |
|-----|-----|-----| |-----|-----|-----|
| 1.| **阿里云授权** | | | 1.| **主机登录授权** | |
| 2.| **EAB授权** | ZeroSSL证书申请需要EAB授权 | | 2.| **阿里云授权** | |
| 3.| **google cloud** | 谷歌云授权 | | 3.| **阿里云ESA授权** | |
| 4.| **主机登录授权** | | | 4.| **腾讯云** | |
| 5.| **SFTP授权** | | | 5.| **华为云授权** | |
| 6.| **阿里云OSS授权** | 包含地域和Bucket | | 6.| **火山引擎** | |
| 7.| **FTP授权** | | | 7.| **京东云** | |
| 8.| **腾讯云** | | | 8.| **七牛云授权** | |
| 9.| **腾讯云COS授权** | 腾讯云对象存储授权,包含地域和存储桶 | | 9.| **天翼云授权** | |
| 10.| **七牛云授权** | | | 10.| **baota授权** | |
| 11.| **七牛OSS授权** | | | 11.| **百度云授权** | |
| 12.| **天翼云授权** | | | 12.| **EAB授权** | ZeroSSL证书申请需要EAB授权 |
| 13.| **s3/minio授权** | S3/minio oss授权 | | 13.| **google cloud** | 谷歌云授权 |
| 14.| **baota授权** | | | 14.| **SFTP授权** | |
| 15.| **易盾DCDN授权** | https://user.yiduncdn.com | | 15.| **阿里云OSS授权** | 包含地域和Bucket |
| 16.| **易盾rcdn授权** | 易盾CDN每月免费30G[注册即领](https://rhcdn.yiduncdn.com/register?code=8mn536rrzfbf8) | | 16.| **FTP授权** | |
| 17.| **易发云短信** | sms.yfyidc.cn/ | | 17.| **腾讯云COS授权** | 腾讯云对象存储授权,包含地域和存储桶 |
| 18.| **cdnfly授权** | | | 18.| **七牛OSS授权** | |
| 19.| **群晖登录授权** | | | 19.| **s3/minio授权** | S3/minio oss授权 |
| 20.| **k8s授权** | | | 20.| **宝塔云WAF授权** | 用于连接和管理宝塔云WAF服务的授权配置 |
| 21.| **1panel授权** | 账号和密码 | | 21.| **易盾DCDN授权** | https://user.yiduncdn.com |
| 22.| **百度云授权** | | | 22.| **易盾rcdn授权** | 易盾CDN每月免费30G[注册即领](https://rhcdn.yiduncdn.com/register?code=8mn536rrzfbf8) |
| 23.| **LeCDN授权** | | | 23.| **易发云短信** | sms.yfyidc.cn/ |
| 24.| **白山云授权** | | | 24.| **cdnfly授权** | |
| 25.| **plesk授权** | | | 25.| **群晖登录授权** | |
| 26.| **易支付** | | | 26.| **k8s授权** | |
| 27.| **支付宝** | | | 27.| **1panel授权** | 账号和密码 |
| 28.| **微信支付** | | | 28.| **LeCDN授权** | |
| 29.| **长亭雷池授权** | | | 29.| **白山云授权** | |
| 30.| **lucky** | | | 30.| **plesk授权** | |
| 31.| **括彩云cdn授权** | 括彩云CDN每月免费30G[注册即领](https://kuocaicdn.com/register?code=8mn536rrzfbf8) | | 31.| **易支付** | |
| 32.| **uniCloud** | unicloud授权 | | 32.| **支付宝** | |
| 33.| **华为云授权** | | | 33.| **微信支付** | |
| 34.| **西部数码授权** | | | 34.| **长亭雷池授权** | |
| 35.| **多吉云** | | | 35.| **lucky** | |
| 36.| **我爱云授权** | 我爱云CDN | | 36.| **括彩云cdn授权** | 括彩云CDN每月免费30G[注册即领](https://kuocaicdn.com/register?code=8mn536rrzfbf8) |
| 37.| **CacheFly** | CacheFly | | 37.| **uniCloud** | unicloud授权 |
| 38.| **Gcore** | Gcore | | 38.| **猫云授权** | |
| 39.| **亚马逊云aws授权** | | | 39.| **授权插件示例** | |
| 40.| **dns.la授权** | | | 40.| **西部数码授权** | |
| 41.| **又拍** | | | 41.| **多吉** | |
| 42.| **火山引擎** | | | 42.| **我爱云授权** | 我爱云CDN |
| 43.| **京东云** | | | 43.| **CacheFly** | CacheFly |
| 44.| **51dns授权** | | | 44.| **Gcore** | Gcore |
| 45.| **亚马逊云aws授权** | |
| 46.| **亚马逊云科技(国区)授权** | |
| 47.| **dns.la授权** | |
| 48.| **又拍云** | |
| 49.| **51dns授权** | |
| 50.| **FlexCDN授权** | |
| 51.| **farcdn授权** | |
| 52.| **cloudflare授权** | |
| 53.| **Github授权** | |
| 54.| **namesilo授权** | |
| 55.| **proxmox** | |
| 56.| **网宿授权** | |
| 57.| **金山云授权** | |
| 58.| **APISIX授权** | |
| 59.| **Dokploy授权** | |
| 60.| **godaddy授权** | |
| 61.| **新网授权** | |
| 62.| **新网授权(代理方式)** | |
| 63.| **新网互联授权** | 仅支持代理账号ip需要加入白名单 |
| 64.| **中国移动CND授权** | |
| 65.| **雨云授权** | https://app.rainyun.com/ |
<style module> <style module>
table th:first-of-type { table th:first-of-type {

View File

@@ -1,5 +1,5 @@
# 任务插件 # 任务插件
`70` 款任务插件 `105` 款任务插件
## 1. 证书申请 ## 1. 证书申请
| 序号 | 名称 | 说明 | | 序号 | 名称 | 说明 |
@@ -15,6 +15,8 @@
| 2.| **IIS-部署到IIS站点** | | | 2.| **IIS-部署到IIS站点** | |
| 3.| **主机-执行远程主机脚本命令** | 可以执行重启nginx等操作让证书生效 | | 3.| **主机-执行远程主机脚本命令** | 可以执行重启nginx等操作让证书生效 |
| 4.| **主机-部署证书到SSH主机** | SFTP上传证书到主机然后SSH执行部署脚本命令 | | 4.| **主机-部署证书到SSH主机** | SFTP上传证书到主机然后SSH执行部署脚本命令 |
| 5.| **主机-复制到本机** | 【仅管理员使用】实际上是复制证书到docker容器内的某个路径需要做目录映射到宿主机 |
| 6.| **上传证书到对象存储OSS** | 支持阿里云OSS、腾讯云COS、七牛云KODO、S3、MinIO、FTP、SFTP |
## 3. CDN ## 3. CDN
| 序号 | 名称 | 说明 | | 序号 | 名称 | 说明 |
@@ -22,33 +24,47 @@
| 1.| **易盾-部署到易盾DCDN** | 主要是防御http://user.yiduncdn.com/ | | 1.| **易盾-部署到易盾DCDN** | 主要是防御http://user.yiduncdn.com/ |
| 2.| **易盾-部署到易盾RCDN** | 易盾CDN每月免费30G[注册即领](https://rhcdn.yiduncdn.com/register?code=8mn536rrzfbf8) | | 2.| **易盾-部署到易盾RCDN** | 易盾CDN每月免费30G[注册即领](https://rhcdn.yiduncdn.com/register?code=8mn536rrzfbf8) |
| 3.| **cdnfly-部署证书到cdnfly** | cdnfly | | 3.| **cdnfly-部署证书到cdnfly** | cdnfly |
| 4.| **百度云-部署证书到CDN** | 部署到百度云CDN | | 4.| **LeCDN-更新证书** | |
| 5.| **LeCDN-更新证书** | | | 5.| **LeCDN-更新证书V2** | 支持新版本LeCDN |
| 6.| **LeCDN-更新证书V2** | 支持新版本LeCDN | | 6.| **白山云-更新证书** | |
| 7.| **白山云-更新证书** | | | 7.| **天翼云-部署证书到CDN** | 部署证书到天翼云CDN和全站加速 |
| 8.| **天翼云-部署证书到CDN** | 部署证书到天翼云CDN和全站加速 | | 8.| **括彩云-部署到括彩云CDN** | 括彩云CDN每月免费30G[注册即领](https://kuocaicdn.com/register?code=8mn536rrzfbf8) |
| 9.| **括彩云-部署到括彩云CDN** | 括彩云CDN每月免费30G[注册即领](https://kuocaicdn.com/register?code=8mn536rrzfbf8) | | 9.| **西数-部署到虚拟主机** | 西部数码部署证书到虚拟主机 |
| 10.| **多吉云-部署到多吉云CDN** | | | 10.| **多吉云-部署到多吉云CDN** | |
| 11.| **我爱云-部署证书到我爱云CDN** | 部署证书到我爱云CDN | | 11.| **我爱云-部署证书到我爱云CDN** | 部署证书到我爱云CDN |
| 12.| **CacheFly-部署证书到CacheFly** | 部署证书到 CacheFly | | 12.| **CacheFly-部署证书到CacheFly** | 部署证书到 CacheFly |
| 13.| **Gcore-部署证书到Gcore** | 仅上传 并不会部署到cdn | | 13.| **Gcore-部署证书到Gcore** | 仅上传 并不会部署到cdn |
| 14.| **Gcore-刷新Gcore证书** | 刷新现有的证书 | | 14.| **Gcore-刷新Gcore证书** | 刷新现有的证书 |
| 15.| **又拍云-部署证书到CDN/USS** | 支持又拍云CDN又拍云云存储USS | | 15.| **又拍云-部署证书到CDN/USS** | 支持又拍云CDN又拍云云存储USS |
| 16.| **FlexCDN-更新证书** | |
| 17.| **farcdn-更新证书** | www.farcdn.net |
| 18.| **雨云-更新证书** | app.rainyun.com |
| 19.| **网宿-更新证书** | 网宿证书自动更新 |
| 20.| **金山云-更新CDN证书** | 金山云自动更新CDN证书 |
| 21.| **APISIX-更新证书** | 自动更新APISIX证书 |
| 22.| **中国移动-部署证书到CDN** | 中国移动自动部署证书到CDN |
## 4. 面板 ## 4. 面板
| 序号 | 名称 | 说明 | | 序号 | 名称 | 说明 |
|-----|-----|-----| |-----|-----|-----|
| 1.| **宝塔-面板证书部署** | 部署宝塔面板本身的ssl证书 | | 1.| **宝塔-面板证书部署** | 部署宝塔面板本身的ssl证书 |
| 2.| **宝塔-网站证书部署** | 部署宝塔管理的站点的ssl证书目前支持网站站点、docker站点等 | | 2.| **宝塔-网站证书部署** | 部署宝塔管理的站点的ssl证书目前支持宝塔网站站点、docker站点等。本插件也支持aaPanel。 |
| 3.| **群晖-部署证书到群晖面板** | Synology支持6.x以上版本 | | 3.| **宝塔-WAF证书部署** | 部署宝塔云WAF/aaWAF |
| 4.| **K8S-部署证书到Secret** | 部署证书到k8s的secret | | 4.| **宝塔win-网站证书部署** | 部署到Windows版宝塔管理的站点的ssl证书 |
| 5.| **K8S-Ingress 证书部署** | 部署证书到k8s的Ingress | | 5.| **宝塔-删除过期证书** | 删除证书夹中过期证书 |
| 6.| **1Panel-部署证书到1Panel** | 更新1Panel的证书 | | 6.| **群晖-部署证书到群晖面板** | Synology支持6.x以上版本 |
| 7.| **Plesk-部署Plesk网站证书** | | | 7.| **K8S-部署证书到Secret** | 部署证书到k8s的secret |
| 8.| **雷池-更新证书** | 更新长亭雷池WAF的证书 | | 8.| **K8S-Ingress 证书部署** | 部署证书到k8s的Ingress |
| 9.| **lucky-更新Lucky证书** | | | 9.| **K8S-Apply自定义yaml** | apply自定义yaml到k8s |
| 10.| **uniCloud-部署到服务空间** | 部署到服务空间 | | 10.| **1Panel-部署证书到1Panel** | 更新1Panel的证书 |
| 11.| **威联通-部署证书到威联通** | 部署证书到qnap | | 11.| **Plesk-部署Plesk网站证书** | |
| 12.| **雷池-更新证书** | 更新长亭雷池WAF的证书 |
| 13.| **lucky-更新Lucky证书** | |
| 14.| **uniCloud-部署到服务空间** | 部署到服务空间 |
| 15.| **威联通-部署证书到威联通** | 部署证书到qnap |
| 16.| **飞牛NAS-部署证书** | |
| 17.| **Proxmox-上传证书到Proxmox** | |
| 18.| **Dokploy-部署server证书** | 自动更新Dokploy server证书 |
## 5. 阿里云 ## 5. 阿里云
| 序号 | 名称 | 说明 | | 序号 | 名称 | 说明 |
@@ -57,18 +73,24 @@
| 2.| **阿里云-部署至任意云资源** | 【不建议使用】需要消耗阿里云自动部署次数支持SLB、LIVE、webHosting、VOD、CR、DCDN、DDoS、CDN、ALB、APIGateway、FC、GA、MSE、NLB、OSS、SAE、WAF等云产品 | | 2.| **阿里云-部署至任意云资源** | 【不建议使用】需要消耗阿里云自动部署次数支持SLB、LIVE、webHosting、VOD、CR、DCDN、DDoS、CDN、ALB、APIGateway、FC、GA、MSE、NLB、OSS、SAE、WAF等云产品 |
| 3.| **阿里云-部署证书至CDN** | 自动部署域名证书至阿里云CDN | | 3.| **阿里云-部署证书至CDN** | 自动部署域名证书至阿里云CDN |
| 4.| **阿里云-部署证书至DCDN** | 依赖证书申请前置任务自动部署域名证书至阿里云DCDN | | 4.| **阿里云-部署证书至DCDN** | 依赖证书申请前置任务自动部署域名证书至阿里云DCDN |
| 5.| **阿里云-部署证书至OSS** | 自动部署域名证书至阿里云OSS | | 5.| **阿里云-部署证书至OSS** | 部署域名证书至阿里云OSS自定义域名不是上传到阿里云oss |
| 6.| **阿里云-上传证书到阿里云** | 如果不想在阿里云上同一份证书上传多次,可以把此任务作为前置任务,其他阿里云任务证书那一项选择此任务的输出 | | 6.| **阿里云-上传证书到CAS** | 上传证书到阿里云证书管理服务CAS如果不想在阿里云上同一份证书上传多次,可以把此任务作为前置任务,其他阿里云任务证书那一项选择此任务的输出 |
| 7.| **阿里云-部署至阿里云WAF** | 部署证书到阿里云WAF | | 7.| **阿里云-部署至阿里云WAF** | 部署证书到阿里云WAF |
| 8.| **阿里云-部署至ALB应用负载均衡** | ALB,更新监听器的默认证书 | | 8.| **阿里云-部署至ALB应用负载均衡** | ALB,更新监听器的默认证书 |
| 9.| **阿里云-部署至NLB网络负载均衡** | NLB,网络负载均衡,更新监听器的默认证书 | | 9.| **阿里云-部署至NLB网络负载均衡** | NLB,网络负载均衡,更新监听器的默认证书 |
| 10.| **阿里云-部署至SLB(传统负载均衡)** | 部署证书到阿里云SLB(传统负载均衡) | | 10.| **阿里云-部署至CLB(传统负载均衡)** | 部署证书到阿里云CLB(传统负载均衡) |
| 11.| **阿里云-部署至阿里云FC(3.0)** | 部署证书到阿里云函数计算FC3.0,【注意】证书的加密算法必须选择【pkcs1旧版】 | | 11.| **阿里云-部署至阿里云FC(3.0)** | 部署证书到阿里云函数计算FC3.0 |
| 12.| **阿里云-部署至ESA** | 部署证书到阿里云ESA(边缘安全加速),自动删除过期证书 |
| 13.| **阿里云-部署至VOD** | 部署证书到阿里云视频点播vod |
| 14.| **阿里云-部署证书至API网关** | 自动部署域名证书至阿里云API网关APIGateway |
| 15.| **阿里云-部署至云原生API网关/AI网关** | 自动部署域名证书至云原生API网关、AI网关 |
## 6. 华为云 ## 6. 华为云
| 序号 | 名称 | 说明 | | 序号 | 名称 | 说明 |
|-----|-----|-----| |-----|-----|-----|
| 1.| **华为云-部署证书至CDN** | | | 1.| **华为云-部署证书至CDN** | |
| 2.| **华为云-上传证书至CCM** | 上传证书到华为云云证书管理CCM |
| 3.| **华为云-部署证书至OBS** | |
## 7. 腾讯云 ## 7. 腾讯云
| 序号 | 名称 | 说明 | | 序号 | 名称 | 说明 |
@@ -79,9 +101,15 @@
| 4.| **腾讯云-部署到CDN-v2** | 推荐使用 | | 4.| **腾讯云-部署到CDN-v2** | 推荐使用 |
| 5.| **腾讯云-上传证书到腾讯云** | 上传成功后输出tencentCertId | | 5.| **腾讯云-上传证书到腾讯云** | 上传成功后输出tencentCertId |
| 6.| **腾讯云-部署证书到COS** | 部署到腾讯云COS源站域名证书【注意很不稳定需要重试很多次偶尔才能成功一次】 | | 6.| **腾讯云-部署证书到COS** | 部署到腾讯云COS源站域名证书【注意很不稳定需要重试很多次偶尔才能成功一次】 |
| 7.| **腾讯云-部署到腾讯云EO** | 腾讯云边缘安全加速平台EO,必须配置上传证书到腾讯云任务 | | 7.| **腾讯云-部署到腾讯云EO** | 腾讯云边缘安全加速平台EdgeOne(EO),必须配置上传证书到腾讯云任务 |
| 8.| **腾讯云-删除即将过期证书** | 仅删除未使用的证书 | | 8.| **腾讯云-删除即将过期证书** | 仅删除未使用的证书 |
| 9.| **腾讯云-部署到TKE-ingress** | serverless集群请使用K8S部署插件Qcloud类型需要【上传到腾讯云】作为前置任务ApiServer未开启外网访问则需要做域名的内网IP映射 | | 9.| **腾讯云-部署到TKE** | 修改TKE集群密钥配置支持Opaque和TLS证书类型。注意
1. serverless集群请使用K8S部署插件
2. Opaque类型需要【上传到腾讯云】作为前置任务
3. ApiServer需要开通公网访问或者certd可访问实际上底层仍然是通过KubeClient进行部署 |
| 10.| **腾讯云-部署到腾讯云直播** | https://console.cloud.tencent.com/live/ |
| 11.| **腾讯云-实例开关机** | 腾讯云实例开关机 |
| 12.| **腾讯云-更新证书(Id不变)** | 根据证书id一键更新腾讯云证书并自动部署Id不变注意该接口为腾讯云白名单功能非白名单用户无法使用该功能 |
## 8. 火山引擎 ## 8. 火山引擎
| 序号 | 名称 | 说明 | | 序号 | 名称 | 说明 |
@@ -91,6 +119,8 @@
| 3.| **火山引擎-上传证书至证书中心** | 上传证书至火山引擎证书中心 | | 3.| **火山引擎-上传证书至证书中心** | 上传证书至火山引擎证书中心 |
| 4.| **火山引擎-部署证书至ALB** | 部署至火山引擎应用负载均衡 | | 4.| **火山引擎-部署证书至ALB** | 部署至火山引擎应用负载均衡 |
| 5.| **火山引擎-部署证书至Live** | 部署至火山引擎视频直播 | | 5.| **火山引擎-部署证书至Live** | 部署至火山引擎视频直播 |
| 6.| **火山引擎-部署证书至DCDN** | 部署至火山引擎全站加速 |
| 7.| **火山引擎-部署证书至VOD** | 部署至火山引擎视频点播(暂不可用) |
## 9. 京东云 ## 9. 京东云
| 序号 | 名称 | 说明 | | 序号 | 名称 | 说明 |
@@ -98,26 +128,43 @@
| 1.| **京东云-部署证书至CDN** | 京东云内容分发网络 | | 1.| **京东云-部署证书至CDN** | 京东云内容分发网络 |
| 2.| **京东云-更新已有证书** | 更新SSL数字证书中的证书 | | 2.| **京东云-更新已有证书** | 更新SSL数字证书中的证书 |
| 3.| **京东云-上传新证书** | 上传证书到SSL数字证书中心 | | 3.| **京东云-上传新证书** | 上传证书到SSL数字证书中心 |
## 10. 七牛 ## 10. 百度
| 序号 | 名称 | 说明 |
|-----|-----|-----|
| 1.| **百度云-部署证书到CDN** | 部署到百度云CDN |
| 2.| **百度云-部署证书到负载均衡** | 部署到百度云负载均衡包括BLB、APPBLB |
| 3.| **百度云-上传到证书托管** | 上传证书到百度云证书托管中心 |
## 11. 七牛云
| 序号 | 名称 | 说明 | | 序号 | 名称 | 说明 |
|-----|-----|-----| |-----|-----|-----|
| 1.| **七牛云-部署证书至OSS** | 自动部署域名证书至七牛云KODO注意是自定义源站域名不是CDN域名 | | 1.| **七牛云-部署证书至OSS** | 自动部署域名证书至七牛云KODO注意是自定义源站域名不是CDN域名 |
| 2.| **七牛云-部署证书至CDN** | 自动部署域名证书至七牛云CDN | | 2.| **七牛云-部署证书至CDN/DCDN** | 自动部署域名证书至七牛云CDN、DCDN |
## 11. 亚马逊云 | 3.| **七牛云-上传证书到七牛云** | 上传到七牛云 |
## 12. 亚马逊云
| 序号 | 名称 | 说明 | | 序号 | 名称 | 说明 |
|-----|-----|-----| |-----|-----|-----|
| 1.| **AWS-部署证书到CloudFront** | 部署证书到 AWS CloudFront | | 1.| **AWS-部署证书到CloudFront** | 部署证书到 AWS CloudFront |
## 12. 其他 | 2.| **AWS-上传证书到ACM** | 上传证书 AWS ACM |
| 3.| **AWS(国区)-部署证书到CloudFront** | 部署证书到 AWS CloudFront |
## 13. 其他
| 序号 | 名称 | 说明 | | 序号 | 名称 | 说明 |
|-----|-----|-----| |-----|-----|-----|
| 1.| **Demo-测试插件** | | | 1.| **Demo-测试插件** | |
| 2.| **重启 Certd** | 【仅管理员可用】 重启 certd的https服务用于更新 Certd 的 ssl 证书 | | 2.| **等待** | 等待一段时间 |
| 3.| **自定义js脚本** | 【仅管理员】运行自定义js脚本执行 | | 3.| **邮件发送证书** | 通过邮件发送证书 |
| 4.| **等待** | 等待一段时间 | | 4.| **webhook方式部署证书** | 调用webhook部署证书 |
| 5.| **数据库备份** | 仅支持备份SQLite数据库 | | 5.| **Github-检查Release版本** | 检查最新Release版本并推送消息 |
## 14. 管理
| 序号 | 名称 | 说明 |
|-----|-----|-----|
| 1.| **重启 Certd** | 【仅管理员可用】 重启 certd的https服务用于更新 Certd 的 ssl 证书 |
| 2.| **自定义js脚本** | 【仅管理员】运行自定义js脚本执行 |
| 3.| **数据库备份** | 【仅管理员可用】仅支持备份SQLite数据库 |
<style module> <style module>
table th:first-of-type { table th:first-of-type {

View File

@@ -3,13 +3,23 @@
| 序号 | 名称 | 说明 | | 序号 | 名称 | 说明 |
|-----|-----|-----| |-----|-----|-----|
| 1.| **阿里云** | 阿里云DNS解析提供商 | | 1.| **阿里云** | 阿里云DNS解析提供商 |
| 2.| **腾讯云** | 腾讯云域名DNS解析提供者 | | 2.| **阿里ESA** | 阿里ESA DNS解析 |
| 3.| **华为云** | 华为云DNS解析提供商 | | 3.| **火山引擎** | 火山引擎DNS解析提供商 |
| 4.| **西部数码** | west dns provider | | 4.| **京东云** | 京东云DNS解析提供商 |
| 5.| **dns.la** | dns.la | | 5.| **新网** | 新网域名解析 |
| 6.| **火山引擎** | 火山引擎DNS解析提供商 | | 6.| **新网(代理方式)** | 新网域名解析(代理方式) |
| 7.| **京东** | 京东云DNS解析提供 | | 7.| **腾讯** | 腾讯云域名DNS解析提供 |
| 8.| **51dns** | 51DNS | | 8.| **腾讯云EO DNS** | 腾讯云EO DNS解析提供者 |
| 9.| **华为云** | 华为云DNS解析提供商 |
| 10.| **西部数码** | west dns provider |
| 11.| **dns.la** | dns.la |
| 12.| **雨云** | 雨云DNS解析提供商 |
| 13.| **cloudflare** | cloudflare dns provider |
| 14.| **namesilo** | namesilo dns provider |
| 15.| **godaddy** | GoDaddy |
| 16.| **Dns提供商Demo** | dns provider示例 |
| 17.| **51dns** | 51DNS |
| 18.| **新网互联** | 新网互联 |
<style module> <style module>
table th:first-of-type { table th:first-of-type {

View File

@@ -2,10 +2,10 @@
| 序号 | 名称 | 说明 | | 序号 | 名称 | 说明 |
|-----|-----|-----| |-----|-----|-----|
| 1.| **企业微信通知** | 企业微信群聊机器人通知 | | 1.| **电子邮件** | 电子邮件通知 |
| 2.| **电子邮件** | 电子邮件通知 | | 2.| **自定义webhook** | 根据模版自定义http请求 |
| 3.| **爱语飞飞微信通知(iyuu)** | https://iyuu.cn/ | | 3.| **企业微信通知** | 企业微信群聊机器人通知 |
| 4.| **自定义webhook** | 根据模版自定义http请求 | | 4.| **爱语飞飞微信通知(iyuu)** | https://iyuu.cn/ |
| 5.| **Server酱ᵀ** | https://sct.ftqq.com/ | | 5.| **Server酱ᵀ** | https://sct.ftqq.com/ |
| 6.| **Server酱³** | https://doc.sc3.ft07.com/serverchan3 | | 6.| **Server酱³** | https://doc.sc3.ft07.com/serverchan3 |
| 7.| **AnPush** | https://anpush.com | | 7.| **AnPush** | https://anpush.com |
@@ -14,6 +14,10 @@
| 10.| **Slack通知** | Slack消息推送通知 | | 10.| **Slack通知** | Slack消息推送通知 |
| 11.| **Bark 通知** | Bark 推送通知插件 | | 11.| **Bark 通知** | Bark 推送通知插件 |
| 12.| **飞书通知** | 飞书群聊webhook通知 | | 12.| **飞书通知** | 飞书群聊webhook通知 |
| 13.| **钉钉通知** | 钉钉群聊通知 |
| 14.| **VoceChat通知** | https://voce.chat |
| 15.| **OneBot V11 通知** | 通过动态拼接URL发送 OneBot V11 协议消息 |
| 16.| **MeoW通知** | https://api.chuckfang.com/ |
<style module> <style module>
table th:first-of-type { table th:first-of-type {

View File

@@ -19,7 +19,7 @@
"detail": too many certificates (5) already issued for this exact set of idantifiers in the last 168hm0s "detail": too many certificates (5) already issued for this exact set of idantifiers in the last 168hm0s
``` ```
## ssl.com报错 CAA record does not include ssl.com which is required to issue the certificate ## 4. ssl.com报错 CAA record does not include ssl.com which is required to issue the certificate
ssl.com申请证书要求必须设置CAA记录表示允许ssl.com为该域名颁发证书 ssl.com申请证书要求必须设置CAA记录表示允许ssl.com为该域名颁发证书
请按如下格式添加CAA记录 请按如下格式添加CAA记录
@@ -29,5 +29,26 @@ ssl.com申请证书要求必须设置CAA记录表示允许ssl.com为该域名
| 一级泛域名 | CAA | * | 0 | issue/issuewild | "ssl.com" | | 一级泛域名 | CAA | * | 0 | issue/issuewild | "ssl.com" |
| 固定子域名 | CAA | sub | 0 | issue |"ssl.com" | | 固定子域名 | CAA | sub | 0 | issue |"ssl.com" |
## 5. address family not supported
启动时出现此错误是由于您的服务器不支持绑定ipv6地址
请配置环境变量 certd_koa_hostname=0.0.0.0
在docker-compose.yml中添加如下配置
```yaml
service:
certd:
environment:
certd_koa_hostname: 0.0.0.0
```
## 6. DNS记录问题
1. DNS 不要设置CAA记录删除即可
2. DNSSEC相关报错DNSSEC管理中删除即可
3. DNS 有其他平台申请过的_acme-challenge记录删除即可

View File

@@ -7,10 +7,16 @@
https://certd.handsfree.work/ https://certd.handsfree.work/
> 注意数据将不定期清理,不定期停止定时任务,生产使用请自行部署 注册 -> 创建证书流水线 -> 添加部署任务 -> 测试运行
> 注意demo的数据将不定期清理生产使用请自行部署
> 包含敏感信息,务必自己本地部署进行生产使用 > 包含敏感信息,务必自己本地部署进行生产使用
![首页](../images/start/home-2.png)
## 二、私有化部署 ## 二、私有化部署
由于证书、授权信息等属于高度敏感数据,请务必私有化部署,保障数据安全 由于证书、授权信息等属于高度敏感数据,请务必私有化部署,保障数据安全

View File

@@ -5,8 +5,10 @@
配置环境变量 配置环境变量
```shell ```shell
ALIYUN_CLIENT_CONNECT_TIMEOUT=10000 # 连接超时,单位毫秒 # docker-compose.yaml
ALIYUN_CLIENT_READ_TIMEOUT=10000 #读取数据超时,单位毫秒 environment:
- ALIYUN_CLIENT_CONNECT_TIMEOUT=16000 # 连接超时,单位毫秒
- ALIYUN_CLIENT_READ_TIMEOUT=16000 #读取数据超时,单位毫秒
``` ```

View File

@@ -17,7 +17,7 @@
> 如果出现过: 100.25.1.5 100.25.4.8 > 如果出现过: 100.25.1.5 100.25.4.8
> >
> 可以尝试配置 100.25.*.5 > 可以尝试配置 100.25.*.*
## 二、nginx代理方案 ## 二、nginx代理方案

View File

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

11
docs/guide/use/cert/ip.md Normal file
View File

@@ -0,0 +1,11 @@
# IP证书申请
certd已支持IP证书申请
> 注意IP证书有效期只有7天。
## 申请方式
相比普通的域名证书申请方式区别在于:
1. 域名栏填写IP
2. 校验方式选择HTTP只能HTTP
3. 证书颁发机构选择默认的Let's Encrypt
4. 过期更新天数改成2天

View File

@@ -7,13 +7,14 @@
services: services:
certd: certd:
environment: # 环境变量 environment: # 环境变量
- certd_system_resetAdminPasswd=false - certd_system_resetAdminPasswd=true
``` ```
## 2. 重启容器 ## 2. 重启容器
```shell ```shell
docker compose up -d docker compose up -d
docker logs -f --tail 500 certd docker logs -f --tail 500 certd
# 观察日志当日志中输出“重置1号管理员用户密码完成”,即可操作下一步 # 观察日志当日志中输出“重置1号管理员用户密码完成”即可操作下一步
# 这里会打印1号管理员记录的用户名如果你修改过管理员用户名请注意查看此条日志
``` ```
## 3. 恢复环境变量 ## 3. 恢复环境变量
修改docker-compose.yaml`certd_system_resetAdminPasswd`改回`false` 修改docker-compose.yaml`certd_system_resetAdminPasswd`改回`false`
@@ -23,4 +24,6 @@ docker logs -f --tail 500 certd
docker compose up -d docker compose up -d
``` ```
## 5. 默认密码登录 ## 5. 默认密码登录
使用`admin/123456`登录系统,请及时修改管理员密码 使用`原管理员账号/123456`登录系统,请及时修改管理员密码
> 默认管理员账号: admin
> 如果忘记管理员账号,请查看修改密码时的启动日志,会打印管理员账号名

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

View File

@@ -0,0 +1,17 @@
# 流水线有效期功能
可以为流水线设置有效期,超过有效期后,流水线将停止运行
## 1. 打开有效期开关
![setting.png](images/setting.png)
## 2. 设置有效期
![valid.png](images/edit.png)
![valid.png](images/edit2.png)
## 3. 设置完成
该流水线将在有效期结束后停止运行
![valid.png](images/show.png)

View File

@@ -18,6 +18,12 @@
### 3. 配置Certd项目 ### 3. 配置Certd项目
![](./images/3.png) ![](./images/3.png)
建议加上 `:delegated` 提升性能
```yaml
volumes:
↓↓↓↓------加上这个提升性能
- /volume1/docker/certd:/app/data:delegated
```
### 4. 外网访问设置 ### 4. 外网访问设置

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

View File

@@ -24,13 +24,13 @@ features:
- title: 全自动申请证书 - title: 全自动申请证书
details: 支持所有注册商注册的域名 details: 支持所有注册商注册的域名
- title: 全自动部署证书 - title: 全自动部署证书
details: 支持部署到主机、阿里云、腾讯云等,目前已支持60+部署插件 details: 支持部署到主机、阿里云、腾讯云等,目前已支持100+部署插件
- title: 多域名、泛域名打到一个证书上 - title: 多域名、泛域名打到一个证书上
details: 支持通配符域名/泛域名,支持多个域名打到一个证书上 details: 支持通配符域名/泛域名,支持多个域名打到一个证书上
- title: 多证书格式支持 - title: 多证书格式支持
details: 支持pem、pfx、der、jks等多种证书格式支持Google、Letsencrypt、ZeroSSL证书颁发机构 details: 支持pem、pfx、der、jks等多种证书格式支持Google、Letsencrypt、ZeroSSL证书颁发机构
- title: 支持私有化部署 - title: 私有化部署,数据安全
details: 授权数据加密存储,保障数据安全 details: 授权数据加密存储,保障数据安全支持SQLite、Postgresql、MySQL多种数据库
- title: 多数据库支持 - title: 无痛升级
details: 支持SQLite、Postgresql、MySQL数据库 details: 有手就行,向下兼容,无需担心数据作废
--- ---

View File

@@ -9,5 +9,5 @@
} }
}, },
"npmClient": "pnpm", "npmClient": "pnpm",
"version": "1.37.1" "version": "1.37.16"
} }

View File

@@ -17,9 +17,10 @@
"start:server": "cd ./packages/ui/certd-server && npm start", "start:server": "cd ./packages/ui/certd-server && npm start",
"devb": "lerna run dev-build", "devb": "lerna run dev-build",
"i-all": "lerna link && lerna exec npm install ", "i-all": "lerna link && lerna exec npm install ",
"publish": "npm run prepublishOnly2 && lerna publish --force-publish=pro/plus-core --conventional-commits --create-release github && npm run afterpublishOnly && npm run commitAll", "publish": "npm run prepublishOnly2 && lerna publish --force-publish=pro/plus-core --conventional-commits --create-release github && npm run afterpublishOnly ",
"afterpublishOnly": "npm run copylogs && time /t >trigger/build.trigger && git add ./trigger/build.trigger && git commit -m \"build: trigger build image\" && TIMEOUT /T 10 && git push", "afterpublishOnly": "npm run plugin-doc-gen && npm run copylogs && time /t >trigger/build.trigger && git add ./trigger/build.trigger && git commit -m \"build: trigger build image\" && TIMEOUT /T 10 && npm run commitAll",
"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",
"plugin-doc-gen": "cd ./packages/ui/certd-server/ && npm run export-md",
"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/pro/ && git add . && git commit -m \"build: publish\" && git push", "commitPro": "cd ./packages/pro/ && git add . && git commit -m \"build: publish\" && git push",
"copylogs": "copyfiles \"CHANGELOG.md\" ./docs/guide/changelogs/", "copylogs": "copyfiles \"CHANGELOG.md\" ./docs/guide/changelogs/",
@@ -33,7 +34,9 @@
"docs:dev": "vitepress dev docs", "docs:dev": "vitepress dev docs",
"docs:build": "npm run copylogs && vitepress build docs", "docs:build": "npm run copylogs && vitepress build docs",
"docs:preview": "vitepress preview docs", "docs:preview": "vitepress preview docs",
"pub": "echo 1" "pub": "echo 1",
"dev": "pnpm run -r --parallel compile ",
"release": "time /t >trigger/release.trigger && git add trigger/release.trigger && git commit -m \"build: release\" && git push"
}, },
"license": "AGPL-3.0", "license": "AGPL-3.0",
"dependencies": { "dependencies": {

View File

@@ -3,6 +3,81 @@
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.37.16](https://github.com/publishlab/node-acme-client/compare/v1.37.15...v1.37.16) (2025-12-15)
### Bug Fixes
* 修复ipv6作为证书域名申请证书校验失败的bug ([e4e16bc](https://github.com/publishlab/node-acme-client/commit/e4e16bc6a65bb082c18ca0590226f0987a47d477))
## [1.37.15](https://github.com/publishlab/node-acme-client/compare/v1.37.14...v1.37.15) (2025-12-06)
**Note:** Version bump only for package @certd/acme-client
## [1.37.14](https://github.com/publishlab/node-acme-client/compare/v1.37.13...v1.37.14) (2025-12-02)
**Note:** Version bump only for package @certd/acme-client
## [1.37.13](https://github.com/publishlab/node-acme-client/compare/v1.37.12...v1.37.13) (2025-12-02)
**Note:** Version bump only for package @certd/acme-client
## [1.37.12](https://github.com/publishlab/node-acme-client/compare/v1.37.11...v1.37.12) (2025-11-29)
### Performance Improvements
* 支持证书颁发机构 LiteSSL ([6be7591](https://github.com/publishlab/node-acme-client/commit/6be75913324e2828d9016eb307ff2d0abbbb2191))
## [1.37.11](https://github.com/publishlab/node-acme-client/compare/v1.37.10...v1.37.11) (2025-11-28)
### Performance Improvements
* ssl.com支持ecc ([b5ec047](https://github.com/publishlab/node-acme-client/commit/b5ec04723db48422f71041f4043002e7f5b450b1))
## [1.37.10](https://github.com/publishlab/node-acme-client/compare/v1.37.9...v1.37.10) (2025-11-19)
**Note:** Version bump only for package @certd/acme-client
## [1.37.9](https://github.com/publishlab/node-acme-client/compare/v1.37.8...v1.37.9) (2025-11-19)
**Note:** Version bump only for package @certd/acme-client
## [1.37.8](https://github.com/publishlab/node-acme-client/compare/v1.37.7...v1.37.8) (2025-11-17)
**Note:** Version bump only for package @certd/acme-client
## [1.37.7](https://github.com/publishlab/node-acme-client/compare/v1.37.6...v1.37.7) (2025-11-12)
### Performance Improvements
* 支持使用letencrypt测试环境申请ip证书 ([86ce00a](https://github.com/publishlab/node-acme-client/commit/86ce00adf92ff98fead87a3eaaa6631036708f47))
* 支持腾讯云teo dns解析 ([1d23dd2](https://github.com/publishlab/node-acme-client/commit/1d23dd2426bd1e4c4dfea0a9e561d665e045ba9d))
## [1.37.6](https://github.com/publishlab/node-acme-client/compare/v1.37.5...v1.37.6) (2025-11-10)
### Performance Improvements
* 支持letencrypt测试环境支持IP证书 ([1462cdd](https://github.com/publishlab/node-acme-client/commit/1462cddd1eb347b7ff238286b5c977b29a0591ec))
## [1.37.5](https://github.com/publishlab/node-acme-client/compare/v1.37.4...v1.37.5) (2025-11-08)
**Note:** Version bump only for package @certd/acme-client
## [1.37.4](https://github.com/publishlab/node-acme-client/compare/v1.37.3...v1.37.4) (2025-10-28)
**Note:** Version bump only for package @certd/acme-client
## [1.37.3](https://github.com/publishlab/node-acme-client/compare/v1.37.2...v1.37.3) (2025-10-24)
### Bug Fixes
* 修复并发情况下证书申请日志混乱的bug ([bb2714f](https://github.com/publishlab/node-acme-client/commit/bb2714ff241f9db4a71d805b23a1b0f9f2f6413a))
## [1.37.2](https://github.com/publishlab/node-acme-client/compare/v1.37.1...v1.37.2) (2025-10-14)
### Bug Fixes
* aliyunoss 选择证书接入点选择新加坡无法上传的bug ([e00733a](https://github.com/publishlab/node-acme-client/commit/e00733a34644c23ffe926486b15dc96bf2fa4b57))
## [1.37.1](https://github.com/publishlab/node-acme-client/compare/v1.37.0...v1.37.1) (2025-09-29) ## [1.37.1](https://github.com/publishlab/node-acme-client/compare/v1.37.0...v1.37.1) (2025-09-29)
**Note:** Version bump only for package @certd/acme-client **Note:** Version bump only for package @certd/acme-client

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.37.1", "version": "1.37.16",
"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.37.1", "@certd/basic": "^1.37.16",
"@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",
@@ -52,7 +52,8 @@
"lint-types": "tsd", "lint-types": "tsd",
"prepublishOnly": "npm run build-docs", "prepublishOnly": "npm run build-docs",
"test": "mocha -t 60000 \"test/setup.js\" \"test/**/*.spec.js\"", "test": "mocha -t 60000 \"test/setup.js\" \"test/**/*.spec.js\"",
"pub": "npm publish" "pub": "npm publish",
"compile": "tsc --skipLibCheck --watch"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@@ -69,5 +70,5 @@
"bugs": { "bugs": {
"url": "https://github.com/publishlab/node-acme-client/issues" "url": "https://github.com/publishlab/node-acme-client/issues"
}, },
"gitHead": "e17cd1f298a72595f01e466b5e5c8971828c6bd9" "gitHead": "fa14f6219810ddbfcf1dde7b69963ee8a36c80c4"
} }

View File

@@ -28,7 +28,6 @@ class AcmeApi {
} }
} }
} }
console.log(locationUrl, mapping);
return locationUrl; return locationUrl;
} }

View File

@@ -2,9 +2,11 @@
* ACME auto helper * ACME auto helper
*/ */
import { readCsrDomains } from "./crypto/index.js"; import { readCsrDomains } from "./crypto/index.js";
import { log } from "./logger.js";
import { wait } from "./wait.js"; import { wait } from "./wait.js";
import { CancelError } from "./error.js"; import { CancelError } from "./error.js";
import { domainUtils } from '@certd/basic';
const defaultOpts = { const defaultOpts = {
@@ -45,6 +47,9 @@ export default async (client, userOpts) => {
accountPayload.externalAccountBinding = opts.externalAccountBinding; accountPayload.externalAccountBinding = opts.externalAccountBinding;
} }
const log = (...args)=>{
return client.logger.info(...args);
}
/** /**
* Register account * Register account
*/ */
@@ -63,7 +68,7 @@ export default async (client, userOpts) => {
* Parse domains from CSR * Parse domains from CSR
*/ */
log("[auto] Parsing domains from Certificate Signing Request "); log("[auto] Parsing domains from Certificate Signing Request");
const { commonName, altNames } = readCsrDomains(opts.csr); const { commonName, altNames } = readCsrDomains(opts.csr);
const uniqueDomains = Array.from(new Set([commonName].concat(altNames).filter((d) => d))); const uniqueDomains = Array.from(new Set([commonName].concat(altNames).filter((d) => d)));
@@ -74,9 +79,21 @@ export default async (client, userOpts) => {
*/ */
log("[auto] Placing new certificate order with ACME provider"); log("[auto] Placing new certificate order with ACME provider");
const orderPayload = { identifiers: uniqueDomains.map((d) => ({ type: "dns", value: d })) };
if (opts.profile && client.sslProvider === 'letsencrypt' ){ let hasIp = false
const orderPayload = { identifiers: uniqueDomains.map((d) =>{
// 判断是否为IPv4或v6否则按域名处理
const type = domainUtils.isIp(d) ? 'ip' : 'dns';
if(type === 'ip'){
hasIp = true
}
return { type, value: d }
}) };
if (opts.profile && client.sslProvider.startsWith("letsencrypt") ){
orderPayload.profile = opts.profile; orderPayload.profile = opts.profile;
if(hasIp){
orderPayload.profile = "shortlived"
}
} }
const order = await client.createOrder(orderPayload); const order = await client.createOrder(orderPayload);
const authorizations = await client.getAuthorizations(order); const authorizations = await client.getAuthorizations(order);
@@ -255,7 +272,7 @@ export default async (client, userOpts) => {
await wait(waitDnsDiffuseTime * 1000) await wait(waitDnsDiffuseTime * 1000)
} }
log("开始向提供商请求挑战验证"); log("开始向提供商请求检查验证");
await runPromisePa(completeChallengeTasks, 1000); await runPromisePa(completeChallengeTasks, 1000);
} catch (e) { } catch (e) {
log(`证书申请失败${e.message}`); log(`证书申请失败${e.message}`);

View File

@@ -3,9 +3,9 @@
*/ */
import axios from 'axios'; import axios from 'axios';
import { parseRetryAfterHeader } from './util.js'; import { parseRetryAfterHeader } from './util.js';
import { log } from './logger.js';
const { AxiosError } = axios; const { AxiosError } = axios;
import {getGlobalAgents, HttpError} from '@certd/basic' import {getGlobalAgents, HttpError} from '@certd/basic'
import { log } from './logger.js';
/** /**
* Defaults * Defaults
*/ */

View File

@@ -5,10 +5,9 @@
*/ */
import { createHash } from 'crypto'; import { createHash } from 'crypto';
import { getPemBodyAsB64u } from './crypto/index.js'; import { getPemBodyAsB64u } from './crypto/index.js';
import { log } from './logger.js';
import HttpClient from './http.js'; import HttpClient from './http.js';
import AcmeApi from './api.js'; import AcmeApi from './api.js';
import verify from './verify.js'; import {createChallengeFn} from './verify.js';
import * as util from './util.js'; import * as util from './util.js';
import auto from './auto.js'; import auto from './auto.js';
import { CancelError } from './error.js'; import { CancelError } from './error.js';
@@ -104,8 +103,13 @@ class AcmeClient {
max: this.opts.backoffMax, max: this.opts.backoffMax,
}; };
this.http = new HttpClient(this.opts.directoryUrl, this.opts.accountKey, this.opts.externalAccountBinding, this.opts.urlMapping); this.http = new HttpClient(this.opts.directoryUrl, this.opts.accountKey, this.opts.externalAccountBinding, this.opts.urlMapping, opts.logger);
this.api = new AcmeApi(this.http, this.opts.accountUrl); this.api = new AcmeApi(this.http, this.opts.accountUrl);
this.logger = opts.logger;
}
log(...args) {
this.logger.info(...args);
} }
/** /**
@@ -177,7 +181,7 @@ class AcmeClient {
this.getAccountUrl(); this.getAccountUrl();
/* Account URL exists */ /* Account URL exists */
log('Account URL exists, returning updateAccount()'); this.log('Account URL exists, returning updateAccount()');
return this.updateAccount(data); return this.updateAccount(data);
} }
catch (e) { catch (e) {
@@ -185,7 +189,7 @@ class AcmeClient {
/* HTTP 200: Account exists */ /* HTTP 200: Account exists */
if (resp.status === 200) { if (resp.status === 200) {
log('Account already exists (HTTP 200), returning updateAccount()'); this.log('Account already exists (HTTP 200), returning updateAccount()');
return this.updateAccount(data); return this.updateAccount(data);
} }
@@ -214,7 +218,7 @@ class AcmeClient {
this.api.getAccountUrl(); this.api.getAccountUrl();
} }
catch (e) { catch (e) {
log('No account URL found, returning createAccount()'); this.log('No account URL found, returning createAccount()');
return this.createAccount(data); return this.createAccount(data);
} }
@@ -488,6 +492,9 @@ class AcmeClient {
throw new Error('Unable to verify ACME challenge, URL not found'); throw new Error('Unable to verify ACME challenge, URL not found');
} }
const {challenges} = createChallengeFn({logger:this.logger});
const verify = challenges
if (typeof verify[challenge.type] === 'undefined') { if (typeof verify[challenge.type] === 'undefined') {
throw new Error(`Unable to verify ACME challenge, unknown type: ${challenge.type}`); throw new Error(`Unable to verify ACME challenge, unknown type: ${challenge.type}`);
} }
@@ -502,8 +509,13 @@ class AcmeClient {
await verify[challenge.type](authz, challenge, keyAuthorization); await verify[challenge.type](authz, challenge, keyAuthorization);
}; };
log('Waiting for ACME challenge verification等待ACME挑战验证)'); this.log('Waiting for ACME challenge verification等待ACME检查验证)');
return util.retry(verifyFn, this.backoffOpts);
const log = (...args)=>{
this.logger.info(...args)
}
return util.retry(verifyFn, this.backoffOpts,log);
} }
/** /**
@@ -570,7 +582,7 @@ class AcmeClient {
const resp = await this.api.apiRequest(item.url, null, [200]); const resp = await this.api.apiRequest(item.url, null, [200]);
/* Verify status */ /* Verify status */
log(`[${d}] Item has status挑战状态): ${resp.data.status}`); this.log(`[${d}] Item has status检查状态): ${resp.data.status}`);
if (invalidStates.includes(resp.data.status)) { if (invalidStates.includes(resp.data.status)) {
abort(); abort();
@@ -586,7 +598,7 @@ class AcmeClient {
throw new Error(`[${d}] Unexpected item status: ${resp.data.status}`); throw new Error(`[${d}] Unexpected item status: ${resp.data.status}`);
}; };
log(`[${d}] Waiting for valid status 等待valid状态: ${item.url}`, this.backoffOpts); this.log(`[${d}] Waiting for valid status 等待valid状态: ${item.url}`, this.backoffOpts);
return util.retry(verifyFn, this.backoffOpts); return util.retry(verifyFn, this.backoffOpts);
} }

View File

@@ -19,7 +19,7 @@ import { getJwk } from './crypto/index.js';
*/ */
class HttpClient { class HttpClient {
constructor(directoryUrl, accountKey, externalAccountBinding = {}, urlMapping = {}) { constructor(directoryUrl, accountKey, externalAccountBinding = {}, urlMapping = {},logger) {
this.directoryUrl = directoryUrl; this.directoryUrl = directoryUrl;
this.accountKey = accountKey; this.accountKey = accountKey;
this.externalAccountBinding = externalAccountBinding; this.externalAccountBinding = externalAccountBinding;
@@ -31,6 +31,7 @@ class HttpClient {
this.directoryMaxAge = 86400; this.directoryMaxAge = 86400;
this.directoryTimestamp = 0; this.directoryTimestamp = 0;
this.urlMapping = urlMapping; this.urlMapping = urlMapping;
this.log = logger? logger.info.bind(logger) : log;
} }
/** /**
@@ -48,7 +49,7 @@ class HttpClient {
for (const key in this.urlMapping.mappings) { for (const key in this.urlMapping.mappings) {
if (url.includes(key)) { if (url.includes(key)) {
const newUrl = url.replace(key, this.urlMapping.mappings[key]); const newUrl = url.replace(key, this.urlMapping.mappings[key]);
log(`use reverse proxy: ${newUrl}`); this.log(`use reverse proxy: ${newUrl}`);
url = newUrl; url = newUrl;
} }
} }
@@ -65,10 +66,10 @@ class HttpClient {
opts.headers['Content-Type'] = 'application/jose+json'; opts.headers['Content-Type'] = 'application/jose+json';
/* Request */ /* Request */
log(`HTTP request: ${method} ${url}`); this.log(`HTTP request: ${method} ${url}`);
const resp = await axios.request(opts); const resp = await axios.request(opts);
log(`RESP ${resp.status} ${method} ${url}`); this.log(`RESP ${resp.status} ${method} ${url}`);
return resp; return resp;
} }
@@ -85,7 +86,7 @@ class HttpClient {
const age = (now - this.directoryTimestamp); const age = (now - this.directoryTimestamp);
if (!this.directoryCache || (age > this.directoryMaxAge)) { if (!this.directoryCache || (age > this.directoryMaxAge)) {
log(`Refreshing ACME directory, age: ${age}`); this.log(`Refreshing ACME directory, age: ${age}`);
const resp = await this.request(this.directoryUrl, 'get'); const resp = await this.request(this.directoryUrl, 'get');
if (resp.status >= 400) { if (resp.status >= 400) {
@@ -187,7 +188,7 @@ class HttpClient {
/* Nonce */ /* Nonce */
if (nonce) { if (nonce) {
log(`Using nonce: ${nonce}`); this.log(`Using nonce: ${nonce}`);
header.nonce = nonce; header.nonce = nonce;
} }
@@ -314,7 +315,7 @@ class HttpClient {
nonce = resp.headers['replay-nonce'] || null; nonce = resp.headers['replay-nonce'] || null;
attempts += 1; attempts += 1;
log(`Caught invalid nonce error, retrying (${attempts}/${this.maxBadNonceRetries}) signed request to: ${url}`); this.log(`Caught invalid nonce error, retrying (${attempts}/${this.maxBadNonceRetries}) signed request to: ${url}`);
return this.signedRequest(url, payload, { kid, nonce, includeExternalAccountBinding }, attempts); return this.signedRequest(url, payload, { kid, nonce, includeExternalAccountBinding }, attempts);
} }

View File

@@ -21,6 +21,9 @@ export const directory = {
staging: 'https://acme-staging-v02.api.letsencrypt.org/directory', staging: 'https://acme-staging-v02.api.letsencrypt.org/directory',
production: 'https://acme-v02.api.letsencrypt.org/directory', production: 'https://acme-v02.api.letsencrypt.org/directory',
}, },
letsencrypt_staging: {
production: 'https://acme-staging-v02.api.letsencrypt.org/directory',
},
zerossl: { zerossl: {
staging: 'https://acme.zerossl.com/v2/DV90', staging: 'https://acme.zerossl.com/v2/DV90',
production: 'https://acme.zerossl.com/v2/DV90', production: 'https://acme.zerossl.com/v2/DV90',
@@ -28,9 +31,32 @@ export const directory = {
sslcom:{ sslcom:{
staging: 'https://acme.ssl.com/sslcom-dv-rsa', staging: 'https://acme.ssl.com/sslcom-dv-rsa',
production: 'https://acme.ssl.com/sslcom-dv-rsa', production: 'https://acme.ssl.com/sslcom-dv-rsa',
} ec: 'https://acme.ssl.com/sslcom-dv-ecc',
},
litessl: {
staging: 'https://acme.litessl.com/acme/v2/directory',
production: 'https://acme.litessl.com/acme/v2/directory',
},
}; };
export function getDirectoryUrl(opts) {
const {sslProvider, pkType} = opts
const list= directory[sslProvider]
if (!list) {
throw new Error(`sslProvider ${sslProvider} not found`)
}
let pkTypePrefix = pkType || 'rsa'
if (pkType) {
pkTypePrefix = pkType.toLowerCase().split("_")[0]
}
if (pkTypePrefix && list[pkTypePrefix]) {
return list[pkTypePrefix]
}
return list.production
}
/** /**
* Crypto * Crypto
*/ */

View File

@@ -48,7 +48,7 @@ class Backoff {
* @returns {Promise} * @returns {Promise}
*/ */
async function retryPromise(fn, attempts, backoff) { async function retryPromise(fn, attempts, backoff, logger = log) {
let aborted = false; let aborted = false;
try { try {
@@ -60,12 +60,12 @@ async function retryPromise(fn, attempts, backoff) {
throw e; throw e;
} }
log(`Promise rejected: ${e.message}`); logger(`Promise rejected: ${e.message}`);
const duration = backoff.duration(); const duration = backoff.duration();
log(`Promise rejected attempt #${backoff.attempts}, ${duration}ms 后重试: ${e.message}`); logger(`Promise rejected attempt #${backoff.attempts}, ${duration}ms 后重试: ${e.message}`);
await new Promise((resolve) => { setTimeout(resolve, duration); }); await new Promise((resolve) => { setTimeout(resolve, duration); });
return retryPromise(fn, attempts, backoff); return retryPromise(fn, attempts, backoff, logger);
} }
} }
@@ -80,9 +80,9 @@ async function retryPromise(fn, attempts, backoff) {
* @returns {Promise} * @returns {Promise}
*/ */
function retry(fn, { attempts = 5, min = 5000, max = 30000 } = {}) { function retry(fn, { attempts = 5, min = 5000, max = 30000 } = {}, logger = log) {
const backoff = new Backoff({ min, max }); const backoff = new Backoff({ min, max });
return retryPromise(fn, attempts, backoff); return retryPromise(fn, attempts, backoff, logger);
} }
/** /**
@@ -216,21 +216,21 @@ function formatResponseError(resp) {
* @returns {Promise<string>} Root domain name * @returns {Promise<string>} Root domain name
*/ */
async function resolveDomainBySoaRecord(recordName) { async function resolveDomainBySoaRecord(recordName, logger = log) {
try { try {
await dns.resolveSoa(recordName); await dns.resolveSoa(recordName);
log(`找到${recordName}的SOA记录`); logger(`找到${recordName}的SOA记录`);
return recordName; return recordName;
} }
catch (e) { catch (e) {
log(`找不到${recordName}的SOA记录,继续往主域名查找`); logger(`找不到${recordName}的SOA记录,继续往主域名查找`);
const parentRecordName = recordName.split('.').slice(1).join('.'); const parentRecordName = recordName.split('.').slice(1).join('.');
if (!parentRecordName.includes('.')) { if (!parentRecordName.includes('.')) {
throw new Error('SOA record查找失败'); throw new Error('SOA record查找失败');
} }
return resolveDomainBySoaRecord(parentRecordName); return resolveDomainBySoaRecord(parentRecordName,logger);
} }
} }
@@ -241,18 +241,18 @@ async function resolveDomainBySoaRecord(recordName) {
* @returns {Promise<dns.Resolver>} DNS resolver * @returns {Promise<dns.Resolver>} DNS resolver
*/ */
async function getAuthoritativeDnsResolver(recordName) { async function getAuthoritativeDnsResolver(recordName, logger = log) {
log(`获取域名${recordName}的权威NS服务器: `); logger(`获取域名${recordName}的权威NS服务器: `);
const resolver = new dns.Resolver(); const resolver = new dns.Resolver();
try { try {
/* Resolve root domain by SOA */ /* Resolve root domain by SOA */
const domain = await resolveDomainBySoaRecord(recordName); const domain = await resolveDomainBySoaRecord(recordName,logger);
/* Resolve authoritative NS addresses */ /* Resolve authoritative NS addresses */
log(`获取到权威NS服务器name: ${domain}`); logger(`获取到权威NS服务器name: ${domain}`);
const nsRecords = await dns.resolveNs(domain); const nsRecords = await dns.resolveNs(domain);
log(`域名权威NS服务器${nsRecords}`); logger(`域名权威NS服务器${nsRecords}`);
const nsAddrArray = await Promise.all(nsRecords.map(async (r) => dns.resolve4(r))); const nsAddrArray = await Promise.all(nsRecords.map(async (r) => dns.resolve4(r)));
const nsAddresses = [].concat(...nsAddrArray).filter((a) => a); const nsAddresses = [].concat(...nsAddrArray).filter((a) => a);
@@ -261,16 +261,16 @@ async function getAuthoritativeDnsResolver(recordName) {
} }
/* Authoritative NS success */ /* Authoritative NS success */
log(`Found ${nsAddresses.length} authoritative NS addresses for domain: ${domain}`); logger(`Found ${nsAddresses.length} authoritative NS addresses for domain: ${domain}`);
resolver.setServers(nsAddresses); resolver.setServers(nsAddresses);
} }
catch (e) { catch (e) {
log(`Authoritative NS lookup error获取权威NS服务器地址失败: ${e.message}`); logger(`Authoritative NS lookup error获取权威NS服务器地址失败: ${e.message}`);
} }
/* Return resolver */ /* Return resolver */
const addresses = resolver.getServers(); const addresses = resolver.getServers();
log(`DNS resolver addresses域名的权威NS服务器地址: ${addresses.join(', ')}`); logger(`DNS resolver addresses域名的权威NS服务器地址: ${addresses.join(', ')}`);
return resolver; return resolver;
} }

View File

@@ -4,14 +4,22 @@
import dnsSdk from "dns" import dnsSdk from "dns"
import https from 'https' import https from 'https'
import {log} from './logger.js' import {log as defaultLog} from './logger.js'
import axios from './axios.js' import axios from './axios.js'
import * as util from './util.js' import * as util from './util.js'
import {isAlpnCertificateAuthorizationValid} from './crypto/index.js' import {isAlpnCertificateAuthorizationValid} from './crypto/index.js'
import {utils} from '@certd/basic'
const dns = dnsSdk.promises const dns = dnsSdk.promises
/**
export function createChallengeFn(opts = {}){
const logger = opts?.logger || {info:defaultLog,error:defaultLog,warn:defaultLog,debug:defaultLog}
const log = function(...args){
logger.info(...args)
}
/**
* Verify ACME HTTP challenge * Verify ACME HTTP challenge
* *
* https://datatracker.ietf.org/doc/html/rfc8555#section-8.3 * https://datatracker.ietf.org/doc/html/rfc8555#section-8.3
@@ -52,11 +60,15 @@ async function verifyHttpChallenge(authz, challenge, keyAuthorization, suffix =
} }
const httpPort = axios.defaults.acmeSettings.httpChallengePort || 80; const httpPort = axios.defaults.acmeSettings.httpChallengePort || 80;
const challengeUrl = `http://${authz.identifier.value}:${httpPort}${suffix}`; let host = authz.identifier.value;
if(utils.domain.isIpv6(host)){
host = `[${host}]`;
}
const challengeUrl = `http://${host}:${httpPort}${suffix}`;
if (!await doQuery(challengeUrl)) { if (!await doQuery(challengeUrl)) {
const httpsPort = axios.defaults.acmeSettings.httpsChallengePort || 443; const httpsPort = axios.defaults.acmeSettings.httpsChallengePort || 443;
const httpsChallengeUrl = `https://${authz.identifier.value}:${httpsPort}${suffix}`; const httpsChallengeUrl = `https://${host}:${httpsPort}${suffix}`;
const res = await doQuery(httpsChallengeUrl) const res = await doQuery(httpsChallengeUrl)
if (!res) { if (!res) {
throw new Error(`[error] 验证失败请检查以上测试url是否可以正常访问`); throw new Error(`[error] 验证失败请检查以上测试url是否可以正常访问`);
@@ -112,7 +124,7 @@ async function walkDnsChallengeRecord(recordName, resolver = dns,deep = 0) {
return records return records
} }
export async function walkTxtRecord(recordName,deep = 0) { async function walkTxtRecord(recordName,deep = 0) {
if(deep >5){ if(deep >5){
log(`walkTxtRecord too deep (#${deep}) , skip walk`) log(`walkTxtRecord too deep (#${deep}) , skip walk`)
return [] return []
@@ -136,7 +148,7 @@ export async function walkTxtRecord(recordName,deep = 0) {
try{ try{
/* Authoritative DNS resolver */ /* Authoritative DNS resolver */
log(`从域名权威服务器获取TXT解析记录`); log(`从域名权威服务器获取TXT解析记录`);
const authoritativeResolver = await util.getAuthoritativeDnsResolver(recordName); const authoritativeResolver = await util.getAuthoritativeDnsResolver(recordName,log);
const res = await walkDnsChallengeRecord(recordName, authoritativeResolver,deep); const res = await walkDnsChallengeRecord(recordName, authoritativeResolver,deep);
if (res && res.length > 0) { if (res && res.length > 0) {
for (const item of res) { for (const item of res) {
@@ -173,7 +185,8 @@ async function verifyDnsChallenge(authz, challenge, keyAuthorization, prefix = '
recordValues = [...new Set(recordValues)]; recordValues = [...new Set(recordValues)];
log(`DNS查询成功, 找到 ${recordValues.length} 条TXT记录${recordValues}`); log(`DNS查询成功, 找到 ${recordValues.length} 条TXT记录${recordValues}`);
if (!recordValues.length || !recordValues.includes(keyAuthorization)) { if (!recordValues.length || !recordValues.includes(keyAuthorization)) {
throw new Error(`没有找到需要的DNS TXT记录: ${recordName},期望:${keyAuthorization},结果:${recordValues}`); const err = `没有找到需要的DNS TXT记录: ${recordName},期望:${keyAuthorization},结果:${recordValues}`
throw new Error(err);
} }
log(`关键授权匹配成功(${challenge.type}/${recordName}:${keyAuthorization},校验成功, ACME challenge verified`); log(`关键授权匹配成功(${challenge.type}/${recordName}:${keyAuthorization},校验成功, ACME challenge verified`);
@@ -207,12 +220,13 @@ async function verifyTlsAlpnChallenge(authz, challenge, keyAuthorization) {
return true; return true;
} }
/** return {
* Export API challenges:{
*/ 'http-01': verifyHttpChallenge,
'dns-01': verifyDnsChallenge,
'tls-alpn-01': verifyTlsAlpnChallenge,
},
walkTxtRecord,
}
export default { }
'http-01': verifyHttpChallenge,
'dns-01': verifyDnsChallenge,
'tls-alpn-01': verifyTlsAlpnChallenge,
};

View File

@@ -49,6 +49,7 @@ export interface ClientOptions {
backoffMax?: number; backoffMax?: number;
urlMapping?: UrlMapping; urlMapping?: UrlMapping;
signal?: AbortSignal; signal?: AbortSignal;
logger?:any
} }
export interface ClientExternalAccountBindingOptions { export interface ClientExternalAccountBindingOptions {
@@ -107,12 +108,17 @@ export const directory: {
staging: string, staging: string,
production: string production: string
}, },
letsencrypt_staging: {
production: string
},
zerossl: { zerossl: {
staging: string, staging: string,
production: string production: string
} }
}; };
export function getDirectoryUrl(opts:{sslProvider:string, pkType: string}): string;
/** /**
* Crypto * Crypto
*/ */
@@ -203,7 +209,8 @@ export const agents: any;
export function setLogger(fn: (message: any, ...args: any[]) => void): void; export function setLogger(fn: (message: any, ...args: any[]) => void): void;
export function walkTxtRecord(record: any): Promise<string[]>; export function createChallengeFn(opts?: {logger?:any}): any;
// export function walkTxtRecord(record: any): Promise<string[]>;
export function getAuthoritativeDnsResolver(record:string): Promise<any>; export function getAuthoritativeDnsResolver(record:string): Promise<any>;
export const CancelError: typeof CancelError; export const CancelError: typeof CancelError;

View File

@@ -26,3 +26,4 @@ dist-ssr
test/user.secret.* test/user.secret.*
test/**/*.js test/**/*.js
src/**/*.spec.ts src/**/*.spec.ts
test.mjs

View File

@@ -3,6 +3,76 @@
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.37.16](https://github.com/certd/certd/compare/v1.37.15...v1.37.16) (2025-12-15)
### Bug Fixes
* 修复ipv6作为证书域名申请证书校验失败的bug ([e4e16bc](https://github.com/certd/certd/commit/e4e16bc6a65bb082c18ca0590226f0987a47d477))
## [1.37.15](https://github.com/certd/certd/compare/v1.37.14...v1.37.15) (2025-12-06)
**Note:** Version bump only for package @certd/basic
## [1.37.14](https://github.com/certd/certd/compare/v1.37.13...v1.37.14) (2025-12-02)
**Note:** Version bump only for package @certd/basic
## [1.37.13](https://github.com/certd/certd/compare/v1.37.12...v1.37.13) (2025-12-02)
**Note:** Version bump only for package @certd/basic
## [1.37.12](https://github.com/certd/certd/compare/v1.37.11...v1.37.12) (2025-11-29)
**Note:** Version bump only for package @certd/basic
## [1.37.11](https://github.com/certd/certd/compare/v1.37.10...v1.37.11) (2025-11-28)
### Performance Improvements
* 优化宝塔网站证书在并发部署时导致nginx配置文件错乱的问题 ([51cc084](https://github.com/certd/certd/commit/51cc08411fd2dbab66d769b495dc1b0bf2f2578c))
* 优化天翼云cdn 等待5秒部署完成 ([53c88ad](https://github.com/certd/certd/commit/53c88ad5afe66a3f7c38b9b759747918913a4edc))
* ssl.com支持ecc ([b5ec047](https://github.com/certd/certd/commit/b5ec04723db48422f71041f4043002e7f5b450b1))
## [1.37.10](https://github.com/certd/certd/compare/v1.37.9...v1.37.10) (2025-11-19)
**Note:** Version bump only for package @certd/basic
## [1.37.9](https://github.com/certd/certd/compare/v1.37.8...v1.37.9) (2025-11-19)
**Note:** Version bump only for package @certd/basic
## [1.37.8](https://github.com/certd/certd/compare/v1.37.7...v1.37.8) (2025-11-17)
**Note:** Version bump only for package @certd/basic
## [1.37.7](https://github.com/certd/certd/compare/v1.37.6...v1.37.7) (2025-11-12)
### Performance Improvements
* 支持使用letencrypt测试环境申请ip证书 ([86ce00a](https://github.com/certd/certd/commit/86ce00adf92ff98fead87a3eaaa6631036708f47))
## [1.37.6](https://github.com/certd/certd/compare/v1.37.5...v1.37.6) (2025-11-10)
**Note:** Version bump only for package @certd/basic
## [1.37.5](https://github.com/certd/certd/compare/v1.37.4...v1.37.5) (2025-11-08)
**Note:** Version bump only for package @certd/basic
## [1.37.4](https://github.com/certd/certd/compare/v1.37.3...v1.37.4) (2025-10-28)
**Note:** Version bump only for package @certd/basic
## [1.37.3](https://github.com/certd/certd/compare/v1.37.2...v1.37.3) (2025-10-24)
**Note:** Version bump only for package @certd/basic
## [1.37.2](https://github.com/certd/certd/compare/v1.37.1...v1.37.2) (2025-10-14)
### Performance Improvements
* 支持网络测试 ([2bef608](https://github.com/certd/certd/commit/2bef608e07ceb56d52007f290667e0afef401b22))
## [1.37.1](https://github.com/certd/certd/compare/v1.37.0...v1.37.1) (2025-09-29) ## [1.37.1](https://github.com/certd/certd/compare/v1.37.0...v1.37.1) (2025-09-29)
**Note:** Version bump only for package @certd/basic **Note:** Version bump only for package @certd/basic

View File

@@ -1 +1 @@
20:32 01:44

View File

@@ -1,7 +1,7 @@
{ {
"name": "@certd/basic", "name": "@certd/basic",
"private": false, "private": false,
"version": "1.37.1", "version": "1.37.16",
"type": "module", "type": "module",
"main": "./dist/index.js", "main": "./dist/index.js",
"module": "./dist/index.js", "module": "./dist/index.js",
@@ -13,9 +13,11 @@
"dev-build": "npm run build", "dev-build": "npm run build",
"preview": "vite preview", "preview": "vite preview",
"test": "mocha --loader=ts-node/esm", "test": "mocha --loader=ts-node/esm",
"pub": "npm publish" "pub": "npm publish",
"compile": "tsc --skipLibCheck --watch"
}, },
"dependencies": { "dependencies": {
"async-lock": "^1.4.1",
"axios": "^1.7.2", "axios": "^1.7.2",
"dayjs": "^1.11.7", "dayjs": "^1.11.7",
"http-proxy-agent": "^7.0.2", "http-proxy-agent": "^7.0.2",
@@ -45,5 +47,5 @@
"tslib": "^2.8.1", "tslib": "^2.8.1",
"typescript": "^5.4.2" "typescript": "^5.4.2"
}, },
"gitHead": "e17cd1f298a72595f01e466b5e5c8971828c6bd9" "gitHead": "fa14f6219810ddbfcf1dde7b69963ee8a36c80c4"
} }

View File

@@ -1,2 +1 @@
export * from './utils/index.js'; export * from "./utils/index.js";
export * from './utils/util.id.js';

View File

@@ -37,6 +37,9 @@ import { mitter } from "./util.mitter.js";
import * as request from "./util.request.js"; import * as request from "./util.request.js";
export * from "./util.cache.js"; export * from "./util.cache.js";
export * from "./util.id.js";
export const utils = { export const utils = {
sleep, sleep,
http, http,

View File

@@ -7,29 +7,29 @@ function match(targetDomains: string | string[], inDomains: string[]) {
return false; return false;
} }
if (typeof targetDomains === 'string') { if (typeof targetDomains === "string") {
targetDomains = [targetDomains]; targetDomains = [targetDomains];
} }
for (let targetDomain of targetDomains) { for (let targetDomain of targetDomains) {
let matched = false; let matched = false;
if (targetDomain.startsWith('.')) { if (targetDomain.startsWith(".")) {
targetDomain = '*' + targetDomain; targetDomain = "*" + targetDomain;
} }
for (let inDomain of inDomains) { for (let inDomain of inDomains) {
if (inDomain.startsWith('.')) { if (inDomain.startsWith(".")) {
inDomain = '*' + inDomain; inDomain = "*" + inDomain;
} }
if (targetDomain === inDomain) { if (targetDomain === inDomain) {
matched = true; matched = true;
break; break;
} }
if (!inDomain.startsWith('*.')) { if (!inDomain.startsWith("*.")) {
//不可能匹配 //不可能匹配
continue; continue;
} }
//子域名匹配通配符即可 //子域名匹配通配符即可
const firstDotIndex = targetDomain.indexOf('.'); const firstDotIndex = targetDomain.indexOf(".");
const targetDomainSuffix = targetDomain.substring(firstDotIndex + 1); const targetDomainSuffix = targetDomain.substring(firstDotIndex + 1);
if (targetDomainSuffix === inDomain.substring(2)) { if (targetDomainSuffix === inDomain.substring(2)) {
matched = true; matched = true;
@@ -46,6 +46,32 @@ function match(targetDomains: string | string[], inDomains: string[]) {
return true; return true;
} }
function isIpv4(d: string) {
if (!d) {
return false;
}
const isIPv4Regex = /^(\d{1,3}\.){3}\d{1,3}$/;
return isIPv4Regex.test(d);
}
function isIpv6(d: string) {
if (!d) {
return false;
}
const isIPv6Regex = /^([0-9A-Fa-f]{0,4}:){2,7}([0-9A-Fa-f]{1,4}$|((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4})$/gm;
return isIPv6Regex.test(d);
}
function isIp(d: string) {
if (!d) {
return false;
}
return isIpv4(d) || isIpv6(d);
}
export const domainUtils = { export const domainUtils = {
match, match,
isIpv4,
isIpv6,
isIp,
}; };

View File

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

View File

@@ -1,46 +1,16 @@
import { logger, utils } from './index.js'; // @ts-ignore
import AsyncLock from "async-lock";
export class Locker { export class Locker {
locked: Record<string, any> = {}; private asyncLocker: AsyncLock;
async execute(lockStr: string, callback: any) { constructor() {
await this.lock(lockStr); this.asyncLocker = new AsyncLock();
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) { async execute(lockStr: string, callback: any, options?: { timeout?: number }) {
const isLocked = this.isLocked(str); const timeout = options?.timeout ?? 120000;
if (isLocked) { return this.asyncLocker.acquire(lockStr, callback, { timeout });
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;
} }
} }

View File

@@ -1,8 +1,10 @@
//转换为import //转换为import
import childProcess from 'child_process'; //@ts-ignore
import { safePromise } from './util.promise.js'; import childProcess from "child_process";
import { ILogger, logger } from './util.log.js'; import { safePromise } from "./util.promise.js";
import iconv from 'iconv-lite'; import { ILogger, logger } from "./util.log.js";
//@ts-ignore
import iconv from "iconv-lite";
export type ExecOption = { export type ExecOption = {
cmd: string | string[]; cmd: string | string[];
env: any; env: any;
@@ -11,12 +13,12 @@ export type ExecOption = {
}; };
async function exec(opts: ExecOption): Promise<string> { async function exec(opts: ExecOption): Promise<string> {
let cmd = ''; let cmd = "";
const log = opts.logger || logger; const log = opts.logger || logger;
if (opts.cmd instanceof Array) { if (opts.cmd instanceof Array) {
for (const item of opts.cmd) { for (const item of opts.cmd) {
if (cmd) { if (cmd) {
cmd += ' && ' + item; cmd += " && " + item;
} else { } else {
cmd = item; cmd = item;
} }
@@ -28,17 +30,18 @@ async function exec(opts: ExecOption): Promise<string> {
cmd, cmd,
{ {
env: { env: {
//@ts-ignore
...process.env, ...process.env,
...opts.env, ...opts.env,
}, },
...opts.options, ...opts.options,
}, },
(error, stdout, stderr) => { (error: any, stdout: { toString: (arg0: string) => any }, stderr: any) => {
if (error) { if (error) {
log.error(`exec error: ${error}`); log.error(`exec error: ${error}`);
reject(error); reject(error);
} else { } else {
const res = stdout.toString('utf-8'); const res = stdout.toString("utf-8");
log.info(`stdout: ${res}`); log.info(`stdout: ${res}`);
resolve(res); resolve(res);
} }
@@ -57,11 +60,12 @@ export type SpawnOption = {
}; };
function isWindows() { function isWindows() {
return process.platform === 'win32'; // @ts-ignore
return process.platform === "win32";
} }
function convert(buffer: any) { function convert(buffer: any) {
if (isWindows()) { if (isWindows()) {
const decoded = iconv.decode(buffer, 'GBK'); const decoded = iconv.decode(buffer, "GBK");
// 检查是否有有效字符 // 检查是否有有效字符
return decoded && decoded.trim().length > 0 ? decoded : buffer.toString(); return decoded && decoded.trim().length > 0 ? decoded : buffer.toString();
} else { } else {
@@ -74,12 +78,12 @@ function convert(buffer: any) {
// } // }
async function spawn(opts: SpawnOption): Promise<string> { async function spawn(opts: SpawnOption): Promise<string> {
let cmd = ''; let cmd = "";
const log = opts.logger || logger; const log = opts.logger || logger;
if (opts.cmd instanceof Array) { if (opts.cmd instanceof Array) {
for (const item of opts.cmd) { for (const item of opts.cmd) {
if (cmd) { if (cmd) {
cmd += ' && ' + item; cmd += " && " + item;
} else { } else {
cmd = item; cmd = item;
} }
@@ -88,37 +92,47 @@ async function spawn(opts: SpawnOption): Promise<string> {
cmd = opts.cmd; cmd = opts.cmd;
} }
log.info(`执行命令: ${cmd}`); log.info(`执行命令: ${cmd}`);
let stdout = ''; let stdout = "";
let stderr = ''; let stderr = "";
return safePromise((resolve, reject) => { return safePromise((resolve, reject) => {
const ls = childProcess.spawn(cmd, { const ls = childProcess.spawn(cmd, {
shell: true, shell: true,
env: { env: {
//@ts-ignore
...process.env, ...process.env,
...opts.env, ...opts.env,
}, },
...opts.options, ...opts.options,
}); });
ls.stdout.on('data', data => { ls.stdout.on("data", (data: string) => {
data = convert(data); data = convert(data);
log.info(`stdout: ${data}`); log.info(`stdout: ${data}`);
stdout += data; stdout += data;
}); });
ls.stderr.on('data', data => { ls.stderr.on("data", (data: string) => {
data = convert(data); data = convert(data);
log.warn(`stderr: ${data}`); log.warn(`stderr: ${data}`);
stderr += data; stderr += data;
}); });
ls.on('error', error => { ls.on("error", (error: any) => {
log.error(`child process error: ${error}`); log.error(`child process error: ${error}`);
//@ts-ignore
error.stderr = stderr;
//@ts-ignore
error.stdout = stdout;
reject(error); reject(error);
}); });
ls.on('close', (code: number) => { ls.on("close", (code: number) => {
if (code !== 0) { if (code !== 0) {
log.error(`child process exited with code ${code}`); log.error(`child process exited with code ${code}`);
reject(new Error(stderr)); const e = new Error(stderr || "return " + code);
//@ts-ignore
e.stderr = stderr;
//@ts-ignore
e.stdout = stdout;
reject(e);
} else { } else {
resolve(stdout); resolve(stdout);
} }

View File

@@ -0,0 +1,18 @@
// import { random } from "lodash-es";
// import { locker } from "./dist/utils/util.lock.js";
// async function testLocker() {
// for (let i = 0; i < 10; i++) {
// await locker.execute("test", async () => {
// console.log("test", i);
// await new Promise(resolve => setTimeout(resolve, Math.random() * 1000));
// throw new Error("test error");
// });
// }
// }
// await testLocker();
import { domainUtils } from "./dist/utils/util.domain.js";
console.log(domainUtils.isIpv6("::0:0:0:FFFF:129.144.52.38"));

View File

@@ -3,6 +3,68 @@
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.37.16](https://github.com/certd/certd/compare/v1.37.15...v1.37.16) (2025-12-15)
### Performance Improvements
* 支持邮件模版设置 ([a6c0d2c](https://github.com/certd/certd/commit/a6c0d2c6f1fd6b60e6d7af290487c94564fd91ea))
## [1.37.15](https://github.com/certd/certd/compare/v1.37.14...v1.37.15) (2025-12-06)
**Note:** Version bump only for package @certd/pipeline
## [1.37.14](https://github.com/certd/certd/compare/v1.37.13...v1.37.14) (2025-12-02)
**Note:** Version bump only for package @certd/pipeline
## [1.37.13](https://github.com/certd/certd/compare/v1.37.12...v1.37.13) (2025-12-02)
**Note:** Version bump only for package @certd/pipeline
## [1.37.12](https://github.com/certd/certd/compare/v1.37.11...v1.37.12) (2025-11-29)
**Note:** Version bump only for package @certd/pipeline
## [1.37.11](https://github.com/certd/certd/compare/v1.37.10...v1.37.11) (2025-11-28)
**Note:** Version bump only for package @certd/pipeline
## [1.37.10](https://github.com/certd/certd/compare/v1.37.9...v1.37.10) (2025-11-19)
**Note:** Version bump only for package @certd/pipeline
## [1.37.9](https://github.com/certd/certd/compare/v1.37.8...v1.37.9) (2025-11-19)
**Note:** Version bump only for package @certd/pipeline
## [1.37.8](https://github.com/certd/certd/compare/v1.37.7...v1.37.8) (2025-11-17)
**Note:** Version bump only for package @certd/pipeline
## [1.37.7](https://github.com/certd/certd/compare/v1.37.6...v1.37.7) (2025-11-12)
**Note:** Version bump only for package @certd/pipeline
## [1.37.6](https://github.com/certd/certd/compare/v1.37.5...v1.37.6) (2025-11-10)
**Note:** Version bump only for package @certd/pipeline
## [1.37.5](https://github.com/certd/certd/compare/v1.37.4...v1.37.5) (2025-11-08)
**Note:** Version bump only for package @certd/pipeline
## [1.37.4](https://github.com/certd/certd/compare/v1.37.3...v1.37.4) (2025-10-28)
**Note:** Version bump only for package @certd/pipeline
## [1.37.3](https://github.com/certd/certd/compare/v1.37.2...v1.37.3) (2025-10-24)
**Note:** Version bump only for package @certd/pipeline
## [1.37.2](https://github.com/certd/certd/compare/v1.37.1...v1.37.2) (2025-10-14)
**Note:** Version bump only for package @certd/pipeline
## [1.37.1](https://github.com/certd/certd/compare/v1.37.0...v1.37.1) (2025-09-29) ## [1.37.1](https://github.com/certd/certd/compare/v1.37.0...v1.37.1) (2025-09-29)
**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.37.1", "version": "1.37.16",
"type": "module", "type": "module",
"main": "./dist/index.js", "main": "./dist/index.js",
"module": "./dist/index.js", "module": "./dist/index.js",
@@ -14,11 +14,12 @@
"build3": "rollup -c", "build3": "rollup -c",
"preview": "vite preview", "preview": "vite preview",
"test": "mocha --loader=ts-node/esm", "test": "mocha --loader=ts-node/esm",
"pub": "npm publish" "pub": "npm publish",
"compile": "tsc --skipLibCheck --watch"
}, },
"dependencies": { "dependencies": {
"@certd/basic": "^1.37.1", "@certd/basic": "^1.37.16",
"@certd/plus-core": "^1.37.1", "@certd/plus-core": "^1.37.16",
"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"
@@ -44,5 +45,5 @@
"tslib": "^2.8.1", "tslib": "^2.8.1",
"typescript": "^5.4.2" "typescript": "^5.4.2"
}, },
"gitHead": "e17cd1f298a72595f01e466b5e5c8971828c6bd9" "gitHead": "fa14f6219810ddbfcf1dde7b69963ee8a36c80c4"
} }

View File

@@ -423,31 +423,46 @@ export class Executor {
let subject = ""; let subject = "";
let content = ""; let content = "";
const errorMessage = error?.message; const errorMessage = error?.message;
const templateData: any = {
pipelineId: this.pipeline.id,
historyId: this.runtime.id,
pipelineTitle: this.pipeline.title,
};
let pipelineResult = "";
let errors = "";
if (when === "start") { if (when === "start") {
subject = `开始执行,${this.pipeline.title}${this.pipeline.id}`; pipelineResult = "开始执行";
subject = `${pipelineResult}${this.pipeline.title}${this.pipeline.id}`;
content = `流水线ID:${this.pipeline.id}运行ID:${this.runtime.id}`; content = `流水线ID:${this.pipeline.id}运行ID:${this.runtime.id}`;
} else if (when === "success") { } else if (when === "success") {
subject = `执行成功,${this.pipeline.title}${this.pipeline.id}`; pipelineResult = "执行成功";
subject = `${pipelineResult}${this.pipeline.title}${this.pipeline.id}`;
content = `流水线ID:${this.pipeline.id}运行ID:${this.runtime.id}`; content = `流水线ID:${this.pipeline.id}运行ID:${this.runtime.id}`;
} else if (when === "turnToSuccess") { } else if (when === "turnToSuccess") {
subject = `执行成功(失败转成功)${this.pipeline.title}${this.pipeline.id}`; pipelineResult = "执行成功(失败转成功)";
subject = `${pipelineResult}${this.pipeline.title}${this.pipeline.id}`;
content = `流水线ID:${this.pipeline.id}运行ID:${this.runtime.id}`; content = `流水线ID:${this.pipeline.id}运行ID:${this.runtime.id}`;
} else if (when === "error") { } else if (when === "error") {
subject = `执行失败,${this.pipeline.title}${this.pipeline.id}`; pipelineResult = "执行失败";
subject = `${pipelineResult}${this.pipeline.title}${this.pipeline.id}`;
if (error instanceof RunnableError) { if (error instanceof RunnableError) {
const runnableError = error as RunnableError; const runnableError = error as RunnableError;
content = `流水线ID:${this.pipeline.id}运行ID:${this.runtime.id}\n\n`; content = `流水线ID:${this.pipeline.id}运行ID:${this.runtime.id}\n\n`;
for (const re of runnableError.errors) { for (const re of runnableError.errors) {
content += ` - ${re.runnable.title} 执行失败,错误详情:${re.e?.message || re.e?.error?.message}\n\n`; errors += ` - ${re.runnable.title} 执行失败,错误详情:${re.e?.message || re.e?.error?.message}\n\n`;
} }
content += errors;
} else { } else {
errors = error.message;
content = `流水线ID:${this.pipeline.id}运行ID:${this.runtime.id}\n\n${this.currentStatusMap?.currentStep?.title} 执行失败\n\n错误详情:${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;
} }
templateData.errors = errors;
templateData.pipelineResult = pipelineResult;
for (const notification of this.pipeline.notifications) { for (const notification of this.pipeline.notifications) {
if (!notification.when.includes(when)) { if (!notification.when.includes(when)) {
continue; continue;
@@ -455,9 +470,9 @@ export class Executor {
if (notification.type === "email" && notification.options?.receivers) { if (notification.type === "email" && notification.options?.receivers) {
try { try {
await this.options.emailService?.send({ await this.options.emailService?.sendByTemplate({
subject, type: "pipelineResult",
content, data: templateData,
receivers: notification.options?.receivers, receivers: notification.options?.receivers,
}); });
} catch (e) { } catch (e) {
@@ -472,15 +487,15 @@ export class Executor {
useEmail: false, useEmail: false,
logger: this.logger, logger: this.logger,
body: { body: {
notificationType: "pipelineResult",
title: subject, title: subject,
content, content,
userId: this.pipeline.userId, userId: this.pipeline.userId,
pipeline: this.pipeline, pipeline: this.pipeline,
result: this.lastRuntime?.pipeline?.status, result: this.lastRuntime?.pipeline?.status,
pipelineId: this.pipeline.id,
historyId: this.runtime.id,
errorMessage, errorMessage,
url, url,
...templateData,
}, },
}); });
} catch (e) { } catch (e) {

View File

@@ -15,6 +15,11 @@ export type NotificationBody = {
historyId?: number; historyId?: number;
errorMessage?: string; errorMessage?: string;
url?: string; url?: string;
notificationType?: string;
attachments?: any[];
pipelineResult?: string;
pipelineTitle?: string;
errors?: string;
}; };
export type NotificationRequestHandleReqInput<T = any> = { export type NotificationRequestHandleReqInput<T = any> = {

View File

@@ -185,6 +185,8 @@ export abstract class AbstractTaskPlugin implements ITaskPlugin {
if (res == null) { if (res == null) {
throw new Error("授权不存在,可能已被删除,请前往任务配置里面重新选择授权"); throw new Error("授权不存在,可能已被删除,请前往任务配置里面重新选择授权");
} }
res.ctx.logger = this.logger;
res.ctx.http = this.http;
// @ts-ignore // @ts-ignore
if (this.logger?.addSecret) { if (this.logger?.addSecret) {
// 隐藏加密信息,不在日志中输出 // 隐藏加密信息,不在日志中输出

View File

@@ -27,6 +27,7 @@ export const pluginGroups = {
tencent: new PluginGroup("tencent", "腾讯云", 4, "svg:icon-tencentcloud"), tencent: new PluginGroup("tencent", "腾讯云", 4, "svg:icon-tencentcloud"),
volcengine: new PluginGroup("volcengine", "火山引擎", 4, "svg:icon-volcengine"), volcengine: new PluginGroup("volcengine", "火山引擎", 4, "svg:icon-volcengine"),
jdcloud: new PluginGroup("jdcloud", "京东云", 4, "svg:icon-jdcloud"), jdcloud: new PluginGroup("jdcloud", "京东云", 4, "svg:icon-jdcloud"),
ucloud: new PluginGroup("ucloud", "UCloud", 4, "svg:icon-ucloud"),
baidu: new PluginGroup("baidu", "百度云", 4, "ant-design:baidu-outlined"), baidu: new PluginGroup("baidu", "百度云", 4, "ant-design:baidu-outlined"),
qiniu: new PluginGroup("qiniu", "七牛云", 5, "svg:icon-qiniuyun"), qiniu: new PluginGroup("qiniu", "七牛云", 5, "svg:icon-qiniuyun"),
aws: new PluginGroup("aws", "亚马逊云", 6, "svg:icon-aws"), aws: new PluginGroup("aws", "亚马逊云", 6, "svg:icon-aws"),

View File

@@ -6,6 +6,14 @@ export type EmailSend = {
html?: string; html?: string;
}; };
export type EmailSendByTemplateReq = {
type: string;
data: any;
receivers: string[];
attachments?: any[];
};
export interface IEmailService { export interface IEmailService {
send(email: EmailSend): Promise<void>; send(email: EmailSend): Promise<void>;
sendByTemplate(req: EmailSendByTemplateReq): Promise<void>;
} }

View File

@@ -3,6 +3,66 @@
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.37.16](https://github.com/certd/certd/compare/v1.37.15...v1.37.16) (2025-12-15)
**Note:** Version bump only for package @certd/lib-huawei
## [1.37.15](https://github.com/certd/certd/compare/v1.37.14...v1.37.15) (2025-12-06)
**Note:** Version bump only for package @certd/lib-huawei
## [1.37.14](https://github.com/certd/certd/compare/v1.37.13...v1.37.14) (2025-12-02)
**Note:** Version bump only for package @certd/lib-huawei
## [1.37.13](https://github.com/certd/certd/compare/v1.37.12...v1.37.13) (2025-12-02)
**Note:** Version bump only for package @certd/lib-huawei
## [1.37.12](https://github.com/certd/certd/compare/v1.37.11...v1.37.12) (2025-11-29)
**Note:** Version bump only for package @certd/lib-huawei
## [1.37.11](https://github.com/certd/certd/compare/v1.37.10...v1.37.11) (2025-11-28)
**Note:** Version bump only for package @certd/lib-huawei
## [1.37.10](https://github.com/certd/certd/compare/v1.37.9...v1.37.10) (2025-11-19)
**Note:** Version bump only for package @certd/lib-huawei
## [1.37.9](https://github.com/certd/certd/compare/v1.37.8...v1.37.9) (2025-11-19)
**Note:** Version bump only for package @certd/lib-huawei
## [1.37.8](https://github.com/certd/certd/compare/v1.37.7...v1.37.8) (2025-11-17)
**Note:** Version bump only for package @certd/lib-huawei
## [1.37.7](https://github.com/certd/certd/compare/v1.37.6...v1.37.7) (2025-11-12)
**Note:** Version bump only for package @certd/lib-huawei
## [1.37.6](https://github.com/certd/certd/compare/v1.37.5...v1.37.6) (2025-11-10)
**Note:** Version bump only for package @certd/lib-huawei
## [1.37.5](https://github.com/certd/certd/compare/v1.37.4...v1.37.5) (2025-11-08)
**Note:** Version bump only for package @certd/lib-huawei
## [1.37.4](https://github.com/certd/certd/compare/v1.37.3...v1.37.4) (2025-10-28)
**Note:** Version bump only for package @certd/lib-huawei
## [1.37.3](https://github.com/certd/certd/compare/v1.37.2...v1.37.3) (2025-10-24)
**Note:** Version bump only for package @certd/lib-huawei
## [1.37.2](https://github.com/certd/certd/compare/v1.37.1...v1.37.2) (2025-10-14)
**Note:** Version bump only for package @certd/lib-huawei
## [1.37.1](https://github.com/certd/certd/compare/v1.37.0...v1.37.1) (2025-09-29) ## [1.37.1](https://github.com/certd/certd/compare/v1.37.0...v1.37.1) (2025-09-29)
**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.37.1", "version": "1.37.16",
"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",
@@ -24,5 +24,5 @@
"prettier": "^2.8.8", "prettier": "^2.8.8",
"tslib": "^2.8.1" "tslib": "^2.8.1"
}, },
"gitHead": "e17cd1f298a72595f01e466b5e5c8971828c6bd9" "gitHead": "fa14f6219810ddbfcf1dde7b69963ee8a36c80c4"
} }

View File

@@ -3,6 +3,66 @@
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.37.16](https://github.com/certd/certd/compare/v1.37.15...v1.37.16) (2025-12-15)
**Note:** Version bump only for package @certd/lib-iframe
## [1.37.15](https://github.com/certd/certd/compare/v1.37.14...v1.37.15) (2025-12-06)
**Note:** Version bump only for package @certd/lib-iframe
## [1.37.14](https://github.com/certd/certd/compare/v1.37.13...v1.37.14) (2025-12-02)
**Note:** Version bump only for package @certd/lib-iframe
## [1.37.13](https://github.com/certd/certd/compare/v1.37.12...v1.37.13) (2025-12-02)
**Note:** Version bump only for package @certd/lib-iframe
## [1.37.12](https://github.com/certd/certd/compare/v1.37.11...v1.37.12) (2025-11-29)
**Note:** Version bump only for package @certd/lib-iframe
## [1.37.11](https://github.com/certd/certd/compare/v1.37.10...v1.37.11) (2025-11-28)
**Note:** Version bump only for package @certd/lib-iframe
## [1.37.10](https://github.com/certd/certd/compare/v1.37.9...v1.37.10) (2025-11-19)
**Note:** Version bump only for package @certd/lib-iframe
## [1.37.9](https://github.com/certd/certd/compare/v1.37.8...v1.37.9) (2025-11-19)
**Note:** Version bump only for package @certd/lib-iframe
## [1.37.8](https://github.com/certd/certd/compare/v1.37.7...v1.37.8) (2025-11-17)
**Note:** Version bump only for package @certd/lib-iframe
## [1.37.7](https://github.com/certd/certd/compare/v1.37.6...v1.37.7) (2025-11-12)
**Note:** Version bump only for package @certd/lib-iframe
## [1.37.6](https://github.com/certd/certd/compare/v1.37.5...v1.37.6) (2025-11-10)
**Note:** Version bump only for package @certd/lib-iframe
## [1.37.5](https://github.com/certd/certd/compare/v1.37.4...v1.37.5) (2025-11-08)
**Note:** Version bump only for package @certd/lib-iframe
## [1.37.4](https://github.com/certd/certd/compare/v1.37.3...v1.37.4) (2025-10-28)
**Note:** Version bump only for package @certd/lib-iframe
## [1.37.3](https://github.com/certd/certd/compare/v1.37.2...v1.37.3) (2025-10-24)
**Note:** Version bump only for package @certd/lib-iframe
## [1.37.2](https://github.com/certd/certd/compare/v1.37.1...v1.37.2) (2025-10-14)
**Note:** Version bump only for package @certd/lib-iframe
## [1.37.1](https://github.com/certd/certd/compare/v1.37.0...v1.37.1) (2025-09-29) ## [1.37.1](https://github.com/certd/certd/compare/v1.37.0...v1.37.1) (2025-09-29)
**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.37.1", "version": "1.37.16",
"type": "module", "type": "module",
"main": "./dist/index.js", "main": "./dist/index.js",
"module": "./dist/index.js", "module": "./dist/index.js",
@@ -31,5 +31,5 @@
"tslib": "^2.8.1", "tslib": "^2.8.1",
"typescript": "^5.4.2" "typescript": "^5.4.2"
}, },
"gitHead": "e17cd1f298a72595f01e466b5e5c8971828c6bd9" "gitHead": "fa14f6219810ddbfcf1dde7b69963ee8a36c80c4"
} }

View File

@@ -3,6 +3,68 @@
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.37.16](https://github.com/certd/certd/compare/v1.37.15...v1.37.16) (2025-12-15)
**Note:** Version bump only for package @certd/jdcloud
## [1.37.15](https://github.com/certd/certd/compare/v1.37.14...v1.37.15) (2025-12-06)
**Note:** Version bump only for package @certd/jdcloud
## [1.37.14](https://github.com/certd/certd/compare/v1.37.13...v1.37.14) (2025-12-02)
**Note:** Version bump only for package @certd/jdcloud
## [1.37.13](https://github.com/certd/certd/compare/v1.37.12...v1.37.13) (2025-12-02)
**Note:** Version bump only for package @certd/jdcloud
## [1.37.12](https://github.com/certd/certd/compare/v1.37.11...v1.37.12) (2025-11-29)
**Note:** Version bump only for package @certd/jdcloud
## [1.37.11](https://github.com/certd/certd/compare/v1.37.10...v1.37.11) (2025-11-28)
### Performance Improvements
* ssh支持ppk格式私钥 ([575ae16](https://github.com/certd/certd/commit/575ae164c863d0b1f9fa0890549a2ee7472fb469))
## [1.37.10](https://github.com/certd/certd/compare/v1.37.9...v1.37.10) (2025-11-19)
**Note:** Version bump only for package @certd/jdcloud
## [1.37.9](https://github.com/certd/certd/compare/v1.37.8...v1.37.9) (2025-11-19)
**Note:** Version bump only for package @certd/jdcloud
## [1.37.8](https://github.com/certd/certd/compare/v1.37.7...v1.37.8) (2025-11-17)
**Note:** Version bump only for package @certd/jdcloud
## [1.37.7](https://github.com/certd/certd/compare/v1.37.6...v1.37.7) (2025-11-12)
**Note:** Version bump only for package @certd/jdcloud
## [1.37.6](https://github.com/certd/certd/compare/v1.37.5...v1.37.6) (2025-11-10)
**Note:** Version bump only for package @certd/jdcloud
## [1.37.5](https://github.com/certd/certd/compare/v1.37.4...v1.37.5) (2025-11-08)
**Note:** Version bump only for package @certd/jdcloud
## [1.37.4](https://github.com/certd/certd/compare/v1.37.3...v1.37.4) (2025-10-28)
**Note:** Version bump only for package @certd/jdcloud
## [1.37.3](https://github.com/certd/certd/compare/v1.37.2...v1.37.3) (2025-10-24)
**Note:** Version bump only for package @certd/jdcloud
## [1.37.2](https://github.com/certd/certd/compare/v1.37.1...v1.37.2) (2025-10-14)
**Note:** Version bump only for package @certd/jdcloud
## [1.37.1](https://github.com/certd/certd/compare/v1.37.0...v1.37.1) (2025-09-29) ## [1.37.1](https://github.com/certd/certd/compare/v1.37.0...v1.37.1) (2025-09-29)
**Note:** Version bump only for package @certd/jdcloud **Note:** Version bump only for package @certd/jdcloud

View File

@@ -1,13 +1,11 @@
{ {
"name": "@certd/jdcloud", "name": "@certd/jdcloud",
"version": "1.37.1", "version": "1.37.16",
"description": "jdcloud openApi sdk", "description": "jdcloud openApi sdk",
"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",
"scripts": { "scripts": {
"test": "cross-env NODE_CONFIG_DIR=./test/config mocha --recursive --require babel-register",
"dev": "babel src --out-dir babel -w",
"build": "rollup -c ", "build": "rollup -c ",
"dev-build": "npm run build", "dev-build": "npm run build",
"pub": "npm publish" "pub": "npm publish"
@@ -15,7 +13,6 @@
"author": "", "author": "",
"license": "Apache", "license": "Apache",
"dependencies": { "dependencies": {
"babel-register": "^6.26.0",
"buffer": "^5.0.8", "buffer": "^5.0.8",
"create-hash": "^1.1.3", "create-hash": "^1.1.3",
"create-hmac": "^1.1.6", "create-hmac": "^1.1.6",
@@ -30,8 +27,6 @@
"@rollup/plugin-typescript": "^11.0.0", "@rollup/plugin-typescript": "^11.0.0",
"@typescript-eslint/eslint-plugin": "^8.26.1", "@typescript-eslint/eslint-plugin": "^8.26.1",
"@typescript-eslint/parser": "^8.26.1", "@typescript-eslint/parser": "^8.26.1",
"babel-cli": "^6.26.0",
"babel-preset-env": "^1.6.1",
"chai": "^4.1.2", "chai": "^4.1.2",
"config": "^1.30.0", "config": "^1.30.0",
"cross-env": "^5.1.4", "cross-env": "^5.1.4",
@@ -61,5 +56,5 @@
"fetch" "fetch"
] ]
}, },
"gitHead": "e17cd1f298a72595f01e466b5e5c8971828c6bd9" "gitHead": "fa14f6219810ddbfcf1dde7b69963ee8a36c80c4"
} }

View File

@@ -3,6 +3,69 @@
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.37.16](https://github.com/certd/certd/compare/v1.37.15...v1.37.16) (2025-12-15)
**Note:** Version bump only for package @certd/lib-k8s
## [1.37.15](https://github.com/certd/certd/compare/v1.37.14...v1.37.15) (2025-12-06)
### Performance Improvements
* 邮件模版安全优化 ([adca151](https://github.com/certd/certd/commit/adca151e4f07a4c6a2a753bfa48ee0d4d6469fd2))
* 支持k8s apply ([d55954a](https://github.com/certd/certd/commit/d55954a36391ebe6a9397ff7dcfb710193ac5e34))
## [1.37.14](https://github.com/certd/certd/compare/v1.37.13...v1.37.14) (2025-12-02)
**Note:** Version bump only for package @certd/lib-k8s
## [1.37.13](https://github.com/certd/certd/compare/v1.37.12...v1.37.13) (2025-12-02)
**Note:** Version bump only for package @certd/lib-k8s
## [1.37.12](https://github.com/certd/certd/compare/v1.37.11...v1.37.12) (2025-11-29)
**Note:** Version bump only for package @certd/lib-k8s
## [1.37.11](https://github.com/certd/certd/compare/v1.37.10...v1.37.11) (2025-11-28)
**Note:** Version bump only for package @certd/lib-k8s
## [1.37.10](https://github.com/certd/certd/compare/v1.37.9...v1.37.10) (2025-11-19)
**Note:** Version bump only for package @certd/lib-k8s
## [1.37.9](https://github.com/certd/certd/compare/v1.37.8...v1.37.9) (2025-11-19)
**Note:** Version bump only for package @certd/lib-k8s
## [1.37.8](https://github.com/certd/certd/compare/v1.37.7...v1.37.8) (2025-11-17)
**Note:** Version bump only for package @certd/lib-k8s
## [1.37.7](https://github.com/certd/certd/compare/v1.37.6...v1.37.7) (2025-11-12)
**Note:** Version bump only for package @certd/lib-k8s
## [1.37.6](https://github.com/certd/certd/compare/v1.37.5...v1.37.6) (2025-11-10)
**Note:** Version bump only for package @certd/lib-k8s
## [1.37.5](https://github.com/certd/certd/compare/v1.37.4...v1.37.5) (2025-11-08)
**Note:** Version bump only for package @certd/lib-k8s
## [1.37.4](https://github.com/certd/certd/compare/v1.37.3...v1.37.4) (2025-10-28)
**Note:** Version bump only for package @certd/lib-k8s
## [1.37.3](https://github.com/certd/certd/compare/v1.37.2...v1.37.3) (2025-10-24)
**Note:** Version bump only for package @certd/lib-k8s
## [1.37.2](https://github.com/certd/certd/compare/v1.37.1...v1.37.2) (2025-10-14)
**Note:** Version bump only for package @certd/lib-k8s
## [1.37.1](https://github.com/certd/certd/compare/v1.37.0...v1.37.1) (2025-09-29) ## [1.37.1](https://github.com/certd/certd/compare/v1.37.0...v1.37.1) (2025-09-29)
**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.37.1", "version": "1.37.16",
"type": "module", "type": "module",
"main": "./dist/index.js", "main": "./dist/index.js",
"module": "./dist/index.js", "module": "./dist/index.js",
@@ -17,7 +17,7 @@
"pub": "npm publish" "pub": "npm publish"
}, },
"dependencies": { "dependencies": {
"@certd/basic": "^1.37.1", "@certd/basic": "^1.37.16",
"@kubernetes/client-node": "0.21.0" "@kubernetes/client-node": "0.21.0"
}, },
"devDependencies": { "devDependencies": {
@@ -32,5 +32,5 @@
"tslib": "^2.8.1", "tslib": "^2.8.1",
"typescript": "^5.4.2" "typescript": "^5.4.2"
}, },
"gitHead": "e17cd1f298a72595f01e466b5e5c8971828c6bd9" "gitHead": "fa14f6219810ddbfcf1dde7b69963ee8a36c80c4"
} }

View File

@@ -1,4 +1,4 @@
import { CoreV1Api, KubeConfig, NetworkingV1Api, V1Ingress, V1Secret } from "@kubernetes/client-node"; import { CoreV1Api, KubeConfig, NetworkingV1Api, V1Ingress, V1Secret, KubernetesObjectApi, loadYaml, KubernetesObject } from "@kubernetes/client-node";
import dns from "dns"; import dns from "dns";
import { ILogger } from "@certd/basic"; import { ILogger } from "@certd/basic";
import { merge } from "lodash-es"; import { merge } from "lodash-es";
@@ -27,6 +27,11 @@ export class K8sClient {
} }
init() { init() {
const kubeconfig = this.getKubeConfig();
this.client = kubeconfig.makeApiClient(CoreV1Api);
}
getKubeConfig() {
const kubeconfig = new KubeConfig(); const kubeconfig = new KubeConfig();
kubeconfig.loadFromString(this.kubeConfigStr); kubeconfig.loadFromString(this.kubeConfigStr);
this.kubeconfig = kubeconfig; this.kubeconfig = kubeconfig;
@@ -41,16 +46,35 @@ export class K8sClient {
} catch (e) { } catch (e) {
this.logger.warn("skipTLSVerify error", e); this.logger.warn("skipTLSVerify error", e);
} }
return kubeconfig;
}
this.client = kubeconfig.makeApiClient(CoreV1Api); getKubeClient() {
const kc = this.getKubeConfig();
const client = KubernetesObjectApi.makeApiClient(kc);
return client;
}
// const reqOpts = { kubeconfig, request: {} } as any; async apply(manifest: string) {
// if (this.lookup) { const yml = loadYaml<KubernetesObject>(manifest);
// reqOpts.request.lookup = this.lookup; const client = this.getKubeClient();
// } try {
// await client.create(yml);
// const backend = new Request(reqOpts); } catch (e) {
// this.client = new Client({ backend, version: '1.13' }); this.logger.error("apply error", e.response?.body);
if (e.response?.body?.reason === "AlreadyExists") {
//patch
this.logger.info("patch existing resource: ", yml.metadata?.name);
const existing = await client.read(yml as any);
if (!yml.metadata) {
yml.metadata = {};
}
yml.metadata.resourceVersion = existing.body.metadata.resourceVersion;
await client.patch(yml);
return;
}
throw e;
}
} }
/** /**
@@ -168,6 +192,7 @@ export class K8sClient {
const oldIngress = await client.readNamespacedIngress(ingressName, namespace); const oldIngress = await client.readNamespacedIngress(ingressName, namespace);
const newIngress = merge(oldIngress.body, opts.body); const newIngress = merge(oldIngress.body, opts.body);
const res = await client.replaceNamespacedIngress(ingressName, namespace, newIngress); const res = await client.replaceNamespacedIngress(ingressName, namespace, newIngress);
this.logger.info("ingress patched", opts.body); this.logger.info("ingress patched", opts.body);
return res; return res;
} }

View File

@@ -3,6 +3,78 @@
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.37.16](https://github.com/certd/certd/compare/v1.37.15...v1.37.16) (2025-12-15)
### Bug Fixes
* 修复ipv6作为证书域名申请证书校验失败的bug ([e4e16bc](https://github.com/certd/certd/commit/e4e16bc6a65bb082c18ca0590226f0987a47d477))
### Performance Improvements
* 支持邮件模版设置 ([a6c0d2c](https://github.com/certd/certd/commit/a6c0d2c6f1fd6b60e6d7af290487c94564fd91ea))
## [1.37.15](https://github.com/certd/certd/compare/v1.37.14...v1.37.15) (2025-12-06)
**Note:** Version bump only for package @certd/lib-server
## [1.37.14](https://github.com/certd/certd/compare/v1.37.13...v1.37.14) (2025-12-02)
**Note:** Version bump only for package @certd/lib-server
## [1.37.13](https://github.com/certd/certd/compare/v1.37.12...v1.37.13) (2025-12-02)
### Performance Improvements
* 第三方登录允许选择logo ([bb3085e](https://github.com/certd/certd/commit/bb3085ef84201ccd2dc632ba8c5097cb00258be4))
## [1.37.12](https://github.com/certd/certd/compare/v1.37.11...v1.37.12) (2025-11-29)
**Note:** Version bump only for package @certd/lib-server
## [1.37.11](https://github.com/certd/certd/compare/v1.37.10...v1.37.11) (2025-11-28)
### Performance Improvements
* 支持oidc单点登录 ([ec75afb](https://github.com/certd/certd/commit/ec75afbc44139dbe9da534d8a8c08a5b91f86d3c))
## [1.37.10](https://github.com/certd/certd/compare/v1.37.9...v1.37.10) (2025-11-19)
**Note:** Version bump only for package @certd/lib-server
## [1.37.9](https://github.com/certd/certd/compare/v1.37.8...v1.37.9) (2025-11-19)
**Note:** Version bump only for package @certd/lib-server
## [1.37.8](https://github.com/certd/certd/compare/v1.37.7...v1.37.8) (2025-11-17)
**Note:** Version bump only for package @certd/lib-server
## [1.37.7](https://github.com/certd/certd/compare/v1.37.6...v1.37.7) (2025-11-12)
**Note:** Version bump only for package @certd/lib-server
## [1.37.6](https://github.com/certd/certd/compare/v1.37.5...v1.37.6) (2025-11-10)
**Note:** Version bump only for package @certd/lib-server
## [1.37.5](https://github.com/certd/certd/compare/v1.37.4...v1.37.5) (2025-11-08)
### Performance Improvements
* 支持列表展示时固定证书最大天数,有助于列表进度条整齐展示 ([4a94eab](https://github.com/certd/certd/commit/4a94eab3935c89a63892661d9cf0d0891e54aa81))
## [1.37.4](https://github.com/certd/certd/compare/v1.37.3...v1.37.4) (2025-10-28)
**Note:** Version bump only for package @certd/lib-server
## [1.37.3](https://github.com/certd/certd/compare/v1.37.2...v1.37.3) (2025-10-24)
**Note:** Version bump only for package @certd/lib-server
## [1.37.2](https://github.com/certd/certd/compare/v1.37.1...v1.37.2) (2025-10-14)
**Note:** Version bump only for package @certd/lib-server
## [1.37.1](https://github.com/certd/certd/compare/v1.37.0...v1.37.1) (2025-09-29) ## [1.37.1](https://github.com/certd/certd/compare/v1.37.0...v1.37.1) (2025-09-29)
**Note:** Version bump only for package @certd/lib-server **Note:** Version bump only for package @certd/lib-server

View File

@@ -1,6 +1,6 @@
{ {
"name": "@certd/lib-server", "name": "@certd/lib-server",
"version": "1.37.1", "version": "1.37.16",
"description": "midway with flyway, sql upgrade way ", "description": "midway with flyway, sql upgrade way ",
"private": false, "private": false,
"type": "module", "type": "module",
@@ -17,7 +17,8 @@
"lint": "mwts check", "lint": "mwts check",
"lint:fix": "mwts fix", "lint:fix": "mwts fix",
"prepublish": "npm run build", "prepublish": "npm run build",
"pub": "npm publish" "pub": "npm publish",
"compile": "tsc --skipLibCheck --watch"
}, },
"keywords": [], "keywords": [],
"author": "greper", "author": "greper",
@@ -27,11 +28,11 @@
], ],
"license": "AGPL", "license": "AGPL",
"dependencies": { "dependencies": {
"@certd/acme-client": "^1.37.1", "@certd/acme-client": "^1.37.16",
"@certd/basic": "^1.37.1", "@certd/basic": "^1.37.16",
"@certd/pipeline": "^1.37.1", "@certd/pipeline": "^1.37.16",
"@certd/plugin-lib": "^1.37.1", "@certd/plugin-lib": "^1.37.16",
"@certd/plus-core": "^1.37.1", "@certd/plus-core": "^1.37.16",
"@midwayjs/cache": "3.14.0", "@midwayjs/cache": "3.14.0",
"@midwayjs/core": "3.20.11", "@midwayjs/core": "3.20.11",
"@midwayjs/i18n": "3.20.13", "@midwayjs/i18n": "3.20.13",
@@ -63,5 +64,5 @@
"typeorm": "^0.3.11", "typeorm": "^0.3.11",
"typescript": "^5.4.2" "typescript": "^5.4.2"
}, },
"gitHead": "e17cd1f298a72595f01e466b5e5c8971828c6bd9" "gitHead": "fa14f6219810ddbfcf1dde7b69963ee8a36c80c4"
} }

View File

@@ -47,4 +47,12 @@ export abstract class BaseController {
} }
return user; return user;
} }
isAdmin() {
const roleIds: number[] = this.ctx?.user?.roles;
if (roleIds?.includes(1)) {
return true;
}
}
} }

View File

@@ -1,5 +1,5 @@
import { PermissionException, ValidateException } from './exception/index.js'; import { PermissionException, ValidateException } from './exception/index.js';
import { In, Repository, SelectQueryBuilder } from 'typeorm'; import { FindOneOptions, 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';
@@ -238,4 +238,8 @@ export abstract class BaseService<T> {
await this.delete(ids); await this.delete(ids);
} }
async findOne(options: FindOneOptions<T>) {
return await this.getRepository().findOne(options);
}
} }

View File

@@ -2,3 +2,4 @@ export * from './service/plus-service.js';
export * from './service/file-service.js'; export * from './service/file-service.js';
export * from './service/encryptor.js'; export * from './service/encryptor.js';
export * from './service/ocr-service.js'; export * from './service/ocr-service.js';
export * from './service/executor-queue.js';

View File

@@ -0,0 +1,79 @@
import { logger } from "@certd/basic";
export type TaskItem = {
task: ()=>Promise<void>;
}
export class UserTaskQueue{
userId: number;
pendingQueue: TaskItem[] = [];
runningQueue: TaskItem[] = [];
getMaxRunningCount: ()=>number ;
constructor(req: { userId: number ,getMaxRunningCount: ()=>number }) {
this.userId = req.userId;
this.getMaxRunningCount = req.getMaxRunningCount ;
}
addTask(task: TaskItem) {
this.pendingQueue.push(task);
this.runTask();
}
runTask() {
logger.info(`[user_${this.userId}]当前运行队列:${this.runningQueue.length}, 等待队列:${this.pendingQueue.length},最大运行队列:${this.getMaxRunningCount()}`);
if (this.runningQueue.length >= this.getMaxRunningCount()) {
return;
}
if (this.pendingQueue.length === 0) {
return;
}
const task = this.pendingQueue.shift();
if (!task) {
return;
}
// 执行任务
this.runningQueue.push(task);
const call = async ()=>{
try{
await task.task();
}finally{
// 任务执行完成,从运行队列中移除
const index = this.runningQueue.indexOf(task);
if (index > -1) {
this.runningQueue.splice(index, 1);
}
// 继续执行下一个任务
this.runTask();
}
}
logger.info(`[user_${this.userId}]执行任务,当前运行队列:${this.runningQueue.length}, 等待队列:${this.pendingQueue.length}`);
call()
}
}
export class ExecutorQueue{
queues: Record<number, UserTaskQueue> = {};
maxRunningCount: number = 8;
setMaxRunningCount(count: number) {
this.maxRunningCount = count;
}
getUserQueue(userId: number) {
const userQueue = this.queues[userId];
if (!userQueue) {
this.queues[userId] = new UserTaskQueue({ userId, getMaxRunningCount: ()=>this.maxRunningCount });
}
return this.queues[userId];
}
addTask(userId: number, task: TaskItem) {
const userQueue = this.getUserQueue(userId);
userQueue.addTask(task);
}
}
export const executorQueue = new ExecutorQueue();

View File

@@ -14,7 +14,7 @@ export const uploadTmpFileCacheKey = 'tmpfile_key_';
/** /**
*/ */
@Provide() @Provide()
@Scope(ScopeEnum.Request, { allowDowngrade: true }) @Scope(ScopeEnum.Singleton, { allowDowngrade: true })
export class FileService { export class FileService {
async saveFile(userId: number, tmpCacheKey: any, permission: 'public' | 'private') { async saveFile(userId: number, tmpCacheKey: any, permission: 'public' | 'private') {
if (tmpCacheKey.startsWith(`/${permission}`)) { if (tmpCacheKey.startsWith(`/${permission}`)) {

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