diff --git a/game-server/app.ts b/game-server/app.ts index 04a6bf5e4..f1c509ac3 100644 --- a/game-server/app.ts +++ b/game-server/app.ts @@ -1,3 +1,4 @@ +require('xprofiler').start(); import { COM_TEAM_STATUS } from './app/consts'; import { createTcpAcceptor, @@ -38,7 +39,7 @@ filePath.CONFIG_DIR = '/config'; const adminfilePath = _pinus.DEFAULT_ADMIN_PATH; adminfilePath.ADMIN_FILENAME = 'adminUser'; adminfilePath.ADMIN_USER = 'config/adminUser'; -const ALL_ENVS = 'production|development|alpha|dev|isbn'; +const ALL_ENVS = 'production|development|alpha|dev|isbn|monitor'; /** * 替换全局Promise * 自动解析sourcemap diff --git a/game-server/config.json b/game-server/config.json index e45862794..787c3287d 100644 --- a/game-server/config.json +++ b/game-server/config.json @@ -1 +1 @@ -{"env":"alpha"} \ No newline at end of file +{"env":"development"} diff --git a/game-server/config/database.ts b/game-server/config/database.ts index 8318bb78c..872630e3b 100644 --- a/game-server/config/database.ts +++ b/game-server/config/database.ts @@ -24,5 +24,10 @@ module.exports = { 'mongo': 'mongodb://root:Bantus123@dds-8vb74337eab84d641.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vb74337eab84d642.mongodb.zhangbei.rds.aliyuncs.com:3717/admin?replicaSet=mgset-504694158', 'redis': 'r-8vbekkbb3z8ru2ckuj.redis.zhangbei.rds.aliyuncs.com', 'redispw': 'zyz_isbn_2021' + }, + 'monitor': { + 'mongo': 'mongodb://dbop:zyzMon2021@dds-8vb7474e31ba7ed41.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vb7474e31ba7ed42.mongodb.zhangbei.rds.aliyuncs.com:3717/zyz?replicaSet=mgset-505529944', + 'redis': 'r-8vb130185rp2ir3lqn.redis.zhangbei.rds.aliyuncs.com', + 'redispw': 'zyz_monitor_2021' } }; \ No newline at end of file diff --git a/game-server/config/master.ts b/game-server/config/master.ts index e716b4e8d..c29269fd7 100644 --- a/game-server/config/master.ts +++ b/game-server/config/master.ts @@ -23,5 +23,10 @@ module.exports = { 'id': 'master-server-1', 'host': '127.0.0.1', 'port': 3005 + }, + 'monitor': { + 'id': 'master-server-1', + 'host': '127.0.0.1', + 'port': 3005 } }; \ No newline at end of file diff --git a/game-server/config/servers.ts b/game-server/config/servers.ts index 084e3403d..f62defe57 100644 --- a/game-server/config/servers.ts +++ b/game-server/config/servers.ts @@ -197,5 +197,35 @@ module.exports = { {'id': 'guild-server-1', 'host': '127.0.0.1', 'port': 6057, "args": " --inspect=9239"}, {'id': 'guild-server-2', 'host': '127.0.0.1', 'port': 6058, "args": " --inspect=9240"} ] + }, + 'monitor': { + 'connector': [ + {'id': 'connector-server-1', 'port': 4050, 'clientHost': 'zyz_monitor.trgame.cn', 'host': '127.0.0.1', 'clientPort': 3050, 'frontend': true}, + {'id': 'connector-server-2', 'port': 4051, 'clientHost': 'zyz_monitor.trgame.cn', 'host': '127.0.0.1', 'clientPort': 3051, 'frontend': true}, + {'id': 'connector-server-3', 'port': 4052, 'clientHost': 'zyz_monitor.trgame.cn', 'host': '127.0.0.1', 'clientPort': 3052, 'frontend': true} + ], + 'chat': [ + {'id': 'chat-server-1', 'host': '127.0.0.1', 'port': 6050}, + ], + 'role': [ + {'id': 'role-server-1', 'host': '127.0.0.1', 'port': 6053} + ], + 'battle': [ + {'id': 'battle-server-1', 'host': '127.0.0.1', 'port': 6054} + ], + 'gate': [ + {'id': 'gate-server-1', 'host': '127.0.0.1', 'clientHost': 'zyz_monitor.trgame.cn', 'clientPort': 3014, 'frontend': true}, + {'id': 'gate-server-2', 'host': '127.0.0.1', 'clientHost': 'zyz_monitor.trgame.cn', 'clientPort': 3015, 'frontend': true} + ], + 'gm': [ + {'id': 'gm-server-1', 'host': '127.0.0.1', 'port': 6055} + ], + 'systimer': [ + {'id': 'systimer-server-1', 'host': '127.0.0.1', 'port': 6056} + ], + 'guild': [ + {'id': 'guild-server-1', 'host': '127.0.0.1', 'port': 6057, "args": " --inspect=9239"}, + {'id': 'guild-server-2', 'host': '127.0.0.1', 'port': 6058, "args": " --inspect=9240"} + ] } }; diff --git a/game-server/package-lock.json b/game-server/package-lock.json index 98fd8071d..bdcce742e 100644 --- a/game-server/package-lock.json +++ b/game-server/package-lock.json @@ -1799,6 +1799,11 @@ "thenify-all": "^1.0.0" } }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.14.2.tgz?cache=0&sync_timestamp=1602591700047&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnan%2Fdownload%2Fnan-2.14.2.tgz", + "integrity": "sha1-9TdkAGlRaPTMaUrJOT0MlYXu6hk=" + }, "nanoid": { "version": "3.1.12", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz", @@ -2979,6 +2984,42 @@ "resolved": "https://registry.npm.taobao.org/xmlhttprequest-ssl/download/xmlhttprequest-ssl-1.5.5.tgz?cache=0&sync_timestamp=1564594177335&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxmlhttprequest-ssl%2Fdownload%2Fxmlhttprequest-ssl-1.5.5.tgz", "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" }, + "xprofiler": { + "version": "1.2.5", + "resolved": "https://registry.npm.taobao.org/xprofiler/download/xprofiler-1.2.5.tgz", + "integrity": "sha1-ugaj1UMv9zIoQR6mhsNTnMWWTsQ=", + "requires": { + "moment": "^2.29.1", + "nan": "^2.14.2", + "node-pre-gyp": "^0.16.0", + "uuid": "^8.3.1", + "yargs": "^15.4.1" + }, + "dependencies": { + "node-pre-gyp": { + "version": "0.16.0", + "resolved": "https://registry.npm.taobao.org/node-pre-gyp/download/node-pre-gyp-0.16.0.tgz?cache=0&sync_timestamp=1612890864161&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-pre-gyp%2Fdownload%2Fnode-pre-gyp-0.16.0.tgz", + "integrity": "sha1-I4+lQDZHhOUBXfzbp42jk34Y29w=", + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.3", + "needle": "^2.5.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npm.taobao.org/uuid/download/uuid-8.3.2.tgz?cache=0&sync_timestamp=1607460209394&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuuid%2Fdownload%2Fuuid-8.3.2.tgz", + "integrity": "sha1-gNW1ztJxu5r2xEXyGhoExgbO++I=" + } + } + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz", diff --git a/game-server/package.json b/game-server/package.json index 9fa5f1eb3..7508f651d 100644 --- a/game-server/package.json +++ b/game-server/package.json @@ -50,7 +50,8 @@ "request": "^2.88.2", "request-promise": "^4.2.6", "source-map-support": "^0.5.0", - "ts-node": "^8.2.0" + "ts-node": "^8.2.0", + "xprofiler": "^1.2.5" }, "devDependencies": { "@types/node-schedule": "^1.3.1", diff --git a/game-server/pm2Config.js b/game-server/pm2Config.js new file mode 100644 index 000000000..b7bf8e794 --- /dev/null +++ b/game-server/pm2Config.js @@ -0,0 +1,121 @@ +/** + * Created by superzhan on 2018/3/19. + * + * 根据pomelo 的 servers.json 生成 pm2 启动文件 + */ + +//服务器端 工程代码的目录 +var cwd='./'; + +//项目的运行环境 +var config = require('./config.json'); +var envType= config.env; + +//配置文件的输出目录 +var outputFilePath = './pomeloPm2Start.json'; + +var masterJsonFile = require('./config/master.ts'); +var serversJosnFile = require('./config/servers.ts'); + +//模板数据 +var processConfigType = { + "name" : "", + "script" : "./dist/app.js", + "args" : [] , + "watch": false, + "out_file": "./logs/app.log", + "error_file": "./logs/err.log", + "cwd": "", + "merge_logs": true, + "exec_mode": "fork_mode", +}; + + +//最后的结果数据 +var resultJson={}; +resultJson.apps=new Array(); + + +var clone = function(origin) { + if(!origin) { + return; + } + var obj = {}; + for(var f in origin) { + obj[f] = origin[f]; + } + return obj; +}; + +// +var masterConfig = masterJsonFile[envType]; +var serversConfig = serversJosnFile[envType]; + +//生成master 的配置 +var pm2Master = clone( processConfigType ); +pm2Master.name="master"; +pm2Master.args = new Array(); +pm2Master.args.push('serverType=master'); +pm2Master.args.push('id='+masterConfig.id); +pm2Master.args.push('host='+masterConfig.host); +pm2Master.args.push('port='+masterConfig.port); +pm2Master.args.push('env='+envType); +pm2Master.args.push('mode=stand-alone'); +pm2Master.cwd= cwd; +pm2Master.out_file = './logs/'+masterConfig.id+"_app.log"; +pm2Master.error_file='./logs/'+masterConfig.id+'_error.log'; +resultJson.apps.push(pm2Master); + +//生成当个服务器的配置 +for(serverType in serversConfig) +{ + var servers = serversConfig[serverType]; + for(var i=0;i { + const config = {} as PowerPartial; + + // override config from framework / plugin + // use for cookie sign key, should change to your own and keep security + config.keys = appInfo.name + '_1600244957952_7142'; + + // add your egg config in here + config.middleware = []; + + config.cluster = { + listen: { + port: 7500 + } + }; + // add your special config in here + const bizConfig = { + sourceUrl: `https://github.com/eggjs/examples/tree/master/${appInfo.name}`, + }; + + config.mongoose = { + url: 'mongodb://dbop:zyzMon2021@dds-8vb7474e31ba7ed41.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vb7474e31ba7ed42.mongodb.zhangbei.rds.aliyuncs.com:3717/zyz?replicaSet=mgset-505529944', // 内网 + options: { useNewUrlParser: true, useUnifiedTopology: true }, + }; + + config.security = { + csrf: { + enable: false, + ignoreJSON: true + }, + domainWhiteList: ['http://localhost:9000'] + }; + + // 配置上传 + config.multipart = { + fileSize: '50mb', + mode: 'stream', + fileExtensions: ['.zip', '.tar.gz'], // 扩展几种上传的文件格式 + }; + + config.alinode = { + appid: '86043', + secret: '54ef0364995b0c4f2ab42150e29ad30df8327a3a', + error_log: [ '/root/logs/zyz/zyz-web.log', '/root/logs/zyz/common-error.log', '/root/logs/zyz/egg-agent.log' ], + packages: [ '/root/zyz/web-server/package.json' ], + }; + + // the return config will combines to EggAppConfig + return { + ...config, + ...bizConfig, + }; +}; diff --git a/pushdocker.sh b/pushdocker.sh index 70a3d5463..ff0bbcc3a 100755 --- a/pushdocker.sh +++ b/pushdocker.sh @@ -4,6 +4,7 @@ if [ $# != 1 ] ; then echo "stable: 同步代码到 stable 服务器上,作为正式服使用" echo "alpha: 同步代码到 alpha 服务器上,作为测试服供服务开发使用" echo "dev: 同步代码到 dev 服务器上,作为测试服供服务开发使用" + echo "monitor: 同步代码到 monitor 服务器上,用做监控和压力测试" exit 1; fi @@ -15,6 +16,8 @@ elif [ ${1} == 'dev' ] ; then destUrl="root@zyzdev:/root/zyz/" elif [ ${1} == 'isbn' ] ; then destUrl="root@zyzisbn:/root/zyz/" +elif [ ${1} == 'monitor' ] ; then +destUrl="root@zyzmon:/root/zyz/" else echo "需要一个参数指明服务器" exit 1; @@ -23,4 +26,4 @@ fi node ./game-server/config.js ${1} rsync -av --include '.babelrc' --include '.eslintrc.js' --exclude '.*' --exclude './game-server/node_modules' --exclude './game-server/node_modules' --exclude './game-server/dist' --exclude 'node_modules' --exclude 'bower_components' --exclude 'dist' --progress --inplace --no-owner --no-group --rsh='ssh -p22' . ${destUrl} -git checkout ./game-server/config.json \ No newline at end of file +git checkout ./game-server/config.json diff --git a/web-server/app/resource b/web-server/app/resource new file mode 120000 index 000000000..773d17ffb --- /dev/null +++ b/web-server/app/resource @@ -0,0 +1 @@ +../../shared/resource \ No newline at end of file diff --git a/web-server/config/config.monitor.ts b/web-server/config/config.monitor.ts new file mode 100644 index 000000000..d67df0f79 --- /dev/null +++ b/web-server/config/config.monitor.ts @@ -0,0 +1,61 @@ +import { EggAppConfig, EggAppInfo, PowerPartial } from 'egg'; +const path = require('path'); + +export default (appInfo: EggAppInfo) => { + const config = {} as PowerPartial; + + // override config from framework / plugin + // use for cookie sign key, should change to your own and keep security + config.keys = appInfo.name + '_1597499383757_3508'; + config.security = { + csrf: { + enable: false, + }, + domainWhiteList: [ '*' ], + }; + config.cors = { + origin: '*', // 匹配规则 域名+端口 *则为全匹配 + allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH', + }; + // add your egg config in here + config.middleware = [ 'parmsDecode' ]; + + config.mongoose = { + url: 'mongodb://dbop:zyzMon2021@dds-8vb7474e31ba7ed41.mongodb.zhangbei.rds.aliyuncs.com:3717,dds-8vb7474e31ba7ed42.mongodb.zhangbei.rds.aliyuncs.com:3717/zyz?replicaSet=mgset-505529944', // 内网 + options: { useNewUrlParser: true, useUnifiedTopology: true }, + }; + + config.alinode = { + appid: '86043', + secret: '54ef0364995b0c4f2ab42150e29ad30df8327a3a', + error_log: [ '/root/logs/zyz/zyz-web.log', '/root/logs/zyz/common-error.log', '/root/logs/zyz/egg-agent.log' ], + packages: [ '/root/zyz/web-server/package.json' ], + }; + + config.view = { + root: path.join(appInfo.baseDir, '/app/public'), + defaultViewEngine: 'nunjucks', + mapping: { + '.html': 'nunjucks' //左边写成.html后缀,会自动渲染.html文件 + }, + }; + + config.decodeParm = true; + + config.static = { + prefix: '/', + dir: path.join(appInfo.baseDir, '/app/public'), + }; + + + // add your special config in here + const bizConfig = { + sourceUrl: `https://github.com/eggjs/examples/tree/master/${appInfo.name}`, + }; + + // the return config will combines to EggAppConfig + return { + ...config, + ...bizConfig, + }; +}; diff --git a/web-server/package.json b/web-server/package.json index b40322247..5fa6c841f 100644 --- a/web-server/package.json +++ b/web-server/package.json @@ -21,7 +21,8 @@ "lint": "eslint . --ext .ts", "clean": "ets clean", "local": "cross-env EGG_SERVER_ENV=local npm run dev", - "isbn": "cross-env EGG_SERVER_ENV=isbn npm run dev" + "isbn": "cross-env EGG_SERVER_ENV=isbn npm run dev", + "monitor": "cross-env EGG_SERVER_ENV=monitor npm run dev" }, "dependencies": { "cross-env": "^7.0.3", @@ -33,6 +34,8 @@ "egg-view-nunjucks": "^2.2.0", "mongoose-transactions": "^1.1.4", "reflect-metadata": "^0.1.13", + "request": "^2.88.2", + "request-promise": "^4.2.6", "underscore": "^1.12.0" }, "devDependencies": {