From 137193d46520ac68184d152c321dc639a0b7fe46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B7=B1=E5=B1=B1=E5=A4=A7=E6=9F=A0=E6=AA=AC?= <34309188+Beelkic@users.noreply.github.com> Date: Mon, 29 Dec 2025 10:43:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D1Panel=E4=B8=BB=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E9=83=A8=E7=BD=B2=E5=A4=B1=E8=B4=A5=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=90=8C=E6=97=B6=E9=83=A8=E7=BD=B2=E4=B8=BB=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E5=92=8C=E5=AD=90=E8=8A=82=E7=82=B9=E8=AF=81=E4=B9=A6?= =?UTF-8?q?=EF=BC=8C=E6=94=B9=E8=BF=9B=E6=97=A5=E5=BF=97=E8=BE=93=E5=87=BA?= =?UTF-8?q?=E5=92=8C=E9=85=8D=E7=BD=AE=E8=AF=B4=E6=98=8E=20(#364)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 1panel支持多个子节点部署 * 1Panel子节点/主节点BUG修复,现在可以同时部署子节点和主节点的证书 - 修复主节点部署失败问题 - 支持同时部署主节点和所有指定的子节点 - 改进日志输出和配置说明 --- app/lib/DeployHelper.php | 6 ++--- app/lib/deploy/opanel.php | 50 +++++++++++++++++++++++++++++---------- 2 files changed, 40 insertions(+), 16 deletions(-) diff --git a/app/lib/DeployHelper.php b/app/lib/DeployHelper.php index e08d3ca..e8300b3 100644 --- a/app/lib/DeployHelper.php +++ b/app/lib/DeployHelper.php @@ -613,10 +613,10 @@ class DeployHelper 'show' => 'type==0', ], 'node_name' => [ - 'name' => '子节点名称', + 'name' => '节点名称', 'type' => 'textarea', - 'placeholder' => '每行一个节点名称', - 'note' => '不填写时,将替换主控节点证书;否则,将替换被控节点证书。多个节点请每行填写一个', + 'placeholder' => '每行一个子节点名称', + 'note' => '不填写时:只更新主节点证书;填写时:同时更新主节点和所有指定的子节点证书。每行填写一个子节点名称', 'show' => 'type==0', ], ], diff --git a/app/lib/deploy/opanel.php b/app/lib/deploy/opanel.php index 2c008ce..2091cd8 100644 --- a/app/lib/deploy/opanel.php +++ b/app/lib/deploy/opanel.php @@ -41,18 +41,30 @@ class opanel implements DeployInterface ]; if (empty($nodeNames)) { - // 没有指定节点,部署到主控节点 + // 没有指定节点,只部署到主控节点 try { $this->request('/core/settings/ssl/update', $params); - $this->log("面板证书更新成功!"); + $this->log("主节点面板证书更新成功!"); return; } catch (Exception $e) { - throw new Exception("面板证书更新失败:" . $e->getMessage()); + throw new Exception("主节点面板证书更新失败:" . $e->getMessage()); } } else { - // 部署到多个子节点 + // 同时部署到主节点和所有指定的子节点 $successCount = 0; $failCount = 0; + + // 先更新主节点 + try { + $this->request('/core/settings/ssl/update', $params); + $this->log("主节点面板证书更新成功!"); + $successCount++; + } catch (Exception $e) { + $this->log("主节点面板证书更新失败:" . $e->getMessage()); + $failCount++; + } + + // 然后更新所有子节点 foreach ($nodeNames as $nodeName) { try { $this->request('/core/settings/ssl/update', $params, $nodeName); @@ -70,13 +82,24 @@ class opanel implements DeployInterface } } - // 如果没有指定节点,则部署到主控节点 + // 如果没有指定节点,则只部署到主控节点 if (empty($nodeNames)) { $this->deployToNode($fullchain, $privatekey, $config, null); } else { - // 部署到多个子节点 + // 同时部署到主节点和所有指定的子节点 $successCount = 0; $failCount = 0; + + // 先更新主节点 + try { + $this->deployToNode($fullchain, $privatekey, $config, null); + $successCount++; + } catch (Exception $e) { + $this->log("主节点部署失败:" . $e->getMessage()); + $failCount++; + } + + // 然后更新所有子节点 foreach ($nodeNames as $nodeName) { try { $this->deployToNode($fullchain, $privatekey, $config, $nodeName); @@ -108,11 +131,11 @@ class opanel implements DeployInterface ]; try { $this->request('/websites/ssl/upload', $params, $nodeName); - $logMsg = $nodeName ? "节点 [{$nodeName}] 证书ID:{$config['id']}更新成功!" : "证书ID:{$config['id']}更新成功!"; + $logMsg = $nodeName ? "节点 [{$nodeName}] 证书ID:{$config['id']}更新成功!" : "主节点 证书ID:{$config['id']}更新成功!"; $this->log($logMsg); return; } catch (Exception $e) { - $logMsg = $nodeName ? "节点 [{$nodeName}] 证书ID:{$config['id']}更新失败:" : "证书ID:{$config['id']}更新失败:"; + $logMsg = $nodeName ? "节点 [{$nodeName}] 证书ID:{$config['id']}更新失败:" : "主节点 证书ID:{$config['id']}更新失败:"; throw new Exception($logMsg . $e->getMessage()); } } @@ -124,10 +147,10 @@ class opanel implements DeployInterface $params = ['page' => 1, 'pageSize' => 500]; try { $data = $this->request("/websites/ssl/search", $params, $nodeName); - $logMsg = $nodeName ? "节点 [{$nodeName}] " : ""; + $logMsg = $nodeName ? "节点 [{$nodeName}] " : "主节点 "; $this->log($logMsg . '获取证书列表成功(total=' . $data['total'] . ')'); } catch (Exception $e) { - $logMsg = $nodeName ? "节点 [{$nodeName}] " : ""; + $logMsg = $nodeName ? "节点 [{$nodeName}] " : "主节点 "; throw new Exception($logMsg . '获取证书列表失败:' . $e->getMessage()); } @@ -156,12 +179,12 @@ class opanel implements DeployInterface ]; try { $this->request('/websites/ssl/upload', $params, $nodeName); - $logMsg = $nodeName ? "节点 [{$nodeName}] 证书ID:{$row['id']}更新成功!" : "证书ID:{$row['id']}更新成功!"; + $logMsg = $nodeName ? "节点 [{$nodeName}] 证书ID:{$row['id']}更新成功!" : "主节点 证书ID:{$row['id']}更新成功!"; $this->log($logMsg); $success++; } catch (Exception $e) { $errmsg = $e->getMessage(); - $logMsg = $nodeName ? "节点 [{$nodeName}] 证书ID:{$row['id']}更新失败:" : "证书ID:{$row['id']}更新失败:"; + $logMsg = $nodeName ? "节点 [{$nodeName}] 证书ID:{$row['id']}更新失败:" : "主节点 证书ID:{$row['id']}更新失败:"; $this->log($logMsg . $errmsg); } } @@ -176,7 +199,7 @@ class opanel implements DeployInterface 'description' => '', ]; $this->request('/websites/ssl/upload', $params, $nodeName); - $logMsg = $nodeName ? "节点 [{$nodeName}] 证书上传成功!" : "证书上传成功!"; + $logMsg = $nodeName ? "节点 [{$nodeName}] 证书上传成功!" : "主节点 证书上传成功!"; $this->log($logMsg); } } @@ -228,6 +251,7 @@ class opanel implements DeployInterface '1Panel-Token' => $token, '1Panel-Timestamp' => $timestamp, ]; + // 只有子节点时才设置 CurrentNode 头,主节点时不设置该头 if (!empty($nodeName)) { $headers['CurrentNode'] = $nodeName; }