From 9b14743b6d74fc00cdbe8da9735076aa06beb8ac Mon Sep 17 00:00:00 2001 From: chaos-zhu Date: Sat, 24 May 2025 21:03:36 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8A=9F=E8=83=BD=E6=A0=8F=E6=96=B0?= =?UTF-8?q?=E5=A2=9Edocker=E5=AE=B9=E5=99=A8=E8=A7=86=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + server/app/controller/plus.js | 2 +- server/app/server.js | 2 + server/app/socket/docker.js | 72 +++ server/app/socket/onekey.js | 2 +- server/app/socket/plus.js | 2 +- server/app/socket/sftp.js | 2 +- server/app/socket/terminal.js | 32 +- server/app/utils/plus.js | 2 +- server/package.json | 2 +- web/package.json | 2 +- web/src/components/code-edit/index.vue | 26 +- web/src/components/common/PlusLimitTip.vue | 68 +++ web/src/views/onekey/index.vue | 2 +- web/src/views/terminal/components/docker.vue | 482 ++++++++++++++++++ .../views/terminal/components/footer-bar.vue | 4 + .../terminal/components/script-input.vue | 51 +- web/src/views/terminal/components/sftp.vue | 2 +- .../terminal/components/terminal-tab.vue | 33 +- .../views/terminal/components/terminal.vue | 4 +- 20 files changed, 705 insertions(+), 88 deletions(-) create mode 100644 server/app/socket/docker.js create mode 100644 web/src/components/common/PlusLimitTip.vue create mode 100644 web/src/views/terminal/components/docker.vue diff --git a/.gitignore b/.gitignore index d122022..4ee23b9 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ plan.md local-script 版本发布.md .vscode +.windsurfrules \ No newline at end of file diff --git a/server/app/controller/plus.js b/server/app/controller/plus.js index a9f10ca..23b2e1d 100644 --- a/server/app/controller/plus.js +++ b/server/app/controller/plus.js @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/server/app/server.js b/server/app/server.js index c462e09..a4d9c3b 100644 --- a/server/app/server.js +++ b/server/app/server.js @@ -5,6 +5,7 @@ const { httpPort } = require('./config') const middlewares = require('./middlewares') const wsTerminal = require('./socket/terminal') const wsSftp = require('./socket/sftp') +const wsDocker = require('./socket/docker') const wsClientInfo = require('./socket/clients') const wsOnekey = require('./socket/onekey') const { throwError } = require('./utils/tools') @@ -24,6 +25,7 @@ function serverHandler(app, server) { app.proxy = true // 用于nginx反代时获取真实客户端ip wsTerminal(server) // 终端 wsSftp(server) // sftp + wsDocker(server) // docker wsOnekey(server) // 一键指令 wsClientInfo(server) // 客户端信息 app.context.throwError = throwError // 常用方法挂载全局ctx上 diff --git a/server/app/socket/docker.js b/server/app/socket/docker.js new file mode 100644 index 0000000..c479f27 --- /dev/null +++ b/server/app/socket/docker.js @@ -0,0 +1,72 @@ +const path = require('path') +const { Server } = require('socket.io') +const { Client: SSHClient } = require('ssh2') +const { verifyAuthSync } = require('../utils/verify-auth') +const { isAllowedIp } = require('../utils/tools') +const { createTerminal } = require('./terminal') +const decryptAndExecuteAsync = require('../utils/decrypt-file') + +module.exports = (httpServer) => { + const serverIo = new Server(httpServer, { + path: '/docker', + cors: { + origin: '*' + } + }) + + let connectionCount = 0 + + serverIo.on('connection', (socket) => { + connectionCount++ + consola.success(`docker websocket 已连接 - 当前连接数: ${ connectionCount }`) + let requestIP = socket.handshake.headers['x-forwarded-for'] || socket.handshake.address + if (!isAllowedIp(requestIP)) { + socket.emit('ip_forbidden', 'IP地址不在白名单中') + socket.disconnect() + return + } + consola.success('docker websocket 已连接') + let targetSSHClient = null + let jumpSshClients = [] + socket.on('ws_docker', async ({ hostId, token }) => { + const { code } = await verifyAuthSync(token, requestIP) + if (code !== 1) { + socket.emit('token_verify_fail') + socket.disconnect() + return + } + targetSSHClient = new SSHClient() + let { jumpSshClients: dockerJumpSshClients } = await createTerminal(hostId, socket, targetSSHClient, false) + jumpSshClients.push(...dockerJumpSshClients) + let { getDockerContainers = null, getDockerLogs = null } = (await decryptAndExecuteAsync(path.join(__dirname, 'plus.js'))) || {} + if (!getDockerContainers || !getDockerLogs) { + socket.emit('docker_not_plus') + socket.disconnect() + return + } + let containersData = await getDockerContainers(targetSSHClient) + if (!containersData) { + socket.emit('docker_connect_fail') + socket.disconnect() + return + } + socket.emit('docker_containers_data', containersData) + socket.on('docker_get_containers_data', async () => { + socket.emit('docker_containers_data', await getDockerContainers(targetSSHClient)) + }) + + socket.on('docker_get_containers_logs', async ({ containerId, tail = 1000 }) => { + socket.emit('docker_containers_logs', await getDockerLogs(targetSSHClient, containerId, tail)) + }) + }) + + socket.on('disconnect', (reason) => { + connectionCount-- + targetSSHClient && targetSSHClient.end() + jumpSshClients?.forEach(sshClient => sshClient && sshClient.end()) + targetSSHClient = null + jumpSshClients = null + consola.info(`docker websocket 连接断开: ${ reason } - 当前连接数: ${ connectionCount }`) + }) + }) +} diff --git a/server/app/socket/onekey.js b/server/app/socket/onekey.js index 17daf32..59d774f 100644 --- a/server/app/socket/onekey.js +++ b/server/app/socket/onekey.js @@ -107,7 +107,7 @@ module.exports = (httpServer) => { return } isExecuting = true - socket.on('create', async ({ hostIds, token, command, timeout }) => { + socket.on('ws_onekey', async ({ hostIds, token, command, timeout }) => { const { code } = await verifyAuthSync(token, requestIP) if (code !== 1) { socket.emit('token_verify_fail') diff --git a/server/app/socket/plus.js b/server/app/socket/plus.js index dc2dfb5..97a57a9 100644 --- a/server/app/socket/plus.js +++ b/server/app/socket/plus.js @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/server/app/socket/sftp.js b/server/app/socket/sftp.js index 2c01fc8..30b9cf5 100644 --- a/server/app/socket/sftp.js +++ b/server/app/socket/sftp.js @@ -224,7 +224,7 @@ module.exports = (httpServer) => { let sftpClient = new SFTPClient() consola.success('terminal websocket 已连接') - socket.on('create', async ({ hostId, token }) => { + socket.on('ws_sftp', async ({ hostId, token }) => { const { code } = await verifyAuthSync(token, requestIP) consola.log('code:', code) if (code !== 1) { diff --git a/server/app/socket/terminal.js b/server/app/socket/terminal.js index f22d8dd..da2becf 100644 --- a/server/app/socket/terminal.js +++ b/server/app/socket/terminal.js @@ -43,12 +43,13 @@ function createInteractiveShell(socket, targetSSHClient) { consola.info('交互终端已关闭') targetSSHClient.end() }) - socket.emit('connect_shell_success') // 已连接终端,web端可以执行指令了 + socket.emit('terminal_connect_shell_success') // 已连接终端,web端可以执行指令了 }) }) } -async function createTerminal(hostId, socket, targetSSHClient) { +async function createTerminal(hostId, socket, targetSSHClient, isInteractiveShell = true) { + consola.info(`准备创建${ isInteractiveShell ? '交互式' : '非交互式' }终端:${ hostId }`) return new Promise(async (resolve) => { const targetHostInfo = await hostListDB.findOneAsync({ _id: hostId }) if (!targetHostInfo) return socket.emit('create_fail', `查找hostId【${ hostId }】凭证信息失败`) @@ -65,30 +66,34 @@ async function createTerminal(hostId, socket, targetSSHClient) { socket.emit('terminal_print_info', `准备连接目标终端: ${ name } - ${ host }`) socket.emit('terminal_print_info', `连接信息: ssh ${ username }@${ host } -p ${ port } -> ${ authType }`) - consola.info('准备连接目标终端:', host) consola.log('连接信息', { username, port, authType }) + let closeNoticeFlag = false // 避免重复发送通知 targetSSHClient .on('ready', async () => { - sendNoticeAsync('host_login', '终端登录', `别名: ${ name } \n IP:${ host } \n 端口:${ port } \n 状态: 登录成功`) - socket.emit('terminal_print_info', `终端连接成功: ${ name } - ${ host }`) consola.success('终端连接成功:', host) - socket.emit('connect_terminal_success', `终端连接成功:${ host }`) - let stream = await createInteractiveShell(socket, targetSSHClient) - resolve({ stream, jumpSshClients }) + if (isInteractiveShell) { + sendNoticeAsync('host_login', '终端登录', `别名: ${ name } \n IP:${ host } \n 端口:${ port } \n 状态: 登录成功`) + socket.emit('terminal_print_info', `终端连接成功: ${ name } - ${ host }`) + socket.emit('terminal_connect_success', `终端连接成功:${ host }`) + let stream = await createInteractiveShell(socket, targetSSHClient) + resolve({ stream, jumpSshClients }) + } else { + resolve({ jumpSshClients }) + } }) .on('close', (err) => { if (closeNoticeFlag) return closeNoticeFlag = false const closeReason = err ? '发生错误导致连接断开' : '正常断开连接' consola.info(`终端连接断开(${ closeReason }): ${ host }`) - socket.emit('connect_close', { reason: closeReason }) + socket.emit('terminal_connect_close', { reason: closeReason }) }) .on('error', (err) => { closeNoticeFlag = true sendNoticeAsync('host_login', '终端登录', `别名: ${ name } \n IP:${ host } \n 端口:${ port } \n 状态: 登录失败`) consola.error('连接终端失败:', host, err.message) - socket.emit('connect_terminal_fail', err.message) + socket.emit('terminal_connect_fail', err.message) }) .on('keyboard-interactive', function (name, instructions, instructionsLang, prompts, finish) { finish([targetConnectionOptions[authType]]) @@ -100,7 +105,7 @@ async function createTerminal(hostId, socket, targetSSHClient) { }) } catch (err) { consola.error('创建终端失败: ', host, err.message) - socket.emit('create_terminal_fail', err.message) + socket.emit('terminal_create_fail', err.message) } }) } @@ -127,7 +132,7 @@ module.exports = (httpServer) => { consola.success('terminal websocket 已连接') let targetSSHClient = null let jumpSshClients = [] - socket.on('create', async ({ hostId, token }) => { + socket.on('ws_terminal', async ({ hostId, token }) => { const { code } = await verifyAuthSync(token, requestIP) if (code !== 1) { socket.emit('token_verify_fail') @@ -135,7 +140,7 @@ module.exports = (httpServer) => { return } targetSSHClient = new SSHClient() - let { stream = null, jumpSshClients: jumpSshClientsFromCreate } = await createTerminal(hostId, socket, targetSSHClient) + let { stream = null, jumpSshClients: jumpSshClientsFromCreate } = await createTerminal(hostId, socket, targetSSHClient, true) jumpSshClients = jumpSshClientsFromCreate function listenerInput(key) { if (targetSSHClient._sock.writable === false) return consola.info('终端连接已关闭,禁止输入') @@ -168,3 +173,4 @@ module.exports = (httpServer) => { } module.exports.getConnectionOptions = getConnectionOptions +module.exports.createTerminal = createTerminal diff --git a/server/app/utils/plus.js b/server/app/utils/plus.js index 69bb053..fe4d7f6 100644 --- a/server/app/utils/plus.js +++ b/server/app/utils/plus.js @@ -1 +1 @@ -U2FsdGVkX18X5TRtUbdmc/+svI+ZQG53eCr1n5cNf1qpcB8oPWdgGLP0LUkMxAygavkY8tr/lLH4pgVRXcMXYN7OkS+q6B7O+BXXJtbJpNOa1pGIgGCJ1WHk3eiSMupSXhEfPPfv4eIsaMrGpAPIWsCg1H5u16KpeaP7MykpmbyHEzVrXIbddeiBneXySl5uNOiRk8qw/JQYCZSrt6D+Sp3xlBsiVyLwGkHxlcRWlVoe5VRkIgMtL9q+Dego/nk1r56iqIkNmnP+kmwPY2wMeOT6lPwYbeRlmdD9VRGRAkgrg1waKqvK5qOMYCMCVDubhvQ5ulD5JtGM0SgzlgWhYoias7HC7AM9FLd8+rUZYw1BXZ/J9eZu2H1gzmClEDWMeHcQuEPPddyUuP9q/hsADGsxxPMMvquEtuedzcx3FQN1dDVqDlkPNAW/DWZ9eB717gcS2jmQlCk+OdyAvlZhTyj/4GhThVrEc5FZo63Y9J7oE4p70/1NCWlnRUKAqBibCeiJkFHR7zcdlLKmUCgO1rXz+PjqSwemG+RJ4tGb1GLdztA6APB17xsBgI3hISM2LSDov/snkYKDgIxYkQctoKGF/c6TLeYYd1YKxWJ4cCeYB+Gko/bH2c+AHMbECKgxZGfCZOJaD8ksY0qRIllKAq52rPeb5kbaNikhkUnvqmCMqWdr7mi8JYHqzW7ys0hp5H6/8tyWxVrSh9EP2hXbpCQF3Wk+0zDt5Dflkiriw8xTr1mCOuSYA1C1M4PyKuaG60DUbLl7WqRxFAd87qwWC4A5fSfMlyWcu2JmZ9M6LfHY7BqKSS0nGQ9YEOwCPol00zeczmEs2WiP+5Esf0U/ZxluCHAmNbJI9ln5AR2RZDc= \ No newline at end of file +U2FsdGVkX1/0WBuJm6/aJntcPq4eyOfQj6zUiDepQcZ+XEkvnCDV/v/x4NBb2uolBryIiLf/dOVkGwMtm0FrtWwvbplESnlHkeAXAPJFQFZSFJfhAAlLobIIHhkCEVEHnA7oBE9GkobuM5yXFNQE0ciYNHkwRkAxk+CdXsdlaTKdnFyInWQ92ljQcZVzr7sW8wnNNkKk9WhmdvsvFtljfkA3YY7AMtEiZLAOdqCpaC5WIzP7sos8C/cmdeY9jmkmtZr79NnCWsyV5MWQB9jvKk7pk0o8wmnlGhsmACyJzzRdzFXFOTouh+pXloohb/uVHx/v2yrrWHjpwwPIbM1d462/iEWv5t4cOHlGyhze0Po26y7QCwId3M2m/nCB726wlKQl6KMjhoavVOGKrkRp4tfLtKb/wgauyQAUSDgVmCAesCVkxS7q+z5u+GJLoAgQDJbnHG0AQxF1lQK3+XrcrO0qr98omnHUOkuBVdPvfZN87HlW20khMEzYW95z9gS2BmlJ+1hyEcOhgIPpG03GAuE6A7NHTpAmWjH9pQeQ8ZhyjywpEEHGRUUgZWuN9s1Mh60sw+JzjI0gXMuX0FfrG3W2zmQa6XB2RjULrYVMNRUDrpOrP2/s8uz9qL/S0dzNsUDsEWgwUgYhW075z932xLhQIJ087WeqHXO0QZ35OSib3I1EaSKIADWgvs1dz5xuLjXBWKaNewFS6w0+CCm6Hg4QUvZeX+9gyNygynEZX1Oe2RJX0hnfYoa9ZbnbB3vGd/Ka59Wi58YOKyIRGV5YX9lRPqdN0OyLxzFhAXqR8DXabvJgaidsJEvyxpP7odpBgMuPb4KO5axeuvlFLp1GrxbRpv6quEhjFCSLQyQMJ8o= \ No newline at end of file diff --git a/server/package.json b/server/package.json index ce2dce7..1181c6d 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "3.0.6", + "version": "3.0.7", "description": "easynode-server", "bin": "./bin/www", "scripts": { diff --git a/web/package.json b/web/package.json index 9cd64ee..9bc0422 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "web", - "version": "3.0.6", + "version": "3.0.7", "description": "easynode-web", "private": true, "scripts": { diff --git a/web/src/components/code-edit/index.vue b/web/src/components/code-edit/index.vue index 0befd1b..4503f6c 100644 --- a/web/src/components/code-edit/index.vue +++ b/web/src/components/code-edit/index.vue @@ -19,7 +19,8 @@