提交 65293bc1 authored 作者: 陈泽健's avatar 陈泽健

feat(middleware): 优化完善中间件检测脚本的容器自动检测功能,完善自检报告输出信息。输出服务自检脚本更新迭代记录。

- 实现容器名模糊匹配功能,支持多种命名模式(如 uredis、uredis2、redis 等)
- 修改脚本上传逻辑为强制覆盖模式,确保使用最新版本检测脚本
- 更新 Redis/MySQL/FastDFS 检测脚本的容器检测实现,移除硬编码容器名参数
- 修复 PowerShell 脚本变量未定义问题,从脚本输出中提取容器名和端口信息
- 补充中间件检测报告信息,显示容器名称、端口、版本等详细信息
- 改进 NTP 检测机制,实现多层级检测避免权限问题
- 修复 SSH 端口配置问题,确保非标准端口连接正常工作
上级 c1946f58
...@@ -6,7 +6,12 @@ ...@@ -6,7 +6,12 @@
"Bash(powershell -NoProfile -Command \"$content = Get-Content ''C:\\\\PycharmData\\\\ubains-module-test\\\\AuxiliaryTool\\\\ScriptTool\\\\远程更新程序\\\\remote_program_update.ps1'' -Raw -Encoding UTF8; $utf8BOM = New-Object System.Text.UTF8Encoding $true; [System.IO.File]::WriteAllText\\(''C:\\\\Users\\\\EDY\\\\Desktop\\\\test\\\\remote_program_update.ps1'', $content, $utf8BOM\\)\")", "Bash(powershell -NoProfile -Command \"$content = Get-Content ''C:\\\\PycharmData\\\\ubains-module-test\\\\AuxiliaryTool\\\\ScriptTool\\\\远程更新程序\\\\remote_program_update.ps1'' -Raw -Encoding UTF8; $utf8BOM = New-Object System.Text.UTF8Encoding $true; [System.IO.File]::WriteAllText\\(''C:\\\\Users\\\\EDY\\\\Desktop\\\\test\\\\remote_program_update.ps1'', $content, $utf8BOM\\)\")",
"Bash(dir \"C:\\\\PycharmData\\\\ubains-module-test\\\\AuxiliaryTool\\\\ScriptTool\\\\ServiceSelfInspection\")", "Bash(dir \"C:\\\\PycharmData\\\\ubains-module-test\\\\AuxiliaryTool\\\\ScriptTool\\\\ServiceSelfInspection\")",
"Bash(git checkout -- \"AuxiliaryTool/ScriptTool/远程更新程序/program_update.sh\" \"AuxiliaryTool/ScriptTool/远程更新程序/remote_program_update.ps1\")", "Bash(git checkout -- \"AuxiliaryTool/ScriptTool/远程更新程序/program_update.sh\" \"AuxiliaryTool/ScriptTool/远程更新程序/remote_program_update.ps1\")",
"Bash(ls -la \"C:\\\\PycharmData\\\\ubains-module-test\\\\.claude\\\\skills\\\\prd\"\" 2>/dev/null || echo \"Not found \")" "Bash(ls -la \"C:\\\\PycharmData\\\\ubains-module-test\\\\.claude\\\\skills\\\\prd\"\" 2>/dev/null || echo \"Not found \")",
"Bash(dir /s /b \"C:\\\\PycharmData\\\\ubains-module-test\\\\AuxiliaryTool\\\\ScriptTool\\\\ServiceSelfInspection\\\\*.log\")",
"Bash(cmd /c dir \"C:\\\\PycharmData\\\\ubains-module-test\\\\AuxiliaryTool\\\\ScriptTool\\\\ServiceSelfInspection\\\\issue_handler.sh\")",
"Bash(powershell -Command \"Copy-Item ''C:\\\\PycharmData\\\\ubains-module-test\\\\AuxiliaryTool\\\\ScriptTool\\\\问题处理\\\\issue_handler.sh'' ''C:\\\\PycharmData\\\\ubains-module-test\\\\AuxiliaryTool\\\\ScriptTool\\\\ServiceSelfInspection\\\\issue_handler.sh''\")",
"Bash(powershell -Command \"Remove-Item ''C:\\\\PycharmData\\\\ubains-module-test\\\\AuxiliaryTool\\\\ScriptTool\\\\ServiceSelfInspection\\\\issue_handler.sh'' -Force\")",
"Bash(powershell -Command \"$scriptDir = ''C:\\\\PycharmData\\\\ubains-module-test\\\\AuxiliaryTool\\\\ScriptTool\\\\ServiceSelfInspection''; $localScript = Join-Path $scriptDir ''..\\\\问题处理\\\\issue_handler.sh''; [System.IO.Path]::GetFullPath\\($localScript\\)\")"
] ]
} }
} }
#!/bin/bash #!/bin/bash
# verify_arm_fastdfs.sh # verify_arm_fastdfs.sh
# 自动检测FastDFS容器
CONTAINER=$(docker ps --format "{{.Names}}" | grep -E "utracker|tracker|ustorage|storage" | head -1)
if [[ -z "$CONTAINER" ]]; then
CONTAINER="utracker3" # 默认值
fi
echo "=== ARM服务器FastDFS验证 ===" echo "=== ARM服务器FastDFS验证 ==="
echo "部署模式: 单容器 (Tracker+Storage)" echo "部署模式: 单容器 (Tracker+Storage)"
echo "容器名称: utracker3" echo "检测到容器: $CONTAINER"
echo "网络模式: Host网络" echo "网络模式: Host网络"
echo "" echo ""
CONTAINER="utracker3"
CLIENT_CONF="/etc/fdfs/client.conf" CLIENT_CONF="/etc/fdfs/client.conf"
# 1. 检查服务状态 # 1. 检查服务状态
......
...@@ -8,14 +8,31 @@ GREEN='\033[0;32m' ...@@ -8,14 +8,31 @@ GREEN='\033[0;32m'
RED='\033[0;31m' RED='\033[0;31m'
NC='\033[0m' NC='\033[0m'
STORAGE_CONTAINER="ustorage" # 自动检测Storage和Tracker容器
TRACKER_CONTAINER="utracker" detect_containers() {
# 检测Storage容器
STORAGE_CONTAINER=$(docker ps --format "{{.Names}}" | grep -E "ustorage|storage" | head -1)
if [[ -z "$STORAGE_CONTAINER" ]]; then
STORAGE_CONTAINER="ustorage" # 默认值
fi
# 检测Tracker容器
TRACKER_CONTAINER=$(docker ps --format "{{.Names}}" | grep -E "utracker|tracker" | head -1)
if [[ -z "$TRACKER_CONTAINER" ]]; then
TRACKER_CONTAINER="utracker" # 默认值
fi
}
detect_containers
CLIENT_CONF="/etc/fdfs/client.conf" CLIENT_CONF="/etc/fdfs/client.conf"
echo "==========================================" echo "=========================================="
echo " FastDFS 最终功能验证" echo " FastDFS 最终功能验证"
echo "==========================================" echo "=========================================="
echo "" echo ""
echo "检测到容器: Storage=$STORAGE_CONTAINER, Tracker=$TRACKER_CONTAINER"
echo ""
# 1. 创建测试文件 # 1. 创建测试文件
TEST_FILE="/tmp/fastdfs_final_test_$(date +%s).txt" TEST_FILE="/tmp/fastdfs_final_test_$(date +%s).txt"
...@@ -71,7 +88,9 @@ if [[ $? -eq 0 ]] && [[ -n "$UPLOAD_RESULT" ]] && [[ "$UPLOAD_RESULT" == group* ...@@ -71,7 +88,9 @@ if [[ $? -eq 0 ]] && [[ -n "$UPLOAD_RESULT" ]] && [[ "$UPLOAD_RESULT" == group*
echo "6. 可选HTTP访问测试:" echo "6. 可选HTTP访问测试:"
# 获取访问URL # 获取访问URL
FILE_PATH=$(echo "$UPLOAD_RESULT" | sed 's|group1|/group1|') FILE_PATH=$(echo "$UPLOAD_RESULT" | sed 's|group1|/group1|')
echo " 访问URL: https://服务器IP$FILE_PATH" # 获取服务器IP地址
SERVER_IP=$(hostname -I | awk '{print $1}')
echo " 访问URL: https://${SERVER_IP}${FILE_PATH}"
else else
echo " ✗ 文件完整性验证失败" echo " ✗ 文件完整性验证失败"
......
#!/bin/bash #!/bin/bash
# MySQL容器健康检查报告 - 优化版 # MySQL容器健康检查报告 - 优化版
CONTAINER="${1:-umysql}" # 容器匹配模式(如果通过参数传递则使用,否则使用默认值)
CONTAINER_PATTERN="${1:-umysql}"
PASSWORD='dNrprU&2S' PASSWORD='dNrprU&2S'
# 自动检测MySQL容器(模糊匹配)
DETECTED_CONTAINER=$(docker ps --format "{{.Names}}" | grep -E "${CONTAINER_PATTERN}|mysql" | head -1)
if [[ -n "$DETECTED_CONTAINER" ]]; then
CONTAINER="$DETECTED_CONTAINER"
else
CONTAINER="$CONTAINER_PATTERN"
fi
echo "╔══════════════════════════════════════════════╗" echo "╔══════════════════════════════════════════════╗"
echo "║ MySQL容器全面健康检查报告 ║" echo "║ MySQL容器全面健康检查报告 ║"
echo "╠══════════════════════════════════════════════╣" echo "╠══════════════════════════════════════════════╣"
......
...@@ -53,25 +53,25 @@ log_error() { ...@@ -53,25 +53,25 @@ log_error() {
# 自动检测 Redis 容器 # 自动检测 Redis 容器
detect_redis_container() { detect_redis_container() {
log_info "正在检测 Redis 容器..." log_info "正在检测 Redis 容器..."
# 查找运行中的 Redis 容器 # 优先按匹配模式查找运行中的 Redis 容器(使用 grep -E 模糊匹配)
local containers=$(docker ps --filter "name=${CONTAINER_PATTERN}" --format "{{.Names}}" 2>/dev/null) local containers=$(docker ps --format "{{.Names}}" | grep -E "${CONTAINER_PATTERN}|redis" 2>/dev/null)
if [ -z "$containers" ]; then if [ -z "$containers" ]; then
log_warning "未找到名称包含 '$CONTAINER_PATTERN' 的 Redis 容器" log_warning "未找到名称包含 '${CONTAINER_PATTERN}' 或 'redis' 的容器"
# 尝试查找任何运行中的 Redis 容器 # 最后尝试:通过镜像名查找任何运行中的 Redis 容器
containers=$(docker ps --format "{{.Names}}" | xargs -I {} sh -c 'docker inspect {} --format "{{.Config.Image}}" 2>/dev/null | grep -qi redis && echo {}') containers=$(docker ps --format "{{.Names}}" | xargs -I {} sh -c 'docker inspect {} --format "{{.Config.Image}}" 2>/dev/null | grep -qi redis && echo {}')
if [ -z "$containers" ]; then if [ -z "$containers" ]; then
log_warning "未找到任何 Redis 容器" log_warning "未找到任何 Redis 容器"
return 1 return 1
fi fi
fi fi
# 统计找到的容器数量 # 统计找到的容器数量
local container_count=$(echo "$containers" | wc -l) local container_count=$(echo "$containers" | wc -l)
if [ $container_count -eq 1 ]; then if [ $container_count -eq 1 ]; then
REDIS_CONTAINER="$containers" REDIS_CONTAINER="$containers"
log_success "找到 Redis 容器: $REDIS_CONTAINER" log_success "找到 Redis 容器: $REDIS_CONTAINER"
...@@ -79,7 +79,7 @@ detect_redis_container() { ...@@ -79,7 +79,7 @@ detect_redis_container() {
else else
log_info "找到多个 Redis 容器:" log_info "找到多个 Redis 容器:"
echo "$containers" | nl -w2 -s'. ' echo "$containers" | nl -w2 -s'. '
# 选择第一个容器 # 选择第一个容器
REDIS_CONTAINER=$(echo "$containers" | head -1) REDIS_CONTAINER=$(echo "$containers" | head -1)
log_info "默认选择第一个容器: $REDIS_CONTAINER" log_info "默认选择第一个容器: $REDIS_CONTAINER"
......
...@@ -77,7 +77,8 @@ function Invoke-PlinkCommand { ...@@ -77,7 +77,8 @@ function Invoke-PlinkCommand {
[Parameter(Mandatory=$true)][string]$User, [Parameter(Mandatory=$true)][string]$User,
[Parameter(Mandatory=$true)][string]$Password, [Parameter(Mandatory=$true)][string]$Password,
[Parameter(Mandatory=$true)][string]$Command, [Parameter(Mandatory=$true)][string]$Command,
[switch]$NoDelay [switch]$NoDelay,
[switch]$BatchMode
) )
# 每次连接前短暂延迟,避免SSH连接冲突 # 每次连接前短暂延迟,避免SSH连接冲突
...@@ -85,8 +86,7 @@ function Invoke-PlinkCommand { ...@@ -85,8 +86,7 @@ function Invoke-PlinkCommand {
Start-Sleep -Milliseconds $SCRIPT:ConnectionDelayMs Start-Sleep -Milliseconds $SCRIPT:ConnectionDelayMs
} }
# 不使用 -batch 参数,允许交互式确认主机密钥 # 构建 plink 参数
# 注意:plink 的 -pw 直接传入即可;不要用奇怪的三引号拼接,容易导致解析出错
$args = @( $args = @(
"-ssh", "-ssh",
"-P", "$Port", "-P", "$Port",
...@@ -96,6 +96,11 @@ function Invoke-PlinkCommand { ...@@ -96,6 +96,11 @@ function Invoke-PlinkCommand {
$Command $Command
) )
# 批处理模式:自动接受主机密钥,不提示用户
if ($BatchMode) {
$args = @("-batch") + $args
}
Write-Info ("远端执行: {0}" -f $Command) Write-Info ("远端执行: {0}" -f $Command)
# 调试信息:显示连接参数(隐藏密码) # 调试信息:显示连接参数(隐藏密码)
Write-Info ("[DEBUG] 连接参数: Host={0}, Port={1}, User={2}, PwdLength={3}" -f $HostName, $Port, $User, $Password.Length) Write-Info ("[DEBUG] 连接参数: Host={0}, Port={1}, User={2}, PwdLength={3}" -f $HostName, $Port, $User, $Password.Length)
...@@ -231,6 +236,11 @@ Write-Info ("remote_program_update.ps1 version={0}" -f $SCRIPT_VERSION) ...@@ -231,6 +236,11 @@ Write-Info ("remote_program_update.ps1 version={0}" -f $SCRIPT_VERSION)
Write-Info ("PowerShell={0} Host={1}" -f $PSVersionTable.PSVersion, $env:COMPUTERNAME) Write-Info ("PowerShell={0} Host={1}" -f $PSVersionTable.PSVersion, $env:COMPUTERNAME)
Write-Info ("ScriptPath={0}" -f $PSCommandPath) Write-Info ("ScriptPath={0}" -f $PSCommandPath)
# 自动化模式说明
Write-Host "`n[自动化模式] 初始选择完成后,后续操作将自动执行,无需额外交互。" -ForegroundColor Green
Write-Host "[提示] 如首次连接该服务器,建议先手动运行 plink 建立主机密钥信任:" -ForegroundColor Yellow
Write-Host " plink.exe -ssh -P <端口> -l <用户> <服务器IP> 'echo test'`n" -ForegroundColor DarkGray
# 服务器预设选择 # 服务器预设选择
$usePreset = Read-Choice "是否使用服务器预设?" @("否(手动输入)", "是(使用预设)") $usePreset = Read-Choice "是否使用服务器预设?" @("否(手动输入)", "是(使用预设)")
$serverIp = "" $serverIp = ""
...@@ -298,7 +308,7 @@ if ($usePreset -eq "否(手动输入)") { ...@@ -298,7 +308,7 @@ if ($usePreset -eq "否(手动输入)") {
Write-Info "参数确认:IP=$serverIp Port=$sshPort User=$username RemoteDir=$remoteDir 平台=$platformType 系统=$systemType 更新=$updateType" Write-Info "参数确认:IP=$serverIp Port=$sshPort User=$username RemoteDir=$remoteDir 平台=$platformType 系统=$systemType 更新=$updateType"
} }
Write-Info "首次连接时会提示确认主机密钥,请选择 'yes' 确认。" Write-Info "使用自动批处理模式,后续操作将自动完成,无需额外交互。"
# 判断是否为中广核项目(需要特殊处理) # 判断是否为中广核项目(需要特殊处理)
$isCgnProject = ($platformType -eq "中广核项目") $isCgnProject = ($platformType -eq "中广核项目")
...@@ -307,13 +317,9 @@ if ($isCgnProject) { ...@@ -307,13 +317,9 @@ if ($isCgnProject) {
Write-Info "检测到中广核项目,将使用zip压缩包方式部署" Write-Info "检测到中广核项目,将使用zip压缩包方式部署"
# 后端服务器需要root密码,用于su切换,前端服务器(root用户)不需要 # 后端服务器需要root密码,用于su切换,前端服务器(root用户)不需要
if ($usePreset -eq "是(使用预设)" -and $preset -eq "测试环境-后端服务器") { if ($usePreset -eq "是(使用预设)" -and $preset -eq "测试环境-后端服务器") {
$useRootPreset = Read-Choice "是否使用预设的root密码?" @("是(使用预设)", "否(输入root密码)") # 自动使用预设root密码,不再询问
if ($useRootPreset -eq "是(使用预设)") { $rootPassword = "Admin@123Admin@123"
$rootPassword = "Admin@123Admin@123" Write-Info "后端服务器:自动使用预设的root密码进行su切换"
Write-Info "使用预设的root密码"
} else {
$rootPassword = Read-NonEmpty "请输入root密码"
}
} }
} }
...@@ -334,7 +340,7 @@ try { ...@@ -334,7 +340,7 @@ try {
} catch { } } catch { }
# -------------------- 连接测试(3.1) -------------------- # -------------------- 连接测试(3.1) --------------------
Invoke-PlinkCommand -PlinkPath $plink -HostName $serverIp -Port $sshPort -User $username -Password $plainPwd -Command "echo Connected; uname -a" Invoke-PlinkCommand -PlinkPath $plink -HostName $serverIp -Port $sshPort -User $username -Password $plainPwd -Command "echo Connected; uname -a" -BatchMode
Write-Info "SSH 连接测试成功。" Write-Info "SSH 连接测试成功。"
# 1) 远端创建目录 + 检查 unzip # 1) 远端创建目录 + 检查 unzip
...@@ -343,7 +349,7 @@ mkdir -p '$remoteDir'; ...@@ -343,7 +349,7 @@ mkdir -p '$remoteDir';
command -v unzip >/dev/null 2>&1 || (echo '缺少 unzip,请安装:yum install -y unzip 或 apt-get install -y unzip' && exit 2) command -v unzip >/dev/null 2>&1 || (echo '缺少 unzip,请安装:yum install -y unzip 或 apt-get install -y unzip' && exit 2)
"@ "@
Invoke-PlinkCommand -PlinkPath $plink -HostName $serverIp -Port $sshPort -User $username -Password $plainPwd -Command $cmdEnsureDirAndUnzip Invoke-PlinkCommand -PlinkPath $plink -HostName $serverIp -Port $sshPort -User $username -Password $plainPwd -Command $cmdEnsureDirAndUnzip -BatchMode
# ====== 3.2 本地准备:找到 zip 包 + program_update.sh ====== # ====== 3.2 本地准备:找到 zip 包 + program_update.sh ======
# 约定:zip 压缩包与本 remote_program_update.ps1 同级目录 # 约定:zip 压缩包与本 remote_program_update.ps1 同级目录
...@@ -380,7 +386,7 @@ Invoke-PscpUpload -PscpPath $pscp -HostName $serverIp -Port $sshPort -User $user ...@@ -380,7 +386,7 @@ Invoke-PscpUpload -PscpPath $pscp -HostName $serverIp -Port $sshPort -User $user
# 远端解压(解压到 remoteDir) # 远端解压(解压到 remoteDir)
$zipName = Split-Path $zipPath -Leaf $zipName = Split-Path $zipPath -Leaf
Invoke-PlinkCommand -PlinkPath $plink -HostName $serverIp -Port $sshPort -User $username -Password $plainPwd -Command "cd '$remoteDir' && unzip -o '$zipName' -d '$remoteDir'" Invoke-PlinkCommand -PlinkPath $plink -HostName $serverIp -Port $sshPort -User $username -Password $plainPwd -Command "cd '$remoteDir' && unzip -o '$zipName' -d '$remoteDir'" -BatchMode
# ====== 执行 program_update.sh 并下载备份包 ====== # ====== 执行 program_update.sh 并下载备份包 ======
# 等待文件系统同步完成 # 等待文件系统同步完成
...@@ -388,7 +394,7 @@ Write-Info "等待远端文件系统同步..." ...@@ -388,7 +394,7 @@ Write-Info "等待远端文件系统同步..."
Start-Sleep -Seconds 2 Start-Sleep -Seconds 2
# 额外打印远端 program_update.sh 版本,便于回溯 # 额外打印远端 program_update.sh 版本,便于回溯
Invoke-PlinkCommand -PlinkPath $plink -HostName $serverIp -Port $sshPort -User $username -Password $plainPwd -Command "cd '$remoteDir' && ./program_update.sh --version 2>/dev/null || true" Invoke-PlinkCommand -PlinkPath $plink -HostName $serverIp -Port $sshPort -User $username -Password $plainPwd -Command "cd '$remoteDir' && ./program_update.sh --version 2>/dev/null || true" -BatchMode
# 中广核项目需要根据服务器类型决定是否使用 su # 中广核项目需要根据服务器类型决定是否使用 su
if ($isCgnProject) { if ($isCgnProject) {
...@@ -398,11 +404,10 @@ if ($isCgnProject) { ...@@ -398,11 +404,10 @@ if ($isCgnProject) {
if ($needSu) { if ($needSu) {
Write-Info "中广核项目(后端服务器):使用 su 切换到root用户执行更新脚本" Write-Info "中广核项目(后端服务器):使用 su 切换到root用户执行更新脚本"
# 优化后的命令结构: # 使用 here-string 避免转义问题
# 1. 先设置环境变量 $execCmd = @"
# 2. 再用单引号包裹整个 su -c 命令 cd '$remoteDir' && echo '$rootPassword' | su - -c 'chmod +x ./program_update.sh && env LC_CTYPE=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8 ./program_update.sh --platform "$platformType" --system "$systemType" --update "$updateType" --workdir "$remoteDir"'
# 3. 使用 -- 作为参数分隔符 "@
$execCmd = "cd '$remoteDir' && echo '$rootPassword' | su - -c 'chmod +x ./program_update.sh && env LC_CTYPE=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8 ./program_update.sh --platform \"$platformType\" --system \"$systemType\" --update \"$updateType\" --workdir \"$remoteDir\"'"
} }
else { else {
Write-Info "中广核项目(前端服务器):直接执行更新脚本(root用户,无需su)" Write-Info "中广核项目(前端服务器):直接执行更新脚本(root用户,无需su)"
...@@ -422,7 +427,7 @@ cd '$remoteDir' && chmod +x ./program_update.sh && ./program_update.sh --platfor ...@@ -422,7 +427,7 @@ cd '$remoteDir' && chmod +x ./program_update.sh && ./program_update.sh --platfor
Write-Info "准备执行更新脚本..." Write-Info "准备执行更新脚本..."
Start-Sleep -Seconds 2 Start-Sleep -Seconds 2
$out = Invoke-PlinkCommand -PlinkPath $plink -HostName $serverIp -Port $sshPort -User $username -Password $plainPwd -Command $execCmd $out = Invoke-PlinkCommand -PlinkPath $plink -HostName $serverIp -Port $sshPort -User $username -Password $plainPwd -Command $execCmd -BatchMode
# 从输出解析 BACKUP_TAR # 从输出解析 BACKUP_TAR
# program_update.sh 输出格式:BACKUP_TAR=/home/Backup/BakYYYYmmdd_HHMMSS.tar.gz # program_update.sh 输出格式:BACKUP_TAR=/home/Backup/BakYYYYmmdd_HHMMSS.tar.gz
......
## 服务自检脚本使用说明
### 1、将整个Server_health_check文件夹拷贝到桌面
### 2、打开电脑的powershell
### 3、切换到Server_health_check文件夹路径
### 4、执行指令
Unblock-File -Path "C:\Users\UBAINS\Desktop\Sever_health_check\check_server_health.ps1"(后面路径替换成自己电脑上的路径!!!)
### 5、执行指令
.\check_server_health.ps1
### 6、步骤说明:
#### 6.1、服务器信息录入
根据提示输入0,再依次输入服务器IP地址、22端口、账号、密码信息即可。
#### 6.2、
...@@ -151,8 +151,7 @@ report_kv_set "mqtt.pubsub.detail" "消息发送与接收测试均成功" ...@@ -151,8 +151,7 @@ report_kv_set "mqtt.pubsub.detail" "消息发送与接收测试均成功"
| 主机地址 | REDIS_HOST | localhost | Redis服务器地址 | | 主机地址 | REDIS_HOST | localhost | Redis服务器地址 |
| 端口 | REDIS_PORT | 6379 | Redis服务端口 | | 端口 | REDIS_PORT | 6379 | Redis服务端口 |
| 密码 | REDIS_PASSWORD | dNrprU&2S | Redis认证密码 | | 密码 | REDIS_PASSWORD | dNrprU&2S | Redis认证密码 |
| 容器匹配模式 | CONTAINER_PATTERN | uredis | 容器名称匹配模式 | | 容器匹配模式 | CONTAINER_PATTERN | uredis | 容器名称模糊匹配模式(支持 uredis、uredis2、redis 等) |
| 自动检测 | AUTO_DETECT | true | 是否自动检测容器 |
**功能要求:** **功能要求:**
...@@ -204,12 +203,12 @@ report_kv_set "mqtt.pubsub.detail" "消息发送与接收测试均成功" ...@@ -204,12 +203,12 @@ report_kv_set "mqtt.pubsub.detail" "消息发送与接收测试均成功"
| 部署方式 | 说明 | | 部署方式 | 说明 |
|----------|------| |----------|------|
| PowerShell (远程SSH) | 自动上传:脚本会自动检测并上传 `check_redis.sh` 到目标服务器 | | PowerShell (远程SSH) | 强制覆盖上传:每次执行都会上传本地最新版本的 `check_redis.sh` 覆盖远程脚本 |
| Shell (本地执行) | 手动部署:需确保 `check_redis.sh``check_server_health.sh` 在同一目录 | | Shell (本地执行) | 手动部署:需确保 `check_redis.sh``check_server_health.sh` 在同一目录 |
| 降级处理 | 如果脚本不存在,自动降级为简单的 `redis-cli ping` 检测 | | 降级处理 | 如果脚本上传失败或不可用,自动降级为简单的 `redis-cli ping` 检测 |
**脚本特性:** **脚本特性:**
- 自动检测Redis容器(支持容器名称模式匹配 - 自动检测Redis容器(支持模糊匹配,如 uredis、uredis2、redis 等
- 自动获取端口映射和认证密码 - 自动获取端口映射和认证密码
- 完整的功能测试(连接、读写、删除) - 完整的功能测试(连接、读写、删除)
- 详细的信息收集(服务器、客户端、内存、状态等) - 详细的信息收集(服务器、客户端、内存、状态等)
...@@ -306,9 +305,9 @@ AUTO_DETECT=false REDIS_CONTAINER=uredis ./check_redis.sh ...@@ -306,9 +305,9 @@ AUTO_DETECT=false REDIS_CONTAINER=uredis ./check_redis.sh
| 部署方式 | 说明 | | 部署方式 | 说明 |
|----------|------| |----------|------|
| PowerShell (远程SSH) | 自动上传:脚本会自动检测并上传 `check_mysql.sh` 到目标服务器 | | PowerShell (远程SSH) | 强制覆盖上传:每次执行都会上传本地最新版本的 `check_mysql.sh` 覆盖远程脚本 |
| Shell (本地执行) | 手动部署:需确保 `check_mysql.sh``check_server_health.sh` 在同一目录 | | Shell (本地执行) | 手动部署:需确保 `check_mysql.sh``check_server_health.sh` 在同一目录 |
| 降级处理 | 如果脚本不存在,自动降级为简单的 MySQL 连接检测 | | 降级处理 | 如果脚本上传失败或不可用,自动降级为简单的 MySQL 连接检测 |
**配置参数:** **配置参数:**
...@@ -491,9 +490,9 @@ docker exec umysql mysqladmin -u root -p"dNrprU&2S" status ...@@ -491,9 +490,9 @@ docker exec umysql mysqladmin -u root -p"dNrprU&2S" status
| 部署方式 | 说明 | | 部署方式 | 说明 |
|----------|------| |----------|------|
| PowerShell (远程SSH) | 自动上传:脚本会自动检测服务器架构并上传对应的 `check_fdfs_x86.sh``check_fdfs_arm.sh` 到目标服务器 | | PowerShell (远程SSH) | 强制覆盖上传:每次执行都会根据服务器架构上传本地最新版本(x86/ARM)覆盖远程脚本 |
| Shell (本地执行) | 手动部署:需确保 `check_fdfs_x86.sh`/`check_fdfs_arm.sh``check_server_health.sh` 在同一目录 | | Shell (本地执行) | 手动部署:需确保 `check_fdfs_x86.sh`/`check_fdfs_arm.sh``check_server_health.sh` 在同一目录 |
| 降级处理 | 如果脚本不存在,自动降级为简单的 `fdfs_test` 检测 | | 降级处理 | 如果脚本上传失败或不可用,自动降级为简单的 `fdfs_test` 检测 |
**配置参数:** **配置参数:**
...@@ -535,7 +534,7 @@ docker exec umysql mysqladmin -u root -p"dNrprU&2S" status ...@@ -535,7 +534,7 @@ docker exec umysql mysqladmin -u root -p"dNrprU&2S" status
- ARM架构:`AuxiliaryTool/ScriptTool/ServiceSelfInspection/check_fdfs_arm.sh` - ARM架构:`AuxiliaryTool/ScriptTool/ServiceSelfInspection/check_fdfs_arm.sh`
**脚本特性:** **脚本特性:**
- 自动检测容器状态(ustorage/utracker - 自动检测容器状态(支持模糊匹配,如 ustorage、storage、utracker、tracker 等
- 自动创建带时间戳的测试文件 - 自动创建带时间戳的测试文件
- 完整的上传下载测试流程 - 完整的上传下载测试流程
- MD5完整性验证 - MD5完整性验证
...@@ -786,6 +785,11 @@ mosquitto 便携版 - 完整验证(含详细过程) ...@@ -786,6 +785,11 @@ mosquitto 便携版 - 完整验证(含详细过程)
| V2.1 | 2026-02-03 | FastDFS检测脚本按架构分离(check_fdfs_x86.sh/check_fdfs_arm.sh) | | V2.1 | 2026-02-03 | FastDFS检测脚本按架构分离(check_fdfs_x86.sh/check_fdfs_arm.sh) |
| V2.1 | 2026-02-03 | 更新代码根据架构自动选择对应的检测脚本 | | V2.1 | 2026-02-03 | 更新代码根据架构自动选择对应的检测脚本 |
| V2.1 | 2026-02-03 | 更新PowerShell脚本自动检测远程架构并上传对应脚本 | | V2.1 | 2026-02-03 | 更新PowerShell脚本自动检测远程架构并上传对应脚本 |
| V2.2 | 2026-02-04 | 优化容器自动检测逻辑:所有中间件检测脚本支持容器名模糊匹配(grep -E) |
| V2.2 | 2026-02-04 | 修改脚本上传逻辑为强制覆盖模式,确保使用最新版本脚本 |
| V2.2 | 2026-02-04 | 移除硬编码容器名参数传递,让脚本自己检测容器 |
| V2.2 | 2026-02-04 | 更新 Redis/MySQL/FastDFS 检测脚本的容器检测实现 |
| V2.2 | 2026-02-04 | 修复PowerShell脚本变量未定义问题:从脚本输出中提取容器名和端口信息 |
### 6.3 规范文档 ### 6.3 规范文档
- 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md` - 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md`
......
...@@ -234,9 +234,9 @@ fi ...@@ -234,9 +234,9 @@ fi
| 部署方式 | 说明 | | 部署方式 | 说明 |
|----------|------| |----------|------|
| PowerShell (远程SSH) | 自动上传:脚本会自动检测并上传 `check_redis.sh` 到目标服务器 | | PowerShell (远程SSH) | 强制覆盖上传:每次执行都会上传本地最新版本的 `check_redis.sh` 覆盖远程脚本 |
| Shell (本地执行) | 手动部署:需确保 `check_redis.sh``check_server_health.sh` 在同一目录 | | Shell (本地执行) | 手动部署:需确保 `check_redis.sh``check_server_health.sh` 在同一目录 |
| 降级处理 | 如果脚本不存在,自动降级为简单的 `redis-cli ping` 检测 | | 降级处理 | 如果脚本上传失败或不可用,自动降级为简单的 `redis-cli ping` 检测 |
#### 配置要求 #### 配置要求
...@@ -245,8 +245,7 @@ fi ...@@ -245,8 +245,7 @@ fi
| 主机地址 | REDIS_HOST | localhost | ✅ 已配置 | | 主机地址 | REDIS_HOST | localhost | ✅ 已配置 |
| 端口 | REDIS_PORT | 6379 | ✅ 已配置 | | 端口 | REDIS_PORT | 6379 | ✅ 已配置 |
| 密码 | REDIS_PASSWORD | dNrprU&2S | ✅ 已配置 | | 密码 | REDIS_PASSWORD | dNrprU&2S | ✅ 已配置 |
| 容器匹配模式 | CONTAINER_PATTERN | uredis | ✅ 已配置 | | 容器匹配模式 | CONTAINER_PATTERN | uredis | ✅ 已配置(支持模糊匹配) |
| 自动检测 | AUTO_DETECT | true | ✅ 已配置 |
#### 实施步骤 #### 实施步骤
...@@ -274,7 +273,7 @@ fi ...@@ -274,7 +273,7 @@ fi
| 需求功能 | 脚本函数 | 实现方式 | | 需求功能 | 脚本函数 | 实现方式 |
|----------|----------|----------| |----------|----------|----------|
| 容器自动检测 | `detect_redis_container` | docker ps --filter name=CONTAINER_PATTERN | | 容器自动检测 | `detect_redis_container` | docker ps --format "{{.Names}}" \| grep -E "CONTAINER_PATTERN\|redis" 模糊匹配 |
| 端口映射检测 | `get_connection_info_from_container` | docker port获取映射端口 | | 端口映射检测 | `get_connection_info_from_container` | docker port获取映射端口 |
| 密码获取 | `get_connection_info_from_container` | docker inspect获取环境变量 | | 密码获取 | `get_connection_info_from_container` | docker inspect获取环境变量 |
| 连接测试 | `check_connection` | redis-cli ping | | 连接测试 | `check_connection` | redis-cli ping |
...@@ -346,9 +345,9 @@ AUTO_DETECT=false REDIS_CONTAINER=uredis ./check_redis.sh ...@@ -346,9 +345,9 @@ AUTO_DETECT=false REDIS_CONTAINER=uredis ./check_redis.sh
| 部署方式 | 说明 | | 部署方式 | 说明 |
|----------|------| |----------|------|
| PowerShell (远程SSH) | 自动上传:脚本会自动检测并上传 `check_mysql.sh` 到目标服务器 | | PowerShell (远程SSH) | 强制覆盖上传:每次执行都会上传本地最新版本的 `check_mysql.sh` 覆盖远程脚本 |
| Shell (本地执行) | 手动部署:需确保 `check_mysql.sh``check_server_health.sh` 在同一目录 | | Shell (本地执行) | 手动部署:需确保 `check_mysql.sh``check_server_health.sh` 在同一目录 |
| 降级处理 | 如果脚本不存在,自动降级为简单的 MySQL 连接检测 | | 降级处理 | 如果脚本上传失败或不可用,自动降级为简单的 MySQL 连接检测 |
#### 配置要求 #### 配置要求
...@@ -446,9 +445,9 @@ docker exec umysql mysqladmin -u root -p"dNrprU&2S" status ...@@ -446,9 +445,9 @@ docker exec umysql mysqladmin -u root -p"dNrprU&2S" status
| 部署方式 | 说明 | | 部署方式 | 说明 |
|----------|------| |----------|------|
| PowerShell (远程SSH) | 自动上传:脚本会自动检测服务器架构并上传对应的 `check_fdfs_x86.sh``check_fdfs_arm.sh` 到目标服务器 | | PowerShell (远程SSH) | 强制覆盖上传:每次执行都会根据服务器架构上传本地最新版本(x86/ARM)覆盖远程脚本 |
| Shell (本地执行) | 手动部署:需确保 `check_fdfs_x86.sh`/`check_fdfs_arm.sh``check_server_health.sh` 在同一目录 | | Shell (本地执行) | 手动部署:需确保 `check_fdfs_x86.sh`/`check_fdfs_arm.sh``check_server_health.sh` 在同一目录 |
| 降级处理 | 如果脚本不存在,自动降级为简单的 `fdfs_test` 检测 | | 降级处理 | 如果脚本上传失败或不可用,自动降级为简单的 `fdfs_test` 检测 |
#### 配置要求 #### 配置要求
...@@ -670,6 +669,11 @@ md5sum /tmp/test.txt /tmp/downloaded.txt ...@@ -670,6 +669,11 @@ md5sum /tmp/test.txt /tmp/downloaded.txt
| 1.7.0 | 2026-02-03 | 实现完整的上传、下载、完整性验证检测流程 | Claude | | 1.7.0 | 2026-02-03 | 实现完整的上传、下载、完整性验证检测流程 | Claude |
| 1.8.0 | 2026-02-03 | 补充mqtt_test_arm ARM架构工具支持 | Claude | | 1.8.0 | 2026-02-03 | 补充mqtt_test_arm ARM架构工具支持 | Claude |
| 1.8.0 | 2026-02-03 | 更新架构支持说明,标记ARM64为已准备状态 | Claude | | 1.8.0 | 2026-02-03 | 更新架构支持说明,标记ARM64为已准备状态 | Claude |
| 1.9.0 | 2026-02-04 | 优化容器自动检测逻辑:所有中间件检测脚本支持容器名模糊匹配 | Claude |
| 1.9.0 | 2026-02-04 | 修改脚本上传逻辑为强制覆盖模式,确保使用最新版本脚本 | Claude |
| 1.9.0 | 2026-02-04 | 移除硬编码容器名参数传递,让脚本自己检测容器 | Claude |
| 1.9.0 | 2026-02-04 | 更新 Redis/MySQL/FastDFS 检测脚本的容器检测实现 | Claude |
| 1.9.1 | 2026-02-04 | 修复PowerShell脚本变量未定义问题:从脚本输出中提取容器名和端口信息 | Claude |
### 6.2 文件修改记录 ### 6.2 文件修改记录
......
# _PRD_服务自检需求文档_计划执行.md # _PRD_服务自检需求文档_计划执行.md
> 版本:V1.1 > 版本:V1.2
> 创建日期:2026-01-28 > 创建日期:2026-01-28
> 最后更新:2026-02-04
> 关联需求:`_PRD_服务自检需求文档-新.md` > 关联需求:`_PRD_服务自检需求文档-新.md`
> 适用范围:服务自检脚本(Windows 版 + Linux 版)开发维护 > 适用范围:服务自检脚本(Windows 版 + Linux 版)开发维护
> MQTT检测工具:`AuxiliaryTool/ScriptTool/ServiceSelfInspection/mqtt_test_x86/` > MQTT检测工具:`AuxiliaryTool/ScriptTool/ServiceSelfInspection/mqtt_test_x86/`
...@@ -37,8 +38,8 @@ ...@@ -37,8 +38,8 @@
| 版本 | 当前版本 | 状态 | 说明 | | 版本 | 当前版本 | 状态 | 说明 |
|------|----------|------|------| |------|----------|------|------|
| Windows 版 | 1.0.4 | ✅ 稳定 | 功能完整,已投入使用 | | Windows 版 | 1.0.6 | ✅ 稳定 | 中间件检测报告信息补充、NTP检测改进、SSH端口配置修复 |
| Linux 版 | 1.0.4 | ✅ 稳定 | 功能完整,已投入使用 | | Linux 版 | 1.0.5 | ✅ 稳定 | 功能完整,待同步Windows版v1.0.6改进 |
### 2.2 功能对比矩阵 ### 2.2 功能对比矩阵
...@@ -110,6 +111,128 @@ ...@@ -110,6 +111,128 @@
| T-1043 | MySQL连接检测 | 已实现 | 已实现 | - | ✅ 已完成 | | T-1043 | MySQL连接检测 | 已实现 | 已实现 | - | ✅ 已完成 |
| T-1044 | FastDFS连接检测 | 已实现 | 已实现 | - | ✅ 已完成 | | T-1044 | FastDFS连接检测 | 已实现 | 已实现 | - | ✅ 已完成 |
#### v1.0.6 - 中间件检测报告信息补充完善(Windows版)✅
**目标:** 基于当前 v1.0.5 版本,补充完善中间件检测报告信息,改进NTP检测机制,修复SSH端口配置问题
| 任务ID | 任务描述 | Windows 版 | Linux 版 | 负责人 | 状态 |
|--------|----------|-----------|----------|--------|------|
| T-1061 | MQTT服务检测信息补充 | 已实现 | 待同步 | - | ✅ 已完成 |
| T-1062 | MQTT消息收发检测信息补充 | 已实现 | 待同步 | - | ✅ 已完成 |
| T-1063 | MQTT主题订阅检测信息补充 | 已实现 | 待同步 | - | ✅ 已完成 |
| T-1064 | Redis连接检测信息补充 | 已实现 | 待同步 | - | ✅ 已完成 |
| T-1065 | MySQL连接检测信息补充 | 已实现 | 待同步 | - | ✅ 已完成 |
| T-1066 | FastDFS连接检测信息补充 | 已实现 | 待同步 | - | ✅ 已完成 |
| T-1067 | NTP检测改进(多层级检测) | 已实现 | 待同步 | - | ✅ 已完成 |
| T-1068 | SSH端口配置修复 | 已实现 | 待同步 | - | ✅ 已完成 |
**详细变更内容:**
##### 1. 中间件检测报告信息补充完善
**变更前示例:**
```
● ✅ MQTT服务检测: 正常 | MQTT端口 1883 可访问 | 检测方式: TCP端口连通性
● ✅ Redis连接检测: 正常 | Redis完整检测通过(连接+读写+删除+信息收集)
● ✅ MySQL连接检测: 正常 | MySQL完整检测通过
● ✅ FastDFS连接检测: 正常 | FastDFS完整检测通过(上传+下载+完整性验证)
```
**变更后示例:**
```
● ✅ MQTT服务检测: 正常 | MQTT端口 1883 可访问 | 检测方式: Dashboard API | 容器: uemqx | Dashboard端口: 18083
● ✅ MQTT消息收发检测: 正常 | 消息发送与接收测试均成功 | 测试主题: /androidPanel/ | 测试消息: MQTT健康检查测试消息_1738665120
● ✅ MQTT主题订阅检测: 正常 | 成功检测 7 个标准版主题,订阅通道正常 | 主题列表: /androidPanel/, /iot/v1/conference/service/request/, ...
● ✅ Redis连接检测: 正常 | Redis完整检测通过(连接+读写+删除+信息收集) | 容器: uredis | 端口: 6379 | 版本: 7.0.5 | 内存: 1.2M | 连接数: 2
● ✅ MySQL连接检测: 正常 | MySQL完整检测通过 | 容器: umysql | 端口: 8306 | 版本: 8.0.30
● ✅ FastDFS连接检测: 正常 | FastDFS完整检测通过(上传+下载+完整性验证) | 容器: ustorage | 架构: ARM | 测试文件大小: 1024字节
```
**补充的信息项:**
| 检测项 | 新增信息 |
|--------|----------|
| MQTT服务检测 | 容器名称(uemqx)、Dashboard端口(18083) |
| MQTT消息收发检测 | 测试主题名称、测试消息内容 |
| MQTT主题订阅检测 | 具体订阅的主题列表 |
| Redis连接检测 | 容器名称(uredis)、端口(6379)、版本信息、内存使用、连接数统计 |
| MySQL连接检测 | 容器名称(umysql)、端口(8306)、版本信息 |
| FastDFS连接检测 | 容器名称(ustorage)、架构类型(ARM/x86)、测试文件大小 |
##### 2. NTP检测机制改进
**问题:** 原先使用 `systemctl` 命令检测NTP服务,当非root用户或polkit限制时会报错 "Access denied"。
**解决方案:** 实现多层级检测机制,避免权限问题
| 检测层级 | 检测方法 | 是否需要root | 说明 |
|----------|----------|-------------|------|
| 方法1 | `ps aux \| grep chronyd/ntpd` | ❌ 否 | 检测运行中的进程 |
| 方法2 | `systemctl list-units` | ⚠️ 可能需要 | 备用方法 |
| 方法3 | `ls /etc/chrony.conf /etc/ntp.conf` | ❌ 否 | 检测配置文件存在性 |
**代码变更:**
```powershell
# 方法1: 检测运行中的进程(不需要root权限)
$Command = "ps aux | grep -E 'chronyd|ntpd' | grep -v grep"
$Result = Invoke-SSHCommand -HostName $ServerIP -User $Username -Pass $Password -Port $Port -Command $Command
# 方法2: 如果进程检测失败,尝试systemctl(可能需要root)
if (-not $ntpRunning) {
$Command = "systemctl list-units --type=service 2>&1 | grep -E 'ntp|chronyd'"
$Result = Invoke-SSHCommand -HostName $ServerIP -User $Username -Pass $Password -Port $Port -Command $Command
}
# 方法3: 检测配置文件是否存在
if (-not $ntpRunning) {
$Command = "ls /etc/chrony.conf /etc/ntp.conf 2>/dev/null"
$Result = Invoke-SSHCommand -HostName $ServerIP -User $Username -Pass $Password -Port $Port -Command $Command
}
```
##### 3. SSH端口配置修复
**问题:** 多个函数硬编码了SSH端口为22,导致使用非标准端口时连接失败。
**修复内容:**
| 函数名 | 修复内容 |
|--------|----------|
| `Check-NTPService` | 添加 `$Port` 参数,所有SSH调用传递 `-Port $Port` |
| `Check-TraditionalPlatformIPs` | 添加 `$Port` 参数,所有SSH调用传递 `-Port $Port` |
| `Check-NewPlatformIPs` | 添加 `$Port` 参数,所有SSH调用传递 `-Port $Port` |
| `Select-Server` | 修复强制覆盖端口为22的问题,保留预设端口配置 |
**代码变更示例:**
```powershell
# 修复前
function Check-NTPService {
param (
[string]$ServerIP,
[string]$Username,
[string]$Password
)
$serverForRepair = @{ IP = $ServerIP; User = $Username; Pass = $Password; Port = 22 }
}
# 修复后
function Check-NTPService {
param (
[string]$ServerIP,
[string]$Username,
[string]$Password,
[int]$Port = 22
)
$serverForRepair = @{ IP = $ServerIP; User = $Username; Pass = $Password; Port = $Port }
}
```
##### 4. 修改文件位置
| 文件路径 | 修改行数 |
|----------|----------|
| `AuxiliaryTool\ScriptTool\ServiceSelfInspection\check_server_health.ps1` | 约2100-4750行 |
#### v1.1.0 - 功能增强(规划中) #### v1.1.0 - 功能增强(规划中)
**目标:** 基于当前 v1.0.4 版本,规划和实现功能增强 **目标:** 基于当前 v1.0.4 版本,规划和实现功能增强
...@@ -295,6 +418,7 @@ graph TD ...@@ -295,6 +418,7 @@ graph TD
| 版本 | 日期 | 变更类型 | 变更内容 | 影响范围 | | 版本 | 日期 | 变更类型 | 变更内容 | 影响范围 |
|------|------|----------|----------|----------| |------|------|----------|----------|----------|
| 1.0.6 | 2026-02-04 | Patch | 中间件检测报告信息补充完善,NTP检测改进,SSH端口配置修复 | Windows 版 |
| 1.0.5 | 2026-02-03 | Patch | 新增mqtt_test_x86便携式工具说明,优化MQTT检测 | 两版本 | | 1.0.5 | 2026-02-03 | Patch | 新增mqtt_test_x86便携式工具说明,优化MQTT检测 | 两版本 |
| 1.0.4 | 2026-01-29 | Minor | 新增中间件连接检测功能(MQTT/Redis/MySQL/FastDFS) | 两版本 | | 1.0.4 | 2026-01-29 | Minor | 新增中间件连接检测功能(MQTT/Redis/MySQL/FastDFS) | 两版本 |
| 1.0.3 | 2026-01-28 | Patch | 双版本版本号统一,功能完善 | 两版本 | | 1.0.3 | 2026-01-28 | Patch | 双版本版本号统一,功能完善 | 两版本 |
...@@ -394,8 +518,10 @@ graph TD ...@@ -394,8 +518,10 @@ graph TD
| M2 | 计划文档完成 | 2026-01-28 | ✅ 已完成 | | M2 | 计划文档完成 | 2026-01-28 | ✅ 已完成 |
| M3 | 双版本 v1.0.3 统一 | 2026-01-28 | ✅ 已完成 | | M3 | 双版本 v1.0.3 统一 | 2026-01-28 | ✅ 已完成 |
| M4 | v1.0.4 中间件连接检测 | 2026-01-29 | ✅ 已完成 | | M4 | v1.0.4 中间件连接检测 | 2026-01-29 | ✅ 已完成 |
| M5 | v1.1.0 功能增强完成 | 待定 | 🔲 计划中 | | M5 | v1.0.5 MQTT检测工具优化 | 2026-02-03 | ✅ 已完成 |
| M6 | v1.2.0 更多功能增强完成 | 待定 | 🔲 计划中 | | M6 | v1.0.6 中间件检测报告信息补充、NTP检测改进、SSH端口配置修复 | 2026-02-04 | ✅ 已完成 |
| M7 | v1.1.0 功能增强完成 | 待定 | 🔲 计划中 |
| M8 | v1.2.0 更多功能增强完成 | 待定 | 🔲 计划中 |
--- ---
...@@ -453,6 +579,7 @@ chmod +x check_server_health.sh ...@@ -453,6 +579,7 @@ chmod +x check_server_health.sh
| 版本 | 日期 | 变更内容 | 作者 | | 版本 | 日期 | 变更内容 | 作者 |
|------|------|----------|------| |------|------|----------|------|
| V1.2 | 2026-02-04 | 新增v1.0.6版本说明:中间件检测报告信息补充、NTP检测改进、SSH端口配置修复 | Claude |
| V1.1 | 2026-02-03 | 新增mqtt_test_x86便携式工具说明,更新MQTT检测描述 | Claude | | V1.1 | 2026-02-03 | 新增mqtt_test_x86便携式工具说明,更新MQTT检测描述 | Claude |
| V1.1 | 2026-01-28 | 更新双版本版本号为 1.0.3 | Claude | | V1.1 | 2026-01-28 | 更新双版本版本号为 1.0.3 | Claude |
| V1.0 | 2026-01-28 | 初始版本 | Claude | | V1.0 | 2026-01-28 | 初始版本 | Claude |
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论