diff --git a/internal/web/actions/default/clusters/cluster/createNode.go b/internal/web/actions/default/clusters/cluster/createNode.go index fb4fb22b..ccebf73f 100644 --- a/internal/web/actions/default/clusters/cluster/createNode.go +++ b/internal/web/actions/default/clusters/cluster/createNode.go @@ -37,6 +37,33 @@ func (this *CreateNodeAction) RunGet(params struct { } this.Data["leftMenuItems"] = leftMenuItems + // DNS线路 + clusterDNSResp, err := this.RPC().NodeClusterRPC().FindEnabledNodeClusterDNS(this.AdminContext(), &pb.FindEnabledNodeClusterDNSRequest{NodeClusterId: params.ClusterId}) + if err != nil { + this.ErrorPage(err) + return + } + dnsRouteMaps := []maps.Map{} + this.Data["dnsDomainId"] = 0 + if clusterDNSResp.Domain != nil { + domainId := clusterDNSResp.Domain.Id + this.Data["dnsDomainId"] = domainId + if domainId > 0 { + routesResp, err := this.RPC().DNSDomainRPC().FindAllDNSDomainRoutes(this.AdminContext(), &pb.FindAllDNSDomainRoutesRequest{DnsDomainId: domainId}) + if err != nil { + this.ErrorPage(err) + return + } + for _, route := range routesResp.Routes { + dnsRouteMaps = append(dnsRouteMaps, maps.Map{ + "name": route.Name, + "code": route.Code, + }) + } + } + } + this.Data["dnsRoutes"] = dnsRouteMaps + this.Show() } @@ -49,6 +76,9 @@ func (this *CreateNodeAction) RunPost(params struct { SshHost string SshPort int + DnsDomainId int64 + DnsRoute string + Must *actions.Must }) { params.Must. @@ -78,10 +108,12 @@ func (this *CreateNodeAction) RunPost(params struct { // 保存 createResp, err := this.RPC().NodeRPC().CreateNode(this.AdminContext(), &pb.CreateNodeRequest{ - Name: params.Name, - ClusterId: params.ClusterId, - GroupId: params.GroupId, - Login: loginInfo, + Name: params.Name, + ClusterId: params.ClusterId, + GroupId: params.GroupId, + Login: loginInfo, + DnsDomainId: params.DnsDomainId, + DnsRoute: params.DnsRoute, }) if err != nil { this.ErrorPage(err) diff --git a/internal/web/actions/default/clusters/cluster/index.go b/internal/web/actions/default/clusters/cluster/index.go index a272ff2d..b233c78c 100644 --- a/internal/web/actions/default/clusters/cluster/index.go +++ b/internal/web/actions/default/clusters/cluster/index.go @@ -102,6 +102,7 @@ func (this *IndexAction) RunGet(params struct { "name": node.Name, "isInstalled": node.IsInstalled, "isOn": node.IsOn, + "isUp": node.IsUp, "installStatus": maps.Map{ "isRunning": node.InstallStatus.IsRunning, "isFinished": node.InstallStatus.IsFinished, diff --git a/internal/web/actions/default/clusters/cluster/settings/dns/index.go b/internal/web/actions/default/clusters/cluster/settings/dns/index.go index e82c1fe4..3102ac95 100644 --- a/internal/web/actions/default/clusters/cluster/settings/dns/index.go +++ b/internal/web/actions/default/clusters/cluster/settings/dns/index.go @@ -39,6 +39,8 @@ func (this *IndexAction) RunGet(params struct { return } this.Data["dnsName"] = dnsInfoResp.Name + this.Data["nodesAutoSync"] = dnsInfoResp.NodesAutoSync + this.Data["serversAutoSync"] = dnsInfoResp.ServersAutoSync if dnsInfoResp.Domain != nil { this.Data["domainId"] = dnsInfoResp.Domain.Id this.Data["domainName"] = dnsInfoResp.Domain.Name @@ -50,8 +52,10 @@ func (this *IndexAction) RunGet(params struct { func (this *IndexAction) RunPost(params struct { ClusterId int64 - DnsDomainId int64 - DnsName string + DnsDomainId int64 + DnsName string + NodesAutoSync bool + ServersAutoSync bool Must *actions.Must CSRF *actionutils.CSRF @@ -80,9 +84,11 @@ func (this *IndexAction) RunPost(params struct { } _, err := this.RPC().NodeClusterRPC().UpdateNodeClusterDNS(this.AdminContext(), &pb.UpdateNodeClusterDNSRequest{ - NodeClusterId: params.ClusterId, - DnsName: params.DnsName, - DnsDomainId: params.DnsDomainId, + NodeClusterId: params.ClusterId, + DnsName: params.DnsName, + DnsDomainId: params.DnsDomainId, + NodesAutoSync: params.NodesAutoSync, + ServersAutoSync: params.ServersAutoSync, }) if err != nil { this.ErrorPage(err) diff --git a/internal/web/actions/default/clusters/clusterutils/cluster_helper.go b/internal/web/actions/default/clusters/clusterutils/cluster_helper.go index 58df7f44..9a0302f4 100644 --- a/internal/web/actions/default/clusters/clusterutils/cluster_helper.go +++ b/internal/web/actions/default/clusters/clusterutils/cluster_helper.go @@ -51,9 +51,9 @@ func (this *ClusterHelper) BeforeAction(action *actions.ActionObject) { tabbar := actionutils.NewTabbar() tabbar.Add("集群列表", "", "/clusters", "", false) - tabbar.Add("节点", "", "/clusters/cluster?clusterId="+clusterIdString, "server", selectedTabbar == "node") - tabbar.Add("设置", "", "/clusters/cluster/settings?clusterId="+clusterIdString, "setting", selectedTabbar == "setting") - tabbar.Add("删除", "", "/clusters/cluster/delete?clusterId="+clusterIdString, "trash", selectedTabbar == "delete") + tabbar.Add("集群节点", "", "/clusters/cluster?clusterId="+clusterIdString, "server", selectedTabbar == "node") + tabbar.Add("集群设置", "", "/clusters/cluster/settings?clusterId="+clusterIdString, "setting", selectedTabbar == "setting") + tabbar.Add("删除集群", "", "/clusters/cluster/delete?clusterId="+clusterIdString, "trash", selectedTabbar == "delete") { m := tabbar.Add("当前集群:"+cluster.Name, "", "/clusters/cluster?clusterId="+clusterIdString, "", false) diff --git a/internal/web/actions/default/dns/updateClusterPopup.go b/internal/web/actions/default/dns/updateClusterPopup.go index e2313b67..26dd602e 100644 --- a/internal/web/actions/default/dns/updateClusterPopup.go +++ b/internal/web/actions/default/dns/updateClusterPopup.go @@ -29,6 +29,8 @@ func (this *UpdateClusterPopupAction) RunGet(params struct { return } this.Data["dnsName"] = dnsResp.Name + this.Data["nodesAutoSync"] = dnsResp.NodesAutoSync + this.Data["serversAutoSync"] = dnsResp.ServersAutoSync if dnsResp.Domain != nil { this.Data["domainId"] = dnsResp.Domain.Id this.Data["domain"] = dnsResp.Domain.Name @@ -63,9 +65,11 @@ func (this *UpdateClusterPopupAction) RunGet(params struct { } func (this *UpdateClusterPopupAction) RunPost(params struct { - ClusterId int64 - DnsName string - DomainId int64 + ClusterId int64 + DnsName string + DomainId int64 + NodesAutoSync bool + ServersAutoSync bool Must *actions.Must CSRF *actionutils.CSRF @@ -94,9 +98,11 @@ func (this *UpdateClusterPopupAction) RunPost(params struct { } _, err = this.RPC().NodeClusterRPC().UpdateNodeClusterDNS(this.AdminContext(), &pb.UpdateNodeClusterDNSRequest{ - NodeClusterId: params.ClusterId, - DnsName: params.DnsName, - DnsDomainId: params.DomainId, + NodeClusterId: params.ClusterId, + DnsName: params.DnsName, + DnsDomainId: params.DomainId, + NodesAutoSync: params.NodesAutoSync, + ServersAutoSync: params.ServersAutoSync, }) if err != nil { this.ErrorPage(err) diff --git a/internal/web/actions/default/nodes/delete.go b/internal/web/actions/default/nodes/delete.go index 41f93a16..de3381ee 100644 --- a/internal/web/actions/default/nodes/delete.go +++ b/internal/web/actions/default/nodes/delete.go @@ -13,7 +13,7 @@ type DeleteAction struct { func (this *DeleteAction) RunPost(params struct { NodeId int64 }) { - _, err := this.RPC().NodeRPC().DisableNode(this.AdminContext(), &pb.DisableNodeRequest{NodeId: params.NodeId}) + _, err := this.RPC().NodeRPC().DeleteNode(this.AdminContext(), &pb.DeleteNodeRequest{NodeId: params.NodeId}) if err != nil { this.ErrorPage(err) return diff --git a/web/public/js/components/common/health-check-config-box.js b/web/public/js/components/common/health-check-config-box.js index 48da937d..eb31aed7 100644 --- a/web/public/js/components/common/health-check-config-box.js +++ b/web/public/js/components/common/health-check-config-box.js @@ -14,7 +14,10 @@ Vue.component("health-check-config-box", { statusCodes: [200], timeout: {count: 10, unit: "second"}, countTries: 3, - tryDelay: {count: 100, unit: "ms"} + tryDelay: {count: 100, unit: "ms"}, + autoDown: true, + countUp: 1, + countDown: 1 } let that = this setTimeout(function () { @@ -44,7 +47,14 @@ Vue.component("health-check-config-box", { if (healthCheckConfig.tryDelay == null) { healthCheckConfig.tryDelay = {count: 100, unit: "ms"} } + if (healthCheckConfig.countUp == null || healthCheckConfig.countUp < 1) { + healthCheckConfig.countUp = 1 + } + if (healthCheckConfig.countDown == null || healthCheckConfig.countDown < 1) { + healthCheckConfig.countDown = 1 + } } + console.log(healthCheckConfig.countUp, healthCheckConfig.countDown) return { healthCheck: healthCheckConfig, advancedVisible: false, @@ -79,6 +89,22 @@ Vue.component("health-check-config-box", { } else { this.healthCheck.countTries = 0 } + }, + "healthCheck.countUp": function (v) { + let count = parseInt(v) + if (!isNaN(count)) { + this.healthCheck.countUp = count + } else { + this.healthCheck.countUp = 0 + } + }, + "healthCheck.countDown": function (v) { + let count = parseInt(v) + if (!isNaN(count)) { + this.healthCheck.countDown = count + } else { + this.healthCheck.countDown = 0 + } } }, methods: { @@ -145,6 +171,30 @@ Vue.component("health-check-config-box", { + + 是否自动下线 + +
+ + +
+

选中后系统会根据健康检查的结果自动标记节点的上线/下线状态。

+ + + + 连续上线次数 + + +

连续N次检查成功后自动恢复上线。

+ + + + 连续下线次数 + + +

连续N次检查失败后自动下线。

+ + @@ -176,7 +226,7 @@ Vue.component("health-check-config-box", { - +
` diff --git a/web/public/js/components/messages/message-row.js b/web/public/js/components/messages/message-row.js index 1b0b138f..264463ff 100644 --- a/web/public/js/components/messages/message-row.js +++ b/web/public/js/components/messages/message-row.js @@ -31,9 +31,15 @@ Vue.component("message-row", { {{message.body}} -
+ +
{{param.node.name}}: {{param.error}}
+ + +
+ 查看问题 » +
diff --git a/web/views/@default/clusters/cluster/createNode.html b/web/views/@default/clusters/cluster/createNode.html index da3ed082..dc4f7771 100644 --- a/web/views/@default/clusters/cluster/createNode.html +++ b/web/views/@default/clusters/cluster/createNode.html @@ -16,6 +16,18 @@ IP地址 +

用于访问节点和域名解析等。

+ + + + DNS线路 + + + +

可用线路是根据集群设置的域名获取的,注意DNS服务商可能对这些线路有所限制。

@@ -25,29 +37,31 @@ - + + + - - SSH主机地址 - - -

比如192.168.1.100

- - - - SSH主机端口 - - -

常见的比如22。

- - - - SSH登录认证 - - - - + + SSH主机地址 + + +

比如192.168.1.100

+ + + + SSH主机端口 + + +

常见的比如22。

+ + + + SSH登录认证 + + + + diff --git a/web/views/@default/clusters/cluster/index.html b/web/views/@default/clusters/cluster/index.html index dec274ef..8b05affd 100644 --- a/web/views/@default/clusters/cluster/index.html +++ b/web/views/@default/clusters/cluster/index.html @@ -87,7 +87,10 @@ - -
+
+ 健康问题 +
+
diff --git a/web/views/@default/clusters/cluster/node/update.html b/web/views/@default/clusters/cluster/node/update.html index 91c62cb7..3a41109f 100644 --- a/web/views/@default/clusters/cluster/node/update.html +++ b/web/views/@default/clusters/cluster/node/update.html @@ -17,6 +17,7 @@ IP地址 +

用于访问节点和域名解析等。

diff --git a/web/views/@default/clusters/cluster/settings/dns/index.html b/web/views/@default/clusters/cluster/settings/dns/index.html index 699a8f89..217a4b6b 100644 --- a/web/views/@default/clusters/cluster/settings/dns/index.html +++ b/web/views/@default/clusters/cluster/settings/dns/index.html @@ -25,6 +25,29 @@

和主域名一起组成子域名。

+ + + + + + 是否同步节点DNS状态 + +
+ + +
+ + + + 是否同步网站服务DNS状态 + +
+ + +
+ + + diff --git a/web/views/@default/dns/clusters/cluster.html b/web/views/@default/dns/clusters/cluster.html index e480922d..5dd67366 100644 --- a/web/views/@default/dns/clusters/cluster.html +++ b/web/views/@default/dns/clusters/cluster.html @@ -9,7 +9,7 @@ - + diff --git a/web/views/@default/dns/clusters/cluster.js b/web/views/@default/dns/clusters/cluster.js index 1718e584..45482f8d 100644 --- a/web/views/@default/dns/clusters/cluster.js +++ b/web/views/@default/dns/clusters/cluster.js @@ -1,7 +1,7 @@ Tea.context(function () { this.updateCluster = function (clusterId) { teaweb.popup("/dns/updateClusterPopup?clusterId=" + clusterId, { - height: "22em", + height: "25em", callback: function () { teaweb.success("保存成功", function () { teaweb.reload() diff --git a/web/views/@default/dns/index.js b/web/views/@default/dns/index.js index 2227ab69..bda1984e 100644 --- a/web/views/@default/dns/index.js +++ b/web/views/@default/dns/index.js @@ -1,7 +1,7 @@ Tea.context(function () { this.updateCluster = function (clusterId) { teaweb.popup("/dns/updateClusterPopup?clusterId=" + clusterId, { - height: "22em", + height: "25em", callback: function () { teaweb.success("保存成功", function () { teaweb.reload() diff --git a/web/views/@default/dns/issues/index.js b/web/views/@default/dns/issues/index.js index fb9d38d1..abc6488e 100644 --- a/web/views/@default/dns/issues/index.js +++ b/web/views/@default/dns/issues/index.js @@ -8,7 +8,7 @@ Tea.context(function () { this.updateCluster = function (clusterId) { let that = this teaweb.popup("/dns/updateClusterPopup?clusterId=" + clusterId, { - height: "22em", + height: "25em", callback: function () { teaweb.success("保存成功", function () { that.reload() diff --git a/web/views/@default/dns/updateClusterPopup.html b/web/views/@default/dns/updateClusterPopup.html index baf72101..a041379d 100644 --- a/web/views/@default/dns/updateClusterPopup.html +++ b/web/views/@default/dns/updateClusterPopup.html @@ -43,6 +43,29 @@

子域名和主域名共同组成集群的域名。

+ + + + + + + + + + + + +
集群{{cluster.name}}{{cluster.name}}
子域名
是否同步节点DNS状态 +
+ + +
+
是否同步网站服务DNS状态 +
+ + +
+