From ff496af65d95ea57ac66001fe0997ec3c7fb3ebe Mon Sep 17 00:00:00 2001 From: gaoxq <376340421@qq.com> Date: Mon, 13 Apr 2026 13:34:54 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A6=96=E9=A1=B5=E6=8E=A5=E5=8F=A3=E9=87=8D?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/apps/Module/ContainerInfo.java | 1 + .../{DockerInfo.java => ServerInfo.java} | 12 +-- .../apps/web/docker/DockerController.java | 98 ------------------- .../apps/web/docker/myAccountController.java | 93 ++++++++++++++++++ .../apps/web/docker/myServerController.java | 39 ++++++++ .../com/jeesite/modules/utils/DockerUtil.java | 53 +++++----- 6 files changed, 165 insertions(+), 131 deletions(-) rename web-api/src/main/java/com/jeesite/modules/apps/Module/{DockerInfo.java => ServerInfo.java} (50%) delete mode 100644 web-api/src/main/java/com/jeesite/modules/apps/web/docker/DockerController.java create mode 100644 web-api/src/main/java/com/jeesite/modules/apps/web/docker/myAccountController.java create mode 100644 web-api/src/main/java/com/jeesite/modules/apps/web/docker/myServerController.java diff --git a/web-api/src/main/java/com/jeesite/modules/apps/Module/ContainerInfo.java b/web-api/src/main/java/com/jeesite/modules/apps/Module/ContainerInfo.java index 1314b4f..6ffc854 100644 --- a/web-api/src/main/java/com/jeesite/modules/apps/Module/ContainerInfo.java +++ b/web-api/src/main/java/com/jeesite/modules/apps/Module/ContainerInfo.java @@ -17,4 +17,5 @@ public class ContainerInfo implements Serializable { private String created; private String names; private String ports; + private String accountId; } diff --git a/web-api/src/main/java/com/jeesite/modules/apps/Module/DockerInfo.java b/web-api/src/main/java/com/jeesite/modules/apps/Module/ServerInfo.java similarity index 50% rename from web-api/src/main/java/com/jeesite/modules/apps/Module/DockerInfo.java rename to web-api/src/main/java/com/jeesite/modules/apps/Module/ServerInfo.java index 29727c3..1889751 100644 --- a/web-api/src/main/java/com/jeesite/modules/apps/Module/DockerInfo.java +++ b/web-api/src/main/java/com/jeesite/modules/apps/Module/ServerInfo.java @@ -5,15 +5,13 @@ import lombok.Data; import java.io.Serializable; @Data -public class DockerInfo implements Serializable { +public class ServerInfo implements Serializable { - private String username; // 登录账号 - private String password; // 登录密码 - private String rootPath; // 初始目录 - private String authType; // 认证方式 - private String privateKey; // 密钥内容 private String hostIp; // 主机域名 private Integer hostPort; // 主机端口 + private String username; // 登录账号 + private String hostName; // 主机名称 + private String accountId; // 账号标识 private String containerId; - public DockerInfo(){} + public ServerInfo(){} } diff --git a/web-api/src/main/java/com/jeesite/modules/apps/web/docker/DockerController.java b/web-api/src/main/java/com/jeesite/modules/apps/web/docker/DockerController.java deleted file mode 100644 index f1b7044..0000000 --- a/web-api/src/main/java/com/jeesite/modules/apps/web/docker/DockerController.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.jeesite.modules.apps.web.docker; - -import com.jeesite.modules.apps.Module.ContainerInfo; -import com.jeesite.modules.apps.Module.DockerInfo; -import com.jeesite.modules.apps.Module.DockerResult; -import com.jeesite.modules.biz.dao.MySftpAccountsDao; -import com.jeesite.modules.biz.entity.MySftpAccounts; -import com.jeesite.modules.utils.DockerUtil; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; - -import java.util.List; - -@Controller -@RequestMapping(value = "${adminPath}/docker/analysis") -public class DockerController { - - @Resource - private MySftpAccountsDao mySftpAccountsDao; - - /** - * 启动容器 - */ - @RequestMapping(value = "start") - @ResponseBody - public DockerResult start(DockerInfo dockerInfo) { - return DockerUtil.start(dockerInfo); - } - - /** - * 停止容器 - */ - @RequestMapping(value = "stop") - @ResponseBody - public DockerResult stop(DockerInfo dockerInfo) { - return DockerUtil.stop(dockerInfo); - } - - /** - * 重启容器 - */ - @RequestMapping(value = "restart") - @ResponseBody - public DockerResult restart(DockerInfo dockerInfo) { - return DockerUtil.restart(dockerInfo); - } - - /** - * 获取容器详情 - */ - @RequestMapping(value = "inspect") - @ResponseBody - public DockerResult inspect(DockerInfo dockerInfo) { - return DockerUtil.inspect(dockerInfo); - } - - /** - * 获取容器日志 - */ - @RequestMapping(value = "logs") - @ResponseBody - public DockerResult logs(DockerInfo dockerInfo) { - return DockerUtil.getLogs(dockerInfo, 20000, true); - } - - /** - * 获取容器列表 - */ - @RequestMapping(value = "listAll") - @ResponseBody - public List listAll(DockerInfo dockerInfo) { - return DockerUtil.listContainers(dockerInfo, true); - } - - /** - * 获取服务列表 - */ - @RequestMapping(value = "listInfo") - @ResponseBody - public List listInfo() { - List accountsList = mySftpAccountsDao.findList(new MySftpAccounts()); - return accountsList.stream() - .map(account -> { - DockerInfo info = new DockerInfo(); - info.setHostIp(account.getHostIp()); - info.setHostPort(account.getHostPort()); - info.setUsername(account.getUsername()); - info.setPassword(account.getPassword()); - info.setRootPath(account.getRootPath()); - info.setAuthType(account.getAuthType()); - info.setPrivateKey(account.getPrivateKey()); - return info; - }) - .toList(); - } -} diff --git a/web-api/src/main/java/com/jeesite/modules/apps/web/docker/myAccountController.java b/web-api/src/main/java/com/jeesite/modules/apps/web/docker/myAccountController.java new file mode 100644 index 0000000..d47201c --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/apps/web/docker/myAccountController.java @@ -0,0 +1,93 @@ +package com.jeesite.modules.apps.web.docker; + +import com.jeesite.modules.apps.Module.ContainerInfo; +import com.jeesite.modules.apps.Module.DockerResult; +import com.jeesite.modules.biz.dao.MySftpAccountsDao; +import com.jeesite.modules.biz.entity.MySftpAccounts; +import com.jeesite.modules.utils.DockerUtil; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Controller +@RequestMapping(value = "${adminPath}/docker/myAccount") +public class myAccountController { + + @Resource + private MySftpAccountsDao mySftpAccountsDao; + + /** + * 启动容器 + */ + @RequestMapping(value = "start") + @ResponseBody + public DockerResult start(ContainerInfo containerInfo) { + MySftpAccounts mySftpAccounts = new MySftpAccounts(); + mySftpAccounts.setAccountId(containerInfo.getAccountId()); + MySftpAccounts accounts = mySftpAccountsDao.get(mySftpAccounts); + return DockerUtil.start(accounts, containerInfo.getContainerId()); + } + + /** + * 停止容器 + */ + @RequestMapping(value = "stop") + @ResponseBody + public DockerResult stop(ContainerInfo containerInfo) { + MySftpAccounts mySftpAccounts = new MySftpAccounts(); + mySftpAccounts.setAccountId(containerInfo.getAccountId()); + MySftpAccounts accounts = mySftpAccountsDao.get(mySftpAccounts); + return DockerUtil.stop(accounts, containerInfo.getContainerId()); + } + + /** + * 重启容器 + */ + @RequestMapping(value = "restart") + @ResponseBody + public DockerResult restart(ContainerInfo containerInfo) { + MySftpAccounts mySftpAccounts = new MySftpAccounts(); + mySftpAccounts.setAccountId(containerInfo.getAccountId()); + MySftpAccounts accounts = mySftpAccountsDao.get(mySftpAccounts); + return DockerUtil.restart(accounts, containerInfo.getContainerId()); + } + + /** + * 获取容器详情 + */ + @RequestMapping(value = "inspect") + @ResponseBody + public DockerResult inspect(ContainerInfo containerInfo) { + MySftpAccounts mySftpAccounts = new MySftpAccounts(); + mySftpAccounts.setAccountId(containerInfo.getAccountId()); + MySftpAccounts accounts = mySftpAccountsDao.get(mySftpAccounts); + return DockerUtil.inspect(accounts, containerInfo.getContainerId()); + } + + /** + * 获取容器日志 + */ + @RequestMapping(value = "logs") + @ResponseBody + public DockerResult logs(ContainerInfo containerInfo) { + MySftpAccounts mySftpAccounts = new MySftpAccounts(); + mySftpAccounts.setAccountId(containerInfo.getAccountId()); + MySftpAccounts accounts = mySftpAccountsDao.get(mySftpAccounts); + return DockerUtil.getLogs(accounts, containerInfo.getContainerId(), 2000, true); + } + + /** + * 获取容器列表 + */ + @RequestMapping(value = "listAll") + @ResponseBody + public List listAll(ContainerInfo containerInfo) { + MySftpAccounts mySftpAccounts = new MySftpAccounts(); + mySftpAccounts.setAccountId(containerInfo.getAccountId()); + MySftpAccounts accounts = mySftpAccountsDao.get(mySftpAccounts); + return DockerUtil.listContainers(accounts, true); + } +} diff --git a/web-api/src/main/java/com/jeesite/modules/apps/web/docker/myServerController.java b/web-api/src/main/java/com/jeesite/modules/apps/web/docker/myServerController.java new file mode 100644 index 0000000..a3cbe39 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/apps/web/docker/myServerController.java @@ -0,0 +1,39 @@ +package com.jeesite.modules.apps.web.docker; + +import com.jeesite.modules.apps.Module.ServerInfo; +import com.jeesite.modules.biz.dao.MySftpAccountsDao; +import com.jeesite.modules.biz.entity.MySftpAccounts; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Controller +@RequestMapping(value = "${adminPath}/docker/myServer") +public class myServerController { + + @Resource + private MySftpAccountsDao mySftpAccountsDao; + + + /** + * 获取服务列表 + */ + @RequestMapping(value = "listAll") + @ResponseBody + public List listAll() { + List accountsList = mySftpAccountsDao.findList(new MySftpAccounts()); + return accountsList.stream() + .map(account -> { + ServerInfo info = new ServerInfo(); + info.setHostIp(account.getHostIp()); + info.setUsername(account.getUsername()); + info.setHostName(account.getHostName()); + info.setAccountId(account.getAccountId()); + return info; + }) + .toList(); + } +} diff --git a/web-api/src/main/java/com/jeesite/modules/utils/DockerUtil.java b/web-api/src/main/java/com/jeesite/modules/utils/DockerUtil.java index b9ad78a..99726c7 100644 --- a/web-api/src/main/java/com/jeesite/modules/utils/DockerUtil.java +++ b/web-api/src/main/java/com/jeesite/modules/utils/DockerUtil.java @@ -2,8 +2,8 @@ package com.jeesite.modules.utils; import com.jcraft.jsch.*; import com.jeesite.modules.apps.Module.ContainerInfo; -import com.jeesite.modules.apps.Module.DockerInfo; import com.jeesite.modules.apps.Module.DockerResult; +import com.jeesite.modules.biz.entity.MySftpAccounts; import java.io.*; import java.nio.charset.StandardCharsets; @@ -21,38 +21,38 @@ public class DockerUtil { private static final int SSH_TIMEOUT = 30000; - public static DockerResult start(DockerInfo dockerInfo) { - return exec(dockerInfo, "docker start " + dockerInfo.getContainerId()); + public static DockerResult start(MySftpAccounts accounts, String containerId) { + return exec(accounts, "docker start " + containerId); } - public static DockerResult stop(DockerInfo dockerInfo) { - return exec(dockerInfo, "docker stop " + dockerInfo.getContainerId()); + public static DockerResult stop(MySftpAccounts accounts, String containerId) { + return exec(accounts, "docker stop " + containerId); } - public static DockerResult restart(DockerInfo dockerInfo) { - return exec(dockerInfo, "docker restart " + dockerInfo.getContainerId()); + public static DockerResult restart(MySftpAccounts accounts, String containerId) { + return exec(accounts, "docker restart " + containerId); } - public static DockerResult getLogs(DockerInfo dockerInfo, + public static DockerResult getLogs(MySftpAccounts accounts, String containerId, int tail, boolean timestamps) { String cmd = "docker logs" + (timestamps ? " -t" : "") - + " --tail " + tail + " " + dockerInfo.getContainerId(); - return exec(dockerInfo, cmd); + + " --tail " + tail + " " + containerId; + return exec(accounts, cmd); } - public static DockerResult list(DockerInfo dockerInfo, boolean all) { - return exec(dockerInfo, all ? "docker ps -a" : "docker ps"); + public static DockerResult list(MySftpAccounts accounts, boolean all) { + return exec(accounts, all ? "docker ps -a" : "docker ps"); } - public static DockerResult inspect(DockerInfo dockerInfo) { - return exec(dockerInfo, "docker inspect " + dockerInfo.getContainerId()); + public static DockerResult inspect(MySftpAccounts accounts, String containerId) { + return exec(accounts, "docker inspect " + containerId); } - public static List listContainers(DockerInfo dockerInfo, boolean all) { + public static List listContainers(MySftpAccounts accounts, boolean all) { List list = new ArrayList<>(); String cmd = (all ? "docker ps -a" : "docker ps") + " --format \"{{.ID}}|{{.Image}}|{{.Command}}|{{.CreatedAt}}|{{.Status}}|{{.Ports}}|{{.Names}}\""; - DockerResult r = exec(dockerInfo, cmd); + DockerResult r = exec(accounts, cmd); if (!r.isSuccess()) { return new ArrayList<>(); } @@ -68,27 +68,28 @@ public class DockerUtil { info.setStatus(p.length > 4 ? p[4].trim() : ""); info.setPorts(p.length > 5 ? p[5].trim() : ""); info.setNames(p.length > 6 ? p[6].trim() : ""); + info.setAccountId(accounts.getAccountId()); list.add(info); } return list; } - public static DockerResult exec(DockerInfo dockerInfo, String command) { + public static DockerResult exec(MySftpAccounts accounts, String command) { JSch jsch = new JSch(); Session session = null; ChannelExec channel = null; try { - int port = dockerInfo.getHostPort() != null ? dockerInfo.getHostPort() : 22; - session = jsch.getSession(dockerInfo.getUsername(), dockerInfo.getHostIp(), port); + int port = accounts.getHostPort() != null ? accounts.getHostPort() : 22; + session = jsch.getSession(accounts.getUsername(), accounts.getHostIp(), port); session.setTimeout(SSH_TIMEOUT); - if ("key".equalsIgnoreCase(dockerInfo.getAuthType()) - && dockerInfo.getPrivateKey() != null && !dockerInfo.getPrivateKey().isEmpty()) { + if ("key".equalsIgnoreCase(accounts.getAuthType()) + && accounts.getPrivateKey() != null && !accounts.getPrivateKey().isEmpty()) { jsch.addIdentity("temp", - dockerInfo.getPrivateKey().getBytes(StandardCharsets.UTF_8), + accounts.getPrivateKey().getBytes(StandardCharsets.UTF_8), null, null); - } else if (dockerInfo.getPassword() != null && !dockerInfo.getPassword().isEmpty()) { - session.setPassword(dockerInfo.getPassword()); + } else if (accounts.getPassword() != null && !accounts.getPassword().isEmpty()) { + session.setPassword(accounts.getPassword()); } else { return DockerResult.fail("SSH 认证信息不完整:缺少密码或私钥"); } @@ -99,8 +100,8 @@ public class DockerUtil { session.connect(SSH_TIMEOUT); channel = (ChannelExec) session.openChannel("exec"); - String finalCmd = (dockerInfo.getRootPath() != null && !dockerInfo.getRootPath().isEmpty()) - ? "cd " + dockerInfo.getRootPath() + " && " + command + String finalCmd = (accounts.getRootPath() != null && !accounts.getRootPath().isEmpty()) + ? "cd " + accounts.getRootPath() + " && " + command : command; channel.setCommand(finalCmd); channel.setInputStream(null);