diff --git a/.github/workflows/build-image.yml b/.github/workflows/build-image.yml index 988feb2a..6af570c0 100644 --- a/.github/workflows/build-image.yml +++ b/.github/workflows/build-image.yml @@ -64,10 +64,10 @@ jobs: username: ${{ secrets.dockerhub_username }} password: ${{ secrets.dockerhub_password }} - - name: Build and push + - name: Build default platforms uses: docker/build-push-action@v6 with: - platforms: linux/amd64,linux/arm64,linux/arm/v7 + platforms: linux/amd64,linux/arm64 push: true context: ./packages/ui/ tags: | @@ -75,3 +75,15 @@ jobs: registry.cn-shenzhen.aliyuncs.com/handsfree/certd:${{steps.get_certd_version.outputs.result}} greper/certd:latest greper/certd:${{steps.get_certd_version.outputs.result}} + + - name: Build armv7 + uses: docker/build-push-action@v6 + with: + platforms: linux/arm/v7 + push: true + context: ./packages/ui/ + tags: | + registry.cn-shenzhen.aliyuncs.com/handsfree/certd:armv7 + registry.cn-shenzhen.aliyuncs.com/handsfree/certd:${{steps.get_certd_version.outputs.result}}-armv7 + greper/certd:armv7 + greper/certd:${{steps.get_certd_version.outputs.result}}-armv7 diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f9cc57c..1c7fe759 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,20 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.24.4](https://github.com/certd/certd/compare/v1.24.3...v1.24.4) (2024-09-09) + +### Bug Fixes + +* 修复腾讯云cdn证书部署后会自动关闭hsts,http2.0等配置的bug ([7908ab7](https://github.com/certd/certd/commit/7908ab79da624c94fa05849925b15e480e3317c4)) +* 修复腾讯云tke证书部署报错的bug ([653f409](https://github.com/certd/certd/commit/653f409d91a441850d6381f89a8dd390831f0d5e)) + +### Performance Improvements + +* 插件选择支持搜索 ([d1498a7](https://github.com/certd/certd/commit/d1498a71601b74d38343b1d070eadd03705dd9d5)) +* 前置任务步骤增加错误提示 ([ae3daa9](https://github.com/certd/certd/commit/ae3daa9bcf4fc363825aad9b77f5d3879aeeff70)) +* 群晖部署教程 ([0f0af2f](https://github.com/certd/certd/commit/0f0af2f309390f388e7a272cea3a1dd30c01977d)) +* 支持群晖 ([5c270b6](https://github.com/certd/certd/commit/5c270b6b9d45a2152f9fdb3c07bd98b7c803cb8e)) + ## [1.24.3](https://github.com/certd/certd/compare/v1.24.2...v1.24.3) (2024-09-06) ### Performance Improvements diff --git a/README.md b/README.md index 994a50e2..b4386d45 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ https://afdian.com/a/greper 1. 可加入发电专属群,可以获得作者一对一技术支持 2. 您的需求我们将优先实现,并且将作为专业版功能提供 3. 一年期专业版激活码 -4. 赠送国外免费服务器部署方案(0成本使用Certd,不过该服务器需要翻墙) +4. 赠送国外免费服务器部署方案(0成本使用Certd,可能需要翻墙,不过现在性能越来越差了) 专业版特权 1. 证书流水线条数无限制(免费版限制10条) @@ -101,9 +101,11 @@ docker compose up -d #### 镜像说明: * 国内镜像地址: * `registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest` + * `registry.cn-shenzhen.aliyuncs.com/handsfree/certd:armv7`、`[version]-armv7` * DockerHub地址: * `https://hub.docker.com/r/greper/certd` - * `docker pull greper/certd:latest` + * `greper/certd:latest` + * `greper/certd:armv7`、`greper/certd:[version]-armv7` * 镜像构建通过`Actions`自动执行,过程公开透明,请放心使用 * [点我查看镜像构建日志](https://github.com/certd/certd/actions/workflows/build-image.yml) @@ -157,6 +159,7 @@ docker compose up -d * [腾讯云](./doc/tencent/tencent.md) * [windows主机](./doc/host/host.md) * [google证书](./doc/google/google.md) +* [群晖部署certd及证书更新教程](./doc/synology/index.md) ## 八、问题处理 diff --git a/build.trigger b/build.trigger index 7f8f011e..d00491fd 100644 --- a/build.trigger +++ b/build.trigger @@ -1 +1 @@ -7 +1 diff --git a/doc/deploy/koyeb.md b/doc/deploy/koyeb.md new file mode 100644 index 00000000..e69de29b diff --git a/doc/synology/images/1.png b/doc/synology/images/1.png new file mode 100644 index 00000000..f14146db Binary files /dev/null and b/doc/synology/images/1.png differ diff --git a/doc/synology/images/2.png b/doc/synology/images/2.png new file mode 100644 index 00000000..38265f78 Binary files /dev/null and b/doc/synology/images/2.png differ diff --git a/doc/synology/images/3.png b/doc/synology/images/3.png new file mode 100644 index 00000000..d7705955 Binary files /dev/null and b/doc/synology/images/3.png differ diff --git a/doc/synology/images/4.png b/doc/synology/images/4.png new file mode 100644 index 00000000..5fdfe168 Binary files /dev/null and b/doc/synology/images/4.png differ diff --git a/doc/synology/images/5.png b/doc/synology/images/5.png new file mode 100644 index 00000000..7f3a853d Binary files /dev/null and b/doc/synology/images/5.png differ diff --git a/doc/synology/images/6.png b/doc/synology/images/6.png new file mode 100644 index 00000000..a735cb92 Binary files /dev/null and b/doc/synology/images/6.png differ diff --git a/doc/synology/images/deploy.png b/doc/synology/images/deploy.png new file mode 100644 index 00000000..dab6909a Binary files /dev/null and b/doc/synology/images/deploy.png differ diff --git a/doc/synology/index.md b/doc/synology/index.md new file mode 100644 index 00000000..bd0becc5 --- /dev/null +++ b/doc/synology/index.md @@ -0,0 +1,41 @@ +# 群晖部署和证书更新 + + +## 一、群晖系统上部署Certd教程 + +### 1. 打开Container Manager + +![](./images/1.png) + +### 2. 新增项目 + +![](./images/2.png) + +### 3. 配置Certd项目 + +![](./images/3.png) + +### 4. 外网访问设置 + +![](./images/4.png) + +### 5. 确认项目信息 + +![](./images/5.png) + +点击完成安装,等待certd启动完成即可 + +### 6. 门户配置向导【可选】 + +![](./images/6.png) + + + +## 二、更新群晖证书 + +## 1. 前提条件 +* 已经部署了certd +* 群晖上已经设置好了证书(证书建议设置好描述,插件需要根据描述查找证书) + +## 2. 在certd上配置自动更新群晖证书插件 +![](./images/deploy.png) \ No newline at end of file diff --git a/docker/run/docker-compose.yaml b/docker/run/docker-compose.yaml index 6aa1b865..595740b1 100644 --- a/docker/run/docker-compose.yaml +++ b/docker/run/docker-compose.yaml @@ -1,38 +1,40 @@ -version: '3.3' +#version: '3.3' services: certd: - # 镜像 # ↓↓↓↓↓ --- 镜像版本号,建议改成固定版本号【可选】 + # 镜像 # ↓↓↓↓↓ --- 镜像版本号,建议改成固定版本号 image: registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest container_name: certd # 容器名 restart: unless-stopped # 自动重启 volumes: - # ↓↓↓↓↓ -------------------------------------------------------- 数据库以及证书存储路径,默认存在宿主机的/data/certd/目录下【可选】 + # ↓↓↓↓↓ -------------------------------------------------------- 数据库以及证书存储路径,默认存在宿主机的/data/certd/目录下,【您需要定时备份此目录,以保障数据容灾】 - /data/certd:/app/data ports: # 端口映射 - # ↓↓↓↓ ---------------------------------------------------------- 如果端口有冲突,可以修改第一个7001为其他不冲突的端口号【可选】 + # ↓↓↓↓ ---------------------------------------------------------- 如果端口有冲突,可以修改第一个7001为其他不冲突的端口号 - "7001:7001" dns: - # 如果出现getaddrinfo ENOTFOUND等错误,可以尝试修改或注释dns配置 + # ↓↓↓↓ ---------------------------------------------------------- 如果出现getaddrinfo ENOTFOUND等错误,可以尝试修改或注释dns配置 - 223.5.5.5 - 223.6.6.6 - # ↓↓↓↓ ---------------------------------------------------------- 如果你服务器部署在国外,可以用8.8.8.8替换上面的dns【可选】 + # ↓↓↓↓ ---------------------------------------------------------- 如果你服务器部署在国外,可以用8.8.8.8替换上面的dns # - 8.8.8.8 # - 8.8.4.4 +# extra_hosts: + # ↓↓↓↓ ---------------------------------------------------------- 这里可以配置自定义hosts,外网域名可以指向本地局域网ip地址 +# - "localdomain.comm:192.168.1.3" environment: # 环境变量 - TZ=Asia/Shanghai #- HTTPS_PROXY=http://xxxxxx:xx #- HTTP_PROXY=http://xxxxxx:xx - # ↑↑↑↑↑ ------------------------------------- 这里可以设置http代理【可选】 + # ↑↑↑↑↑ ------------------------------------- 这里可以设置http代理 - certd_system_resetAdminPasswd=false - # ↑↑↑↑↑--------------------------- 如果忘记管理员密码,可以设置为true,重启之后,管理员密码将改成123456,然后请及时修改回false【可选】 + # ↑↑↑↑↑--------------------------- 如果忘记管理员密码,可以设置为true,重启之后,管理员密码将改成123456,然后请及时修改回false - certd_cron_immediateTriggerOnce=false - # ↑↑↑↑↑--------------------------- 如果设置为true,启动后所有配置了cron的流水线任务都将被立即触发一次【可选】 + # ↑↑↑↑↑--------------------------- 如果设置为true,启动后所有配置了cron的流水线任务都将被立即触发一次 - VITE_APP_ICP_NO= - # ↑↑↑↑↑ ----------------------------------------- 这里可以设置备案号【可选】 + # ↑↑↑↑↑ ----------------------------------------- 这里可以设置备案号 #- certd_koa_key=./data/ssl/cert.key #- certd_koa_cert=./data/ssl/cert.crt - # ↑↑↑↑↑ ----------------------------------------- 配置证书和key,则表示https方式启动,访问网址要使用 https://your.domain:7001【可选】 - + # ↑↑↑↑↑ ----------------------------------------- 配置证书和key,则表示https方式启动,使用https协议访问,https://your.domain:7001 # 设置环境变量即可自定义certd配置 # 服务端配置项见: packages/ui/certd-server/src/config/config.default.ts # 服务端配置规则: certd_ + 配置项, 点号用_代替 diff --git a/lerna.json b/lerna.json index 0010b0ed..2e236bdc 100644 --- a/lerna.json +++ b/lerna.json @@ -9,5 +9,5 @@ } }, "npmClient": "pnpm", - "version": "1.24.3" + "version": "1.24.4" } diff --git a/packages/core/acme-client/CHANGELOG.md b/packages/core/acme-client/CHANGELOG.md index 91c170c4..a2c3b14c 100644 --- a/packages/core/acme-client/CHANGELOG.md +++ b/packages/core/acme-client/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.24.4](https://github.com/publishlab/node-acme-client/compare/v1.24.3...v1.24.4) (2024-09-09) + +**Note:** Version bump only for package @certd/acme-client + ## [1.24.3](https://github.com/publishlab/node-acme-client/compare/v1.24.2...v1.24.3) (2024-09-06) **Note:** Version bump only for package @certd/acme-client diff --git a/packages/core/acme-client/package.json b/packages/core/acme-client/package.json index 12adb8d2..f38d4f0a 100644 --- a/packages/core/acme-client/package.json +++ b/packages/core/acme-client/package.json @@ -3,7 +3,7 @@ "description": "Simple and unopinionated ACME client", "private": false, "author": "nmorsman", - "version": "1.24.3", + "version": "1.24.4", "main": "src/index.js", "types": "types/index.d.ts", "license": "MIT", @@ -59,5 +59,5 @@ "bugs": { "url": "https://github.com/publishlab/node-acme-client/issues" }, - "gitHead": "c49ccbde93dbad7062ac39d4f18eca7d561f573f" + "gitHead": "6fe2d2c3288b698e9cbdc91725abcbb072278fab" } diff --git a/packages/core/pipeline/CHANGELOG.md b/packages/core/pipeline/CHANGELOG.md index e628644e..b2689e2f 100644 --- a/packages/core/pipeline/CHANGELOG.md +++ b/packages/core/pipeline/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.24.4](https://github.com/certd/certd/compare/v1.24.3...v1.24.4) (2024-09-09) + +### Performance Improvements + +* 前置任务步骤增加错误提示 ([ae3daa9](https://github.com/certd/certd/commit/ae3daa9bcf4fc363825aad9b77f5d3879aeeff70)) +* 群晖部署教程 ([0f0af2f](https://github.com/certd/certd/commit/0f0af2f309390f388e7a272cea3a1dd30c01977d)) +* 支持群晖 ([5c270b6](https://github.com/certd/certd/commit/5c270b6b9d45a2152f9fdb3c07bd98b7c803cb8e)) + ## [1.24.3](https://github.com/certd/certd/compare/v1.24.2...v1.24.3) (2024-09-06) ### Performance Improvements diff --git a/packages/core/pipeline/build.md b/packages/core/pipeline/build.md index 2895c169..f852c9ed 100644 --- a/packages/core/pipeline/build.md +++ b/packages/core/pipeline/build.md @@ -1 +1 @@ -23:19 +17:29 diff --git a/packages/core/pipeline/package.json b/packages/core/pipeline/package.json index 769f16a3..963fe489 100644 --- a/packages/core/pipeline/package.json +++ b/packages/core/pipeline/package.json @@ -1,7 +1,7 @@ { "name": "@certd/pipeline", "private": false, - "version": "1.24.3", + "version": "1.24.4", "type": "module", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -20,6 +20,7 @@ "lodash-es": "^4.17.21", "node-forge": "^1.3.1", "nodemailer": "^6.9.3", + "proxy-agent": "^6.4.0", "qs": "^6.11.2" }, "devDependencies": { @@ -57,5 +58,5 @@ "vite": "^4.3.8", "vue-tsc": "^1.6.5" }, - "gitHead": "c49ccbde93dbad7062ac39d4f18eca7d561f573f" + "gitHead": "6fe2d2c3288b698e9cbdc91725abcbb072278fab" } diff --git a/packages/core/pipeline/src/context/index.ts b/packages/core/pipeline/src/context/index.ts index 5c8c6b16..a4687574 100644 --- a/packages/core/pipeline/src/context/index.ts +++ b/packages/core/pipeline/src/context/index.ts @@ -1,6 +1,4 @@ -import { AxiosInstance } from "axios"; import { IContext } from "../core/index.js"; -export type HttpClient = AxiosInstance; export type UserContext = IContext; export type PipelineContext = IContext; diff --git a/packages/core/pipeline/src/core/executor.ts b/packages/core/pipeline/src/core/executor.ts index 4928dafa..3d7ef07f 100644 --- a/packages/core/pipeline/src/core/executor.ts +++ b/packages/core/pipeline/src/core/executor.ts @@ -12,7 +12,7 @@ import { RegistryItem } from "../registry/index.js"; import { Decorator } from "../decorator/index.js"; import { IEmailService } from "../service/index.js"; import { FileStore } from "./file-store.js"; -import { hashUtils } from "../utils/index.js"; +import { hashUtils, utils } from "../utils/index.js"; // import { TimeoutPromise } from "../utils/util.promise.js"; export type ExecutorOptions = { @@ -93,7 +93,7 @@ export class Executor { await this.notification("success"); } catch (e: any) { await this.notification("error", e); - this.logger.error("pipeline 执行失败", e.stack); + this.logger.error("pipeline 执行失败", e); } finally { clearInterval(intervalFlushLogId); await this.onChanged(this.runtime); @@ -104,11 +104,18 @@ export class Executor { async runWithHistory(runnable: Runnable, runnableType: string, run: () => Promise) { runnable.runnableType = runnableType; + this.runtime.start(runnable); - // const timeout = runnable.timeout ?? 20 * 60 * 1000; - await this.onChanged(this.runtime); try { + if (runnable.disabled) { + //该任务被禁用 + this.runtime.disabled(runnable); + return ResultType.disabled; + } + + await this.onChanged(this.runtime); + if (this.abort.signal.aborted) { this.runtime.cancel(runnable); return ResultType.canceled; @@ -217,11 +224,17 @@ export class Executor { if (item.component?.name === "pi-output-selector") { const contextKey = input[key]; if (contextKey != null) { + if (typeof contextKey !== "string") { + throw new Error(`步骤${step.title}的${item.title}属性必须为String类型,请重新配置该属性`); + } // "cert": "step.-BNFVPMKPu2O-i9NiOQxP.cert", const arr = contextKey.split("."); const id = arr[1]; const outputKey = arr[2]; input[key] = this.currentStatusMap.get(id)?.status?.output[outputKey] ?? this.lastStatusMap.get(id)?.status?.output[outputKey]; + if (input[key] == null) { + this.logger.warn(`${item.title}的配置未找到对应的输出值,请确认对应的前置任务是否存在或者是否执行正确`); + } } } }); @@ -231,14 +244,13 @@ export class Executor { //判断是否需要跳过 const lastNode = this.lastStatusMap.get(step.id); const lastResult = lastNode?.status?.status; + let inputChanged = true; + const lastInputHash = lastNode?.status?.inputHash; + if (lastInputHash && newInputHash && lastInputHash === newInputHash) { + //参数有变化 + inputChanged = false; + } if (step.strategy?.runStrategy === RunStrategy.SkipWhenSucceed) { - //如果是成功后跳过策略 - let inputChanged = true; - const lastInputHash = lastNode?.status?.inputHash; - if (lastInputHash && newInputHash && lastInputHash === newInputHash) { - //参数有变化 - inputChanged = false; - } if (lastResult != null && lastResult === ResultType.success && !inputChanged) { step.status!.output = lastNode?.status?.output; step.status!.files = lastNode?.status?.files; @@ -253,6 +265,7 @@ export class Executor { lastStatus, http, logger: currentLogger, + inputChanged, accessService: this.options.accessService, emailService: this.options.emailService, pipelineContext: this.pipelineContext, @@ -263,6 +276,7 @@ export class Executor { rootDir: this.options.fileRootDir, }), signal: this.abort.signal, + utils, }; instance.setCtx(taskCtx); diff --git a/packages/core/pipeline/src/core/run-history.ts b/packages/core/pipeline/src/core/run-history.ts index 4e4e6833..e6ee250a 100644 --- a/packages/core/pipeline/src/core/run-history.ts +++ b/packages/core/pipeline/src/core/run-history.ts @@ -74,6 +74,17 @@ export class RunHistory { this.log(runnable, `跳过`); } + disabled(runnable: Runnable) { + const now = new Date().getTime(); + const status = runnable.status; + _.merge(status, { + status: "canceled", + endTime: now, + result: "disabled", + }); + this.log(runnable, `禁用`); + } + error(runnable: Runnable, e: Error) { const now = new Date().getTime(); const status = runnable.status; @@ -107,8 +118,8 @@ export class RunHistory { logError(runnable: Runnable, e: Error) { // @ts-ignore - const errorInfo = runnable.runnableType == "step" ? e.stack : e.message; - this._loggers[runnable.id].error(`[${runnable.runnableType}] [${runnable.title}] :${errorInfo}`); + const errorInfo = runnable.runnableType === "step" ? e : e.message; + this._loggers[runnable.id].error(`[${runnable.runnableType}] [${runnable.title}] :`, errorInfo); } finally(runnable: Runnable) { diff --git a/packages/core/pipeline/src/dt/pipeline.ts b/packages/core/pipeline/src/dt/pipeline.ts index 90b74649..c9532327 100644 --- a/packages/core/pipeline/src/dt/pipeline.ts +++ b/packages/core/pipeline/src/dt/pipeline.ts @@ -70,6 +70,7 @@ export type Runnable = { default?: { [key: string]: any; }; + disabled?: boolean; }; export type EmailOptions = { @@ -108,6 +109,7 @@ export enum ResultType { error = "error", canceled = "canceled", skip = "skip", + disabled = "disabled", none = "none", } diff --git a/packages/core/pipeline/src/plugin/api.ts b/packages/core/pipeline/src/plugin/api.ts index 559f0c54..3436bd41 100644 --- a/packages/core/pipeline/src/plugin/api.ts +++ b/packages/core/pipeline/src/plugin/api.ts @@ -5,9 +5,9 @@ import { Logger } from "log4js"; import { IAccessService } from "../access/index.js"; import { IEmailService } from "../service/index.js"; import { IContext } from "../core/index.js"; -import { AxiosInstance } from "axios"; import { ILogger, logger } from "../utils/index.js"; - +import { HttpClient } from "../utils/util.request"; +import { utils } from "../utils/index.js"; export enum ContextScope { global, pipeline, @@ -57,17 +57,32 @@ export type TaskResult = { pipelineVars: Record; }; export type TaskInstanceContext = { + //流水线定义 pipeline: Pipeline; + //步骤定义 step: Step; + //日志 logger: Logger; + //当前步骤输入参数跟上一次执行比较是否有变化 + inputChanged: boolean; + //授权获取服务 accessService: IAccessService; + //邮件服务 emailService: IEmailService; + //流水线上下文 pipelineContext: IContext; + //用户上下文 userContext: IContext; - http: AxiosInstance; + //http请求客户端 + http: HttpClient; + //文件存储 fileStore: FileStore; + //上一次执行结果状态 lastStatus?: Runnable; + //用户取消信号 signal: AbortSignal; + //工具类 + utils: typeof utils; }; export abstract class AbstractTaskPlugin implements ITaskPlugin { diff --git a/packages/core/pipeline/src/utils/index.ts b/packages/core/pipeline/src/utils/index.ts index 76faa040..972d453b 100644 --- a/packages/core/pipeline/src/utils/index.ts +++ b/packages/core/pipeline/src/utils/index.ts @@ -1,11 +1,22 @@ import sleep from "./util.sleep.js"; -import { request } from "./util.request.js"; +import { http } from "./util.request.js"; +export * from "./util.request.js"; export * from "./util.log.js"; export * from "./util.file.js"; export * from "./util.sp.js"; -export * as promises from "./util.promise.js"; +export * from "./util.promise.js"; export * from "./util.hash.js"; +import { sp } from "./util.sp.js"; +import { hashUtils } from "./util.hash.js"; +import { promises } from "./util.promise.js"; +import { fileUtils } from "./util.file.js"; +import _ from "lodash-es"; export const utils = { sleep, - http: request, + http, + sp, + hash: hashUtils, + promises, + file: fileUtils, + _, }; diff --git a/packages/core/pipeline/src/utils/util.promise.ts b/packages/core/pipeline/src/utils/util.promise.ts index 5757e4b6..81e5f8fc 100644 --- a/packages/core/pipeline/src/utils/util.promise.ts +++ b/packages/core/pipeline/src/utils/util.promise.ts @@ -24,3 +24,8 @@ export function safePromise(callback: (resolve: (ret: T) => void, reject: (re } }); } + +export const promises = { + TimeoutPromise, + safePromise, +}; diff --git a/packages/core/pipeline/src/utils/util.request.ts b/packages/core/pipeline/src/utils/util.request.ts index 70632ae5..b2ad890a 100644 --- a/packages/core/pipeline/src/utils/util.request.ts +++ b/packages/core/pipeline/src/utils/util.request.ts @@ -1,29 +1,39 @@ -import axios from "axios"; +import axios, { AxiosRequestConfig } from "axios"; import { logger } from "./util.log.js"; import { Logger } from "log4js"; - +import { ProxyAgent, ProxyAgentOptions } from "proxy-agent"; export class HttpError extends Error { - request?: { url: string; method: string; data?: any }; - response?: { data: any }; status?: number; statusText?: string; + code?: string; + request?: { url: string; method: string; params?: any; data?: any }; + response?: { data: any }; + cause?: any; constructor(error: any) { if (!error) { return; } super(error.message); this.name = error.name; - this.stack = error.stack; - this.status = error?.response?.status; - this.statusText = error?.response?.statusText; + this.code = error.code; + this.cause = error.cause; + + this.status = error.response?.status; + this.statusText = error.response?.statusText; this.request = { - url: error?.response?.config?.url, - method: error?.response?.config?.method, - data: error?.response?.config?.data, + url: error.config?.url, + method: error.config?.method, + params: error.config?.params, + data: error.config?.data, }; this.response = { - data: error?.response?.data, + data: error.response?.data, }; + + delete error.response; + delete error.config; + delete error.request; + logger.error(error); } } /** @@ -32,10 +42,23 @@ export class HttpError extends Error { export function createAxiosService({ logger }: { logger: Logger }) { // 创建一个 axios 实例 const service = axios.create(); + + const defaultAgents = createAgent(); // 请求拦截 service.interceptors.request.use( (config: any) => { - logger.info(`http request:${config.url},method:${config.method}`); + logger.info(`http request:${config.url},method:${config.method},params:${JSON.stringify(config.params)}`); + if (config.timeout == null) { + config.timeout = 15000; + } + let agents = defaultAgents; + if (config.skipSslVerify) { + agents = createAgent({ rejectUnauthorized: config.rejectUnauthorized }); + } + + config.httpsAgent = agents.httpsAgent; + config.httpAgent = agents.httpAgent; + return config; }, (error: Error) => { @@ -51,25 +74,52 @@ export function createAxiosService({ logger }: { logger: Logger }) { return response.data; }, (error: any) => { - // const status = _.get(error, 'response.status') - // switch (status) { - // case 400: error.message = '请求错误'; break - // case 401: error.message = '未授权,请登录'; break - // case 403: error.message = '拒绝访问'; break - // case 404: error.message = `请求地址出错: ${error.response.config.url}`; break - // case 408: error.message = '请求超时'; break - // case 500: error.message = '服务器内部错误'; break - // case 501: error.message = '服务未实现'; break - // case 502: error.message = '网关错误'; break - // case 503: error.message = '服务不可用'; break - // case 504: error.message = '网关超时'; break - // case 505: error.message = 'HTTP版本不受支持'; break - // default: break - // } + const status = error.response?.status; + switch (status) { + case 400: + error.message = "请求错误"; + break; + case 401: + error.message = "未授权,请登录"; + break; + case 403: + error.message = "拒绝访问"; + break; + case 404: + error.message = `请求地址出错: ${error.response.config.url}`; + break; + case 408: + error.message = "请求超时"; + break; + case 500: + error.message = "服务器内部错误"; + break; + case 501: + error.message = "服务未实现"; + break; + case 502: + error.message = "网关错误"; + break; + case 503: + error.message = "服务不可用"; + break; + case 504: + error.message = "网关超时"; + break; + case 505: + error.message = "HTTP版本不受支持"; + break; + default: + break; + } logger.error( - `请求出错:status:${error?.response?.status},statusText:${error?.response?.statusText},url:${error?.config?.url},method:${error?.config?.method}。` + `请求出错:status:${error.response?.status},statusText:${error.response?.statusText},url:${error.config?.url},method:${error.config?.method}。` ); - logger.error("返回数据:", JSON.stringify(error?.response?.data)); + logger.error("返回数据:", JSON.stringify(error.response?.data)); + + if (error instanceof AggregateError) { + logger.error(error); + } const err = new HttpError(error); return Promise.reject(err); } @@ -77,4 +127,19 @@ export function createAxiosService({ logger }: { logger: Logger }) { return service; } -export const request = createAxiosService({ logger }); +export const http = createAxiosService({ logger }) as HttpClient; +export type HttpClientResponse = any; +export type HttpRequestConfig = { + skipSslVerify?: boolean; +} & AxiosRequestConfig; +export type HttpClient = { + request(config: HttpRequestConfig): Promise>; +}; + +export function createAgent(opts: ProxyAgentOptions = {}) { + const httpAgent = new ProxyAgent(opts); + return { + httpAgent, + httpsAgent: httpAgent, + }; +} diff --git a/packages/libs/lib-k8s/CHANGELOG.md b/packages/libs/lib-k8s/CHANGELOG.md index 553ff2ae..f50b18c2 100644 --- a/packages/libs/lib-k8s/CHANGELOG.md +++ b/packages/libs/lib-k8s/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.24.4](https://github.com/certd/certd/compare/v1.24.3...v1.24.4) (2024-09-09) + +**Note:** Version bump only for package @certd/lib-k8s + ## [1.24.3](https://github.com/certd/certd/compare/v1.24.2...v1.24.3) (2024-09-06) **Note:** Version bump only for package @certd/lib-k8s diff --git a/packages/libs/lib-k8s/package.json b/packages/libs/lib-k8s/package.json index f71387e5..7bdd9950 100644 --- a/packages/libs/lib-k8s/package.json +++ b/packages/libs/lib-k8s/package.json @@ -1,7 +1,7 @@ { "name": "@certd/lib-k8s", "private": false, - "version": "1.24.3", + "version": "1.24.4", "type": "module", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -16,7 +16,7 @@ "@kubernetes/client-node": "0.21.0" }, "devDependencies": { - "@certd/pipeline": "^1.24.3", + "@certd/pipeline": "^1.24.4", "@rollup/plugin-commonjs": "^23.0.4", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.0.1", @@ -37,5 +37,5 @@ "tslib": "^2.5.2", "typescript": "^4.8.4" }, - "gitHead": "c49ccbde93dbad7062ac39d4f18eca7d561f573f" + "gitHead": "6fe2d2c3288b698e9cbdc91725abcbb072278fab" } diff --git a/packages/libs/midway-flyway-js/CHANGELOG.md b/packages/libs/midway-flyway-js/CHANGELOG.md index b568db0e..1e8d644a 100644 --- a/packages/libs/midway-flyway-js/CHANGELOG.md +++ b/packages/libs/midway-flyway-js/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.24.4](https://github.com/certd/certd/compare/v1.24.3...v1.24.4) (2024-09-09) + +**Note:** Version bump only for package @certd/midway-flyway-js + ## [1.22.6](https://github.com/certd/certd/compare/v1.22.5...v1.22.6) (2024-08-03) **Note:** Version bump only for package @certd/midway-flyway-js diff --git a/packages/libs/midway-flyway-js/package.json b/packages/libs/midway-flyway-js/package.json index eaf5aa4c..7fcefc22 100644 --- a/packages/libs/midway-flyway-js/package.json +++ b/packages/libs/midway-flyway-js/package.json @@ -1,6 +1,6 @@ { "name": "@certd/midway-flyway-js", - "version": "1.22.6", + "version": "1.24.4", "description": "midway with flyway, sql upgrade way ", "private": false, "type": "module", @@ -53,5 +53,5 @@ "typeorm": "^0.3.11", "typescript": "~5.1.0" }, - "gitHead": "e5da46cfc31b2e30a4903bcb2251b1851265ef41" + "gitHead": "6fe2d2c3288b698e9cbdc91725abcbb072278fab" } diff --git a/packages/plugins/plugin-cert/CHANGELOG.md b/packages/plugins/plugin-cert/CHANGELOG.md index 01ef1437..b5ef9354 100644 --- a/packages/plugins/plugin-cert/CHANGELOG.md +++ b/packages/plugins/plugin-cert/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.24.4](https://github.com/certd/certd/compare/v1.24.3...v1.24.4) (2024-09-09) + +### Performance Improvements + +* 支持群晖 ([5c270b6](https://github.com/certd/certd/commit/5c270b6b9d45a2152f9fdb3c07bd98b7c803cb8e)) + ## [1.24.3](https://github.com/certd/certd/compare/v1.24.2...v1.24.3) (2024-09-06) **Note:** Version bump only for package @certd/plugin-cert diff --git a/packages/plugins/plugin-cert/package.json b/packages/plugins/plugin-cert/package.json index c961b7db..ab2ef440 100644 --- a/packages/plugins/plugin-cert/package.json +++ b/packages/plugins/plugin-cert/package.json @@ -1,7 +1,7 @@ { "name": "@certd/plugin-cert", "private": false, - "version": "1.24.3", + "version": "1.24.4", "type": "module", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -13,8 +13,8 @@ "preview": "vite preview" }, "dependencies": { - "@certd/acme-client": "^1.24.3", - "@certd/pipeline": "^1.24.3", + "@certd/acme-client": "^1.24.4", + "@certd/pipeline": "^1.24.4", "jszip": "^3.10.1", "node-forge": "^0.10.0", "psl": "^1.9.0" @@ -53,5 +53,5 @@ "vite": "^3.1.0", "vue-tsc": "^0.38.9" }, - "gitHead": "c49ccbde93dbad7062ac39d4f18eca7d561f573f" + "gitHead": "6fe2d2c3288b698e9cbdc91725abcbb072278fab" } diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/acme.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/acme.ts index e652c48a..5df20137 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/acme.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/acme.ts @@ -311,7 +311,7 @@ export class AcmeService { private async testDirectory(directoryUrl: string) { try { - await utils.http({ + await utils.http.request({ url: directoryUrl, method: "GET", timeout: 10000, diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/base.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/base.ts index e919be7a..26efb895 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/base.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/base.ts @@ -45,7 +45,7 @@ export abstract class CertApplyBasePlugin extends AbstractTaskPlugin { email!: string; @TaskInput({ - title: "PFX密码", + title: "PFX证书密码", component: { name: "a-input-password", vModel: "value", @@ -191,14 +191,14 @@ export abstract class CertApplyBasePlugin extends AbstractTaskPlugin { */ async condition() { if (this.forceUpdate) { + this.logger.info("强制更新证书选项已勾选,准备申请新证书"); return null; } - let inputChanged = false; - const oldInput = JSON.stringify(this.lastStatus?.input?.domains); - const thisInput = JSON.stringify(this.domains); - if (oldInput !== thisInput) { - inputChanged = true; + const inputChanged = this.ctx.inputChanged; + if (inputChanged) { + this.logger.info("输入参数变更,准备申请新证书"); + return null; } let oldCert: CertReader | undefined = undefined; @@ -212,11 +212,6 @@ export abstract class CertApplyBasePlugin extends AbstractTaskPlugin { return null; } - if (inputChanged) { - this.logger.info("输入参数变更,申请新证书"); - return null; - } - const ret = this.isWillExpire(oldCert.expires, this.renewDays); if (!ret.isWillExpire) { this.logger.info(`证书还未过期:过期时间${dayjs(oldCert.expires).format("YYYY-MM-DD HH:mm:ss")},剩余${ret.leftDays}天`); 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 0702b0f3..606a2aa4 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 @@ -69,13 +69,15 @@ export class CertReader { const tmpDerPath = this.saveToFile("der"); logger.info("本地文件写入成功"); try { - await opts.handle({ + return await opts.handle({ reader: this, tmpCrtPath: tmpCrtPath, tmpKeyPath: tmpKeyPath, tmpPfxPath: tmpPfxPath, tmpDerPath: tmpDerPath, }); + } catch (err) { + throw err; } finally { //删除临时文件 logger.info("删除临时文件"); diff --git a/packages/ui/Dockerfile b/packages/ui/Dockerfile index 962930f8..8271f4f5 100644 --- a/packages/ui/Dockerfile +++ b/packages/ui/Dockerfile @@ -8,7 +8,7 @@ RUN npm install -g pnpm@8.15.7 #RUN cd /workspace/certd-client && pnpm install && npm run build RUN cp /workspace/certd-client/dist/* /workspace/certd-server/public/ -rf -RUN cd /workspace/certd-server && yarn install && npm run build-on-docker +RUN cd /workspace/certd-server && pnpm install && npm run build-on-docker FROM node:18-alpine diff --git a/packages/ui/certd-client/CHANGELOG.md b/packages/ui/certd-client/CHANGELOG.md index 64aa8017..9e94e010 100644 --- a/packages/ui/certd-client/CHANGELOG.md +++ b/packages/ui/certd-client/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.24.4](https://github.com/certd/certd/compare/v1.24.3...v1.24.4) (2024-09-09) + +### Performance Improvements + +* 插件选择支持搜索 ([d1498a7](https://github.com/certd/certd/commit/d1498a71601b74d38343b1d070eadd03705dd9d5)) + ## [1.24.3](https://github.com/certd/certd/compare/v1.24.2...v1.24.3) (2024-09-06) **Note:** Version bump only for package @certd/ui-client diff --git a/packages/ui/certd-client/package.json b/packages/ui/certd-client/package.json index 28ba8ce0..4bc6adad 100644 --- a/packages/ui/certd-client/package.json +++ b/packages/ui/certd-client/package.json @@ -1,6 +1,6 @@ { "name": "@certd/ui-client", - "version": "1.24.3", + "version": "1.24.4", "private": true, "scripts": { "dev": "vite --open", @@ -58,7 +58,7 @@ "vuedraggable": "^4.1.0" }, "devDependencies": { - "@certd/pipeline": "^1.24.3", + "@certd/pipeline": "^1.24.4", "@rollup/plugin-commonjs": "^25.0.7", "@rollup/plugin-node-resolve": "^15.2.3", "@types/chai": "^4.3.12", diff --git a/packages/ui/certd-client/src/components/vip-button/index.vue b/packages/ui/certd-client/src/components/vip-button/index.vue index 9f41e9cf..8d44ee5e 100644 --- a/packages/ui/certd-client/src/components/vip-button/index.vue +++ b/packages/ui/certd-client/src/components/vip-button/index.vue @@ -143,6 +143,7 @@ function openUpgrade() {
站点ID: +
注意保存好数据库,暂不支持换绑(默认数据库路径/data/certd/db.sqlite)
diff --git a/packages/ui/certd-client/src/style/common.less b/packages/ui/certd-client/src/style/common.less index 52db4981..41cb8f55 100644 --- a/packages/ui/certd-client/src/style/common.less +++ b/packages/ui/certd-client/src/style/common.less @@ -68,6 +68,17 @@ h1, h2, h3, h4, h5, h6 { flex: 1; } +.flex-col{ + display: flex; + flex-direction: column; +} + +.scroll-y{ + overflow-y: auto; + +} + + .mb-2 { margin-bottom: 2px; } @@ -137,6 +148,13 @@ h1, h2, h3, h4, h5, h6 { .w-100 { width: 100%; } +.h-100 { + height: 100%; +} + +.overflow-hidden { + overflow: hidden; +} .block-header { margin: 3px; @@ -166,3 +184,17 @@ h1, h2, h3, h4, h5, h6 { .need-plus { color: #c5913f !important; } + + +.deleted{ + color: #c7c7c7; + //删除线 + text-decoration: line-through; +} + +.cursor-move{ + cursor: move !important; +} +.cursor-pointer{ + cursor: pointer; +} \ No newline at end of file diff --git a/packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/step-form/index.vue b/packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/step-form/index.vue index 91853f65..a30a1ae6 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/step-form/index.vue +++ b/packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/step-form/index.vue @@ -8,43 +8,61 @@ @@ -77,7 +95,7 @@