Commit 76fa9c78 authored by 智勇's avatar 智勇

init

parents
node_modules
.idea/
npm-*.log
package-lock.json
Dockerfile
.dockerignore
*.heapsnapshot
const Router = require('koa-router');
let new_os_key = "";
const router = new Router();
function generateUUID() {
var d = new Date().getTime();
var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = (d + Math.random() * 16) % 16 | 0;
d = Math.floor(d / 16);
return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});
return uuid;
};
const get_code = async function (ctx) {
if (new_os_key == "") {
new_os_key = generateUUID();
}
ctx.body = {
code: new_os_key
};
}
router
.get('/get_code', get_code)
module.exports = router
\ No newline at end of file
'use strict'
const Router = require('koa-router');
const config = require(configPath);
const proConfig = require('../model/mongo/qa_api/ProConfig')
// const logger = require('koa-log4').getLogger('controller:proconfig');
const router = new Router();
const query = async function (ctx) {
let item = await proConfig.statics.getProjectByQuery(ctx.request.body);
ctx.body = ctx.ok(item)
}
router
.get('/query', query)
module.exports = router
\ No newline at end of file
'use strict'
const Router = require('koa-router');
const router = new Router();
const proxy = require('request-proxy')
const timingLogger = require('koa-log4').getLogger('timing')
const config = require(configPath)
const error = require('./middleware/error')
const result = require('./middleware/result')
const proconfig = require('./controller/proconfig')
const docker = require('./controller/docker')
// const ghelp = require('./controller/ghelp')
router
.use(error())
.use(proxy({
logger: timingLogger,
agent: config.agent
}))
.use(result())
.use('/proconfig', proconfig.routes())
.use('/docker', docker.routes())
// .use('/ghelp', ghelp.routes())
module.exports = router;
\ No newline at end of file
'use strict';
const logger = require('koa-log4').getLogger('middleware:error');
module.exports = function () {
return async function (ctx, next) {
try {
await next();
} catch (e) {
logger.error(e, ctx.path)
ctx.respond = true
ctx.status = 200;
ctx.body = {
code: '0001',
business: '0001',
msg: '系统出错了哦,请稍后再试。'
};
}
}
};
\ No newline at end of file
'use strict'
module.exports = {
ERROR_INPUT: { msg: '输入参数不正确', code: '0001', businessCode: '0001' }
}
\ No newline at end of file
'use strict';
const Code = require('./code')
module.exports = function () {
return async function (ctx, next) {
if (ctx.ok || ctx.fail) return next()
ctx.ok = function (data) {
return {
code: '0000',
businessCode: '0000',
data: data
}
}
ctx.Code = Code
ctx.fail = function (msg, code, businessCode) {
if (msg && msg.code) {
return msg
}
return {
code: code || '0001',
businessCode: businessCode || '0001',
msg: msg || '请求失败,请稍候重试'
}
}
return next()
}
};
\ No newline at end of file
'use strict';
const Schema = require('mongoose').Schema;
// 表结构
const schema = new Schema({
git_lab: { type: String, unique: false, required: true, index: false },
port: { type: Number, unique: true, required: true, index: false },
is_active: { type: Boolean, unique: false, required: true, index: false },
type: { type: String, unique: false, required: true, index: false },
git_path: { type: String, unique: true, required: true, index: true },
git_path_group: { type: String, unique: false, required: true, index: false },
project_name: { type: String, unique: false, required: true, index: false },
host_name: { type: String, unique: false, required: false, index: false },
log_path: { type: String, unique: false, required: false, index: false },
config_path: { type: String, unique: false, required: false, index: false },
des: { type: String, unique: false, required: false, index: false },
auth: { type: String, unique: false, required: false, index: false },
jar_path: { type: String, unique: false, required: false, index: false },
command1: { type: String, unique: false, required: false, index: false },
command2: { type: String, unique: false, required: false, index: false },
command3: { type: String, unique: false, required: false, index: false },
command4: { type: String, unique: false, required: false, index: false },
command5: { type: String, unique: false, required: false, index: false },
build_command: { type: String, unique: false, required: false, index: false },
start_command: { type: String, unique: false, required: false, index: false },
stop_command: { type: String, unique: false, required: false, index: false }
}, {
autoIndex: false,
versionKey: false,
collection: 'ProConfig', // 表名
timestamps: true
});
schema.statics.getProjectByQuery = async function (query, sort) {
return await this.find(query).sort(sort)
}
module.exports = schema
const mongoose = require('mongoose');
const log = require('koa-log4').getLogger('service:mongo')
const config = require(configPath)
const path = require('path')
mongoose.Promise = global.Promise;
// 创建数据库连接
const db = mongoose.createConnection(config.mongo.api, {
autoReconnect: true,
poolSize: 5,
connectTimeoutMS: 60000,
socketTimeoutMS: 60000,
useNewUrlParser: true
// useMongoClient: true
});
db.on('error', function (err) {
log.error(`error: connect ${config.mongo.api} ${err}`);
});
db.once('open', function () {
log.info(`connect ${config.mongo.api} success!`);
});
const schemas = require('require-all')({
dirname: path.resolve(__dirname, '../model/mongo/qa_api')
})
const models = {}
for (let prop in schemas) {
models[prop] = db.model(prop, schemas[prop])
}
module.exports = models
const Redis = require('ioredis');
const config = require(configPath)
const logger = require('koa-log4').getLogger('service:redis')
// 优先使用哨兵
let option = config.redis.sentinels || config.redis.api
let client = new Redis(config.redis.sentinels || config.redis.api)
client.on('error', function (e) {
logger.error(`error : connect redis ${option.name || option} ${e}`)
});
client.on('ready', function () {
logger.info(`connect redis ${option.name || option} success!`);
});
module.exports = client
'use strict';
const Koa = require('koa');
const path = require('path');
const compress = require('koa-compress');
const cors = require('kcors');
const log4js = require('koa-log4');
global.Promise = require('bluebird');
global.configPath = path.resolve(__dirname, '../src');
const config = require(configPath);
log4js.configure(config.log4js)
const logger = log4js.getLogger()
require('../app/service/mongoService')
require('../app/service/redisService')
var logFormat = ':req[x-real-ip] :req[x-forwarded-for] - -' +
' ":method :url HTTP/:http-version"' +
' :status :content-length ":referrer"' +
' ":user-agent" :req[x-auth-token] :response-time' + 'ms';
const router = require('../app');
const app = new Koa();
app
.use(compress({
threshold: 2048
}))
.use(cors({
maxAge: 86400, // options请求缓存24小时
origin: function (req) {
var originUrl = req.header.origin;
var Origin = originUrl.slice(originUrl.indexOf("."));
if (config.accessOrigin.indexOf(Origin) !== -1) {
return originUrl;
} else {
return false;
}
}
}))
.use(log4js.koaLogger(log4js.getLogger("http"), { level: 'auto', format: logFormat }))
.use(router.routes())
.use(router.allowedMethods());
app.listen(config.port);
process.on('SIGINT', function () {
logger.info('收到 SIGINT 信号');
setTimeout(function () {
logger.info('关闭node进程');
log4js.shutdown(function (err) {
logger.error(err)
})
setTimeout(function () {
process.exit(0)
}, 1000)
}, 2 * 1000)
});
logger.info(`server listening ${config.port}`);
logger.info('Started Bootstrap in');
logger.info('加载环境配置: ', process.env.NODE_ENV)
\ No newline at end of file
*
!.gitignore
\ No newline at end of file
{
"name": "qa-api",
"version": "1.0.0",
"description": "QA系统后台",
"main": "bin/server.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "NODE_ENV=dev nodemon --harmony",
"pull": "git subtree pull --prefix=app/proto protos master --squash"
},
"author": "qaer",
"license": "ISC",
"dependencies": {
"ioredis": "^4.2.0",
"kcors": "^2.2.2",
"koa": "^2.5.3",
"koa-compress": "^3.0.0",
"koa-log4": "^2.3.0",
"koa-router": "^7.4.0",
"mongoose": "^5.3.4",
"request-proxy": "^0.2.4",
"require-all": "^3.0.0"
},
"devDependencies": {
"nodemon": "^1.18.4"
},
"nodemonConfig": {
"ignore": [
"node_modules/*"
],
"delay": "2000"
}
}
\ No newline at end of file
'use strict'
module.exports = {
port: 3003,
timeout: 15000,
agent: {
keepAlive: true,
// 当 socket 超过 60 秒都没有任何活动,就会被当作超时处理掉
timeout: 60000,
// 每个域名最大socket数
maxSockets: 2000, // 默认Infinity
// 最大空闲 socket 数
maxFreeSockets: 256, // 默认256
// 空闲的 KeepAlive socket 最长可以存活 30 秒
freeSocketKeepAliveTimeout: 30000
},
HELP_EXPIRE: 12 * 60 * 60,
VEST_TOKEN: 'VEST-TOKEN-',
VEST_TOKEN_EXPIRE: 90 * 24 * 60 * 60,
USER_TOKEN_EXPIRE: 24 * 60 * 1000 - 1000,
}
\ No newline at end of file
'use strict'
const path = require('path')
const logDir = path.resolve(process.cwd(), './logs')
module.exports = {
api: {
sc_api: 'http://192.168.4.24:7021'
},
redis: {
api: 'redis://192.168.4.50:6379/1'
},
// 先停用
zookeeper: {
api: '192.168.4.15:2181',
znode: ['/grpc/help_center']
},
log4js: {
appenders: {
out: { type: 'stdout' },
app: { type: 'dateFile', filename: logDir + '/qa-api.log', daysToKeep: 3, compress: true },
error: { type: 'dateFile', filename: logDir + '/qa-api.error.log', daysToKeep: 3, compress: true },
timing: { type: 'dateFile', filename: logDir + '/qa-api.timing.log', daysToKeep: 3, compress: true },
just_errors: { type: 'logLevelFilter', appender: 'error', level: 'error' }
},
categories: {
default: { appenders: ['out', 'app', 'just_errors'], level: 'info' },
timing: { appenders: ['out', 'timing'], level: 'info' }
}
},
mongo: {
api: 'mongodb://192.168.28.179:27017/qa_api'
},
accessOrigin: [".xyqb.com", ".q-gp.com", ".quantgroup.cn", ".liangkebang.com"]
}
\ No newline at end of file
'use strict';
let appCfg = require('./app.config');
let envCfg = process.env.NODE_ENV === 'production' ? require('./prod.config') : require('./dev.config')
module.exports = Object.assign({}, appCfg, envCfg);
\ No newline at end of file
'use strict'
const path = require('path')
const logDir = path.resolve(process.cwd(), './logs')
module.exports = {
api: {
sc_api: 'http://192.168.4.24:7021'
},
redis: {
api: 'redis://192.168.4.50:6379/1'
},
// 先停用
zookeeper: {
api: '192.168.4.15:2181',
znode: ['/grpc/help_center']
},
log4js: {
appenders: {
out: { type: 'stdout' },
app: { type: 'dateFile', filename: logDir + '/qa-api.log', daysToKeep: 3, compress: true },
error: { type: 'dateFile', filename: logDir + '/qa-api.error.log', daysToKeep: 3, compress: true },
timing: { type: 'dateFile', filename: logDir + '/qa-api.timing.log', daysToKeep: 3, compress: true },
just_errors: { type: 'logLevelFilter', appender: 'error', level: 'error' }
},
categories: {
default: { appenders: ['out', 'app', 'just_errors'], level: 'info' },
timing: { appenders: ['out', 'timing'], level: 'info' }
}
},
mongo: {
api: 'mongodb://172.30.220.22:27017/qa_api'
},
accessOrigin: [".xyqb.com", ".q-gp.com", ".quantgroup.cn", ".liangkebang.com"]
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment