docs: 自动升级帮助文档

v2-dev-auto
xiaojunnuo 2025-07-11 17:37:33 +08:00
parent 24d3096752
commit 8273031d7e
5 changed files with 87 additions and 20 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -13,4 +13,54 @@
::: :::
## 升级日志 ## 升级日志
可以查看最新版本号,以及所有版本的更新日志
[CHANGELOG](../changelogs/CHANGELOG.md) [CHANGELOG](../changelogs/CHANGELOG.md)
## 自动升级配置
### 1. 方法一使用watchtower监控
修改docker-compose.yaml文件增加如下配置 使用watchtower监控自动升级
```yaml
services:
certd:
...
labels:
com.centurylinklabs.watchtower.enable: "true"
# ↓↓↓↓ --------------------------------------------------------- 自动升级上面certd的版本号要保持为latest
certd-updater: # 添加 Watchtower 服务
image: containrrr/watchtower:latest
container_name: certd-updater
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
# 配置 自动更新
environment:
- WATCHTOWER_CLEANUP=true # 自动清理旧版本容器
- WATCHTOWER_INCLUDE_STOPPED=false # 不更新已停止的容器
- WATCHTOWER_LABEL_ENABLE=true # 根据容器标签进行更新
- WATCHTOWER_POLL_INTERVAL=600 # 每 10 分钟检查一次更新
```
### 2. 方法二使用Certd版本监控功能
选择Github-检查Release版本插件
![](./images/github-release.png)
按如下图填写配置
![](./images/github-release-2.png)
检测到新版本后执行宿主机升级命令:
```shell
# 拉取最新镜像
docker pull registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest
# 升级容器命令, 替换成你自己的certd更新命令
export RESTART_CERT='sleep 10; cd ~/deploy/certd/ ; docker compose down; docker compose up -d'
# 构造一个脚本10s后在后台执行避免容器销毁时执行太快导致流水线任务无法结束
nohup sh -c '$RESTART_CERT' >/dev/null 2>&1 & echo '10秒后重启' && exit
```

View File

@ -491,7 +491,7 @@ export class SshClient {
* Set-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\cmd.exe" * Set-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\cmd.exe"
* @param options * @param options
*/ */
async exec(options: { connectConf: SshAccess; script: string | Array<string>; env?: any; throwOnStdErr?: boolean }): Promise<string> { async exec(options: { connectConf: SshAccess; script: string | Array<string>; env?: any; throwOnStdErr?: boolean; stopOnError?: boolean }): Promise<string> {
let { script } = options; let { script } = options;
const { connectConf, throwOnStdErr } = options; const { connectConf, throwOnStdErr } = options;
@ -506,6 +506,10 @@ export class SshClient {
isWinCmd = await this.isCmd(conn); isWinCmd = await this.isCmd(conn);
} }
if (isLinux && options.stopOnError !== false) {
script = "set -e\n" + script;
}
if (options.env) { if (options.env) {
for (const key in options.env) { for (const key in options.env) {
if (isLinux) { if (isLinux) {
@ -538,6 +542,7 @@ export class SshClient {
script = envScripts.join(newLine) + newLine + script; script = envScripts.join(newLine) + newLine + script;
} }
} }
return await conn.exec(script as string, { throwOnStdErr }); return await conn.exec(script as string, { throwOnStdErr });
}, },
}); });

View File

@ -47,7 +47,7 @@ export class GithubCheckRelease extends AbstractTaskPlugin {
mode:"tags" mode:"tags"
} }
}, },
required:true, required:false,
}) })
notificationIds!: number[]; notificationIds!: number[];
@ -74,9 +74,21 @@ export class GithubCheckRelease extends AbstractTaskPlugin {
name: 'a-textarea', name: 'a-textarea',
vModel: 'value', vModel: 'value',
rows: 6, rows: 6,
placeholder: `#拉取最新版镜像\ndocker pull greper/certd:latest \n#重建容器 \nnohup sh -c 'sleep 10; cd ~/deploy/certd/ ; docker compose down; docker compose up -d' >/dev/null & `, placeholder: `
#
docker pull registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest
#
export RESTART_CERT='sleep 10; cd ~/deploy/certd/ ; docker compose down; docker compose up -d'
# 10s线
nohup sh -c '$RESTART_CERT' >/dev/null 2>&1 & echo '10' && exit`,
}, },
helper: '有新版本后执行命令,比如:拉取最新版镜像,然后重建容器\n注意自己升级自己需要使用nobup配合sleep', helper: `有新版本后执行命令,比如:拉取最新版镜像,然后重建容器
使nohupsleep
docker pull registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest
export RESTART_CERT='sleep 10; cd ~/deploy/certd/ ; docker compose down; docker compose up -d'
nohup sh -c '$RESTART_CERT' >/dev/null 2>&1 & echo '10' && exit
`,
required: false, required: false,
}) })
script!: string; script!: string;
@ -108,24 +120,24 @@ export class GithubCheckRelease extends AbstractTaskPlugin {
//仅每行开头的* 替换成 - *号前面可以有空格 //仅每行开头的* 替换成 - *号前面可以有空格
const body = res.body.replace(/^(\s*)\* /gm, "$1- ") const body = res.body.replace(/^(\s*)\* /gm, "$1- ")
if (this.notificationIds == null){ if (this.notificationIds && this.notificationIds.length > 0){
this.notificationIds = [0] //发送通知
} for (const notificationId of this.notificationIds) {
//发送通知 await this.ctx.notificationService.send({
for (const notificationId of this.notificationIds) { id: notificationId,
await this.ctx.notificationService.send({ useDefault: false,
id: notificationId, useEmail:false,
useDefault: false, logger: this.logger,
useEmail:false, body: {
logger: this.logger, title: `${this.repoName} 新版本 ${this.lastVersion} 发布`,
body: { content: `${body}\n\n > [Certd](https://certd.docmirror.cn),不止证书自动化,插件解锁无限可能!\n\n`,
title: `${this.repoName} 新版本 ${this.lastVersion} 发布`, url: `https://github.com/${this.repoName}/releases/tag/${this.lastVersion}`,
content: `${body}\n\n > [Certd](https://certd.docmirror.cn),不止证书自动化,插件解锁无限可能!\n\n`, }
url: `https://github.com/${this.repoName}/releases/tag/${this.lastVersion}`, })
} }
})
} }
if (this.script != null && this.script.trim() != "") { if (this.script != null && this.script.trim() != "") {
const connectConf = await this.getAccess(this.sshAccessId); const connectConf = await this.getAccess(this.sshAccessId);
const sshClient = new SshClient(this.logger); const sshClient = new SshClient(this.logger);