From fac94479101121c4d4532cb32f9980501ce34bda Mon Sep 17 00:00:00 2001 From: chaoszhu Date: Tue, 23 Jul 2024 00:37:57 +0800 Subject: [PATCH] update --- CHANGELOG.md | 124 ++++++++++++++++---------------- Q&A.md | 40 +++++------ README.md | 12 ++-- client/app/socket/monitor.js | 134 +++++++++++++++++------------------ client/package.json | 70 +++++++++--------- 5 files changed, 190 insertions(+), 190 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c7d971..e2ba15a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,62 +1,62 @@ -## [2.0.0-beta](https://github.com/chaos-zhu/easynode/releases) (2024-07-13) - -底层代码重构 - -## [1.2.1](https://github.com/chaos-zhu/easynode/releases) (2022-12-12) - -### Features - -* 新增支持终端长命令输入模式 ✔ -* 新增前端静态文件缓存 ✔ -* 【重要】v1.2.1开始移除创建https服务 ✔ - -### Bug Fixes - -* v1.2的若干bug... - -## [1.2.0](https://github.com/chaos-zhu/easynode/releases) (2022-09-12) - -### Features - -* 新增邮件通知: 包括登录面板、密码修改、服务器到期、服务器离线等 ✔ -* 支持服务器分组(为新版UI作准备的) ✔ -* 面板功能调整,支持http延迟显示、支持服务器控制台直达与到期时间字段 ✔ -* 优化终端输入、支持状态面板收缩 ✔ -* **全新SFTP功能支持,上传下载进度条展示** ✔ -* **支持在线文件编辑与保存** ✔ - -### Bug Fixes - -* v1.1的若干bug... - ---- - -## [1.1.0](https://github.com/chaos-zhu/easynode/releases) (2022-06-27) - -### Features - -* ssh密钥/密码(采用对称AES+RSA非对称双加密传输与存储)、jwtToken(服务端对称加密传输) ✔ -* 加密储存登录密码 ✔ -* 登录IP检测机制&历史登录查询✔ -* 终端多tab支持✔ -* 终端页左侧栏信息✔ -* 客户端支持ARM实例✔ - -### Bug Fixes - -* 修复终端展示异常的Bug✔ -* 修复保存私钥时第二次选择无效的bug✔ -* 修复面板客户端探针断开更新不及时的bug✔ -* 修复移除主机未移除ssh密钥信息的bug✔ -* 修复服务器排序bug✔ -* 解决https下无法socket连接到客户端bug✔ - ---- - -## [1.0.0](https://github.com/chaos-zhu/easynode/releases) (2022-06-08) - - -### Features - -* 通过`websocker实时更新`服务器基本信息: 系统、公网IP、CPU、内存、硬盘、网卡等 -* 解决`SSH跨端同步`问题——Web SSH +## [2.0.0-beta](https://github.com/chaos-zhu/easynode/releases) (2024-07-13) + +底层代码重构 + +## [1.2.1](https://github.com/chaos-zhu/easynode/releases) (2022-12-12) + +### Features + +* 新增支持终端长命令输入模式 ✔ +* 新增前端静态文件缓存 ✔ +* 【重要】v1.2.1开始移除创建https服务 ✔ + +### Bug Fixes + +* v1.2的若干bug... + +## [1.2.0](https://github.com/chaos-zhu/easynode/releases) (2022-09-12) + +### Features + +* 新增邮件通知: 包括登录面板、密码修改、服务器到期、服务器离线等 ✔ +* 支持服务器分组(为新版UI作准备的) ✔ +* 面板功能调整,支持http延迟显示、支持服务器控制台直达与到期时间字段 ✔ +* 优化终端输入、支持状态面板收缩 ✔ +* **全新SFTP功能支持,上传下载进度条展示** ✔ +* **支持在线文件编辑与保存** ✔ + +### Bug Fixes + +* v1.1的若干bug... + +--- + +## [1.1.0](https://github.com/chaos-zhu/easynode/releases) (2022-06-27) + +### Features + +* ssh密钥/密码(采用对称AES+RSA非对称双加密传输与存储)、jwtToken(服务端对称加密传输) ✔ +* 加密储存登录密码 ✔ +* 登录IP检测机制&历史登录查询✔ +* 终端多tab支持✔ +* 终端页左侧栏信息✔ +* 客户端支持ARM实例✔ + +### Bug Fixes + +* 修复终端展示异常的Bug✔ +* 修复保存私钥时第二次选择无效的bug✔ +* 修复面板客户端探针断开更新不及时的bug✔ +* 修复移除主机未移除ssh密钥信息的bug✔ +* 修复服务器排序bug✔ +* 解决https下无法socket连接到客户端bug✔ + +--- + +## [1.0.0](https://github.com/chaos-zhu/easynode/releases) (2022-06-08) + + +### Features + +* 通过`websocker实时更新`服务器基本信息: 系统、公网IP、CPU、内存、硬盘、网卡等 +* 解决`SSH跨端同步`问题——Web SSH diff --git a/Q&A.md b/Q&A.md index d5d0d48..33576db 100644 --- a/Q&A.md +++ b/Q&A.md @@ -1,20 +1,20 @@ -# Q&A - -## CentOS7/8启动服务失败 - -> 先关闭SELinux - -```shell -vi /etc/selinux/config -SELINUX=enforcing -// 修改为禁用 -SELINUX=disabled -``` - -> 重启:`reboot`,再使用一键脚本安装 - -> 查看SELinux状态:sestatus - -## 客户端服务启动成功,无法连接? - -> 端口未开放:`iptables -I INPUT -s 0.0.0.0/0 -p tcp --dport 22022 -j ACCEPT` 或者 `rm -rf /etc/iptables && reboot` +# Q&A + +## CentOS7/8启动服务失败 + +> 先关闭SELinux + +```shell +vi /etc/selinux/config +SELINUX=enforcing +// 修改为禁用 +SELINUX=disabled +``` + +> 重启:`reboot`,再使用一键脚本安装 + +> 查看SELinux状态:sestatus + +## 客户端服务启动成功,无法连接? + +> 端口未开放:`iptables -I INPUT -s 0.0.0.0/0 -p tcp --dport 22022 -j ACCEPT` 或者 `rm -rf /etc/iptables && reboot` diff --git a/README.md b/README.md index 028cf16..af4a282 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# 重构中, 老版本切换v1.2分支部署 - -## EasyNode - -> 一个简易的个人Linux服务器管理面板. - +# 重构中, 老版本切换v1.2分支部署 + +## EasyNode + +> 一个简易的个人Linux服务器管理面板. + diff --git a/client/app/socket/monitor.js b/client/app/socket/monitor.js index 5b25115..ba04929 100644 --- a/client/app/socket/monitor.js +++ b/client/app/socket/monitor.js @@ -1,67 +1,67 @@ -const { Server } = require('socket.io') -const schedule = require('node-schedule') -const axios = require('axios') -let getOsData = require('../utils/os-data') - -let serverSockets = {}, ipInfo = {}, osData = {} - -async function getIpInfo() { - try { - let { data } = await axios.get('http://ip-api.com/json?lang=zh-CN') - console.log('getIpInfo Success: ', new Date()) - ipInfo = data - } catch (error) { - console.log('getIpInfo Error: ', new Date(), error) - } -} - -function ipSchedule() { - let rule1 = new schedule.RecurrenceRule() - rule1.second = [0, 10, 20, 30, 40, 50] - schedule.scheduleJob(rule1, () => { - let { query, country, city } = ipInfo || {} - if(query && country && city) return - console.log('Task: start getIpInfo', new Date()) - getIpInfo() - }) - - // 每日凌晨两点整,刷新ip信息(兼容动态ip服务器) - let rule2 = new schedule.RecurrenceRule() - rule2.hour = 2 - rule2.minute = 0 - rule2.second = 0 - schedule.scheduleJob(rule2, () => { - console.log('Task: refresh ip info', new Date()) - getIpInfo() - }) -} - -ipSchedule() - -module.exports = (httpServer) => { - const serverIo = new Server(httpServer, { - path: '/client/os-info', - cors: { - origin: '*' - } - }) - - serverIo.on('connection', (socket) => { - serverSockets[socket.id] = setInterval(async () => { - try { - osData = await getOsData() - socket && socket.emit('client_data', Object.assign(osData, { ipInfo })) - } catch (error) { - console.error('客户端错误:', error) - socket && socket.emit('client_error', { error }) - } - }, 1500) - - socket.on('disconnect', () => { - if(serverSockets[socket.id]) clearInterval(serverSockets[socket.id]) - delete serverSockets[socket.id] - socket.close && socket.close() - socket = null - }) - }) -} +const { Server } = require('socket.io') +const schedule = require('node-schedule') +const axios = require('axios') +let getOsData = require('../utils/os-data') + +let serverSockets = {}, ipInfo = {}, osData = {} + +async function getIpInfo() { + try { + let { data } = await axios.get('http://ip-api.com/json?lang=zh-CN') + console.log('getIpInfo Success: ', new Date()) + ipInfo = data + } catch (error) { + console.log('getIpInfo Error: ', new Date(), error) + } +} + +function ipSchedule() { + let rule1 = new schedule.RecurrenceRule() + rule1.second = [0, 10, 20, 30, 40, 50] + schedule.scheduleJob(rule1, () => { + let { query, country, city } = ipInfo || {} + if(query && country && city) return + console.log('Task: start getIpInfo', new Date()) + getIpInfo() + }) + + // 每日凌晨两点整,刷新ip信息(兼容动态ip服务器) + let rule2 = new schedule.RecurrenceRule() + rule2.hour = 2 + rule2.minute = 0 + rule2.second = 0 + schedule.scheduleJob(rule2, () => { + console.log('Task: refresh ip info', new Date()) + getIpInfo() + }) +} + +ipSchedule() + +module.exports = (httpServer) => { + const serverIo = new Server(httpServer, { + path: '/client/os-info', + cors: { + origin: '*' + } + }) + + serverIo.on('connection', (socket) => { + serverSockets[socket.id] = setInterval(async () => { + try { + osData = await getOsData() + socket && socket.emit('client_data', Object.assign(osData, { ipInfo })) + } catch (error) { + console.error('客户端错误:', error) + socket && socket.emit('client_error', { error }) + } + }, 1500) + + socket.on('disconnect', () => { + if(serverSockets[socket.id]) clearInterval(serverSockets[socket.id]) + delete serverSockets[socket.id] + socket.close && socket.close() + socket = null + }) + }) +} diff --git a/client/package.json b/client/package.json index 369ca5f..50d8303 100644 --- a/client/package.json +++ b/client/package.json @@ -1,35 +1,35 @@ -{ - "name": "easynode-client", - "version": "1.0.0", - "description": "easynode-client", - "bin": "./bin/www", - "pkg": { - "outputPath": "dist" - }, - "scripts": { - "client": "nodemon ./app/main.js", - "pkgwin": "pkg . -t node16-win-x64", - "pkglinux:x86": "pkg . -t node16-linux-x64", - "pkglinux:arm": "pkg . -t node16-linux-arm64" - }, - "keywords": [], - "author": "", - "license": "ISC", - "nodemonConfig": { - "ignore": [ - "*.json" - ] - }, - "dependencies": { - "axios": "^0.21.4", - "koa": "^2.13.1", - "node-os-utils": "^1.3.6", - "node-schedule": "^2.1.0", - "socket.io": "^4.4.1" - }, - "devDependencies": { - "eslint": "^7.32.0", - "nodemon": "^2.0.15", - "pkg": "5.6" - } -} +{ + "name": "easynode-client", + "version": "1.0.0", + "description": "easynode-client", + "bin": "./bin/www", + "pkg": { + "outputPath": "dist" + }, + "scripts": { + "client": "nodemon ./app/main.js", + "pkgwin": "pkg . -t node16-win-x64", + "pkglinux:x86": "pkg . -t node16-linux-x64", + "pkglinux:arm": "pkg . -t node16-linux-arm64" + }, + "keywords": [], + "author": "", + "license": "ISC", + "nodemonConfig": { + "ignore": [ + "*.json" + ] + }, + "dependencies": { + "axios": "^0.21.4", + "koa": "^2.13.1", + "node-os-utils": "^1.3.6", + "node-schedule": "^2.1.0", + "socket.io": "^4.4.1" + }, + "devDependencies": { + "eslint": "^7.32.0", + "nodemon": "^2.0.15", + "pkg": "5.6" + } +}