mirror of
https://github.com/TeaOSLab/EdgeAPI.git
synced 2025-12-15 23:26:35 +08:00
初步实现安装界面
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -25,7 +25,9 @@ type HTTPAccessLogDAOWrapper struct {
|
||||
|
||||
func init() {
|
||||
initializer := NewDBNodeInitializer()
|
||||
go initializer.Start()
|
||||
dbs.OnReady(func() {
|
||||
go initializer.Start()
|
||||
})
|
||||
}
|
||||
|
||||
// 获取获取DAO
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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{
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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("")
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
28
internal/db/models/version_dao.go
Normal file
28
internal/db/models/version_dao.go
Normal file
@@ -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()
|
||||
})
|
||||
}
|
||||
5
internal/db/models/version_dao_test.go
Normal file
5
internal/db/models/version_dao_test.go
Normal file
@@ -0,0 +1,5 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
)
|
||||
16
internal/db/models/version_model.go
Normal file
16
internal/db/models/version_model.go
Normal file
@@ -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{}
|
||||
}
|
||||
1
internal/db/models/version_model_ext.go
Normal file
1
internal/db/models/version_model_ext.go
Normal file
@@ -0,0 +1 @@
|
||||
package models
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
|
||||
7
internal/setup/config.go
Normal file
7
internal/setup/config.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package setup
|
||||
|
||||
type Config struct {
|
||||
APINodeProtocol string
|
||||
APINodeHost string
|
||||
APINodePort int
|
||||
}
|
||||
187
internal/setup/setup.go
Normal file
187
internal/setup/setup.go
Normal file
@@ -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
|
||||
}
|
||||
19
internal/setup/setup_test.go
Normal file
19
internal/setup/setup_test.go
Normal file
@@ -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")
|
||||
}
|
||||
279
internal/setup/sql_executor.go
Normal file
279
internal/setup/sql_executor.go
Normal file
@@ -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
|
||||
}
|
||||
19
internal/setup/sql_executor_test.go
Normal file
19
internal/setup/sql_executor_test.go
Normal file
@@ -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")
|
||||
}
|
||||
642
internal/setup/sqls/sql_full.go
Normal file
642
internal/setup/sqls/sql_full.go
Normal file
@@ -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"
|
||||
6
internal/setup/sqls/sqls.go
Normal file
6
internal/setup/sqls/sqls.go
Normal file
@@ -0,0 +1,6 @@
|
||||
// generated
|
||||
package sqls
|
||||
|
||||
var SQLVersions = []map[string]string{
|
||||
{"version": "full", "sql": SQL_full},
|
||||
}
|
||||
Reference in New Issue
Block a user