diff --git a/build/build.sh b/build/build.sh index 3a5d2456..5f55ab47 100755 --- a/build/build.sh +++ b/build/build.sh @@ -1,11 +1,66 @@ #!/usr/bin/env bash -ROOT=`dirname $0` +function build() { + ROOT=$(dirname $0) + NAME="edge-api" + DIST="../dist/${NAME}" + OS=${1} + ARCH=${2} -# building installer -architects=( "amd64" "386" ) -for arch in "${architects[@]}" -do - # TODO support arm, mips ... - env GOOS=linux GOARCH=${arch} go build --ldflags="-s -w" -o $ROOT/installers/installer-helper-linux-${arch} $ROOT/../cmd/installer-helper/main.go -done + if [ -z $OS ]; then + echo "usage: build.sh OS ARCH" + exit + fi + if [ -z $ARCH ]; then + echo "usage: build.sh OS ARCH" + exit + fi + + VERSION_DATA=$(cat ../internal/const/const.go) + re="Version[ ]+=[ ]+\"([0-9.]+)\"" + if [[ $VERSION_DATA =~ $re ]]; then + VERSION=${BASH_REMATCH[1]} + else + echo "could not match version" + exit + fi + + ZIP="${NAME}-${OS}-${ARCH}-v${VERSION}.zip" + + # copy files + echo "copying ..." + if [ ! -d $DIST ]; then + mkdir $DIST + mkdir $DIST/bin + mkdir $DIST/configs + mkdir $DIST/logs + fi + cp configs/api.template.yaml $DIST/configs/ + cp configs/db.template.yaml $DIST/configs/ + cp -R deploy $DIST/ + cp -R installers $DIST/ + + # building installer + echo "building installer ..." + architects=("amd64" "386") + for arch in "${architects[@]}"; do + # TODO support arm, mips ... + env GOOS=linux GOARCH=${arch} go build --ldflags="-s -w" -o $ROOT/installers/installer-helper-linux-${arch} $ROOT/../cmd/installer-helper/main.go + done + + # building api node + env GOOS=$OS GOARCH=$ARCH go build --ldflags="-s -w" -o $DIST/bin/edge-api $ROOT/../cmd/edge-api/main.go + + echo "zip files" + cd "${DIST}/../" || exit + if [ -f "${ZIP}" ]; then + rm -f "${ZIP}" + fi + zip -r -X -q "${ZIP}" ${NAME}/ + rm -rf ${NAME} + cd - || exit + + echo "[done]" +} + +build $1 $2 diff --git a/build/configs/api.template.yaml b/build/configs/api.template.yaml index e69de29b..3b9713a6 100644 --- a/build/configs/api.template.yaml +++ b/build/configs/api.template.yaml @@ -0,0 +1,2 @@ +nodeId: "${nodeId}" +secret: "${secret}" \ No newline at end of file diff --git a/build/configs/db.template.yaml b/build/configs/db.template.yaml index d98fcf07..7696ed29 100644 --- a/build/configs/db.template.yaml +++ b/build/configs/db.template.yaml @@ -1,11 +1,11 @@ default: - db: "dev" + db: "prod" prefix: "" dbs: - dev: + prod: driver: "mysql" - dsn: "root:123456@tcp(127.0.0.1:3306)/db_shield?charset=utf8mb4&timeout=30s" - prefix: "shield" + dsn: "root:123456@tcp(127.0.0.1:3306)/db_edge?charset=utf8mb4&timeout=30s" + prefix: "edge" models: package: internal/web/models diff --git a/build/sqls/build.sh b/build/sqls/build.sh new file mode 100755 index 00000000..0d7fc63f --- /dev/null +++ b/build/sqls/build.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +go run `dirname $0`/../../cmd/sql-generate/main.go -dir=`dirname $0` \ No newline at end of file diff --git a/build/sqls/full.sql b/build/sqls/full.sql new file mode 100644 index 00000000..38bbc534 --- /dev/null +++ b/build/sqls/full.sql @@ -0,0 +1,638 @@ +CREATE TABLE `edgeAPINodes` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用', + `clusterId` int(11) unsigned DEFAULT '0' COMMENT '专用集群ID', + `uniqueId` varchar(32) DEFAULT NULL COMMENT '唯一ID', + `secret` varchar(32) DEFAULT NULL COMMENT '密钥', + `name` varchar(255) DEFAULT NULL COMMENT '名称', + `description` varchar(1024) DEFAULT NULL COMMENT '描述', + `http` json DEFAULT NULL COMMENT '监听的HTTP配置', + `https` json DEFAULT NULL COMMENT '监听的HTTPS配置', + `accessAddrs` json DEFAULT NULL COMMENT '外部访问地址', + `order` int(11) unsigned DEFAULT '0' COMMENT '排序', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `weight` int(11) unsigned DEFAULT '0' COMMENT '权重', + `status` json DEFAULT NULL COMMENT '运行状态', + PRIMARY KEY (`id`), + UNIQUE KEY `uniqueId` (`uniqueId`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='API节点'; +CREATE TABLE `edgeAPITokens` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `nodeId` varchar(32) DEFAULT NULL COMMENT '节点ID', + `secret` varchar(255) DEFAULT NULL COMMENT '节点密钥', + `role` varchar(64) DEFAULT NULL COMMENT '节点角色', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + PRIMARY KEY (`id`), + KEY `nodeId` (`nodeId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='API令牌管理'; +CREATE TABLE `edgeAdmins` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `username` varchar(64) DEFAULT NULL COMMENT '用户名', + `password` varchar(32) DEFAULT NULL COMMENT '密码', + `fullname` varchar(64) DEFAULT NULL COMMENT '全名', + `isSuper` tinyint(1) unsigned DEFAULT '0' COMMENT '是否为超级管理员', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `updatedAt` bigint(11) unsigned DEFAULT '0' COMMENT '修改时间', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理员'; +CREATE TABLE `edgeDBNodes` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用', + `role` varchar(255) DEFAULT NULL COMMENT '数据库角色', + `name` varchar(255) DEFAULT NULL COMMENT '名称', + `description` varchar(1024) DEFAULT NULL COMMENT '描述', + `host` varchar(255) DEFAULT NULL COMMENT '主机', + `port` int(11) unsigned DEFAULT '0' COMMENT '端口', + `database` varchar(255) DEFAULT NULL COMMENT '数据库名称', + `username` varchar(255) DEFAULT NULL COMMENT '用户名', + `password` varchar(255) DEFAULT NULL COMMENT '密码', + `charset` varchar(255) DEFAULT NULL COMMENT '通讯字符集', + `connTimeout` int(11) unsigned DEFAULT '0' COMMENT '连接超时时间(秒)', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `weight` int(11) unsigned DEFAULT '0' COMMENT '权重', + `order` int(11) unsigned DEFAULT '0' COMMENT '排序', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据库节点'; +CREATE TABLE `edgeFileChunks` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `fileId` int(11) unsigned DEFAULT '0' COMMENT '文件ID', + `data` longblob COMMENT '分块内容', + PRIMARY KEY (`id`), + KEY `fileId` (`fileId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文件片段'; +CREATE TABLE `edgeFiles` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `description` varchar(255) DEFAULT NULL COMMENT '文件描述', + `filename` varchar(255) DEFAULT NULL COMMENT '文件名', + `size` int(11) unsigned DEFAULT '0' COMMENT '文件尺寸', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `order` int(11) unsigned DEFAULT '0' COMMENT '排序', + `type` varchar(64) DEFAULT '' COMMENT '类型', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + PRIMARY KEY (`id`), + KEY `type` (`type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文件管理'; +CREATE TABLE `edgeHTTPAccessLogPolicies` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `name` varchar(255) DEFAULT NULL COMMENT '名称', + `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用', + `type` varchar(255) DEFAULT NULL COMMENT '存储类型', + `options` json DEFAULT NULL COMMENT '存储选项', + `conds` json DEFAULT NULL COMMENT '请求条件', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='访问日志策略'; +CREATE TABLE `edgeHTTPAccessLogs` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `serverId` int(11) unsigned DEFAULT '0' COMMENT '服务ID', + `nodeId` int(11) unsigned DEFAULT '0' COMMENT '节点ID', + `status` int(3) unsigned DEFAULT '0' COMMENT '状态码', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `content` json DEFAULT NULL COMMENT '日志内容', + `requestId` varchar(128) DEFAULT NULL COMMENT '请求ID', + PRIMARY KEY (`id`), + KEY `serverId` (`serverId`), + KEY `nodeId` (`nodeId`), + KEY `serverId_status` (`serverId`,`status`), + KEY `requestId` (`requestId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +CREATE TABLE `edgeHTTPAccessLogs_20201010` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `serverId` int(11) unsigned DEFAULT '0' COMMENT '服务ID', + `nodeId` int(11) unsigned DEFAULT '0' COMMENT '节点ID', + `status` int(3) unsigned DEFAULT '0' COMMENT '状态码', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `content` json DEFAULT NULL COMMENT '日志内容', + `day` varchar(8) DEFAULT NULL COMMENT '日期Ymd', + PRIMARY KEY (`id`), + KEY `serverId` (`serverId`), + KEY `nodeId` (`nodeId`), + KEY `serverId_status` (`serverId`,`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +CREATE TABLE `edgeHTTPCachePolicies` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID', + `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用', + `name` varchar(255) DEFAULT NULL COMMENT '名称', + `capacity` json DEFAULT NULL COMMENT '容量数据', + `maxKeys` bigint(20) unsigned DEFAULT '0' COMMENT '最多Key值', + `maxSize` json DEFAULT NULL COMMENT '最大缓存内容尺寸', + `type` varchar(255) DEFAULT NULL COMMENT '存储类型', + `options` json DEFAULT NULL COMMENT '存储选项', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + `description` varchar(1024) DEFAULT NULL COMMENT '描述', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='HTTP缓存策略'; +CREATE TABLE `edgeHTTPFirewallPolicies` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用', + `name` varchar(255) DEFAULT NULL COMMENT '名称', + `description` varchar(1024) DEFAULT NULL COMMENT '描述', + `inbound` json DEFAULT NULL COMMENT '入站规则', + `outbound` json DEFAULT NULL COMMENT '出站规则', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='HTTP防火墙'; +CREATE TABLE `edgeHTTPFirewallRuleGroups` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用', + `name` varchar(255) DEFAULT NULL COMMENT '名称', + `description` varchar(1024) DEFAULT NULL COMMENT '描述', + `code` varchar(255) DEFAULT NULL COMMENT '代号', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + `sets` json DEFAULT NULL COMMENT '规则集列表', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='防火墙规则分组'; +CREATE TABLE `edgeHTTPFirewallRuleSets` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用', + `code` varchar(255) DEFAULT NULL COMMENT '代号', + `name` varchar(255) DEFAULT NULL COMMENT '名称', + `description` varchar(1024) DEFAULT NULL COMMENT '描述', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `rules` json DEFAULT NULL COMMENT '规则列表', + `connector` varchar(64) DEFAULT NULL COMMENT '规则之间的关系', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `action` varchar(255) DEFAULT NULL COMMENT '执行的动作', + `actionOptions` json DEFAULT NULL COMMENT '动作的选项', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='防火墙规则集'; +CREATE TABLE `edgeHTTPFirewallRules` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用', + `description` varchar(1024) DEFAULT NULL COMMENT '说明', + `param` varchar(1024) DEFAULT NULL COMMENT '参数', + `operator` varchar(255) DEFAULT NULL COMMENT '操作符', + `value` varchar(1024) DEFAULT NULL COMMENT '对比值', + `isCaseInsensitive` tinyint(1) unsigned DEFAULT '1' COMMENT '是否大小写不敏感', + `checkpointOptions` json DEFAULT NULL COMMENT '检查点参数', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='防火墙规则'; +CREATE TABLE `edgeHTTPGzips` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用', + `level` int(11) unsigned DEFAULT '0' COMMENT '压缩级别', + `minLength` json DEFAULT NULL COMMENT '可压缩最小值', + `maxLength` json DEFAULT NULL COMMENT '可压缩最大值', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `conds` json DEFAULT NULL COMMENT '条件', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Gzip配置'; +CREATE TABLE `edgeHTTPHeaderPolicies` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `isOn` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '是否启用', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `addHeaders` json DEFAULT NULL COMMENT '添加的Header', + `addTrailers` json DEFAULT NULL COMMENT '添加的Trailers', + `setHeaders` json DEFAULT NULL COMMENT '设置Header', + `replaceHeaders` json DEFAULT NULL COMMENT '替换Header内容', + `expires` json DEFAULT NULL COMMENT 'Expires单独设置', + `deleteHeaders` json DEFAULT NULL COMMENT '删除的Headers', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Header定义'; +CREATE TABLE `edgeHTTPHeaders` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID', + `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用', + `name` varchar(255) DEFAULT NULL COMMENT '名称', + `value` varchar(1024) DEFAULT NULL COMMENT '值', + `order` int(11) unsigned DEFAULT '0' COMMENT '排序', + `status` json DEFAULT NULL COMMENT '状态码设置', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='HTTP Header'; +CREATE TABLE `edgeHTTPLocations` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `parentId` int(11) unsigned DEFAULT '0' COMMENT '父级ID', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `pattern` varchar(1024) DEFAULT NULL COMMENT '匹配规则', + `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用', + `name` varchar(255) DEFAULT NULL COMMENT '名称', + `description` varchar(1024) DEFAULT NULL COMMENT '描述', + `webId` int(11) unsigned DEFAULT '0' COMMENT 'Web配置ID', + `reverseProxy` json DEFAULT NULL COMMENT '反向代理', + `urlPrefix` varchar(1024) DEFAULT NULL COMMENT 'URL前缀', + `isBreak` tinyint(1) unsigned DEFAULT '0' COMMENT '是否终止匹配', + `conds` json DEFAULT NULL COMMENT '匹配条件', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='路径规则配置'; +CREATE TABLE `edgeHTTPPages` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `isOn` tinyint(1) unsigned DEFAULT '0' COMMENT '是否启用', + `statusList` json DEFAULT NULL COMMENT '状态列表', + `url` varchar(1024) DEFAULT NULL COMMENT '页面URL', + `newStatus` int(3) DEFAULT NULL COMMENT '新状态码', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='特殊页面'; +CREATE TABLE `edgeHTTPRewriteRules` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID', + `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `pattern` varchar(1024) DEFAULT NULL COMMENT '匹配规则', + `replace` varchar(1024) DEFAULT NULL COMMENT '跳转后的地址', + `mode` varchar(255) DEFAULT NULL COMMENT '替换模式', + `redirectStatus` int(3) unsigned DEFAULT '0' COMMENT '跳转的状态码', + `proxyHost` varchar(255) DEFAULT NULL COMMENT '代理的主机名', + `isBreak` tinyint(1) unsigned DEFAULT '1' COMMENT '是否终止解析', + `withQuery` tinyint(1) unsigned DEFAULT '1' COMMENT '是否保留URI参数', + `conds` json DEFAULT NULL COMMENT '匹配条件', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='重写规则'; +CREATE TABLE `edgeHTTPWebs` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用', + `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `root` json DEFAULT NULL COMMENT '根目录', + `charset` json DEFAULT NULL COMMENT '字符集', + `shutdown` json DEFAULT NULL COMMENT '临时关闭页面配置', + `pages` json DEFAULT NULL COMMENT '特殊页面', + `redirectToHttps` json DEFAULT NULL COMMENT '跳转到HTTPS设置', + `indexes` json DEFAULT NULL COMMENT '首页文件列表', + `maxRequestBodySize` json DEFAULT NULL COMMENT '最大允许的请求内容尺寸', + `requestHeader` json DEFAULT NULL COMMENT '请求Header配置', + `responseHeader` json DEFAULT NULL COMMENT '响应Header配置', + `accessLog` json DEFAULT NULL COMMENT '访问日志配置', + `stat` json DEFAULT NULL COMMENT '统计配置', + `gzip` json DEFAULT NULL COMMENT 'Gzip配置', + `cache` json DEFAULT NULL COMMENT '缓存配置', + `firewall` json DEFAULT NULL COMMENT '防火墙设置', + `locations` json DEFAULT NULL COMMENT '路径规则配置', + `websocket` json DEFAULT NULL COMMENT 'Websocket设置', + `rewriteRules` json DEFAULT NULL COMMENT '重写规则配置', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='HTTP Web'; +CREATE TABLE `edgeHTTPWebsockets` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用', + `handshakeTimeout` json DEFAULT NULL COMMENT '握手超时时间', + `allowAllOrigins` tinyint(1) unsigned DEFAULT '1' COMMENT '是否支持所有源', + `allowedOrigins` json DEFAULT NULL COMMENT '支持的源域名列表', + `requestSameOrigin` tinyint(1) unsigned DEFAULT '1' COMMENT '是否请求一样的Origin', + `requestOrigin` varchar(255) DEFAULT NULL COMMENT '请求Origin', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Websocket设置'; +CREATE TABLE `edgeLogs` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `level` varchar(32) DEFAULT NULL COMMENT '级别', + `description` varchar(255) DEFAULT NULL COMMENT '描述', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `action` varchar(255) DEFAULT NULL COMMENT '动作', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `providerId` int(11) unsigned DEFAULT '0' COMMENT '供应商ID', + `ip` varchar(32) DEFAULT NULL COMMENT 'IP地址', + `type` varchar(255) DEFAULT 'admin' COMMENT '类型:admin, user', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作日志'; +CREATE TABLE `edgeNodeClusters` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `name` varchar(255) DEFAULT NULL COMMENT '名称', + `useAllAPINodes` tinyint(1) unsigned DEFAULT '1' COMMENT '是否使用所有API节点', + `apiNodes` json DEFAULT NULL COMMENT '使用的API节点', + `installDir` varchar(512) DEFAULT NULL COMMENT '安装目录', + `order` int(11) unsigned DEFAULT '0' COMMENT '排序', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `grantId` int(11) unsigned DEFAULT '0' COMMENT '默认认证方式', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点集群'; +CREATE TABLE `edgeNodeGrants` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `name` varchar(255) DEFAULT NULL COMMENT '名称', + `method` varchar(64) DEFAULT NULL COMMENT '登录方式', + `username` varchar(255) DEFAULT NULL COMMENT '用户名', + `password` varchar(255) DEFAULT NULL COMMENT '密码', + `su` tinyint(1) unsigned DEFAULT '1' COMMENT '是否需要su', + `privateKey` varchar(4096) DEFAULT NULL COMMENT '密钥', + `description` varchar(255) DEFAULT NULL COMMENT '备注', + `nodeId` int(11) unsigned DEFAULT '0' COMMENT '专有节点', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点授权'; +CREATE TABLE `edgeNodeGroups` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `name` varchar(255) DEFAULT NULL COMMENT '名称', + `order` int(11) unsigned DEFAULT '0' COMMENT '排序', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点分组'; +CREATE TABLE `edgeNodeIPAddresses` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `nodeId` int(11) unsigned DEFAULT '0' COMMENT '节点ID', + `name` varchar(255) DEFAULT NULL COMMENT '名称', + `ip` varchar(128) DEFAULT NULL COMMENT 'IP地址', + `description` varchar(255) DEFAULT NULL COMMENT '描述', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + `order` int(11) unsigned DEFAULT '0' COMMENT '排序', + PRIMARY KEY (`id`), + KEY `nodeId` (`nodeId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点IP地址'; +CREATE TABLE `edgeNodeLogins` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `nodeId` int(11) unsigned DEFAULT '0' COMMENT '节点ID', + `name` varchar(255) DEFAULT NULL COMMENT '名称', + `type` varchar(255) DEFAULT NULL COMMENT '类型:ssh,agent', + `params` json DEFAULT NULL COMMENT '配置参数', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + PRIMARY KEY (`id`), + KEY `nodeId` (`nodeId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点登录信息'; +CREATE TABLE `edgeNodeLogs` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `role` varchar(64) DEFAULT NULL COMMENT '节点角色', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `tag` varchar(255) DEFAULT NULL COMMENT '标签', + `description` varchar(1024) DEFAULT NULL COMMENT '描述', + `level` varchar(32) DEFAULT NULL COMMENT '级别', + `nodeId` int(11) unsigned DEFAULT '0' COMMENT '节点ID', + `day` varchar(8) DEFAULT NULL COMMENT '日期', + PRIMARY KEY (`id`), + KEY `level` (`level`), + KEY `day` (`day`), + KEY `role_nodeId` (`role`,`nodeId`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点日志'; +CREATE TABLE `edgeNodeRegions` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `name` varchar(255) DEFAULT NULL COMMENT '名称', + `order` int(11) unsigned DEFAULT '0' COMMENT '排序', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点区域'; +CREATE TABLE `edgeNodes` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用', + `uniqueId` varchar(32) DEFAULT NULL COMMENT '节点ID', + `secret` varchar(32) DEFAULT NULL COMMENT '密钥', + `name` varchar(255) DEFAULT NULL COMMENT '节点名', + `code` varchar(255) DEFAULT NULL COMMENT '代号', + `clusterId` int(11) unsigned DEFAULT '0' COMMENT '集群ID', + `regionId` int(11) unsigned DEFAULT '0' COMMENT '区域ID', + `groupId` int(11) unsigned DEFAULT '0' COMMENT '分组ID', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `status` json DEFAULT NULL COMMENT '最新的状态', + `version` int(11) unsigned DEFAULT '0' COMMENT '当前版本号', + `latestVersion` int(11) unsigned DEFAULT '0' COMMENT '最后版本号', + `installDir` varchar(512) DEFAULT NULL COMMENT '安装目录', + `isInstalled` tinyint(1) unsigned DEFAULT '0' COMMENT '是否已安装', + `installStatus` json DEFAULT NULL COMMENT '安装状态', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + `connectedAPINodes` json DEFAULT NULL COMMENT '当前连接的API节点', + `maxCPU` int(4) unsigned DEFAULT '0' COMMENT '可以使用的最多CPU', + PRIMARY KEY (`id`), + KEY `uniqueId` (`uniqueId`), + KEY `clusterId` (`clusterId`), + KEY `groupId` (`groupId`), + KEY `regionId` (`regionId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点'; +CREATE TABLE `edgeOrigins` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用', + `name` varchar(255) DEFAULT NULL COMMENT '名称', + `version` int(11) unsigned DEFAULT '0' COMMENT '版本', + `addr` json DEFAULT NULL COMMENT '地址', + `description` varchar(512) DEFAULT NULL COMMENT '描述', + `code` varchar(255) DEFAULT NULL COMMENT '代号', + `weight` int(11) unsigned DEFAULT '0' COMMENT '权重', + `connTimeout` json DEFAULT NULL COMMENT '连接超时', + `readTimeout` json DEFAULT NULL COMMENT '读超时', + `idleTimeout` json DEFAULT NULL COMMENT '空闲连接超时', + `maxFails` int(11) unsigned DEFAULT '0' COMMENT '最多失败次数', + `maxConns` int(11) unsigned DEFAULT '0' COMMENT '最大并发连接数', + `maxIdleConns` int(11) unsigned DEFAULT '0' COMMENT '最多空闲连接数', + `httpRequestURI` varchar(1024) DEFAULT NULL COMMENT '转发后的请求URI', + `httpRequestHeader` json DEFAULT NULL COMMENT '请求Header配置', + `httpResponseHeader` json DEFAULT NULL COMMENT '响应Header配置', + `host` varchar(255) DEFAULT NULL COMMENT '自定义主机名', + `healthCheck` json DEFAULT NULL COMMENT '健康检查设置', + `cert` json DEFAULT NULL COMMENT '证书设置', + `ftp` json DEFAULT NULL COMMENT 'FTP相关设置', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='源站'; +CREATE TABLE `edgeProviders` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `username` varchar(64) DEFAULT NULL COMMENT '用户名', + `password` varchar(32) DEFAULT NULL COMMENT '密码', + `fullname` varchar(64) DEFAULT NULL COMMENT '真实姓名', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `updatedAt` bigint(11) unsigned DEFAULT '0' COMMENT '修改时间', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='供应商'; +CREATE TABLE `edgeReverseProxies` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID', + `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用', + `scheduling` json DEFAULT NULL COMMENT '调度算法', + `primaryOrigins` json DEFAULT NULL COMMENT '主要源站', + `backupOrigins` json DEFAULT NULL COMMENT '备用源站', + `stripPrefix` varchar(255) DEFAULT NULL COMMENT '去除URL前缀', + `requestHost` varchar(255) DEFAULT NULL COMMENT '请求Host', + `requestURI` varchar(1024) DEFAULT NULL COMMENT '请求URI', + `autoFlush` tinyint(1) unsigned DEFAULT '0' COMMENT '是否自动刷新缓冲区', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='反向代理配置'; +CREATE TABLE `edgeSSLCertGroups` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `name` varchar(255) DEFAULT NULL COMMENT '分组名', + `order` int(11) unsigned DEFAULT '0' COMMENT '分组排序', + `state` tinyint(1) unsigned DEFAULT '0' COMMENT '状态', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='证书分组'; +CREATE TABLE `edgeSSLCerts` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `updatedAt` bigint(11) unsigned DEFAULT '0' COMMENT '修改时间', + `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用', + `name` varchar(255) DEFAULT NULL COMMENT '证书名', + `description` varchar(1024) DEFAULT NULL COMMENT '描述', + `certData` blob COMMENT '证书内容', + `keyData` blob COMMENT '密钥内容', + `serverName` varchar(255) DEFAULT NULL COMMENT '证书使用的主机名', + `isCA` tinyint(1) unsigned DEFAULT '0' COMMENT '是否为CA证书', + `groupIds` json DEFAULT NULL COMMENT '证书分组', + `timeBeginAt` bigint(11) unsigned DEFAULT '0' COMMENT '开始时间', + `timeEndAt` bigint(11) unsigned DEFAULT '0' COMMENT '结束时间', + `dnsNames` json DEFAULT NULL COMMENT 'DNS名称列表', + `commonNames` json DEFAULT NULL COMMENT '发行单位列表', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='SSL证书'; +CREATE TABLE `edgeSSLPolicies` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用', + `certs` json DEFAULT NULL COMMENT '证书列表', + `clientCACerts` json DEFAULT NULL COMMENT '客户端证书', + `clientAuthType` int(11) unsigned DEFAULT '0' COMMENT '客户端认证类型', + `minVersion` varchar(32) DEFAULT NULL COMMENT '支持的SSL最小版本', + `cipherSuitesIsOn` tinyint(1) unsigned DEFAULT '0' COMMENT '是否自定义加密算法套件', + `cipherSuites` json DEFAULT NULL COMMENT '加密算法套件', + `hsts` json DEFAULT NULL COMMENT 'HSTS设置', + `http2Enabled` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用HTTP/2', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='SSL配置策略'; +CREATE TABLE `edgeServerGroups` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `name` varchar(255) DEFAULT NULL COMMENT '名称', + `order` int(11) unsigned DEFAULT '0' COMMENT '排序', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='服务分组'; +CREATE TABLE `edgeServers` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID', + `type` varchar(64) DEFAULT NULL COMMENT '服务类型', + `name` varchar(255) DEFAULT NULL COMMENT '名称', + `description` varchar(512) DEFAULT NULL COMMENT '描述', + `serverNames` json DEFAULT NULL COMMENT '域名列表', + `http` json DEFAULT NULL COMMENT 'HTTP配置', + `https` json DEFAULT NULL COMMENT 'HTTPS配置', + `tcp` json DEFAULT NULL COMMENT 'TCP配置', + `tls` json DEFAULT NULL COMMENT 'TLS配置', + `unix` json DEFAULT NULL COMMENT 'Unix配置', + `udp` json DEFAULT NULL COMMENT 'UDP配置', + `webId` int(11) unsigned DEFAULT '0' COMMENT 'WEB配置', + `reverseProxy` json DEFAULT NULL COMMENT '反向代理配置', + `groupIds` json DEFAULT NULL COMMENT '分组ID列表', + `config` json DEFAULT NULL COMMENT '服务配置,自动生成', + `configMd5` varchar(32) DEFAULT NULL COMMENT 'Md5', + `clusterId` int(11) unsigned DEFAULT '0' COMMENT '集群ID', + `includeNodes` json DEFAULT NULL COMMENT '部署条件', + `excludeNodes` json DEFAULT NULL COMMENT '节点排除条件', + `version` int(11) unsigned DEFAULT '0' COMMENT '版本号', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + PRIMARY KEY (`id`), + KEY `userId` (`userId`), + KEY `adminId` (`adminId`), + KEY `isUpdating_state` (`state`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='服务'; +CREATE TABLE `edgeSysEvents` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `type` varchar(255) DEFAULT NULL COMMENT '类型', + `params` json DEFAULT NULL COMMENT '参数', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统事件'; +CREATE TABLE `edgeSysLockers` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `key` varchar(255) DEFAULT NULL COMMENT '键值', + `version` bigint(20) unsigned DEFAULT '0' COMMENT '版本号', + `timeoutAt` bigint(11) unsigned DEFAULT '0' COMMENT '超时时间', + PRIMARY KEY (`id`), + UNIQUE KEY `key` (`key`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='并发锁'; +CREATE TABLE `edgeSysSettings` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `code` varchar(255) DEFAULT NULL COMMENT '代号', + `value` json DEFAULT NULL COMMENT '配置值', + PRIMARY KEY (`id`), + UNIQUE KEY `code` (`code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统配置'; +CREATE TABLE `edgeTCPFirewallPolicies` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `adminId` int(11) DEFAULT NULL COMMENT '管理员ID', + `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID', + `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='TCP防火墙'; +CREATE TABLE `edgeUsers` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `username` varchar(64) DEFAULT NULL COMMENT '用户名', + `password` varchar(32) DEFAULT NULL COMMENT '密码', + `fullname` varchar(64) DEFAULT NULL COMMENT '真实姓名', + `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间', + `updatedAt` bigint(11) unsigned DEFAULT '0' COMMENT '修改时间', + `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户'; +CREATE TABLE `edgeVersions` ( + `id` bigint(16) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', + `version` varchar(64) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据库结构版本'; diff --git a/cmd/edge-api/main.go b/cmd/edge-api/main.go index 26a143b3..01ea2115 100644 --- a/cmd/edge-api/main.go +++ b/cmd/edge-api/main.go @@ -1,18 +1,47 @@ package main import ( + "encoding/json" "github.com/TeaOSLab/EdgeAPI/internal/apps" teaconst "github.com/TeaOSLab/EdgeAPI/internal/const" "github.com/TeaOSLab/EdgeAPI/internal/nodes" + "github.com/TeaOSLab/EdgeAPI/internal/setup" _ "github.com/TeaOSLab/EdgeAPI/internal/tasks" + "github.com/iwind/TeaGo/Tea" _ "github.com/iwind/TeaGo/bootstrap" + "github.com/iwind/TeaGo/maps" + "log" + "os" ) func main() { + if !Tea.IsTesting() { + Tea.Env = "prod" + } app := apps.NewAppCmd() app.Version(teaconst.Version) app.Product(teaconst.ProductName) - app.Usage(teaconst.ProcessName + " [start|stop|restart]") + app.Usage(teaconst.ProcessName + " [start|stop|restart|setup]") + app.On("setup", func() { + setupCmd := setup.NewSetupFromCmd() + err := setupCmd.Run() + result := maps.Map{} + if err != nil { + result["isOk"] = false + result["error"] = err.Error() + } else { + result["isOk"] = true + result["adminNodeId"] = setupCmd.AdminNodeId + result["adminNodeSecret"] = setupCmd.AdminNodeSecret + } + + resultJSON, err := json.Marshal(result) + if err != nil { + log.Fatal(err.Error()) + } + + _, _ = os.Stdout.Write(resultJSON) + }) app.Run(func() { nodes.NewAPINode().Start() }) diff --git a/cmd/sql-generate/main.go b/cmd/sql-generate/main.go new file mode 100644 index 00000000..af655350 --- /dev/null +++ b/cmd/sql-generate/main.go @@ -0,0 +1,103 @@ +package main + +import ( + "bytes" + "flag" + "fmt" + "github.com/iwind/TeaGo/Tea" + _ "github.com/iwind/TeaGo/bootstrap" + "github.com/iwind/TeaGo/logs" + "go/format" + "io/ioutil" + "os" + "path/filepath" + "strings" +) + +func main() { + var dir string + flag.StringVar(&dir, "dir", "", "SQL dir") + flag.Parse() + + if len(dir) == 0 { + fmt.Println("[ERROR]'dir' should not be empty") + return + } + + sourceDir := filepath.Dir(Tea.Root) + + // full + fullSQLFile := dir + "/full.sql" + _, err := os.Stat(fullSQLFile) + if err != nil { + if os.IsNotExist(err) { + fmt.Println("[ERROR]'full.sql' not found") + return + } + fmt.Println("[ERROR]checking 'full.sql' failed: " + err.Error()) + return + } + + matches, err := filepath.Glob(dir + "/*.sql") + if err != nil { + fmt.Println("[ERROR]" + err.Error()) + return + } + + versionsCode := "// generated\npackage sqls\n\nvar SQLVersions = []map[string]string{" + + for _, match := range matches { + baseName := filepath.Base(match) + logs.Println("reading " + baseName + " ...") + + data, err := ioutil.ReadFile(match) + if err != nil { + fmt.Println("[ERROR]" + err.Error()) + return + } + + version := baseName[:strings.LastIndex(baseName, ".")] + versionsCode += "\n" + `{ "version": "` + version + `", "sql": SQL_` + version + ` },` + + code := "// generated\npackage sqls \n\n" + lines := bytes.Split(data, []byte{'\n'}) + for index, line := range lines { + if index == 0 { + code += "var SQL_" + version + " = " + } + code += `"` + string(line) + `\n"` + if index != len(lines)-1 { + code += "+" + } + code += "\n" + } + code += "\n" + + codeBytes, err := format.Source([]byte(code)) + if err != nil { + fmt.Println("[ERROR]" + err.Error()) + return + } + fmt.Println("writing sql_" + version + ".go ...") + err = ioutil.WriteFile(sourceDir+"/internal/setup/sqls/sql_"+version+".go", codeBytes, 0666) + if err != nil { + fmt.Println("[ERROR]" + err.Error()) + return + } + fmt.Println("ok") + } + + versionsCode += "\n}" + versionsCodeBytes, err := format.Source([]byte(versionsCode)) + if err != nil { + fmt.Println("[ERROR]" + err.Error()) + return + } + fmt.Println("writing sqls.go ...") + err = ioutil.WriteFile(sourceDir+"/internal/setup/sqls/sqls.go", versionsCodeBytes, 0666) + if err != nil { + fmt.Println("[ERROR]" + err.Error()) + return + } + fmt.Println("ok") +} diff --git a/dist/.gitignore b/dist/.gitignore new file mode 100644 index 00000000..6f66c74b --- /dev/null +++ b/dist/.gitignore @@ -0,0 +1 @@ +*.zip \ No newline at end of file diff --git a/dist/edge-api/bin/edge-api b/dist/edge-api/bin/edge-api new file mode 100755 index 00000000..bd808a9f Binary files /dev/null and b/dist/edge-api/bin/edge-api differ diff --git a/dist/edge-api/configs/api.template.yaml b/dist/edge-api/configs/api.template.yaml new file mode 100644 index 00000000..3b9713a6 --- /dev/null +++ b/dist/edge-api/configs/api.template.yaml @@ -0,0 +1,2 @@ +nodeId: "${nodeId}" +secret: "${secret}" \ No newline at end of file diff --git a/dist/edge-api/configs/db.template.yaml b/dist/edge-api/configs/db.template.yaml new file mode 100644 index 00000000..7696ed29 --- /dev/null +++ b/dist/edge-api/configs/db.template.yaml @@ -0,0 +1,11 @@ +default: + db: "prod" + prefix: "" + +dbs: + prod: + driver: "mysql" + dsn: "root:123456@tcp(127.0.0.1:3306)/db_edge?charset=utf8mb4&timeout=30s" + prefix: "edge" + models: + package: internal/web/models diff --git a/dist/edge-api/deploy/.gitignore b/dist/edge-api/deploy/.gitignore new file mode 100644 index 00000000..6f66c74b --- /dev/null +++ b/dist/edge-api/deploy/.gitignore @@ -0,0 +1 @@ +*.zip \ No newline at end of file diff --git a/dist/edge-api/installers/.gitignore b/dist/edge-api/installers/.gitignore new file mode 100644 index 00000000..6997afc8 --- /dev/null +++ b/dist/edge-api/installers/.gitignore @@ -0,0 +1 @@ +installer-* \ No newline at end of file diff --git a/go.mod b/go.mod index 2ca25604..a0d97a5c 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/go-sql-driver/mysql v1.5.0 github.com/go-yaml/yaml v2.1.0+incompatible github.com/golang/protobuf v1.4.2 - github.com/iwind/TeaGo v0.0.0-20201010005321-430e836dee8a + github.com/iwind/TeaGo v0.0.0-20201013075636-119886e49c04 github.com/pkg/sftp v1.12.0 golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a google.golang.org/grpc v1.32.0 diff --git a/go.sum b/go.sum index 4b73a308..6faca87d 100644 --- a/go.sum +++ b/go.sum @@ -64,6 +64,8 @@ github.com/iwind/TeaGo v0.0.0-20201009121920-5ab994526a80 h1:GFObMYO7mqeE+2n/4AA github.com/iwind/TeaGo v0.0.0-20201009121920-5ab994526a80/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc= github.com/iwind/TeaGo v0.0.0-20201010005321-430e836dee8a h1:sO6uDbQOEe6/tIB3o31vn6eD/JmkKGErKgcOA/Cpb+Q= github.com/iwind/TeaGo v0.0.0-20201010005321-430e836dee8a/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc= +github.com/iwind/TeaGo v0.0.0-20201013075636-119886e49c04 h1:QXRSB5x9pJFZLC7dCxDx9CRXAx9en1Uk3QdfzC8wMC8= +github.com/iwind/TeaGo v0.0.0-20201013075636-119886e49c04/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc= github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= diff --git a/internal/configs/api_config.go b/internal/configs/api_config.go index d2c20c88..11949873 100644 --- a/internal/configs/api_config.go +++ b/internal/configs/api_config.go @@ -52,3 +52,12 @@ func (this *APIConfig) SetNumberId(numberId int64) { func (this *APIConfig) NumberId() int64 { return this.numberId } + +// 保存到文件 +func (this *APIConfig) WriteFile(path string) error { + data, err := yaml.Marshal(this) + if err != nil { + return err + } + return ioutil.WriteFile(path, data, 0666) +} diff --git a/internal/db/models/admin_dao.go b/internal/db/models/admin_dao.go index 261b24b8..e6b2f942 100644 --- a/internal/db/models/admin_dao.go +++ b/internal/db/models/admin_dao.go @@ -1,9 +1,12 @@ package models import ( + "github.com/TeaOSLab/EdgeAPI/internal/errors" _ "github.com/go-sql-driver/mysql" "github.com/iwind/TeaGo/Tea" "github.com/iwind/TeaGo/dbs" + "github.com/iwind/TeaGo/types" + stringutil "github.com/iwind/TeaGo/utils/string" ) const ( @@ -24,7 +27,13 @@ func NewAdminDAO() *AdminDAO { }).(*AdminDAO) } -var SharedAdminDAO = NewAdminDAO() +var SharedAdminDAO *AdminDAO + +func init() { + dbs.OnReady(func() { + SharedAdminDAO = NewAdminDAO() + }) +} // 启用条目 func (this *AdminDAO) EnableAdmin(id uint32) (rowsAffected int64, err error) { @@ -71,7 +80,7 @@ func (this *AdminDAO) FindAdminFullname(adminId int) (string, error) { } // 检查用户名、密码 -func (this *AdminDAO) CheckAdminPassword(username string, encryptedPassword string) (int, error) { +func (this *AdminDAO) CheckAdminPassword(username string, encryptedPassword string) (int64, error) { if len(username) == 0 || len(encryptedPassword) == 0 { return 0, nil } @@ -80,5 +89,46 @@ func (this *AdminDAO) CheckAdminPassword(username string, encryptedPassword stri Attr("password", encryptedPassword). Attr("state", AdminStateEnabled). ResultPk(). - FindIntCol(0) + FindInt64Col(0) +} + +// 根据用户名查询管理员ID +func (this *AdminDAO) FindAdminIdWithUsername(username string) (int64, error) { + one, err := this.Query(). + Attr("username", username). + State(AdminStateEnabled). + ResultPk(). + Find() + if err != nil { + return 0, err + } + if one == nil { + return 0, nil + } + return int64(one.(*Admin).Id), nil +} + +// 更改管理员密码 +func (this *AdminDAO) UpdateAdminPassword(adminId int64, password string) error { + if adminId <= 0 { + return errors.New("invalid adminId") + } + op := NewAdminOperator() + op.Id = adminId + op.Password = stringutil.Md5(password) + _, err := this.Save(op) + return err +} + +// 创建管理员 +func (this *AdminDAO) CreateAdmin(username string, password string, fullname string) (int64, error) { + op := NewAdminOperator() + op.Username = username + op.Password = stringutil.Md5(password) + op.Fullname = fullname + _, err := this.Save(op) + if err != nil { + return 0, err + } + return types.Int64(op.Id), nil } diff --git a/internal/db/models/api_node_dao.go b/internal/db/models/api_node_dao.go index 49769d3e..3e2cfe9d 100644 --- a/internal/db/models/api_node_dao.go +++ b/internal/db/models/api_node_dao.go @@ -1,12 +1,15 @@ package models import ( + "encoding/json" "errors" _ "github.com/go-sql-driver/mysql" "github.com/iwind/TeaGo/Tea" "github.com/iwind/TeaGo/dbs" + "github.com/iwind/TeaGo/maps" "github.com/iwind/TeaGo/rands" "github.com/iwind/TeaGo/types" + "strconv" ) const ( @@ -27,7 +30,13 @@ func NewAPINodeDAO() *APINodeDAO { }).(*APINodeDAO) } -var SharedAPINodeDAO = NewAPINodeDAO() +var SharedAPINodeDAO *APINodeDAO + +func init() { + dbs.OnReady(func() { + SharedAPINodeDAO = NewAPINodeDAO() + }) +} // 启用条目 func (this *APINodeDAO) EnableAPINode(id int64) error { @@ -87,7 +96,7 @@ func (this *APINodeDAO) CreateAPINode(name string, description string, httpJSON return 0, err } secret := rands.String(32) - err = SharedApiTokenDAO.CreateAPIToken(uniqueId, secret, NodeRoleAPI) + err = NewApiTokenDAO().CreateAPIToken(uniqueId, secret, NodeRoleAPI) if err != nil { return } @@ -183,6 +192,33 @@ func (this *APINodeDAO) ListEnabledAPINodes(offset int64, size int64) (result [] return } +// 根据主机名和端口获取ID +func (this *APINodeDAO) FindEnabledAPINodeIdWithAddr(protocol string, host string, port int) (int64, error) { + addr := maps.Map{ + "protocol": protocol, + "host": host, + "portRange": strconv.Itoa(port), + } + addrJSON, err := json.Marshal(addr) + if err != nil { + return 0, err + } + + one, err := this.Query(). + State(APINodeStateEnabled). + Where("JSON_CONTAINS(accessAddrs, :addr)"). + Param("addr", string(addrJSON)). + ResultPk(). + Find() + if err != nil { + return 0, err + } + if one == nil { + return 0, nil + } + return int64(one.(*APINode).Id), nil +} + // 生成唯一ID func (this *APINodeDAO) genUniqueId() (string, error) { for { diff --git a/internal/db/models/api_node_dao_test.go b/internal/db/models/api_node_dao_test.go index 97c24b56..43c86d80 100644 --- a/internal/db/models/api_node_dao_test.go +++ b/internal/db/models/api_node_dao_test.go @@ -2,4 +2,32 @@ package models import ( _ "github.com/go-sql-driver/mysql" + "runtime" + "testing" ) + +func TestAPINodeDAO_FindEnabledAPINodeIdWithAddr(t *testing.T) { + dao := NewAPINodeDAO() + { + apiNodeId, err := dao.FindEnabledAPINodeIdWithAddr("http", "127.0.0.1", 123) + if err != nil { + t.Fatal(err) + } + t.Log("apiNodeId:", apiNodeId) + } + + { + apiNodeId, err := dao.FindEnabledAPINodeIdWithAddr("http", "127.0.0.1", 8003) + if err != nil { + t.Fatal(err) + } + t.Log("apiNodeId:", apiNodeId) + } +} + +func BenchmarkAPINodeDAO_New(b *testing.B) { + runtime.GOMAXPROCS(1) + for i := 0; i < b.N; i++ { + _ = NewAPINodeDAO() + } +} diff --git a/internal/db/models/api_node_model.go b/internal/db/models/api_node_model.go index b96b1309..bf5a12ce 100644 --- a/internal/db/models/api_node_model.go +++ b/internal/db/models/api_node_model.go @@ -17,6 +17,7 @@ type APINode struct { CreatedAt uint64 `field:"createdAt"` // 创建时间 AdminId uint32 `field:"adminId"` // 管理员ID Weight uint32 `field:"weight"` // 权重 + Status string `field:"status"` // 运行状态 } type APINodeOperator struct { @@ -35,6 +36,7 @@ type APINodeOperator struct { CreatedAt interface{} // 创建时间 AdminId interface{} // 管理员ID Weight interface{} // 权重 + Status interface{} // 运行状态 } func NewAPINodeOperator() *APINodeOperator { diff --git a/internal/db/models/api_token_dao.go b/internal/db/models/api_token_dao.go index 23c256ec..241ee764 100644 --- a/internal/db/models/api_token_dao.go +++ b/internal/db/models/api_token_dao.go @@ -24,7 +24,13 @@ func NewApiTokenDAO() *ApiTokenDAO { }).(*ApiTokenDAO) } -var SharedApiTokenDAO = NewApiTokenDAO() +var SharedApiTokenDAO *ApiTokenDAO + +func init() { + dbs.OnReady(func() { + SharedApiTokenDAO = NewApiTokenDAO() + }) +} // 启用条目 func (this *ApiTokenDAO) EnableApiToken(id uint32) (rowsAffected int64, err error) { @@ -67,6 +73,18 @@ func (this *ApiTokenDAO) FindEnabledTokenWithNode(nodeId string) (*ApiToken, err return nil, err } +// 根据角色获取节点 +func (this *ApiTokenDAO) FindEnabledTokenWithRole(role string) (*ApiToken, error) { + one, err := this.Query(). + Attr("role", role). + State(ApiTokenStateEnabled). + Find() + if one != nil { + return one.(*ApiToken), nil + } + return nil, err +} + // 保存API Token func (this *ApiTokenDAO) CreateAPIToken(nodeId string, secret string, role NodeRole) error { op := NewApiTokenOperator() diff --git a/internal/db/models/db_node_dao.go b/internal/db/models/db_node_dao.go index 579b1d50..572a053e 100644 --- a/internal/db/models/db_node_dao.go +++ b/internal/db/models/db_node_dao.go @@ -26,7 +26,13 @@ func NewDBNodeDAO() *DBNodeDAO { }).(*DBNodeDAO) } -var SharedDBNodeDAO = NewDBNodeDAO() +var SharedDBNodeDAO *DBNodeDAO + +func init() { + dbs.OnReady(func() { + SharedDBNodeDAO = NewDBNodeDAO() + }) +} // 启用条目 func (this *DBNodeDAO) EnableDBNode(id int64) error { diff --git a/internal/db/models/db_node_initializer.go b/internal/db/models/db_node_initializer.go index 1fca1849..e10f815e 100644 --- a/internal/db/models/db_node_initializer.go +++ b/internal/db/models/db_node_initializer.go @@ -25,7 +25,9 @@ type HTTPAccessLogDAOWrapper struct { func init() { initializer := NewDBNodeInitializer() - go initializer.Start() + dbs.OnReady(func() { + go initializer.Start() + }) } // 获取获取DAO diff --git a/internal/db/models/file_chunk_dao.go b/internal/db/models/file_chunk_dao.go index 5ef14889..0a3220f1 100644 --- a/internal/db/models/file_chunk_dao.go +++ b/internal/db/models/file_chunk_dao.go @@ -20,7 +20,13 @@ func NewFileChunkDAO() *FileChunkDAO { }).(*FileChunkDAO) } -var SharedFileChunkDAO = NewFileChunkDAO() +var SharedFileChunkDAO *FileChunkDAO + +func init() { + dbs.OnReady(func() { + SharedFileChunkDAO = NewFileChunkDAO() + }) +} // 创建文件Chunk func (this *FileChunkDAO) CreateFileChunk(fileId int, data []byte) error { diff --git a/internal/db/models/file_dao.go b/internal/db/models/file_dao.go index c65abb3b..0fff9085 100644 --- a/internal/db/models/file_dao.go +++ b/internal/db/models/file_dao.go @@ -27,7 +27,13 @@ func NewFileDAO() *FileDAO { }).(*FileDAO) } -var SharedFileDAO = NewFileDAO() +var SharedFileDAO *FileDAO + +func init() { + dbs.OnReady(func() { + SharedFileDAO = NewFileDAO() + }) +} // 启用条目 func (this *FileDAO) EnableFile(id int64) error { diff --git a/internal/db/models/http_access_log_dao.go b/internal/db/models/http_access_log_dao.go index c4bf0b29..c86560f6 100644 --- a/internal/db/models/http_access_log_dao.go +++ b/internal/db/models/http_access_log_dao.go @@ -20,7 +20,13 @@ import ( type HTTPAccessLogDAO dbs.DAO -var SharedHTTPAccessLogDAO = NewHTTPAccessLogDAO() +var SharedHTTPAccessLogDAO *HTTPAccessLogDAO + +func init() { + dbs.OnReady(func() { + SharedHTTPAccessLogDAO = NewHTTPAccessLogDAO() + }) +} func NewHTTPAccessLogDAO() *HTTPAccessLogDAO { return dbs.NewDAO(&HTTPAccessLogDAO{ diff --git a/internal/db/models/http_access_log_policy_dao.go b/internal/db/models/http_access_log_policy_dao.go index bdb6f863..fd1daf07 100644 --- a/internal/db/models/http_access_log_policy_dao.go +++ b/internal/db/models/http_access_log_policy_dao.go @@ -27,7 +27,13 @@ func NewHTTPAccessLogPolicyDAO() *HTTPAccessLogPolicyDAO { }).(*HTTPAccessLogPolicyDAO) } -var SharedHTTPAccessLogPolicyDAO = NewHTTPAccessLogPolicyDAO() +var SharedHTTPAccessLogPolicyDAO *HTTPAccessLogPolicyDAO + +func init() { + dbs.OnReady(func() { + SharedHTTPAccessLogPolicyDAO = NewHTTPAccessLogPolicyDAO() + }) +} // 初始化 func (this *HTTPAccessLogPolicyDAO) Init() { diff --git a/internal/db/models/http_cache_policy_dao.go b/internal/db/models/http_cache_policy_dao.go index ac0cb463..73ff1ea0 100644 --- a/internal/db/models/http_cache_policy_dao.go +++ b/internal/db/models/http_cache_policy_dao.go @@ -29,7 +29,13 @@ func NewHTTPCachePolicyDAO() *HTTPCachePolicyDAO { }).(*HTTPCachePolicyDAO) } -var SharedHTTPCachePolicyDAO = NewHTTPCachePolicyDAO() +var SharedHTTPCachePolicyDAO *HTTPCachePolicyDAO + +func init() { + dbs.OnReady(func() { + SharedHTTPCachePolicyDAO = NewHTTPCachePolicyDAO() + }) +} // 初始化 func (this *HTTPCachePolicyDAO) Init() { diff --git a/internal/db/models/http_firewall_policy_dao.go b/internal/db/models/http_firewall_policy_dao.go index 6b390549..3747e872 100644 --- a/internal/db/models/http_firewall_policy_dao.go +++ b/internal/db/models/http_firewall_policy_dao.go @@ -28,7 +28,13 @@ func NewHTTPFirewallPolicyDAO() *HTTPFirewallPolicyDAO { }).(*HTTPFirewallPolicyDAO) } -var SharedHTTPFirewallPolicyDAO = NewHTTPFirewallPolicyDAO() +var SharedHTTPFirewallPolicyDAO *HTTPFirewallPolicyDAO + +func init() { + dbs.OnReady(func() { + SharedHTTPFirewallPolicyDAO = NewHTTPFirewallPolicyDAO() + }) +} // 初始化 func (this *HTTPFirewallPolicyDAO) Init() { diff --git a/internal/db/models/http_firewall_rule_dao.go b/internal/db/models/http_firewall_rule_dao.go index 17430f99..4a476bde 100644 --- a/internal/db/models/http_firewall_rule_dao.go +++ b/internal/db/models/http_firewall_rule_dao.go @@ -27,7 +27,13 @@ func NewHTTPFirewallRuleDAO() *HTTPFirewallRuleDAO { }).(*HTTPFirewallRuleDAO) } -var SharedHTTPFirewallRuleDAO = NewHTTPFirewallRuleDAO() +var SharedHTTPFirewallRuleDAO *HTTPFirewallRuleDAO + +func init() { + dbs.OnReady(func() { + SharedHTTPFirewallRuleDAO = NewHTTPFirewallRuleDAO() + }) +} // 初始化 func (this *HTTPFirewallRuleDAO) Init() { diff --git a/internal/db/models/http_firewall_rule_group_dao.go b/internal/db/models/http_firewall_rule_group_dao.go index 57f11c5d..15cf2e55 100644 --- a/internal/db/models/http_firewall_rule_group_dao.go +++ b/internal/db/models/http_firewall_rule_group_dao.go @@ -28,7 +28,13 @@ func NewHTTPFirewallRuleGroupDAO() *HTTPFirewallRuleGroupDAO { }).(*HTTPFirewallRuleGroupDAO) } -var SharedHTTPFirewallRuleGroupDAO = NewHTTPFirewallRuleGroupDAO() +var SharedHTTPFirewallRuleGroupDAO *HTTPFirewallRuleGroupDAO + +func init() { + dbs.OnReady(func() { + SharedHTTPFirewallRuleGroupDAO = NewHTTPFirewallRuleGroupDAO() + }) +} // 初始化 func (this *HTTPFirewallRuleGroupDAO) Init() { diff --git a/internal/db/models/http_firewall_rule_set_dao.go b/internal/db/models/http_firewall_rule_set_dao.go index 095c95d6..ef5ad1a2 100644 --- a/internal/db/models/http_firewall_rule_set_dao.go +++ b/internal/db/models/http_firewall_rule_set_dao.go @@ -29,7 +29,13 @@ func NewHTTPFirewallRuleSetDAO() *HTTPFirewallRuleSetDAO { }).(*HTTPFirewallRuleSetDAO) } -var SharedHTTPFirewallRuleSetDAO = NewHTTPFirewallRuleSetDAO() +var SharedHTTPFirewallRuleSetDAO *HTTPFirewallRuleSetDAO + +func init() { + dbs.OnReady(func() { + SharedHTTPFirewallRuleSetDAO = NewHTTPFirewallRuleSetDAO() + }) +} // 初始化 func (this *HTTPFirewallRuleSetDAO) Init() { diff --git a/internal/db/models/http_gzip_dao.go b/internal/db/models/http_gzip_dao.go index c9754fd1..dda3da0c 100644 --- a/internal/db/models/http_gzip_dao.go +++ b/internal/db/models/http_gzip_dao.go @@ -29,7 +29,13 @@ func NewHTTPGzipDAO() *HTTPGzipDAO { }).(*HTTPGzipDAO) } -var SharedHTTPGzipDAO = NewHTTPGzipDAO() +var SharedHTTPGzipDAO *HTTPGzipDAO + +func init() { + dbs.OnReady(func() { + SharedHTTPGzipDAO = NewHTTPGzipDAO() + }) +} // 初始化 func (this *HTTPGzipDAO) Init() { diff --git a/internal/db/models/http_header_dao.go b/internal/db/models/http_header_dao.go index 3df781a7..e8fc405f 100644 --- a/internal/db/models/http_header_dao.go +++ b/internal/db/models/http_header_dao.go @@ -28,7 +28,13 @@ func NewHTTPHeaderDAO() *HTTPHeaderDAO { }).(*HTTPHeaderDAO) } -var SharedHTTPHeaderDAO = NewHTTPHeaderDAO() +var SharedHTTPHeaderDAO *HTTPHeaderDAO + +func init() { + dbs.OnReady(func() { + SharedHTTPHeaderDAO = NewHTTPHeaderDAO() + }) +} // 初始化 func (this *HTTPHeaderDAO) Init() { diff --git a/internal/db/models/http_header_policy_dao.go b/internal/db/models/http_header_policy_dao.go index 619a471f..ec606785 100644 --- a/internal/db/models/http_header_policy_dao.go +++ b/internal/db/models/http_header_policy_dao.go @@ -28,7 +28,13 @@ func NewHTTPHeaderPolicyDAO() *HTTPHeaderPolicyDAO { }).(*HTTPHeaderPolicyDAO) } -var SharedHTTPHeaderPolicyDAO = NewHTTPHeaderPolicyDAO() +var SharedHTTPHeaderPolicyDAO *HTTPHeaderPolicyDAO + +func init() { + dbs.OnReady(func() { + SharedHTTPHeaderPolicyDAO = NewHTTPHeaderPolicyDAO() + }) +} // 初始化 func (this *HTTPHeaderPolicyDAO) Init() { diff --git a/internal/db/models/http_location_dao.go b/internal/db/models/http_location_dao.go index 77edca5a..5f028283 100644 --- a/internal/db/models/http_location_dao.go +++ b/internal/db/models/http_location_dao.go @@ -28,7 +28,13 @@ func NewHTTPLocationDAO() *HTTPLocationDAO { }).(*HTTPLocationDAO) } -var SharedHTTPLocationDAO = NewHTTPLocationDAO() +var SharedHTTPLocationDAO *HTTPLocationDAO + +func init() { + dbs.OnReady(func() { + SharedHTTPLocationDAO = NewHTTPLocationDAO() + }) +} // 初始化 func (this *HTTPLocationDAO) Init() { diff --git a/internal/db/models/http_page_dao.go b/internal/db/models/http_page_dao.go index 8f073126..409f26e3 100644 --- a/internal/db/models/http_page_dao.go +++ b/internal/db/models/http_page_dao.go @@ -28,7 +28,13 @@ func NewHTTPPageDAO() *HTTPPageDAO { }).(*HTTPPageDAO) } -var SharedHTTPPageDAO = NewHTTPPageDAO() +var SharedHTTPPageDAO *HTTPPageDAO + +func init() { + dbs.OnReady(func() { + SharedHTTPPageDAO = NewHTTPPageDAO() + }) +} // 初始化 func (this *HTTPPageDAO) Init() { @@ -121,7 +127,6 @@ func (this *HTTPPageDAO) UpdatePage(pageId int64, statusList []string, url strin op.NewStatus = newStatus _, err = this.Save(op) - return err } diff --git a/internal/db/models/http_rewrite_rule_dao.go b/internal/db/models/http_rewrite_rule_dao.go index 34910e79..7b73b9b3 100644 --- a/internal/db/models/http_rewrite_rule_dao.go +++ b/internal/db/models/http_rewrite_rule_dao.go @@ -27,7 +27,13 @@ func NewHTTPRewriteRuleDAO() *HTTPRewriteRuleDAO { }).(*HTTPRewriteRuleDAO) } -var SharedHTTPRewriteRuleDAO = NewHTTPRewriteRuleDAO() +var SharedHTTPRewriteRuleDAO *HTTPRewriteRuleDAO + +func init() { + dbs.OnReady(func() { + SharedHTTPRewriteRuleDAO = NewHTTPRewriteRuleDAO() + }) +} // 初始化 func (this *HTTPRewriteRuleDAO) Init() { diff --git a/internal/db/models/http_web_dao.go b/internal/db/models/http_web_dao.go index a74b943e..e1e5077c 100644 --- a/internal/db/models/http_web_dao.go +++ b/internal/db/models/http_web_dao.go @@ -31,7 +31,13 @@ func NewHTTPWebDAO() *HTTPWebDAO { }).(*HTTPWebDAO) } -var SharedHTTPWebDAO = NewHTTPWebDAO() +var SharedHTTPWebDAO *HTTPWebDAO + +func init() { + dbs.OnReady(func() { + SharedHTTPWebDAO = NewHTTPWebDAO() + }) +} func (this *HTTPWebDAO) Init() { this.DAOObject.Init() diff --git a/internal/db/models/http_websocket_dao.go b/internal/db/models/http_websocket_dao.go index 2b988d10..c9f665c2 100644 --- a/internal/db/models/http_websocket_dao.go +++ b/internal/db/models/http_websocket_dao.go @@ -29,7 +29,13 @@ func NewHTTPWebsocketDAO() *HTTPWebsocketDAO { }).(*HTTPWebsocketDAO) } -var SharedHTTPWebsocketDAO = NewHTTPWebsocketDAO() +var SharedHTTPWebsocketDAO *HTTPWebsocketDAO + +func init() { + dbs.OnReady(func() { + SharedHTTPWebsocketDAO = NewHTTPWebsocketDAO() + }) +} // 启用条目 func (this *HTTPWebsocketDAO) EnableHTTPWebsocket(id int64) error { diff --git a/internal/db/models/log_dao.go b/internal/db/models/log_dao.go index 336c4a82..1c0c0e47 100644 --- a/internal/db/models/log_dao.go +++ b/internal/db/models/log_dao.go @@ -19,7 +19,13 @@ func NewLogDAO() *LogDAO { }).(*LogDAO) } -var SharedLogDAO = NewLogDAO() +var SharedLogDAO *LogDAO + +func init() { + dbs.OnReady(func() { + SharedLogDAO = NewLogDAO() + }) +} // 创建管理员日志 func (this *LogDAO) CreateAdminLog(adminId int64, level string, description string, action string, ip string) error { diff --git a/internal/db/models/node_cluster_dao.go b/internal/db/models/node_cluster_dao.go index 4a3c2dc2..84c832f4 100644 --- a/internal/db/models/node_cluster_dao.go +++ b/internal/db/models/node_cluster_dao.go @@ -26,7 +26,13 @@ func NewNodeClusterDAO() *NodeClusterDAO { }).(*NodeClusterDAO) } -var SharedNodeClusterDAO = NewNodeClusterDAO() +var SharedNodeClusterDAO *NodeClusterDAO + +func init() { + dbs.OnReady(func() { + SharedNodeClusterDAO = NewNodeClusterDAO() + }) +} // 启用条目 func (this *NodeClusterDAO) EnableNodeCluster(id int64) error { diff --git a/internal/db/models/node_dao.go b/internal/db/models/node_dao.go index 7c44b131..bfa8b5a6 100644 --- a/internal/db/models/node_dao.go +++ b/internal/db/models/node_dao.go @@ -32,7 +32,13 @@ func NewNodeDAO() *NodeDAO { }).(*NodeDAO) } -var SharedNodeDAO = NewNodeDAO() +var SharedNodeDAO *NodeDAO + +func init() { + dbs.OnReady(func() { + SharedNodeDAO = NewNodeDAO() + }) +} // 启用条目 func (this *NodeDAO) EnableNode(id uint32) (rowsAffected int64, err error) { diff --git a/internal/db/models/node_grant_dao.go b/internal/db/models/node_grant_dao.go index 4d414d4f..6f13a68a 100644 --- a/internal/db/models/node_grant_dao.go +++ b/internal/db/models/node_grant_dao.go @@ -26,7 +26,13 @@ func NewNodeGrantDAO() *NodeGrantDAO { }).(*NodeGrantDAO) } -var SharedNodeGrantDAO = NewNodeGrantDAO() +var SharedNodeGrantDAO *NodeGrantDAO + +func init() { + dbs.OnReady(func() { + SharedNodeGrantDAO = NewNodeGrantDAO() + }) +} // 启用条目 func (this *NodeGrantDAO) EnableNodeGrant(id uint32) (rowsAffected int64, err error) { diff --git a/internal/db/models/node_group_dao.go b/internal/db/models/node_group_dao.go index 28f5a69c..80cd9efe 100644 --- a/internal/db/models/node_group_dao.go +++ b/internal/db/models/node_group_dao.go @@ -24,7 +24,13 @@ func NewNodeGroupDAO() *NodeGroupDAO { }).(*NodeGroupDAO) } -var SharedNodeGroupDAO = NewNodeGroupDAO() +var SharedNodeGroupDAO *NodeGroupDAO + +func init() { + dbs.OnReady(func() { + SharedNodeGroupDAO = NewNodeGroupDAO() + }) +} // 启用条目 func (this *NodeGroupDAO) EnableNodeGroup(id uint32) (rowsAffected int64, err error) { diff --git a/internal/db/models/node_ip_address_dao.go b/internal/db/models/node_ip_address_dao.go index 121ed6d7..1c795378 100644 --- a/internal/db/models/node_ip_address_dao.go +++ b/internal/db/models/node_ip_address_dao.go @@ -26,7 +26,13 @@ func NewNodeIPAddressDAO() *NodeIPAddressDAO { }).(*NodeIPAddressDAO) } -var SharedNodeIPAddressDAO = NewNodeIPAddressDAO() +var SharedNodeIPAddressDAO *NodeIPAddressDAO + +func init() { + dbs.OnReady(func() { + SharedNodeIPAddressDAO = NewNodeIPAddressDAO() + }) +} // 启用条目 func (this *NodeIPAddressDAO) EnableAddress(id int64) (err error) { diff --git a/internal/db/models/node_log_dao.go b/internal/db/models/node_log_dao.go index ddfad2f8..fadd37a0 100644 --- a/internal/db/models/node_log_dao.go +++ b/internal/db/models/node_log_dao.go @@ -25,7 +25,13 @@ func NewNodeLogDAO() *NodeLogDAO { }).(*NodeLogDAO) } -var SharedNodeLogDAO = NewNodeLogDAO() +var SharedNodeLogDAO *NodeLogDAO + +func init() { + dbs.OnReady(func() { + SharedNodeLogDAO = NewNodeLogDAO() + }) +} // 创建日志 func (this *NodeLogDAO) CreateLog(nodeRole NodeRole, nodeId int64, level string, tag string, description string, createdAt int64) error { diff --git a/internal/db/models/node_login_dao.go b/internal/db/models/node_login_dao.go index d5d08b24..0a58e6d7 100644 --- a/internal/db/models/node_login_dao.go +++ b/internal/db/models/node_login_dao.go @@ -28,7 +28,13 @@ func NewNodeLoginDAO() *NodeLoginDAO { }).(*NodeLoginDAO) } -var SharedNodeLoginDAO = NewNodeLoginDAO() +var SharedNodeLoginDAO *NodeLoginDAO + +func init() { + dbs.OnReady(func() { + SharedNodeLoginDAO = NewNodeLoginDAO() + }) +} // 启用条目 func (this *NodeLoginDAO) EnableNodeLogin(id uint32) (rowsAffected int64, err error) { diff --git a/internal/db/models/origin_dao.go b/internal/db/models/origin_dao.go index ace04abb..d7b33a8e 100644 --- a/internal/db/models/origin_dao.go +++ b/internal/db/models/origin_dao.go @@ -30,7 +30,13 @@ func NewOriginDAO() *OriginDAO { }).(*OriginDAO) } -var SharedOriginDAO = NewOriginDAO() +var SharedOriginDAO *OriginDAO + +func init() { + dbs.OnReady(func() { + SharedOriginDAO = NewOriginDAO() + }) +} // 初始化 func (this *OriginDAO) Init() { diff --git a/internal/db/models/provider_dao.go b/internal/db/models/provider_dao.go index 2cc28b3b..aac71a5c 100644 --- a/internal/db/models/provider_dao.go +++ b/internal/db/models/provider_dao.go @@ -24,7 +24,13 @@ func NewProviderDAO() *ProviderDAO { }).(*ProviderDAO) } -var SharedProviderDAO = NewProviderDAO() +var SharedProviderDAO *ProviderDAO + +func init() { + dbs.OnReady(func() { + SharedProviderDAO = NewProviderDAO() + }) +} // 启用条目 func (this *ProviderDAO) EnableProvider(id uint32) (rowsAffected int64, err error) { diff --git a/internal/db/models/reverse_proxy_dao.go b/internal/db/models/reverse_proxy_dao.go index 9c1483c3..dd312e9b 100644 --- a/internal/db/models/reverse_proxy_dao.go +++ b/internal/db/models/reverse_proxy_dao.go @@ -28,7 +28,13 @@ func NewReverseProxyDAO() *ReverseProxyDAO { }).(*ReverseProxyDAO) } -var SharedReverseProxyDAO = NewReverseProxyDAO() +var SharedReverseProxyDAO *ReverseProxyDAO + +func init() { + dbs.OnReady(func() { + SharedReverseProxyDAO = NewReverseProxyDAO() + }) +} // 初始化 func (this *ReverseProxyDAO) Init() { diff --git a/internal/db/models/server_dao.go b/internal/db/models/server_dao.go index 3c48caa6..6ab6d7b8 100644 --- a/internal/db/models/server_dao.go +++ b/internal/db/models/server_dao.go @@ -32,7 +32,13 @@ func NewServerDAO() *ServerDAO { }).(*ServerDAO) } -var SharedServerDAO = NewServerDAO() +var SharedServerDAO *ServerDAO + +func init() { + dbs.OnReady(func() { + SharedServerDAO = NewServerDAO() + }) +} // 初始化 func (this *ServerDAO) Init() { diff --git a/internal/db/models/server_group_dao.go b/internal/db/models/server_group_dao.go index 653f5949..86c91feb 100644 --- a/internal/db/models/server_group_dao.go +++ b/internal/db/models/server_group_dao.go @@ -24,22 +24,30 @@ func NewServerGroupDAO() *ServerGroupDAO { }).(*ServerGroupDAO) } -var SharedServerGroupDAO = NewServerGroupDAO() +var SharedServerGroupDAO *ServerGroupDAO + +func init() { + dbs.OnReady(func() { + SharedServerGroupDAO = NewServerGroupDAO() + }) +} // 启用条目 -func (this *ServerGroupDAO) EnableServerGroup(id uint32) (rowsAffected int64, err error) { - return this.Query(). +func (this *ServerGroupDAO) EnableServerGroup(id uint32) error { + _, err := this.Query(). Pk(id). Set("state", ServerGroupStateEnabled). Update() + return err } // 禁用条目 -func (this *ServerGroupDAO) DisableServerGroup(id uint32) (rowsAffected int64, err error) { - return this.Query(). +func (this *ServerGroupDAO) DisableServerGroup(id uint32) error { + _, err := this.Query(). Pk(id). Set("state", ServerGroupStateDisabled). Update() + return err } // 查找启用中的条目 @@ -56,9 +64,8 @@ func (this *ServerGroupDAO) FindEnabledServerGroup(id uint32) (*ServerGroup, err // 根据主键查找名称 func (this *ServerGroupDAO) FindServerGroupName(id uint32) (string, error) { - name, err := this.Query(). + return this.Query(). Pk(id). Result("name"). - FindCol("") - return name.(string), err + FindStringCol("") } diff --git a/internal/db/models/ssl_cert_dao.go b/internal/db/models/ssl_cert_dao.go index f08e407c..45ad77a8 100644 --- a/internal/db/models/ssl_cert_dao.go +++ b/internal/db/models/ssl_cert_dao.go @@ -29,7 +29,13 @@ func NewSSLCertDAO() *SSLCertDAO { }).(*SSLCertDAO) } -var SharedSSLCertDAO = NewSSLCertDAO() +var SharedSSLCertDAO *SSLCertDAO + +func init() { + dbs.OnReady(func() { + SharedSSLCertDAO = NewSSLCertDAO() + }) +} // 初始化 func (this *SSLCertDAO) Init() { diff --git a/internal/db/models/ssl_cert_group_dao.go b/internal/db/models/ssl_cert_group_dao.go index 61fe1397..e965215b 100644 --- a/internal/db/models/ssl_cert_group_dao.go +++ b/internal/db/models/ssl_cert_group_dao.go @@ -24,7 +24,13 @@ func NewSSLCertGroupDAO() *SSLCertGroupDAO { }).(*SSLCertGroupDAO) } -var SharedSSLCertGroupDAO = NewSSLCertGroupDAO() +var SharedSSLCertGroupDAO *SSLCertGroupDAO + +func init() { + dbs.OnReady(func() { + SharedSSLCertGroupDAO = NewSSLCertGroupDAO() + }) +} // 启用条目 func (this *SSLCertGroupDAO) EnableSSLCertGroup(id uint32) error { diff --git a/internal/db/models/ssl_policy_dao.go b/internal/db/models/ssl_policy_dao.go index ae262e33..5e814c30 100644 --- a/internal/db/models/ssl_policy_dao.go +++ b/internal/db/models/ssl_policy_dao.go @@ -29,7 +29,13 @@ func NewSSLPolicyDAO() *SSLPolicyDAO { }).(*SSLPolicyDAO) } -var SharedSSLPolicyDAO = NewSSLPolicyDAO() +var SharedSSLPolicyDAO *SSLPolicyDAO + +func init() { + dbs.OnReady(func() { + SharedSSLPolicyDAO = NewSSLPolicyDAO() + }) +} // 初始化 func (this *SSLPolicyDAO) Init() { diff --git a/internal/db/models/sys_event_dao.go b/internal/db/models/sys_event_dao.go index 7c68f589..378ecc01 100644 --- a/internal/db/models/sys_event_dao.go +++ b/internal/db/models/sys_event_dao.go @@ -21,7 +21,13 @@ func NewSysEventDAO() *SysEventDAO { }).(*SysEventDAO) } -var SharedSysEventDAO = NewSysEventDAO() +var SharedSysEventDAO *SysEventDAO + +func init() { + dbs.OnReady(func() { + SharedSysEventDAO = NewSysEventDAO() + }) +} // 创建事件 func (this *SysEventDAO) CreateEvent(event EventInterface) error { diff --git a/internal/db/models/sys_locker_dao.go b/internal/db/models/sys_locker_dao.go index 6ece112a..3dcd6726 100644 --- a/internal/db/models/sys_locker_dao.go +++ b/internal/db/models/sys_locker_dao.go @@ -21,7 +21,13 @@ func NewSysLockerDAO() *SysLockerDAO { }).(*SysLockerDAO) } -var SharedSysLockerDAO = NewSysLockerDAO() +var SharedSysLockerDAO *SysLockerDAO + +func init() { + dbs.OnReady(func() { + SharedSysLockerDAO = NewSysLockerDAO() + }) +} // 开锁 func (this *SysLockerDAO) Lock(key string, timeout int64) (bool, error) { diff --git a/internal/db/models/sys_setting_dao.go b/internal/db/models/sys_setting_dao.go index 533bd6af..8ef37a37 100644 --- a/internal/db/models/sys_setting_dao.go +++ b/internal/db/models/sys_setting_dao.go @@ -26,7 +26,13 @@ func NewSysSettingDAO() *SysSettingDAO { }).(*SysSettingDAO) } -var SharedSysSettingDAO = NewSysSettingDAO() +var SharedSysSettingDAO *SysSettingDAO + +func init() { + dbs.OnReady(func() { + SharedSysSettingDAO = NewSysSettingDAO() + }) +} // 设置配置 func (this *SysSettingDAO) UpdateSetting(codeFormat string, valueJSON []byte, codeFormatArgs ...interface{}) error { diff --git a/internal/db/models/tcp_firewall_policy_dao.go b/internal/db/models/tcp_firewall_policy_dao.go index 52ef2bfd..8fb56fc0 100644 --- a/internal/db/models/tcp_firewall_policy_dao.go +++ b/internal/db/models/tcp_firewall_policy_dao.go @@ -19,7 +19,13 @@ func NewTCPFirewallPolicyDAO() *TCPFirewallPolicyDAO { }).(*TCPFirewallPolicyDAO) } -var SharedTCPFirewallPolicyDAO = NewTCPFirewallPolicyDAO() +var SharedTCPFirewallPolicyDAO *TCPFirewallPolicyDAO + +func init() { + dbs.OnReady(func() { + SharedTCPFirewallPolicyDAO = NewTCPFirewallPolicyDAO() + }) +} // 初始化 func (this *TCPFirewallPolicyDAO) Init() { diff --git a/internal/db/models/user_dao.go b/internal/db/models/user_dao.go index 3641a723..85410159 100644 --- a/internal/db/models/user_dao.go +++ b/internal/db/models/user_dao.go @@ -24,7 +24,13 @@ func NewUserDAO() *UserDAO { }).(*UserDAO) } -var SharedUserDAO = NewUserDAO() +var SharedUserDAO *UserDAO + +func init() { + dbs.OnReady(func() { + SharedUserDAO = NewUserDAO() + }) +} // 启用条目 func (this *UserDAO) EnableUser(id uint32) (rowsAffected int64, err error) { diff --git a/internal/db/models/version_dao.go b/internal/db/models/version_dao.go new file mode 100644 index 00000000..6f753a8f --- /dev/null +++ b/internal/db/models/version_dao.go @@ -0,0 +1,28 @@ +package models + +import ( + _ "github.com/go-sql-driver/mysql" + "github.com/iwind/TeaGo/Tea" + "github.com/iwind/TeaGo/dbs" +) + +type VersionDAO dbs.DAO + +func NewVersionDAO() *VersionDAO { + return dbs.NewDAO(&VersionDAO{ + DAOObject: dbs.DAOObject{ + DB: Tea.Env, + Table: "edgeVersions", + Model: new(Version), + PkName: "id", + }, + }).(*VersionDAO) +} + +var SharedVersionDAO *VersionDAO + +func init() { + dbs.OnReady(func() { + SharedVersionDAO = NewVersionDAO() + }) +} diff --git a/internal/db/models/version_dao_test.go b/internal/db/models/version_dao_test.go new file mode 100644 index 00000000..97c24b56 --- /dev/null +++ b/internal/db/models/version_dao_test.go @@ -0,0 +1,5 @@ +package models + +import ( + _ "github.com/go-sql-driver/mysql" +) diff --git a/internal/db/models/version_model.go b/internal/db/models/version_model.go new file mode 100644 index 00000000..adbe948a --- /dev/null +++ b/internal/db/models/version_model.go @@ -0,0 +1,16 @@ +package models + +// 数据库结构版本 +type Version struct { + Id uint64 `field:"id"` // ID + Version string `field:"version"` // +} + +type VersionOperator struct { + Id interface{} // ID + Version interface{} // +} + +func NewVersionOperator() *VersionOperator { + return &VersionOperator{} +} diff --git a/internal/db/models/version_model_ext.go b/internal/db/models/version_model_ext.go new file mode 100644 index 00000000..2640e7f9 --- /dev/null +++ b/internal/db/models/version_model_ext.go @@ -0,0 +1 @@ +package models diff --git a/internal/nodes/api_node.go b/internal/nodes/api_node.go index cef98927..e8f89c5d 100644 --- a/internal/nodes/api_node.go +++ b/internal/nodes/api_node.go @@ -8,6 +8,7 @@ import ( "github.com/TeaOSLab/EdgeAPI/internal/rpc/services" "github.com/TeaOSLab/EdgeAPI/internal/utils" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/iwind/TeaGo/dbs" "github.com/iwind/TeaGo/logs" "google.golang.org/grpc" "google.golang.org/grpc/credentials" @@ -28,6 +29,9 @@ func NewAPINode() *APINode { func (this *APINode) Start() { logs.Println("[API]start api node, pid: " + strconv.Itoa(os.Getpid())) + // 数据库通知启动 + dbs.NotifyReady() + // 读取配置 config, err := configs.SharedAPIConfig() if err != nil { diff --git a/internal/rpc/services/service_admin.go b/internal/rpc/services/service_admin.go index 5933a2ec..3c7381fc 100644 --- a/internal/rpc/services/service_admin.go +++ b/internal/rpc/services/service_admin.go @@ -52,9 +52,10 @@ func (this *AdminService) CreateAdminLog(ctx context.Context, req *pb.CreateAdmi return nil, err } err = models.SharedLogDAO.CreateAdminLog(userId, req.Level, req.Description, req.Action, req.Ip) - return &pb.CreateAdminLogResponse{ - IsOk: err != nil, - }, err + if err != nil { + return nil, err + } + return &pb.CreateAdminLogResponse{}, nil } func (this *AdminService) CheckAdminExists(ctx context.Context, req *pb.CheckAdminExistsRequest) (*pb.CheckAdminExistsResponse, error) { @@ -95,3 +96,28 @@ func (this *AdminService) FindAdminFullname(ctx context.Context, req *pb.FindAdm Fullname: fullname, }, nil } + +// 创建或修改管理员 +func (this *AdminService) CreateOrUpdateAdmin(ctx context.Context, req *pb.CreateOrUpdateAdminRequest) (*pb.CreateOrUpdateAdminResponse, error) { + _, _, err := rpcutils.ValidateRequest(ctx, rpcutils.UserTypeAdmin, rpcutils.UserTypeAPI) + if err != nil { + return nil, err + } + + adminId, err := models.SharedAdminDAO.FindAdminIdWithUsername(req.Username) + if err != nil { + return nil, err + } + if adminId > 0 { + err = models.SharedAdminDAO.UpdateAdminPassword(adminId, req.Password) + if err != nil { + return nil, err + } + return &pb.CreateOrUpdateAdminResponse{AdminId: adminId}, nil + } + adminId, err = models.SharedAdminDAO.CreateAdmin(req.Username, req.Password, "管理员") + if err != nil { + return nil, err + } + return &pb.CreateOrUpdateAdminResponse{AdminId: adminId}, nil +} diff --git a/internal/rpc/services/service_api_node.go b/internal/rpc/services/service_api_node.go index e412a535..36fe6f02 100644 --- a/internal/rpc/services/service_api_node.go +++ b/internal/rpc/services/service_api_node.go @@ -2,6 +2,7 @@ package services import ( "context" + teaconst "github.com/TeaOSLab/EdgeAPI/internal/const" "github.com/TeaOSLab/EdgeAPI/internal/db/models" rpcutils "github.com/TeaOSLab/EdgeAPI/internal/rpc/utils" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" @@ -180,3 +181,13 @@ func (this *APINodeService) FindEnabledAPINode(ctx context.Context, req *pb.Find } return &pb.FindEnabledAPINodeResponse{Node: result}, nil } + +// 获取当前API节点的版本 +func (this *APINodeService) FindCurrentAPINodeVersion(ctx context.Context, req *pb.FindCurrentAPINodeVersionRequest) (*pb.FindCurrentAPINodeVersionResponse, error) { + _, _, err := rpcutils.ValidateRequest(ctx) + if err != nil { + return nil, err + } + + return &pb.FindCurrentAPINodeVersionResponse{Version: teaconst.Version}, nil +} diff --git a/internal/rpc/utils/utils.go b/internal/rpc/utils/utils.go index c1cf103f..4aa37135 100644 --- a/internal/rpc/utils/utils.go +++ b/internal/rpc/utils/utils.go @@ -28,6 +28,7 @@ const ( UserTypeStat = "stat" UserTypeDNS = "dns" UserTypeLog = "log" + UserTypeAPI = "api" ) // 校验请求 @@ -51,23 +52,7 @@ func ValidateRequest(ctx context.Context, userTypes ...UserType) (userType UserT } nodeUserId := int64(0) if apiToken == nil { - // 我们从节点中获取 - node, err := models.SharedNodeDAO.FindEnabledNodeWithUniqueId(nodeId) - if err != nil { - return UserTypeNone, 0, err - } - if node == nil { - return UserTypeNone, 0, err - } - - nodeUserId = int64(node.Id) - apiToken = &models.ApiToken{ - Id: 0, - NodeId: nodeId, - Secret: node.Secret, - Role: "node", - State: 1, - } + return UserTypeNode, 0, errors.New("context: invalid api token") } tokens := md.Get("token") diff --git a/internal/setup/config.go b/internal/setup/config.go new file mode 100644 index 00000000..05a3b001 --- /dev/null +++ b/internal/setup/config.go @@ -0,0 +1,7 @@ +package setup + +type Config struct { + APINodeProtocol string + APINodeHost string + APINodePort int +} diff --git a/internal/setup/setup.go b/internal/setup/setup.go new file mode 100644 index 00000000..af96f9bd --- /dev/null +++ b/internal/setup/setup.go @@ -0,0 +1,187 @@ +package setup + +import ( + "encoding/json" + "github.com/TeaOSLab/EdgeAPI/internal/configs" + "github.com/TeaOSLab/EdgeAPI/internal/db/models" + "github.com/TeaOSLab/EdgeAPI/internal/errors" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" + "github.com/go-yaml/yaml" + "github.com/iwind/TeaGo/Tea" + "github.com/iwind/TeaGo/cmd" + "github.com/iwind/TeaGo/dbs" + "github.com/iwind/TeaGo/types" + "io/ioutil" + "os" + "strconv" + "strings" +) + +type Setup struct { + config *Config + + // 要返回的数据 + AdminNodeId string + AdminNodeSecret string +} + +func NewSetup(config *Config) *Setup { + return &Setup{ + config: config, + } +} + +func NewSetupFromCmd() *Setup { + args := cmd.ParseArgs(strings.Join(os.Args[1:], " ")) + + config := &Config{} + for _, arg := range args { + index := strings.Index(arg, "=") + if index <= 0 { + continue + } + value := arg[index+1:] + value = strings.Trim(value, "\"'") + switch arg[:index] { + case "-api-node-protocol": + config.APINodeProtocol = value + case "-api-node-host": + config.APINodeHost = value + case "-api-node-port": + config.APINodePort = types.Int(value) + } + } + + return NewSetup(config) +} + +func (this *Setup) Run() error { + if this.config == nil { + return errors.New("config should not be nil") + } + + if len(this.config.APINodeProtocol) == 0 { + return errors.New("api node protocol should not be empty") + } + if this.config.APINodeProtocol != "http" && this.config.APINodeProtocol != "https" { + return errors.New("invalid api node protocol: " + this.config.APINodeProtocol) + } + if len(this.config.APINodeHost) == 0 { + return errors.New("api node host should not be empty") + } + if this.config.APINodePort <= 0 { + return errors.New("api node port should not be less than 1") + } + + // 执行SQL + config := &dbs.Config{} + configData, err := ioutil.ReadFile(Tea.ConfigFile("db.yaml")) + if err != nil { + return err + } + err = yaml.Unmarshal(configData, config) + if err != nil { + return err + } + for _, db := range config.DBs { + // 可以同时运行多条语句 + db.Dsn += "&multiStatements=true" + } + dbConfig, ok := config.DBs[Tea.Env] + if !ok { + return errors.New("can not find database config for env '" + Tea.Env + "'") + } + + executor := NewSQLExecutor(dbConfig) + err = executor.Run() + if err != nil { + return err + } + + // Admin节点信息 + apiTokenDAO := models.NewApiTokenDAO() + token, err := apiTokenDAO.FindEnabledTokenWithRole("admin") + if err != nil { + return err + } + if token == nil { + return errors.New("can not find admin node token, please run the setup again") + } + this.AdminNodeId = token.NodeId + this.AdminNodeSecret = token.Secret + + // 检查API节点 + dao := models.NewAPINodeDAO() + apiNodeId, err := dao.FindEnabledAPINodeIdWithAddr(this.config.APINodeProtocol, this.config.APINodeHost, this.config.APINodePort) + if err != nil { + return err + } + if apiNodeId == 0 { + addr := &serverconfigs.NetworkAddressConfig{ + Protocol: serverconfigs.Protocol(this.config.APINodeProtocol), + Host: this.config.APINodeHost, + PortRange: strconv.Itoa(this.config.APINodePort), + } + addrsJSON, err := json.Marshal([]*serverconfigs.NetworkAddressConfig{addr}) + if err != nil { + return errors.New("json encode api node addr failed: " + err.Error()) + } + + var httpJSON []byte = nil + var httpsJSON []byte = nil + if this.config.APINodeProtocol == "http" { + httpConfig := &serverconfigs.HTTPProtocolConfig{} + httpConfig.IsOn = true + httpConfig.Listen = []*serverconfigs.NetworkAddressConfig{ + { + PortRange: strconv.Itoa(this.config.APINodePort), + }, + } + httpJSON, err = json.Marshal(httpConfig) + if err != nil { + return errors.New("json encode api node http config failed: " + err.Error()) + } + } + if this.config.APINodeProtocol == "https" { + // TODO 如果在安装过程中开启了HTTPS,需要同时上传SSL证书 + httpsConfig := &serverconfigs.HTTPSProtocolConfig{} + httpsConfig.IsOn = true + httpsConfig.Listen = []*serverconfigs.NetworkAddressConfig{ + { + PortRange: strconv.Itoa(this.config.APINodePort), + }, + } + httpsJSON, err = json.Marshal(httpsConfig) + if err != nil { + return errors.New("json encode api node https config failed: " + err.Error()) + } + } + + // 创建API节点 + nodeId, err := dao.CreateAPINode("默认API节点", "这是默认创建的第一个API节点", httpJSON, httpsJSON, addrsJSON, true) + if err != nil { + return errors.New("create api node in database failed: " + err.Error()) + } + apiNodeId = nodeId + } + + apiNode, err := dao.FindEnabledAPINode(apiNodeId) + if err != nil { + return err + } + if apiNode == nil { + return errors.New("apiNode should not be nil") + } + + // 保存配置 + apiConfig := &configs.APIConfig{ + NodeId: apiNode.UniqueId, + Secret: apiNode.Secret, + } + err = apiConfig.WriteFile(Tea.ConfigFile("api.yaml")) + if err != nil { + return errors.New("save config failed: " + err.Error()) + } + + return nil +} diff --git a/internal/setup/setup_test.go b/internal/setup/setup_test.go new file mode 100644 index 00000000..08a98820 --- /dev/null +++ b/internal/setup/setup_test.go @@ -0,0 +1,19 @@ +package setup + +import ( + _ "github.com/iwind/TeaGo/bootstrap" + "testing" +) + +func TestSetup_Run(t *testing.T) { + setup := NewSetup(&Config{ + APINodeProtocol: "http", + APINodeHost: "127.0.0.1", + APINodePort: 8003, + }) + err := setup.Run() + if err != nil { + t.Fatal(err) + } + t.Log("OK") +} diff --git a/internal/setup/sql_executor.go b/internal/setup/sql_executor.go new file mode 100644 index 00000000..6a8b3039 --- /dev/null +++ b/internal/setup/sql_executor.go @@ -0,0 +1,279 @@ +package setup + +import ( + teaconst "github.com/TeaOSLab/EdgeAPI/internal/const" + "github.com/TeaOSLab/EdgeAPI/internal/errors" + "github.com/TeaOSLab/EdgeAPI/internal/setup/sqls" + _ "github.com/go-sql-driver/mysql" + "github.com/iwind/TeaGo/dbs" + "github.com/iwind/TeaGo/lists" + "github.com/iwind/TeaGo/rands" + "github.com/iwind/TeaGo/types" + stringutil "github.com/iwind/TeaGo/utils/string" + "sort" + "strings" + "time" +) + +type SQLExecutor struct { + dbConfig *dbs.DBConfig +} + +func NewSQLExecutor(dbConfig *dbs.DBConfig) *SQLExecutor { + return &SQLExecutor{ + dbConfig: dbConfig, + } +} + +func (this *SQLExecutor) Run() error { + db, err := dbs.NewInstanceFromConfig(this.dbConfig) + if err != nil { + return err + } + + tableNames, err := db.TableNames() + if err != nil { + return err + } + + // 检查已有数据 + if lists.ContainsString(tableNames, "edgeVersions") { + stmt, err := db.Prepare("SELECT version FROM " + db.TablePrefix() + "Versions") + if err != nil { + return err + } + defer func() { + _ = stmt.Close() + }() + + rows, err := stmt.Query() + if err != nil { + return err + } + defer func() { + _ = rows.Close() + }() + + // 对比版本 + oldVersion := "" + if rows.Next() { + err = rows.Scan(&oldVersion) + if err != nil { + return errors.New("query version failed: " + err.Error()) + } + } + if oldVersion == teaconst.Version { + err = this.checkData(db) + if err != nil { + return err + } + + return nil + } + oldVersion = strings.Replace(oldVersion, "_", ".", -1) + + upgradeVersions := []string{} + sqlMap := map[string]string{} // version => sql + + for _, m := range sqls.SQLVersions { + version, _ := m["version"] + if version == "full" { + continue + } + version = strings.Replace(version, "_", ".", -1) + if len(oldVersion) == 0 || stringutil.VersionCompare(version, oldVersion) > 0 { + upgradeVersions = append(upgradeVersions, version) + sql, _ := m["sql"] + sqlMap[version] = sql + } + } + + // 如果没有可以升级的版本,直接返回 + if len(upgradeVersions) == 0 { + err = this.checkData(db) + if err != nil { + return err + } + return nil + } + + sort.Slice(upgradeVersions, func(i, j int) bool { + return stringutil.VersionCompare(upgradeVersions[i], upgradeVersions[j]) < 0 + }) + + // 执行升级的SQL + for _, version := range upgradeVersions { + sql := sqlMap[version] + _, err = db.Exec(sql) + if err != nil { + if !this.canIgnoreError(err) { + return errors.New("exec upgrade sql for version '" + version + "' failed: " + err.Error()) + + } + } + err = this.updateVersion(db, version) + if err != nil { + return err + } + } + + // 检查数据 + err = this.checkData(db) + if err != nil { + return err + } + + return nil + } + + // 全新安装 + fullSQL, found := this.findFullSQL() + if !found { + return errors.New("not found full setup sql") + } + + // 执行SQL + _, err = db.Exec(fullSQL) + if err != nil { + return errors.New("create tables failed: " + err.Error()) + } + + // 检查数据 + err = this.checkData(db) + if err != nil { + return err + } + + return nil +} + +// 查找完整的SQL +func (this *SQLExecutor) findFullSQL() (sql string, found bool) { + for _, m := range sqls.SQLVersions { + code, _ := m["version"] + if code == "full" { + sql, found = m["sql"] + return + } + } + return +} + +// 检查数据 +func (this *SQLExecutor) checkData(db *dbs.DB) error { + // 检查管理员 + err := this.checkAdmin(db) + if err != nil { + return err + } + + // 检查管理员平台节点 + err = this.checkAdminNode(db) + if err != nil { + return err + } + + // 更新版本号 + err = this.updateVersion(db, teaconst.Version) + if err != nil { + return err + } + + return nil +} + +// 检查管理员 +func (this *SQLExecutor) checkAdmin(db *dbs.DB) error { + stmt, err := db.Prepare("SELECT COUNT(*) FROM edgeAdmins") + if err != nil { + return errors.New("check admin failed: " + err.Error()) + } + defer func() { + _ = stmt.Close() + }() + col, err := stmt.FindCol(0) + if err != nil { + return errors.New("check admin failed: " + err.Error()) + } + count := types.Int(col) + if count == 0 { + _, err = db.Exec("INSERT INTO edgeAdmins (username, password, fullname, isSuper, createdAt, state) VALUES (?, ?, ?, ?, ?, ?)", "admin", stringutil.Md5("123456"), "管理员", 1, time.Now().Unix(), 1) + if err != nil { + return errors.New("create admin failed: " + err.Error()) + } + } + return nil +} + +// 检查管理员平台节点 +func (this *SQLExecutor) checkAdminNode(db *dbs.DB) error { + stmt, err := db.Prepare("SELECT COUNT(*) FROM edgeAPITokens WHERE role='admin'") + if err != nil { + return err + } + defer func() { + _ = stmt.Close() + }() + col, err := stmt.FindCol(0) + if err != nil { + return err + } + count := types.Int(col) + if count > 0 { + return nil + } + + nodeId := rands.HexString(32) + secret := rands.String(32) + _, err = db.Exec("INSERT INTO edgeAPITokens (nodeId, secret, role) VALUES (?, ?, ?)", nodeId, secret, "admin") + if err != nil { + return err + } + + return nil +} + +// 更新版本号 +func (this *SQLExecutor) updateVersion(db *dbs.DB, version string) error { + stmt, err := db.Prepare("SELECT COUNT(*) FROM edgeVersions") + if err != nil { + return errors.New("query version failed: " + err.Error()) + } + defer func() { + _ = stmt.Close() + }() + + col, err := stmt.FindCol(0) + if err != nil { + return errors.New("query version failed: " + err.Error()) + } + count := types.Int(col) + if count > 0 { + _, err = db.Exec("UPDATE edgeVersions SET version=?", version) + if err != nil { + return errors.New("update version failed: " + err.Error()) + } + return nil + } + + _, err = db.Exec("INSERT edgeVersions (version) VALUES (?)", version) + if err != nil { + return errors.New("create version failed: " + err.Error()) + } + + return nil +} + +// 判断某个错误是否可以忽略 +func (this *SQLExecutor) canIgnoreError(err error) bool { + if err == nil { + return true + } + + // Error 1050: Table 'xxx' already exists + if strings.Contains(err.Error(), "Error 1050") { + return true + } + + return false +} diff --git a/internal/setup/sql_executor_test.go b/internal/setup/sql_executor_test.go new file mode 100644 index 00000000..c4f5a84e --- /dev/null +++ b/internal/setup/sql_executor_test.go @@ -0,0 +1,19 @@ +package setup + +import ( + "github.com/iwind/TeaGo/dbs" + "testing" +) + +func TestSQLExecutor_Run(t *testing.T) { + executor := NewSQLExecutor(&dbs.DBConfig{ + Driver: "mysql", + Prefix: "edge", + Dsn: "root:123456@tcp(127.0.0.1:3306)/db_edge_new?charset=utf8mb4&multiStatements=true", + }) + err := executor.Run() + if err != nil { + t.Fatal(err) + } + t.Log("ok") +} diff --git a/internal/setup/sqls/sql_full.go b/internal/setup/sqls/sql_full.go new file mode 100644 index 00000000..399fd498 --- /dev/null +++ b/internal/setup/sqls/sql_full.go @@ -0,0 +1,642 @@ +// generated +package sqls + +var SQL_full = "CREATE TABLE `edgeAPINodes` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" + + " `clusterId` int(11) unsigned DEFAULT '0' COMMENT '专用集群ID',\n" + + " `uniqueId` varchar(32) DEFAULT NULL COMMENT '唯一ID',\n" + + " `secret` varchar(32) DEFAULT NULL COMMENT '密钥',\n" + + " `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" + + " `description` varchar(1024) DEFAULT NULL COMMENT '描述',\n" + + " `http` json DEFAULT NULL COMMENT '监听的HTTP配置',\n" + + " `https` json DEFAULT NULL COMMENT '监听的HTTPS配置',\n" + + " `accessAddrs` json DEFAULT NULL COMMENT '外部访问地址',\n" + + " `order` int(11) unsigned DEFAULT '0' COMMENT '排序',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `weight` int(11) unsigned DEFAULT '0' COMMENT '权重',\n" + + " `status` json DEFAULT NULL COMMENT '运行状态',\n" + + " PRIMARY KEY (`id`),\n" + + " UNIQUE KEY `uniqueId` (`uniqueId`) USING BTREE\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='API节点';\n" + + "CREATE TABLE `edgeAPITokens` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `nodeId` varchar(32) DEFAULT NULL COMMENT '节点ID',\n" + + " `secret` varchar(255) DEFAULT NULL COMMENT '节点密钥',\n" + + " `role` varchar(64) DEFAULT NULL COMMENT '节点角色',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " PRIMARY KEY (`id`),\n" + + " KEY `nodeId` (`nodeId`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='API令牌管理';\n" + + "CREATE TABLE `edgeAdmins` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `username` varchar(64) DEFAULT NULL COMMENT '用户名',\n" + + " `password` varchar(32) DEFAULT NULL COMMENT '密码',\n" + + " `fullname` varchar(64) DEFAULT NULL COMMENT '全名',\n" + + " `isSuper` tinyint(1) unsigned DEFAULT '0' COMMENT '是否为超级管理员',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `updatedAt` bigint(11) unsigned DEFAULT '0' COMMENT '修改时间',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='管理员';\n" + + "CREATE TABLE `edgeDBNodes` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" + + " `role` varchar(255) DEFAULT NULL COMMENT '数据库角色',\n" + + " `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" + + " `description` varchar(1024) DEFAULT NULL COMMENT '描述',\n" + + " `host` varchar(255) DEFAULT NULL COMMENT '主机',\n" + + " `port` int(11) unsigned DEFAULT '0' COMMENT '端口',\n" + + " `database` varchar(255) DEFAULT NULL COMMENT '数据库名称',\n" + + " `username` varchar(255) DEFAULT NULL COMMENT '用户名',\n" + + " `password` varchar(255) DEFAULT NULL COMMENT '密码',\n" + + " `charset` varchar(255) DEFAULT NULL COMMENT '通讯字符集',\n" + + " `connTimeout` int(11) unsigned DEFAULT '0' COMMENT '连接超时时间(秒)',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `weight` int(11) unsigned DEFAULT '0' COMMENT '权重',\n" + + " `order` int(11) unsigned DEFAULT '0' COMMENT '排序',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据库节点';\n" + + "CREATE TABLE `edgeFileChunks` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `fileId` int(11) unsigned DEFAULT '0' COMMENT '文件ID',\n" + + " `data` longblob COMMENT '分块内容',\n" + + " PRIMARY KEY (`id`),\n" + + " KEY `fileId` (`fileId`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文件片段';\n" + + "CREATE TABLE `edgeFiles` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `description` varchar(255) DEFAULT NULL COMMENT '文件描述',\n" + + " `filename` varchar(255) DEFAULT NULL COMMENT '文件名',\n" + + " `size` int(11) unsigned DEFAULT '0' COMMENT '文件尺寸',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `order` int(11) unsigned DEFAULT '0' COMMENT '排序',\n" + + " `type` varchar(64) DEFAULT '' COMMENT '类型',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " PRIMARY KEY (`id`),\n" + + " KEY `type` (`type`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文件管理';\n" + + "CREATE TABLE `edgeHTTPAccessLogPolicies` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" + + " `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" + + " `type` varchar(255) DEFAULT NULL COMMENT '存储类型',\n" + + " `options` json DEFAULT NULL COMMENT '存储选项',\n" + + " `conds` json DEFAULT NULL COMMENT '请求条件',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='访问日志策略';\n" + + "CREATE TABLE `edgeHTTPAccessLogs` (\n" + + " `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `serverId` int(11) unsigned DEFAULT '0' COMMENT '服务ID',\n" + + " `nodeId` int(11) unsigned DEFAULT '0' COMMENT '节点ID',\n" + + " `status` int(3) unsigned DEFAULT '0' COMMENT '状态码',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `content` json DEFAULT NULL COMMENT '日志内容',\n" + + " `requestId` varchar(128) DEFAULT NULL COMMENT '请求ID',\n" + + " PRIMARY KEY (`id`),\n" + + " KEY `serverId` (`serverId`),\n" + + " KEY `nodeId` (`nodeId`),\n" + + " KEY `serverId_status` (`serverId`,`status`),\n" + + " KEY `requestId` (`requestId`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n" + + "CREATE TABLE `edgeHTTPAccessLogs_20201010` (\n" + + " `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `serverId` int(11) unsigned DEFAULT '0' COMMENT '服务ID',\n" + + " `nodeId` int(11) unsigned DEFAULT '0' COMMENT '节点ID',\n" + + " `status` int(3) unsigned DEFAULT '0' COMMENT '状态码',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `content` json DEFAULT NULL COMMENT '日志内容',\n" + + " `day` varchar(8) DEFAULT NULL COMMENT '日期Ymd',\n" + + " PRIMARY KEY (`id`),\n" + + " KEY `serverId` (`serverId`),\n" + + " KEY `nodeId` (`nodeId`),\n" + + " KEY `serverId_status` (`serverId`,`status`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n" + + "CREATE TABLE `edgeHTTPCachePolicies` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',\n" + + " `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" + + " `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" + + " `capacity` json DEFAULT NULL COMMENT '容量数据',\n" + + " `maxKeys` bigint(20) unsigned DEFAULT '0' COMMENT '最多Key值',\n" + + " `maxSize` json DEFAULT NULL COMMENT '最大缓存内容尺寸',\n" + + " `type` varchar(255) DEFAULT NULL COMMENT '存储类型',\n" + + " `options` json DEFAULT NULL COMMENT '存储选项',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " `description` varchar(1024) DEFAULT NULL COMMENT '描述',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='HTTP缓存策略';\n" + + "CREATE TABLE `edgeHTTPFirewallPolicies` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" + + " `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" + + " `description` varchar(1024) DEFAULT NULL COMMENT '描述',\n" + + " `inbound` json DEFAULT NULL COMMENT '入站规则',\n" + + " `outbound` json DEFAULT NULL COMMENT '出站规则',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='HTTP防火墙';\n" + + "CREATE TABLE `edgeHTTPFirewallRuleGroups` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" + + " `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" + + " `description` varchar(1024) DEFAULT NULL COMMENT '描述',\n" + + " `code` varchar(255) DEFAULT NULL COMMENT '代号',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " `sets` json DEFAULT NULL COMMENT '规则集列表',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='防火墙规则分组';\n" + + "CREATE TABLE `edgeHTTPFirewallRuleSets` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" + + " `code` varchar(255) DEFAULT NULL COMMENT '代号',\n" + + " `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" + + " `description` varchar(1024) DEFAULT NULL COMMENT '描述',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `rules` json DEFAULT NULL COMMENT '规则列表',\n" + + " `connector` varchar(64) DEFAULT NULL COMMENT '规则之间的关系',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `action` varchar(255) DEFAULT NULL COMMENT '执行的动作',\n" + + " `actionOptions` json DEFAULT NULL COMMENT '动作的选项',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='防火墙规则集';\n" + + "CREATE TABLE `edgeHTTPFirewallRules` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" + + " `description` varchar(1024) DEFAULT NULL COMMENT '说明',\n" + + " `param` varchar(1024) DEFAULT NULL COMMENT '参数',\n" + + " `operator` varchar(255) DEFAULT NULL COMMENT '操作符',\n" + + " `value` varchar(1024) DEFAULT NULL COMMENT '对比值',\n" + + " `isCaseInsensitive` tinyint(1) unsigned DEFAULT '1' COMMENT '是否大小写不敏感',\n" + + " `checkpointOptions` json DEFAULT NULL COMMENT '检查点参数',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='防火墙规则';\n" + + "CREATE TABLE `edgeHTTPGzips` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" + + " `level` int(11) unsigned DEFAULT '0' COMMENT '压缩级别',\n" + + " `minLength` json DEFAULT NULL COMMENT '可压缩最小值',\n" + + " `maxLength` json DEFAULT NULL COMMENT '可压缩最大值',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `conds` json DEFAULT NULL COMMENT '条件',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Gzip配置';\n" + + "CREATE TABLE `edgeHTTPHeaderPolicies` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `isOn` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '是否启用',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `addHeaders` json DEFAULT NULL COMMENT '添加的Header',\n" + + " `addTrailers` json DEFAULT NULL COMMENT '添加的Trailers',\n" + + " `setHeaders` json DEFAULT NULL COMMENT '设置Header',\n" + + " `replaceHeaders` json DEFAULT NULL COMMENT '替换Header内容',\n" + + " `expires` json DEFAULT NULL COMMENT 'Expires单独设置',\n" + + " `deleteHeaders` json DEFAULT NULL COMMENT '删除的Headers',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Header定义';\n" + + "CREATE TABLE `edgeHTTPHeaders` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',\n" + + " `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" + + " `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" + + " `value` varchar(1024) DEFAULT NULL COMMENT '值',\n" + + " `order` int(11) unsigned DEFAULT '0' COMMENT '排序',\n" + + " `status` json DEFAULT NULL COMMENT '状态码设置',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='HTTP Header';\n" + + "CREATE TABLE `edgeHTTPLocations` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `parentId` int(11) unsigned DEFAULT '0' COMMENT '父级ID',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `pattern` varchar(1024) DEFAULT NULL COMMENT '匹配规则',\n" + + " `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" + + " `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" + + " `description` varchar(1024) DEFAULT NULL COMMENT '描述',\n" + + " `webId` int(11) unsigned DEFAULT '0' COMMENT 'Web配置ID',\n" + + " `reverseProxy` json DEFAULT NULL COMMENT '反向代理',\n" + + " `urlPrefix` varchar(1024) DEFAULT NULL COMMENT 'URL前缀',\n" + + " `isBreak` tinyint(1) unsigned DEFAULT '0' COMMENT '是否终止匹配',\n" + + " `conds` json DEFAULT NULL COMMENT '匹配条件',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='路径规则配置';\n" + + "CREATE TABLE `edgeHTTPPages` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `isOn` tinyint(1) unsigned DEFAULT '0' COMMENT '是否启用',\n" + + " `statusList` json DEFAULT NULL COMMENT '状态列表',\n" + + " `url` varchar(1024) DEFAULT NULL COMMENT '页面URL',\n" + + " `newStatus` int(3) DEFAULT NULL COMMENT '新状态码',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='特殊页面';\n" + + "CREATE TABLE `edgeHTTPRewriteRules` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',\n" + + " `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `pattern` varchar(1024) DEFAULT NULL COMMENT '匹配规则',\n" + + " `replace` varchar(1024) DEFAULT NULL COMMENT '跳转后的地址',\n" + + " `mode` varchar(255) DEFAULT NULL COMMENT '替换模式',\n" + + " `redirectStatus` int(3) unsigned DEFAULT '0' COMMENT '跳转的状态码',\n" + + " `proxyHost` varchar(255) DEFAULT NULL COMMENT '代理的主机名',\n" + + " `isBreak` tinyint(1) unsigned DEFAULT '1' COMMENT '是否终止解析',\n" + + " `withQuery` tinyint(1) unsigned DEFAULT '1' COMMENT '是否保留URI参数',\n" + + " `conds` json DEFAULT NULL COMMENT '匹配条件',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='重写规则';\n" + + "CREATE TABLE `edgeHTTPWebs` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" + + " `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `root` json DEFAULT NULL COMMENT '根目录',\n" + + " `charset` json DEFAULT NULL COMMENT '字符集',\n" + + " `shutdown` json DEFAULT NULL COMMENT '临时关闭页面配置',\n" + + " `pages` json DEFAULT NULL COMMENT '特殊页面',\n" + + " `redirectToHttps` json DEFAULT NULL COMMENT '跳转到HTTPS设置',\n" + + " `indexes` json DEFAULT NULL COMMENT '首页文件列表',\n" + + " `maxRequestBodySize` json DEFAULT NULL COMMENT '最大允许的请求内容尺寸',\n" + + " `requestHeader` json DEFAULT NULL COMMENT '请求Header配置',\n" + + " `responseHeader` json DEFAULT NULL COMMENT '响应Header配置',\n" + + " `accessLog` json DEFAULT NULL COMMENT '访问日志配置',\n" + + " `stat` json DEFAULT NULL COMMENT '统计配置',\n" + + " `gzip` json DEFAULT NULL COMMENT 'Gzip配置',\n" + + " `cache` json DEFAULT NULL COMMENT '缓存配置',\n" + + " `firewall` json DEFAULT NULL COMMENT '防火墙设置',\n" + + " `locations` json DEFAULT NULL COMMENT '路径规则配置',\n" + + " `websocket` json DEFAULT NULL COMMENT 'Websocket设置',\n" + + " `rewriteRules` json DEFAULT NULL COMMENT '重写规则配置',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='HTTP Web';\n" + + "CREATE TABLE `edgeHTTPWebsockets` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" + + " `handshakeTimeout` json DEFAULT NULL COMMENT '握手超时时间',\n" + + " `allowAllOrigins` tinyint(1) unsigned DEFAULT '1' COMMENT '是否支持所有源',\n" + + " `allowedOrigins` json DEFAULT NULL COMMENT '支持的源域名列表',\n" + + " `requestSameOrigin` tinyint(1) unsigned DEFAULT '1' COMMENT '是否请求一样的Origin',\n" + + " `requestOrigin` varchar(255) DEFAULT NULL COMMENT '请求Origin',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Websocket设置';\n" + + "CREATE TABLE `edgeLogs` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `level` varchar(32) DEFAULT NULL COMMENT '级别',\n" + + " `description` varchar(255) DEFAULT NULL COMMENT '描述',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `action` varchar(255) DEFAULT NULL COMMENT '动作',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `providerId` int(11) unsigned DEFAULT '0' COMMENT '供应商ID',\n" + + " `ip` varchar(32) DEFAULT NULL COMMENT 'IP地址',\n" + + " `type` varchar(255) DEFAULT 'admin' COMMENT '类型:admin, user',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作日志';\n" + + "CREATE TABLE `edgeNodeClusters` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" + + " `useAllAPINodes` tinyint(1) unsigned DEFAULT '1' COMMENT '是否使用所有API节点',\n" + + " `apiNodes` json DEFAULT NULL COMMENT '使用的API节点',\n" + + " `installDir` varchar(512) DEFAULT NULL COMMENT '安装目录',\n" + + " `order` int(11) unsigned DEFAULT '0' COMMENT '排序',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `grantId` int(11) unsigned DEFAULT '0' COMMENT '默认认证方式',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点集群';\n" + + "CREATE TABLE `edgeNodeGrants` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" + + " `method` varchar(64) DEFAULT NULL COMMENT '登录方式',\n" + + " `username` varchar(255) DEFAULT NULL COMMENT '用户名',\n" + + " `password` varchar(255) DEFAULT NULL COMMENT '密码',\n" + + " `su` tinyint(1) unsigned DEFAULT '1' COMMENT '是否需要su',\n" + + " `privateKey` varchar(4096) DEFAULT NULL COMMENT '密钥',\n" + + " `description` varchar(255) DEFAULT NULL COMMENT '备注',\n" + + " `nodeId` int(11) unsigned DEFAULT '0' COMMENT '专有节点',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点授权';\n" + + "CREATE TABLE `edgeNodeGroups` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" + + " `order` int(11) unsigned DEFAULT '0' COMMENT '排序',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点分组';\n" + + "CREATE TABLE `edgeNodeIPAddresses` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `nodeId` int(11) unsigned DEFAULT '0' COMMENT '节点ID',\n" + + " `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" + + " `ip` varchar(128) DEFAULT NULL COMMENT 'IP地址',\n" + + " `description` varchar(255) DEFAULT NULL COMMENT '描述',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " `order` int(11) unsigned DEFAULT '0' COMMENT '排序',\n" + + " PRIMARY KEY (`id`),\n" + + " KEY `nodeId` (`nodeId`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点IP地址';\n" + + "CREATE TABLE `edgeNodeLogins` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `nodeId` int(11) unsigned DEFAULT '0' COMMENT '节点ID',\n" + + " `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" + + " `type` varchar(255) DEFAULT NULL COMMENT '类型:ssh,agent',\n" + + " `params` json DEFAULT NULL COMMENT '配置参数',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " PRIMARY KEY (`id`),\n" + + " KEY `nodeId` (`nodeId`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点登录信息';\n" + + "CREATE TABLE `edgeNodeLogs` (\n" + + " `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `role` varchar(64) DEFAULT NULL COMMENT '节点角色',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `tag` varchar(255) DEFAULT NULL COMMENT '标签',\n" + + " `description` varchar(1024) DEFAULT NULL COMMENT '描述',\n" + + " `level` varchar(32) DEFAULT NULL COMMENT '级别',\n" + + " `nodeId` int(11) unsigned DEFAULT '0' COMMENT '节点ID',\n" + + " `day` varchar(8) DEFAULT NULL COMMENT '日期',\n" + + " PRIMARY KEY (`id`),\n" + + " KEY `level` (`level`),\n" + + " KEY `day` (`day`),\n" + + " KEY `role_nodeId` (`role`,`nodeId`) USING BTREE\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点日志';\n" + + "CREATE TABLE `edgeNodeRegions` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" + + " `order` int(11) unsigned DEFAULT '0' COMMENT '排序',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点区域';\n" + + "CREATE TABLE `edgeNodes` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" + + " `uniqueId` varchar(32) DEFAULT NULL COMMENT '节点ID',\n" + + " `secret` varchar(32) DEFAULT NULL COMMENT '密钥',\n" + + " `name` varchar(255) DEFAULT NULL COMMENT '节点名',\n" + + " `code` varchar(255) DEFAULT NULL COMMENT '代号',\n" + + " `clusterId` int(11) unsigned DEFAULT '0' COMMENT '集群ID',\n" + + " `regionId` int(11) unsigned DEFAULT '0' COMMENT '区域ID',\n" + + " `groupId` int(11) unsigned DEFAULT '0' COMMENT '分组ID',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `status` json DEFAULT NULL COMMENT '最新的状态',\n" + + " `version` int(11) unsigned DEFAULT '0' COMMENT '当前版本号',\n" + + " `latestVersion` int(11) unsigned DEFAULT '0' COMMENT '最后版本号',\n" + + " `installDir` varchar(512) DEFAULT NULL COMMENT '安装目录',\n" + + " `isInstalled` tinyint(1) unsigned DEFAULT '0' COMMENT '是否已安装',\n" + + " `installStatus` json DEFAULT NULL COMMENT '安装状态',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " `connectedAPINodes` json DEFAULT NULL COMMENT '当前连接的API节点',\n" + + " `maxCPU` int(4) unsigned DEFAULT '0' COMMENT '可以使用的最多CPU',\n" + + " PRIMARY KEY (`id`),\n" + + " KEY `uniqueId` (`uniqueId`),\n" + + " KEY `clusterId` (`clusterId`),\n" + + " KEY `groupId` (`groupId`),\n" + + " KEY `regionId` (`regionId`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点';\n" + + "CREATE TABLE `edgeOrigins` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" + + " `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" + + " `version` int(11) unsigned DEFAULT '0' COMMENT '版本',\n" + + " `addr` json DEFAULT NULL COMMENT '地址',\n" + + " `description` varchar(512) DEFAULT NULL COMMENT '描述',\n" + + " `code` varchar(255) DEFAULT NULL COMMENT '代号',\n" + + " `weight` int(11) unsigned DEFAULT '0' COMMENT '权重',\n" + + " `connTimeout` json DEFAULT NULL COMMENT '连接超时',\n" + + " `readTimeout` json DEFAULT NULL COMMENT '读超时',\n" + + " `idleTimeout` json DEFAULT NULL COMMENT '空闲连接超时',\n" + + " `maxFails` int(11) unsigned DEFAULT '0' COMMENT '最多失败次数',\n" + + " `maxConns` int(11) unsigned DEFAULT '0' COMMENT '最大并发连接数',\n" + + " `maxIdleConns` int(11) unsigned DEFAULT '0' COMMENT '最多空闲连接数',\n" + + " `httpRequestURI` varchar(1024) DEFAULT NULL COMMENT '转发后的请求URI',\n" + + " `httpRequestHeader` json DEFAULT NULL COMMENT '请求Header配置',\n" + + " `httpResponseHeader` json DEFAULT NULL COMMENT '响应Header配置',\n" + + " `host` varchar(255) DEFAULT NULL COMMENT '自定义主机名',\n" + + " `healthCheck` json DEFAULT NULL COMMENT '健康检查设置',\n" + + " `cert` json DEFAULT NULL COMMENT '证书设置',\n" + + " `ftp` json DEFAULT NULL COMMENT 'FTP相关设置',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='源站';\n" + + "CREATE TABLE `edgeProviders` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `username` varchar(64) DEFAULT NULL COMMENT '用户名',\n" + + " `password` varchar(32) DEFAULT NULL COMMENT '密码',\n" + + " `fullname` varchar(64) DEFAULT NULL COMMENT '真实姓名',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `updatedAt` bigint(11) unsigned DEFAULT '0' COMMENT '修改时间',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='供应商';\n" + + "CREATE TABLE `edgeReverseProxies` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',\n" + + " `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" + + " `scheduling` json DEFAULT NULL COMMENT '调度算法',\n" + + " `primaryOrigins` json DEFAULT NULL COMMENT '主要源站',\n" + + " `backupOrigins` json DEFAULT NULL COMMENT '备用源站',\n" + + " `stripPrefix` varchar(255) DEFAULT NULL COMMENT '去除URL前缀',\n" + + " `requestHost` varchar(255) DEFAULT NULL COMMENT '请求Host',\n" + + " `requestURI` varchar(1024) DEFAULT NULL COMMENT '请求URI',\n" + + " `autoFlush` tinyint(1) unsigned DEFAULT '0' COMMENT '是否自动刷新缓冲区',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='反向代理配置';\n" + + "CREATE TABLE `edgeSSLCertGroups` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `name` varchar(255) DEFAULT NULL COMMENT '分组名',\n" + + " `order` int(11) unsigned DEFAULT '0' COMMENT '分组排序',\n" + + " `state` tinyint(1) unsigned DEFAULT '0' COMMENT '状态',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='证书分组';\n" + + "CREATE TABLE `edgeSSLCerts` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `updatedAt` bigint(11) unsigned DEFAULT '0' COMMENT '修改时间',\n" + + " `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" + + " `name` varchar(255) DEFAULT NULL COMMENT '证书名',\n" + + " `description` varchar(1024) DEFAULT NULL COMMENT '描述',\n" + + " `certData` blob COMMENT '证书内容',\n" + + " `keyData` blob COMMENT '密钥内容',\n" + + " `serverName` varchar(255) DEFAULT NULL COMMENT '证书使用的主机名',\n" + + " `isCA` tinyint(1) unsigned DEFAULT '0' COMMENT '是否为CA证书',\n" + + " `groupIds` json DEFAULT NULL COMMENT '证书分组',\n" + + " `timeBeginAt` bigint(11) unsigned DEFAULT '0' COMMENT '开始时间',\n" + + " `timeEndAt` bigint(11) unsigned DEFAULT '0' COMMENT '结束时间',\n" + + " `dnsNames` json DEFAULT NULL COMMENT 'DNS名称列表',\n" + + " `commonNames` json DEFAULT NULL COMMENT '发行单位列表',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='SSL证书';\n" + + "CREATE TABLE `edgeSSLPolicies` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" + + " `certs` json DEFAULT NULL COMMENT '证书列表',\n" + + " `clientCACerts` json DEFAULT NULL COMMENT '客户端证书',\n" + + " `clientAuthType` int(11) unsigned DEFAULT '0' COMMENT '客户端认证类型',\n" + + " `minVersion` varchar(32) DEFAULT NULL COMMENT '支持的SSL最小版本',\n" + + " `cipherSuitesIsOn` tinyint(1) unsigned DEFAULT '0' COMMENT '是否自定义加密算法套件',\n" + + " `cipherSuites` json DEFAULT NULL COMMENT '加密算法套件',\n" + + " `hsts` json DEFAULT NULL COMMENT 'HSTS设置',\n" + + " `http2Enabled` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用HTTP/2',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='SSL配置策略';\n" + + "CREATE TABLE `edgeServerGroups` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" + + " `order` int(11) unsigned DEFAULT '0' COMMENT '排序',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='服务分组';\n" + + "CREATE TABLE `edgeServers` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `isOn` tinyint(1) unsigned DEFAULT '1' COMMENT '是否启用',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `adminId` int(11) unsigned DEFAULT '0' COMMENT '管理员ID',\n" + + " `type` varchar(64) DEFAULT NULL COMMENT '服务类型',\n" + + " `name` varchar(255) DEFAULT NULL COMMENT '名称',\n" + + " `description` varchar(512) DEFAULT NULL COMMENT '描述',\n" + + " `serverNames` json DEFAULT NULL COMMENT '域名列表',\n" + + " `http` json DEFAULT NULL COMMENT 'HTTP配置',\n" + + " `https` json DEFAULT NULL COMMENT 'HTTPS配置',\n" + + " `tcp` json DEFAULT NULL COMMENT 'TCP配置',\n" + + " `tls` json DEFAULT NULL COMMENT 'TLS配置',\n" + + " `unix` json DEFAULT NULL COMMENT 'Unix配置',\n" + + " `udp` json DEFAULT NULL COMMENT 'UDP配置',\n" + + " `webId` int(11) unsigned DEFAULT '0' COMMENT 'WEB配置',\n" + + " `reverseProxy` json DEFAULT NULL COMMENT '反向代理配置',\n" + + " `groupIds` json DEFAULT NULL COMMENT '分组ID列表',\n" + + " `config` json DEFAULT NULL COMMENT '服务配置,自动生成',\n" + + " `configMd5` varchar(32) DEFAULT NULL COMMENT 'Md5',\n" + + " `clusterId` int(11) unsigned DEFAULT '0' COMMENT '集群ID',\n" + + " `includeNodes` json DEFAULT NULL COMMENT '部署条件',\n" + + " `excludeNodes` json DEFAULT NULL COMMENT '节点排除条件',\n" + + " `version` int(11) unsigned DEFAULT '0' COMMENT '版本号',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " PRIMARY KEY (`id`),\n" + + " KEY `userId` (`userId`),\n" + + " KEY `adminId` (`adminId`),\n" + + " KEY `isUpdating_state` (`state`) USING BTREE\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='服务';\n" + + "CREATE TABLE `edgeSysEvents` (\n" + + " `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `type` varchar(255) DEFAULT NULL COMMENT '类型',\n" + + " `params` json DEFAULT NULL COMMENT '参数',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统事件';\n" + + "CREATE TABLE `edgeSysLockers` (\n" + + " `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `key` varchar(255) DEFAULT NULL COMMENT '键值',\n" + + " `version` bigint(20) unsigned DEFAULT '0' COMMENT '版本号',\n" + + " `timeoutAt` bigint(11) unsigned DEFAULT '0' COMMENT '超时时间',\n" + + " PRIMARY KEY (`id`),\n" + + " UNIQUE KEY `key` (`key`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='并发锁';\n" + + "CREATE TABLE `edgeSysSettings` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `code` varchar(255) DEFAULT NULL COMMENT '代号',\n" + + " `value` json DEFAULT NULL COMMENT '配置值',\n" + + " PRIMARY KEY (`id`),\n" + + " UNIQUE KEY `code` (`code`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统配置';\n" + + "CREATE TABLE `edgeTCPFirewallPolicies` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `adminId` int(11) DEFAULT NULL COMMENT '管理员ID',\n" + + " `userId` int(11) unsigned DEFAULT '0' COMMENT '用户ID',\n" + + " `templateId` int(11) unsigned DEFAULT '0' COMMENT '模版ID',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='TCP防火墙';\n" + + "CREATE TABLE `edgeUsers` (\n" + + " `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `username` varchar(64) DEFAULT NULL COMMENT '用户名',\n" + + " `password` varchar(32) DEFAULT NULL COMMENT '密码',\n" + + " `fullname` varchar(64) DEFAULT NULL COMMENT '真实姓名',\n" + + " `createdAt` bigint(11) unsigned DEFAULT '0' COMMENT '创建时间',\n" + + " `updatedAt` bigint(11) unsigned DEFAULT '0' COMMENT '修改时间',\n" + + " `state` tinyint(1) unsigned DEFAULT '1' COMMENT '状态',\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户';\n" + + "CREATE TABLE `edgeVersions` (\n" + + " `id` bigint(16) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',\n" + + " `version` varchar(64) DEFAULT NULL,\n" + + " PRIMARY KEY (`id`)\n" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据库结构版本';\n" + + "\n" diff --git a/internal/setup/sqls/sqls.go b/internal/setup/sqls/sqls.go new file mode 100644 index 00000000..fd9d07b9 --- /dev/null +++ b/internal/setup/sqls/sqls.go @@ -0,0 +1,6 @@ +// generated +package sqls + +var SQLVersions = []map[string]string{ + {"version": "full", "sql": SQL_full}, +}