diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/cert-reader.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/cert-reader.ts index 8fbaa32d..66b8f24e 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/cert-reader.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/cert-reader.ts @@ -36,6 +36,7 @@ export class CertReader { detail: CertificateInfo; //毫秒时间戳 effective: number; + //毫秒时间戳 expires: number; constructor(certInfo: CertInfo) { this.cert = certInfo; diff --git a/packages/ui/certd-server/src/plugins/plugin-dokploy/access.ts b/packages/ui/certd-server/src/plugins/plugin-dokploy/access.ts index cdc8fafb..3a13131a 100644 --- a/packages/ui/certd-server/src/plugins/plugin-dokploy/access.ts +++ b/packages/ui/certd-server/src/plugins/plugin-dokploy/access.ts @@ -50,6 +50,14 @@ export class DokployAccess extends BaseAccess { return "ok" } + async getServerList(){ + const req = { + url :"/api/server.all", + method: "get", + } + return await this.doRequest(req); + } + async getCertList(){ const req = { url :"/api/certificates.all", @@ -96,7 +104,7 @@ export class DokployAccess extends BaseAccess { headers, baseURL: this.endpoint, ...req, - logRes: true, + logRes: false, }); } diff --git a/packages/ui/certd-server/src/plugins/plugin-dokploy/plugins/plugin-refresh-cert.ts b/packages/ui/certd-server/src/plugins/plugin-dokploy/plugins/plugin-refresh-cert.ts index 1e97beb6..000a3da9 100644 --- a/packages/ui/certd-server/src/plugins/plugin-dokploy/plugins/plugin-refresh-cert.ts +++ b/packages/ui/certd-server/src/plugins/plugin-dokploy/plugins/plugin-refresh-cert.ts @@ -1,13 +1,13 @@ import { AbstractTaskPlugin, IsTaskPlugin, PageSearch, pluginGroups, RunStrategy, TaskInput } from "@certd/pipeline"; -import {CertApplyPluginNames, CertInfo} from "@certd/plugin-cert"; +import {CertApplyPluginNames, CertInfo, CertReader} from "@certd/plugin-cert"; import {createCertDomainGetterInputDefine, createRemoteSelectInputDefine} from "@certd/plugin-lib"; import {DokployAccess} from "../access.js"; @IsTaskPlugin({ //命名规范,插件类型+功能(就是目录plugin-demo中的demo),大写字母开头,驼峰命名 name: "DokployRefreshCert", - title: "Dokploy-更新证书", - desc: "自动更新Dokploy证书", + title: "Dokploy-部署server证书", + desc: "自动更新Dokploy server证书", icon: "svg:icon-lucky", //插件分组 group: pluginGroups.panel.key, @@ -52,12 +52,12 @@ export class DokployRefreshCert extends AbstractTaskPlugin { createRemoteSelectInputDefine({ title: "证书名称", helper: "要更新的证书名称,如果这里没有,请先给手动绑定一次证书", - action: DokployRefreshCert.prototype.onGetCertList.name, + action: DokployRefreshCert.prototype.onGetServerList.name, pager: false, search: false }) ) - certList!: string[]; + serverList!: string[]; //插件实例化时执行的方法 async onInstance() { @@ -67,46 +67,61 @@ export class DokployRefreshCert extends AbstractTaskPlugin { async execute(): Promise { const access = await this.getAccess(this.accessId); + if (!this.serverList || this.serverList.length === 0) { + throw new Error("请先选择要部署证书的server"); + } + // await access.createCert({cert:this.cert}) - const certList = await access.getCertList(); + const oldCertList = await access.getCertList(); - for (const certId of this.certList) { - this.logger.info(`----------- 开始更新证书:${certId}`); - const [serverId,name] = certId.split("#"); - const founds = certList.filter((item: any) => item.name === name); - if (founds){ - for (const found of founds) { - await access.removeCert({id:found.certificateId}) - } + const certReader = new CertReader(this.cert); + for (const serverId of this.serverList) { + this.logger.info(`----------- 开始部署server证书:${serverId}`); + if(!serverId){ + this.logger.error(`----------- serverId不能为空,跳过更新`); + continue; } - await access.createCert({ - name, + name: certReader.buildCertName(), cert: this.cert, serverId: serverId, }); - this.logger.info(`----------- 更新证书${certId}成功`); + this.logger.info(`----------- 部署server${serverId}证书成功`); + } + + this.logger.info(`----------- 等待10秒后开始清理过期证书`); + await this.ctx.utils.sleep(10000); + //清理过期证书 + for (const certItem of oldCertList) { + + const certDetail = CertReader.readCertDetail(certItem.certificateData); + if (certDetail.expires.getTime() < new Date().getTime()){ + this.logger.info(`----------- 证书${certItem.certificateId}已过期`); + await access.removeCert({id:certItem.certificateId}); + this.logger.info(`----------- 清理过期证书${certItem.certificateId}成功`); + }else{ + this.logger.info(`----------- 证书${certItem.certificateId}还未过期`); + } } this.logger.info("部署完成"); } - async onGetCertList(data: PageSearch = {}) { + async onGetServerList(data: PageSearch = {}) { const access = await this.getAccess(this.accessId); - const res = await access.getCertList() + const res = await access.getServerList() const list = res if (!list || list.length === 0) { - throw new Error("没有找到证书,你可以直接手动输入id,如果id不存在将自动创建"); + throw new Error("没有找到Server,你可以直接手动输入serverId"); } const options = list.map((item: any) => { return { label: `${item.name}<${item.serverId}>`, - value: `${item.serverId}#${item.name}`, - domain: item.name + value: `${item.serverId}`, }; }); return options;